Access 非連結ボックスの入力確認して、元に戻す。

簡単そうでなかなかできなかった案件。

Me.Undoをすれば戻にもどるとか、Me.テキストボックス.valuedefault すれば戻るとかあったけどできない。

結局スマートではないだろうが、下記の方法で切り抜けた。

(1)フォームにダミーの記憶するためのテキストボックスを準備
(2)対象の非連結テキストボックスにフォーカスが当たったら、ダミーのテキストボックスに値を退避
Private Sub input_MNO_GotFocus()
MNOD = input_MNO
End Sub

(3)
Private Sub input_MNO_AfterUpdate()

If MNOD = 0 Then

If MsgBox(“WCから他社に変更するとWCマスタデータも同時に削除されます。”, vbYesNo, “WC変更確認”) = vbYes Then

If DCount(“*”, “dbo_mst_maker”, “[MNO]=[input_MNO]”) = 0 Then
MsgBox “そのメーカー番号は存在しません。”
input_MNO = MNOD
Me.input_メーカー名 = DLookup(“メーカー名”, “dbo_mst_maker”, “MNO=” & Me.MNOD)
Me.input_メーカー名.SetFocus
Me.input_MNO.SetFocus
Else

Me.input_メーカー名 = DLookup(“メーカー名”, “dbo_mst_maker”, “MNO=” & Me.input_MNO)

End If
Else
input_MNO = MNOD  ※0以外でNOでキャンセルした時は、戻に戻すをやっている。
Exit Sub
End If

Else

If DCount(“*”, “dbo_mst_maker”, “[MNO]=[input_MNO]”) = 0 Then
MsgBox “そのメーカー番号は存在しません。”
input_MNO = Null
input_メーカー名 = Null
Me.input_メーカー名.SetFocus
Me.input_MNO.SetFocus
Else

Me.input_メーカー名 = DLookup(“メーカー名”, “dbo_mst_maker”, “MNO=” & Me.input_MNO)

End If
End If
On Error Resume Next

End Sub

Access 文字列の検索

文字列キーを呼び出して、非連結のフォームにデータを呼び出すVBA

Private Sub outsourcing_no_AfterUpdate()

If DCount(“外注手配番号”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”) = 0 Then
MsgBox “外注手配番号の登録がありません。ご確認ください。”
outsourcing_no = Null
Me.call_HNO.SetFocus
Me.outsourcing_no.SetFocus
Else

Me.call_HNO = DLookup(“HNO”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_手順 = DLookup(“手順”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_品名コード = DLookup(“品名コード”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_品名 = DLookup(“品名”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_型式 = DLookup(“型式”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_担当工程 = DLookup(“担当工程”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_メーカー名 = DLookup(“メーカー名”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_加工仕様 = DLookup(“加工仕様”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_加工費 = DLookup(“加工費”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_加工日数 = DLookup(“加工日数”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_加工累計 = DLookup(“加工累計”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)
Me.call_次工程 = DLookup(“次工程”, “dbo_outsourcing_running”, “外注手配番号='” & Me.outsourcing_no & “‘”)

Exit Sub
End If

End Sub

Access Dlookup 非連結テキストボックスに表示

レポートにて、あるテーブルからDlookupである条件のレコードフィールドを引っ張ってきたかったが、なかなかできなかった。

=DLookUp(“月次処理年月”,”dbo_mst_月次”,[終了確認]=”作業中”)

dbo_mst_月次 テーブル

JNO 月次処理年月 終了確認
1   2017/01/01   終了
2 2017/02/01 終了
3 2017/03/01 作業中
4 2017/04/01

2017/03/01 を出したいのに、2017/01/01がでます。そして、結論は?

=DLookUp(“[月次処理年月]”,”dbo_mst_月次”,”[終了確認]=’作業中'”)

ポイントは、
1.条件式部分全体をダブルクォーテーションでくくる
2.=の後は、数値ならそのまま、文字列ならシングルクォーテーションでくくる
3.変数で指定する場合は”[終了確認]=” & 変数 & “)”
となります。

Access パススルークエリ

SQLserverとの接続で、テーブルやクエリをそのままフォームにして作業をすると遅くなることは前回説明した。

その回避方法の一つとしてAccess側にパススルークエリにするってことで、今回はその説明。

つまり、viewのリンクテーブルじゃ遅いので、早いviewのリンクテーブルだと思えばいい。

(1)SQLserver側で、Viewを作成して、SQLをコピー
(2)Access側で、適当(テーブルも適当でOK)な選択クエリを作成して、パススルークエリに種類を変更すると、現在のSQLが見れるので、(1)のSQLを貼り付けるだけ。
(3)「プロパティ」の「ODBC接続文字列」の行をクリックして、「ODBC」が表示されるので設定

これでクエリのリストにパススルークエリが作成されます。
リンクテーブルのようなマークのクエリが作成されて、テーブルと同じように使える。

ただ、あくまでも見るためのものであり、更新などの作業はできない。

つまり、これを非連結にして抽出や検索をして、VBAでアップデートや削除の作業をさせることが、理想なのでしょう。

Access 非連結窓に抽出表示

コード [コンボボックス] [商品詳細] [商品値段]

商品テーブルから、コンボボックスで、商品コードを選択すると、非連結の商品詳細と商品値段に表示をさせたい場合。

Private Sub コード_AfterUpdate()

With Me!コード
‘コンボボックスの2列目を得意先名テキストボックスに代入
Me!商品詳細 = .Column(1)
‘コンボボックスの3列目を得意先名テキストボックスに代入
Me!商品値段 = .Column(2)
End With
End Sub

ただ単に、非連結窓にデータを表示させたいときは便利だ。
ルックアップウイザードなどで、設定すると、番号だけが、表示されて中身が分からない場合などには、使える機能だ。