お世話になります。
“F_作業標準入力” の中にある、テキストボックス “txt_口座番号” に
口座番号というものを入力し、ボタン “btn_読込” を押すと、
5つのテーブルのデータが、指定するテキストボックスとコンボボックスに
それぞれ格納される,,,という動作を目指しています。
上記を実行すると、下記のメッセージが出現します。
間違いをご指摘いただき、正しく動作できるよう導いていただけたら
幸いです。どうぞよろしくお願いします。
(別途DBファイルをお送りします
「SELECT ステートメントが間違っている予約語や引数を含んでいるか、
区切り記号が正しくありません。」
Private Sub loadForm()
If IsNull(Me.txt_口座番号.Value) Then Exit Sub '「txt_口座番号」が空なら終了
Call initializeForm '初期化呼出し
On Error GoTo ErrorHandler
Dim daoDb As DAO.Database
Set daoDb = CurrentDb
Dim daoRs As DAO.Recordset
Dim strSQL As String
'機械設定の読込
strSQL = _
"SELECT " & _
"T_機械設定.'品名', " & _
"T_機械設定.'厚さ', " & _
"T_機械設定.'幅', " & _
"T_機械設定.'長さ', " & _
"T_機械設定.'巻取側の張力', " & _
"T_機械設定.'巻取側のテーパー', " & _
"T_機械設定.'巻戻側の張力', " & _
"T_機械設定.'巻戻側のテーパー', " & _
"T_機械設定.'巻取方向', " & _
"T_機械設定.'巻戻方向', " & _
"T_機械設定.'ニップの使用可否', " & _
"T_機械設定.'ニップ圧', " & _
"T_機械設定.'巻取速度', " & _
"T_機械設定.'サンプル採取', " & _
"T_機械設定.'巻取側の巻芯種別', " & _
"T_機械設定.'巻取側の巻芯寸法', " & _
"T_機械設定.'タッチロールの材質', " & _
"T_機械設定.'タッチロールの寸法', " & _
"T_機械設定.'EPC検出位置切替', " & _
"FROM T_機械設定 " & _
"WHERE `口座番号' = " & Me.txt_口座番号.Value & ";"
Set daoRs = daoDb.OpenRecordset(strSQL) 'レコードセットを取得
If daoRs.BOF = True And daoRs.EOF = True Then '該当レコードが無かったら
MsgBox "対象レコードがありません。", vbInformation, "確認" 'メッセージを表示
GoTo Finally '接続解除へジャンプ(機械設定のレコードが無ければ、FUTEC・特記事項・クレーム履歴の読込が出来ないため)
End If
'機械設定の各項目を格納
Me.txt_品名.Value = daoRs!Fields("品名")
Me.txt_厚さ.Value = daoRs!Fields("厚さ")
Me.txt_幅.Value = daoRs!Fields("幅")
Me.txt_長さ.Value = daoRs!Fields("長さ")
Me.txt_巻取張力.Value = daoRs!Fields("巻取側の張力")
Me.txt_巻取テーパー.Value = daoRs!Fields("巻取側のテーパー")
Me.txt_巻戻張力.Value = daoRs!Fields("巻戻側の張力")
Me.txt_巻戻テーパー.Value = daoRs!Fields("巻戻側のテーパー")
Me.cmb_巻取方向.Value = daoRs!Fields("巻取方向")
Me.cmb_巻戻方向.Value = daoRs!Fields("巻戻方向")
Me.cmb_ニップ可否.Value = daoRs!Fields("ニップの使用可否")
Me.txt_ニップ圧.Value = daoRs!Fields("ニップ圧")
Me.txt_巻取速度.Value = daoRs!Fields("巻取速度")
Me.cmb_試験サンプル.Value = daoRs!Fields("サンプル採取")
Me.cmb_種別.Value = daoRs!Fields("巻取側の巻芯種別")
Me.txt_巻芯寸法.Value = daoRs!Fields("巻取側の巻芯寸法")
Me.cmb_タッチロール材質.Value = daoRs!Fields("タッチロールの材質")
Me.txt_タッチロール寸法.Value = daoRs!Fields("タッチロールの寸法")
Me.cmb_検出位置.Value = daoRs!Fields("EPC検出位置切替")
daoRs.Close 'レコードセットを閉じる(次の読込が出来ないため)
'FUTEC設定の読み込み
strSQL = _
"SELECT " & _
"T_FUTEC設定.'FUTEC品名4-表', " & _
"T_FUTEC設定.'FUTEC品名4-裏', " & _
"T_FUTEC設定.'FUTEC品名5-表', " & _
"T_FUTEC設定.'FUTEC品名5-裏', " & _
"T_FUTEC設定.'FUTEC品名6-表', " & _
"T_FUTEC設定.'FUTEC品名6-裏', " & _
"FROM T_FUTEC設定 " & _
"WHERE '口座番号' = " & Me.txt_口座番号.Value & ";"
Set daoRs = daoDb.OpenRecordset(strSQL) 'レコードセットを取得
'FUTEC設定の各項目を格納
Me.txt_M5004表.Value = daoRs!Fields("FUTEC品名4-表")
Me.txt_M5004裏.Value = daoRs!Fields("FUTEC品名4-裏")
Me.txt_M5005表.Value = daoRs!Fields("FUTEC品名5-表")
Me.txt_M5005裏.Value = daoRs!Fields("FUTEC品名5-裏")
Me.txt_M5006表.Value = daoRs!Fields("FUTEC品名6-表")
Me.txt_M5006裏.Value = daoRs!Fields("FUTEC品名6-裏")
daoRs.Close 'レコードセットを閉じる(次の読込が出来ないため)
'更新履歴の読込
strSQL = _
"SELECT '更新日時, '起案者', '承認者', '制定・改訂理由' " & _
"FROM T_更新履歴 " & _
"WHERE '口座番号' = " & Me.txt_口座番号.Value & ";"
Set daoRs = daoDb.OpenRecordset(strSQL) 'レコードセットを取得
Dim i As Long: i = 1 'コントロール番号として使用
Do Until daoRs.EOF = True 'レコードセットが終了するまで繰り返す
If i > 10 Then '用意したコントロール数を超えてしまったら
MsgBox "表示できないレコードが存在しています", vbExclamation, "エラー" 'メッセージを表示
Exit Do 'ループを抜ける
End If
'更新履歴の各項目を格納
Me("txt_更新日" & i).Value = daoRs!Fields("更新日時")
Me("cmb_起案者" & i).Value = daoRs!Fields("起案者")
Me("cmb_承認者" & i).Value = daoRs!Fields("承認者")
Me("txt_理由" & i).Value = daoRs!Fields("制定・改訂理由")
daoRs.MoveNext '次のレコードへ
i = i + 1 '次のコントロール番号へ
Loop
'特記事項の読込
strSQL = _
"SELECT " & _
"T_特記事項.'特記事項', " & _
"FROM T_特記事項 " & _
"WHERE '口座番号' = " & Me.txt_口座番号.Value & ";"
Set daoRs = daoDb.OpenRecordset(strSQL) 'レコードセットを取得
Dim R As Long: R = 1 'コントロール番号として使用
Do Until daoRs.EOF = True 'レコードセットが終了するまで繰り返す
If R > 10 Then '用意したコントロール数を超えてしまったら
MsgBox "表示できないレコードが存在しています", vbExclamation, "エラー" 'メッセージを表示
Exit Do 'ループを抜ける
End If
'特記事項の各項目を格納
Me("txt_特記事項" & R).Value = daoRs!Fields("特記事項")
daoRs.MoveNext '次のレコードへ
R = R + 1 '次のコントロール番号へ
Loop
'クレーム履歴の読込
strSQL = _
"SELECT '発生年月', 'クレーム内容', '是正処置' " & _
"FROM T_クレーム履歴 " & _
"WHERE '口座番号' = " & Me.txt_口座番号.Value & ";"
Set daoRs = daoDb.OpenRecordset(strSQL) 'レコードセットを取得
Dim Z As Long: Z = 1 'コントロール番号として使用
Do Until daoRs.EOF = True 'レコードセットが終了するまで繰り返す
If Z > 10 Then '用意したコントロール数を超えてしまったら
MsgBox "表示できないレコードが存在しています", vbExclamation, "エラー" 'メッセージを表示
Exit Do 'ループを抜ける
End If
'クレーム履歴の各項目を格納
Me("txt_発生年月" & Z).Value = daoRs!Fields("発生年月")
Me("txt_クレーム内容" & Z).Value = daoRs!Fields("クレーム内容")
Me("txt_是正処置" & Z).Value = daoRs!Fields("是正処置")
daoRs.MoveNext '次のレコードへ
R = Z + 1 '次のコントロール番号へ
Loop
GoTo Finally
ErrorHandler: 'エラートラップ
MsgBox "Error #: " & Err.Number & vbNewLine & vbNewLine & _
Err.Description, vbCritical, "エラー" 'エラーメッセージ
Finally: '接続解除
If Not daoRs Is Nothing Then
daoRs.Close
Set daoRs = Nothing
End If
If Not daoDb Is Nothing Then
daoDb.Close
Set daoDb = Nothing
End If
End Sub
リレーションシップの状態です。
リレーションシップウィンドウのスクショでしょうか?
もしかしたら、主キーの設定が緩い、リレーションシップが未設定、という課題があるかもしれませんね。
品名と年月を軸に、再検討は如何でしょうか?
参考サイト
リレーションシップの作成と参照整合性の設定
最初のシングルクォテーションは、閉じないのでしょうか?
最後のカンマは、必要ですか?
りんごさん、ありがとうございます。
リレーションシップに関するご指摘ですが、このような感じで良いでしょうか?
シングルクォーテーションとカンマについて。
おっしゃる通りでした。ありがとうございます!
派生関係 T_特記事項:🔑品名,🔑開始日,特記事項
T_機械設定:🔑品名,🔑開始日,…,承認者,承認日
親子関係 T_クレーム履歴:🔑品名,🔑開始日,🔑クレーム履歴番号,…
親子関係 T_FUTEC設定:🔑品名,🔑開始日,🔑検査番号,…
参照関係 T_更新履歴:🔑承認者,🔑承認日,…
とりあえず、たたき台にどうですか?
「FUTEC品名4-表」のようなハイフンを含む列名は、SQLでマイナス記号として扱われてしまうため、[FUTEC品名4-表]のように角かっこで囲む必要があります。しかし、このような列名は他の場面でもトラブルの種になりがちなので、可能なかぎり列名を変更したほうが良いと思います。
質問に対する直接の回答ではなく、前提に関する疑問点なんですが、
リレーションシップをみると一つのメインテーブルに4つのサブテーブルが紐づいているという関係ですね。つまり一対多の関係が4組あるということになります。
これを非連結のコントロールを想定されるレコード数分配置してそこに表示するという設計ですね。
通常、Accessでは一対多の関係のデータはメイン/サブフォーム形式で簡単に表示させることが可能です。
今回の場合は、[T_機械設定]をメインフォームのレコードソースにして、そこに4つのサブテーブルをサブフォームとしてそれぞれ配置すれば、コード無しに目的のことは実現できます。
そうせずに、非連結で設計する理由はなんでしょうか。
現状だと、レコード数が用意したコントロール数を超えてしまうということもあるし、コード量が増えて、メンテナンスも大変になるだけでメリットがあるようには思えないですが。
リンゴさん
派生・親子・参照それぞれの関係性について
ご提案いただきありがとうございます。
このDBは、口座番号で検索する既存用紙をDB化したものなので、
口座番号を主キーにした方が、不特定多数の者が使用することを想定しても
移行しやすいと思い設計しました。ご提案の内容も、一度検討したいと思います。
toneさん
列名の件、設計段階で「どうかな?」なんて思いながらもハイフンを使用しました。
改名したいと思います。ありがとうございます!
hatenaさん
ご指摘ありがとうございます。
ちょうど一年前に、こちらで非連結フォームの質問をした際に、同じようなご指摘を頂きました。
前回のDBでは、最大10人の者が使用する想定でしたので、よく目にする「ユーザー用の画面は
非連結で、予期せぬ更新を排除」というのを実践したく、こちらで助けていただきました。
今回のDBでは、データ編集をするのは最大3人で、かつ同時にデータ編集は行われないので、
ご指摘の通り、連結で設計してもよいかもしれませんね!
そうしたいのであれば、責任を負わなくて済むように立ち回りましょう。会社から口座番号を主キーにするように命令されていたので、その前提のもとで設計を開始したんだ。諸々の選択肢を検討したんだけれどね。根回し・既成事実化しておかないと詰みますな。
りんごさん
社内では、製品を口座番号で管理しております。
また、当該DBは社内基幹システムの口座番号と紐付けされています。
口座管理は既成事実ですので、おそらく問題は起こらないのでは?と考えております。
ありがとうございます!