お世話になっております。
T_依頼の[依頼者][依頼理由_1][依頼理由_2][依頼理由_3]の表示コントロールを
コンボボックスからテキストボックスに変更した直後から、それまで読み込まれていた
これら4つのフィールドが読み込まなくなりました(ブランクになってしまいます)
表示コントロールの変更が引き金となっていると思うのですが、、、。
ご教示ください!
'##########################
'### 過去IDの読込を行う ###
'##########################
Private Sub btn過去ID読込_Click() '「btn過去ID読込」をクリックした時
Call loadForm '読込を呼び出し
End Sub
Private Sub loadForm() '読込処理
If IsNull(Me.txt依頼ID.Value) Then Exit Sub '「txt依頼ID」が空なら
Me.txt依頼日.Value = Null '「txt依頼日」をクリア
Me.cmb依頼者.Value = Null '「cmb依頼者」をクリア
Me.cmbWNo.Value = Null '「cmbWNo」をクリア
Me.txt品名.Value = Null '「txt品名」をクリア
Me.cmb希望処置.Value = Null '「cmb希望処置」をクリア
Me.txtロット番号.Value = Null '「txtロット番号」をクリア
Me.cmbロット枝.Value = Null '「cmbロット枝」をクリア
Me.txt巻き長さ.Value = Null '「txt巻き長さ」をクリア
Me.cmb依頼理由1.Value = Null '「cmb依頼理由1」をクリア
Me.cmb依頼理由2.Value = Null '「cmb依頼理由2」をクリア
Me.cmb依頼理由3.Value = Null '「cmb依頼理由3」をクリア
Me.txt補足説明.Value = Null '「txt補足説明」をクリア
Me.txt検品フィードバック.Value = Null '「txt検品フィードバック」をクリア
On Error GoTo ErrorHandler
Dim strSQL As String
strSQL = _
"SELECT [依頼日], [依頼者], [W_No], [品名], [希望処置], [ロット番号], [ロット枝], [巻き長さ], [依頼理由_1], [依頼理由_2], [依頼理由_3], [補足説明], [検品フィードバック] " & _
"FROM T_依頼 " & _
"WHERE 依頼ID = '" & Me.txt依頼ID.Value & "';" 'SQLを作成
Dim daoDb As dao.Database
Set daoDb = CurrentDb
Dim daoRs As dao.Recordset
Set daoRs = daoDb.OpenRecordset(strSQL)
If daoRs.BOF = True And daoRs.EOF = True Then
MsgBox "対象レコードがありません。", vbInformation, "確認"
GoTo Finally 'レコードが無ければ終了
End If
Me.txt依頼日.Value = daoRs![依頼日] '抽出したレコードをテキストボックスへ
Me.cmb依頼者.Value = daoRs![依頼者]
Me.cmbWNo.Value = daoRs![W_No]
Me.txt品名.Value = daoRs![品名]
Me.cmb希望処置.Value = daoRs![希望処置]
Me.txtロット番号.Value = daoRs![ロット番号]
Me.cmbロット枝.Value = daoRs![ロット枝]
Me.txt巻き長さ.Value = daoRs![巻き長さ]
Me.cmb依頼理由1.Value = daoRs![依頼理由_1]
Me.cmb依頼理由2.Value = daoRs![依頼理由_2]
Me.cmb依頼理由3.Value = daoRs![依頼理由_3]
Me.txt補足説明.Value = daoRs![補足説明]
Me.txt検品フィードバック.Value = daoRs![検品フィードバック]
Me.btn追加.Enabled = False '「btn追加」を使用不可に
Me.btn更新.Enabled = True '「btn更新」を使用可能に
Me.btn削除.Enabled = True '「btn削除」を使用可能に
Me.txt依頼ID.Enabled = False '「txt依頼ID」を使用不可に
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
'######################################
'### 読込終了ボタンをクリックした時 ###
'######################################
Private Sub btn読込終了_Click()
Call initializeForm
Call Form_Current
End Sub
'##############################
'### レコード移動時のID採番 ###
'##############################
Private Sub Form_Current()
Const prefix As String = "C" '「color」の頭文字 "C"
Dim maxID As String
maxID = DMax("依頼ID", "T_依頼") '最終IDを取り出す
Dim lastNum As Long
lastNum = Replace(maxID, prefix, "") '最終IDから頭文字"C"を除き、数値型へ代入する
Dim newID As String
newID = prefix & Format(lastNum + 1, "0000000") '+1して桁を揃えて頭文字"C"と結合
Me.txt依頼ID.DefaultValue = "'" & newID & "'" '既定値へ代入
End Sub
'######################################################
'### フォームを開いた時に適用する初期化プロシージャ ###
'######################################################
Private Sub Form_Load()
Call initializeForm 'フォームを開いたら「初期化プロシージャ」を呼び出す
End Sub
'########################################################################
'### 次ロットボタンをクリックした時に適用する初期化とID採番のプロシージャ ###
'########################################################################
Private Sub btn次ロット_Click() '「btn次ロット」をクリックした時
Me.txtロット番号.Value = Null '7項目を初期化
Me.cmbロット枝.Value = Null
Me.txt巻き長さ.Value = Null
Me.cmb依頼理由1.Value = Null
Me.cmb依頼理由2.Value = Null
Me.cmb依頼理由3.Value = Null
Me.txt補足説明.Value = Null
Const prefix As String = "C" '「color」の頭文字 "C"
Dim maxID As String
maxID = DMax("依頼ID", "T_依頼") '最終IDを取り出す
Dim lastNum As Long
lastNum = Replace(maxID, prefix, "") '最終IDから頭文字"C"を除き、数値型へ代入する
Dim newID As String
newID = prefix & Format(lastNum + 1, "0000000") '+1して桁を揃えて頭文字"C"と結合
Me.txt依頼ID.DefaultValue = "'" & newID & "'" '既定値へ代入
End Sub
'##########################
'### 初期化プロシージャ ###
'##########################
Private Sub initializeForm() '初期化
Me.txt依頼日.Value = Null '「txt依頼日」をクリア
Me.cmb依頼者.Value = Null '「cmb依頼者」をクリア
Me.cmbWNo.Value = Null '「cmbWNo」をクリア
Me.txt品名.Value = Null '「txt品名」をクリア
Me.cmb希望処置.Value = Null '「cmb希望処置」をクリア
Me.txtロット番号.Value = Null '「txtロット番号」をクリア
Me.cmbロット枝.Value = Null '「cmbロット枝」をクリア
Me.txt巻き長さ.Value = Null '「txt巻き長さ」をクリア
Me.cmb依頼理由1.Value = Null '「cmb依頼理由1」をクリア
Me.cmb依頼理由2.Value = Null '「cmb依頼理由2」をクリア
Me.cmb依頼理由3.Value = Null '「cmb依頼理由3」をクリア
Me.txt補足説明.Value = Null '「txt補足説明」をクリア
Me.txt検品フィードバック.Value = Null '「txt検品フィードバック」をクリア
Me.btn追加.Enabled = True '「btn追加」を使用可能に
Me.btn更新.Enabled = False '「btn更新」を使用不可に
Me.btn削除.Enabled = False '「btn削除」を使用不可に
Me.txt依頼ID.Enabled = True '「txt依頼ID」を使用可能に
End Sub
'###############################
'### txt品名に対する入力補助 ###
'###############################
Private Sub cmbWNo_AfterUpdate() '「cmbW_No」の更新後処理
txt品名.Value = cmbWNo.Column(2) '「txt品名」に2列目を表示。編集不可で設定中
End Sub
'##############################################
'### T_依頼にレコードを入力するプロシージャ ###
'##############################################
Private Sub btn追加_Click() '「btn追加」をクリックした時
If IsNull(Me.txt依頼日.Value) _
Or IsNull(Me.cmb依頼者.Value) _
Or IsNull(Me.cmbWNo.Value) _
Or IsNull(Me.cmb希望処置.Value) _
Or IsNull(Me.txtロット番号.Value) _
Or IsNull(Me.txt巻き長さ.Value) _
Or IsNull(Me.cmb依頼理由1.Value) Then '入力チェック
MsgBox "必要項目が入力されていません", vbInformation, "確認"
Exit Sub
End If
Dim db As dao.Database 'データベースへの参照を代入する変数を宣言する
Dim rs As dao.Recordset 'レコードセットへの参照を代入する変数を宣言する
Set db = CurrentDb() '現在のデータベースに接続する
Set rs = CurrentDb.OpenRecordset("T_依頼", dbOpenDynaset) '「T_依頼」への参照を変数rsに代入する
With rs '「T_依頼」にレコードを入力する
.AddNew 'レコードを入力する
.Fields("依頼ID") = Me!txt依頼ID
.Fields("依頼日") = Me!txt依頼日
.Fields("依頼者") = Me!cmb依頼者.Column(2)
.Fields("W_No") = Me!cmbWNo.Column(7)
.Fields("品名") = Me!txt品名
.Fields("希望処置") = Me!cmb希望処置
.Fields("ロット番号") = Me!txtロット番号
.Fields("ロット枝") = Me!cmbロット枝
.Fields("巻き長さ") = Me!txt巻き長さ
.Fields("依頼理由_1") = Me!cmb依頼理由1.Column(1)
.Fields("依頼理由_2") = Me!cmb依頼理由2.Column(1)
.Fields("依頼理由_3") = Me!cmb依頼理由3.Column(1)
.Fields("補足説明") = Me!txt補足説明
.Update 'レコードを更新する
End With
rs.Close 'レコードセットを閉じる
Me.txtロット番号.Value = Null '「btn追加」をクリックしたら7項目を初期化(連続作業に対応するため)
Me.cmbロット枝.Value = Null
Me.txt巻き長さ.Value = Null
Me.cmb依頼理由1.Value = Null
Me.cmb依頼理由2.Value = Null
Me.cmb依頼理由3.Value = Null
Me.txt補足説明.Value = Null
MsgBox "追加しました", vbInformation, "完了"
End Sub
'#######################################################
'### テーブル変更のSQLを実行するFunctionプロシージャ ###
'#######################################################
Public Function tryExecute(strSQL As String) As String 'SQLを実行してメッセージを返す関数
On Error GoTo ErrorHandler
Dim daoDb As dao.Database
Set daoDb = CurrentDb '接続
daoDb.Execute strSQL '実行
tryExecute = "" '成功の場合は空の文字列が入る
GoTo Finally '正常に終了したら接続解除へジャンプ
ErrorHandler: 'エラー処理
tryExecute = "Error #: " & Err.Number & vbNewLine & vbNewLine & Err.Description 'エラーの場合はエラーメッセージが入る
Finally: '接続解除
If Not daoDb Is Nothing Then
daoDb.Close
Set daoDb = Nothing
End If
End Function
'############################
'### UPDATE文の作成と実行 ###
'############################
Private Sub btn更新_Click() '「btn更新」のクリックイベントプロシージャ
Dim strSQL As String
strSQL = _
"UPDATE T_依頼 " & _
"SET " & _
"[依頼者] = '" & Me.cmb依頼者.Value & "', " & _
"[W_No] = '" & Me.cmbWNo.Value & "', " & _
"[品名] = '" & Me.txt品名.Value & "', " & _
"[希望処置] = '" & Me.cmb希望処置.Value & "', " & _
"[ロット番号] = '" & Me.txtロット番号.Value & "', " & _
"[ロット枝] = '" & Me.cmbロット枝.Value & "', " & _
"[巻き長さ] = '" & Me.txt巻き長さ.Value & "', " & _
"[依頼理由_1] = '" & Me.cmb依頼理由1.Value & "', " & _
"[依頼理由_2] = '" & Me.cmb依頼理由2.Value & "', " & _
"[依頼理由_3] = '" & Me.cmb依頼理由3.Value & "', " & _
"[補足説明] = '" & Me.txt補足説明.Value & "', " & _
"[検品フィードバック] = '" & Me.txt検品フィードバック & " ' " & _
"WHERE 依頼ID = '" & Me.txt依頼ID.Value & "';" 'UPDATE文の作成
Dim errMsg As String
errMsg = tryExecute(strSQL) 'SQLを実行してメッセージを受け取る
If errMsg <> "" Then 'メッセージが空ではない(エラーがあった)場合
MsgBox errMsg, vbCritical, "エラー" '受け取ったエラーメッセージを出力
Exit Sub '終了
End If
Call loadForm '再度読み込み処理を呼び出す
MsgBox "更新しました", vbInformation, "完了" '完了メッセージを出力
End Sub
以下の点を提示してください。
そのフォームは非連結フォーム(「レコードソース」プロパティが空欄)ですか。
テキストボックスに変換する前のコンボボックスの下記の設定。
コントロールソース
値集合ソース
連結列
列数
列幅
現状のコードに下記のデバック用コードを挿入して実行した後の、イミディエイトウィンドウの結果
ご回答ありがとうございます。
このフォームは非連結フォームです(「レコードソース」プロパティは空欄)
「T_依頼」のルックアップで、テキストボックスからコンボボックスに変更する前の設定は以下の通り。
フィールド[W_No]
表示コントロール:コンボボックス
値集合ソース:ORDER FILE
連結列:1
列数:8
列幅:0cm;0cm;0cm;0cm;0cm;0cm;0cm;3cm
フィールド[依頼者]
表示コントロール:コンボボックス
値集合ソース:T_着色作業者
連結列:1
列数:3
列幅:0cm;0cm;2cm
フィールド[依頼理由_1][依頼理由_2][依頼理由_3]
表示コントロール:コンボボックス
値集合ソース:T_理由
連結列:1
列数:2
列幅:0cm;4cm
それはテーブル「T_依頼」のフィールドのルックアップの設定ですよね。
フォーム上の変更する前のコンボボックスの設定も同じですか。
また、そのルックアップの設定だと、連結列の列幅が0に設定されているので、
そのテーブルをデータシートビューとして開いたとき、表示されていく値と実際に格納されている値は異なるということは理解していますか。
例えば、
フィールド[W_No]
表示コントロール:コンボボックス
値集合ソース:ORDER FILE
連結列:1
列数:8
列幅:0cm;0cm;0cm;0cm;0cm;0cm;0cm;3cm
なら、表示されている値は「ORDER FILE」の8列目の値、格納されている値は1列目の値になります。
格納されている値は、ルックアップの表示コントロールをテキストボックスに変更すると確認できます。
非連結フォームに表示したいのは、表示されている値か、格納されている値のどちらですか。
あと、デバック用コードを挿入して実行した結果も教えてください。
ありがとうございます!
<フォーム上の変更する前のコンボボックスの設定も同じですか。
<表示されていく値と実際に格納されている値は異なるということは理解していますか。
仰るとおり、テキストボックスに変更後、格納された値にズレが生じました。前述の列数と列幅は、値を
コンボボックス = テキストボックスにするために
変更した現在のコンボボックスの設定です。
<非連結フォームに表示したいのは、表示されている値か、格納されている値のどちらですか。
表示したいのは格納されている値です。
そもそも、何故テキストボックスに変更したかと
申しますと、フォーム上で検索をかけた際に
ルックアップがコンボボックスになっていた
フィールドだけ、検索できなかった為に、
テキストボックスにすれば解決できるかと、
安易に考えた末に至った結論です。
<デバック用コードを挿入して実行した結果も教えてください。
明日以降、試した結果をお知らせします。
よろしくお願いします。
イミディエイトウィンドウの結果は以下のようになりました。
前に「フォーム上で検索をかけた…」と書きましたが、
これは、テーブル「T_依頼」からクエリ「Q_依頼履歴」を作り、
レコードソース「Q_依頼履歴」からなるフォーム「F_依頼履歴一覧」の中に、
書籍に掲載されていた検索機能を盛り込んだものです。
書籍の作例は、検索フィールドが全てテキストボックスでしたが、
私の製作したものはコンボボックスが3つ出来てしまっています。
これをテキスト形式に変更すれば...といった素人考えから発展した醜態です。
過去データの読込にはコンボボックスの方が望み通りの結果になりますが、
一方の検索では、、、といった感じです。
ならばと、コンボボックスの値もヒットする方法も調べてみましたが
見つかりませんでした。
「F_依頼履歴一覧」の検索コード
デバッグ結果
テキストボックスに値が表示されないというのは、
cmbロット枝, cmb依頼理由2, cmb依頼理由3
のことですか。
だとしたら、コードの問題ではなく、テーブルのフィールド自体に値がないのが原因ですね。
それ以外のテキストボックスで値が表示されないのですか。それはどのテキストボックスですか。
読込で値が表示されないのは
依頼者、依頼理由1、依頼理由2、依頼理由3です。
今回読込んだレコードのロット枝、依頼理由2、依頼理由3はブランクになっています。
横からすみません.
その状況で、適当な値を手入力するとどうなりますか?もし、入力出来ないなら、プロパティシートのデータタブだったかと思いますが、編集可否を確認してみるとか。
あとは問題があるようには見えないので、何か追加情報を出して誰かが運良く気づくのを期待するしかないかと思います。レイアウトビューのスクリーンショットやプロパティシート(データタブ)のスクリーンショットなど。
デバッグでは、
daoRs![依頼者]: 齋藤 cmb依頼者.Value: 齋藤
とデータが代入されているのに表示されないのは、ありえない現象ですね。
テキストボックスをもとのコンボボックスに戻すと表示されますか。
あと、
On Error GoTo ErrorHandler
をコメントアウトして実行した場合、エラーはでますか。
コマンドボタンを追加して、下記のように設定してクリックしたときはどうなりますか。
Private Sub CommandButton1_Click()
Me.cmb依頼者.Value = "齋藤"
End Sub
りんごさん
ありがとうございます!
プロパテーシートを確認しましたが、編集ロックは「いいえ」でした。
hatenaさん
コンボボックスに戻すと、しっかり表示されるのです。
ここは、何回か作り直して確認済みです。
コマンドボタンを追加したのち、上記を試しましたが
変化は生じませんでした。
ちょっと気になっている事として、
T_依頼の[依頼者]を以前のようにコンボボックスに戻すと
読み込みで表示される「希望通り」の結果になり、
一方で、コンボボックスの値だけ検索かけてもヒットしないという
「希望通りではない」結果が生み出されています。
コンボボックスを検索ヒットさせる手段はないのでしょうか?
cmb依頼者のプロパティシートのスクショを
2分割にしてみました。何か発見されることを願って,,,