|
Mainフォーム”R/3コード””小区分名称””中区分名称””大区分名称””内容””具体例””注意点”テキストボックスに、
サブフォーム SubGL勘定の抽出結果を表示させたいと思ってます。
ソースコードの書き方がわかりません。
ご指導よろしくお願いします
Option Compare Database
Option Explicit
Public Function SetFilter()
Dim stCri As String
'配列変数を使用 配列番号はゼロから始まります。
Dim MyCount(2) As Integer
'Private Sub ComboBoxInit()をCALLプロシージャで呼び出す。
Call ComboBoxInit
'抽出条件を設定する
With Me.ActiveControl
stCri = .Name & " LIKE '" & .Value & "*'"
End With
'上記のlike演算子の条件でフォームフィルターをかける
Me.X0001GL勘定.Form.Filter = stCri
Me.X0001GL勘定.Form.FilterOn = True
'レコード全件を代入する
MyCount(0) = DCount("*", "X0001GL勘定")
'抽出件数を代入する
MyCount(1) = DCount("*", "X0001GL勘定", Me.ActiveControl.Name & " LIKE '" & Me.ActiveControl.Value & "*'")
'抽出件数をラベルに表示させる
If MyCount(1) = 0 Then
'レコードが無いときは"抽出データなし"と表示
Me.L1.Caption = "抽出データなし"
Else
'レコードがあるときは全レコード件数と抽出件数を表示させる
Me.L1.Caption = "全レコード " & MyCount(0) & " 件中 " & MyCount(1) & " 件抽出しました"
End If
Call ラベル情報
End Function
Private Sub Cmd解除_Click()
ComboBoxInit
Me.X0001GL勘定.SetFocus
Me.X0001GL勘定.Form.Filter = ""
Me.X0001GL勘定.Form.FilterOn = False
End Sub
Private Sub txtGL勘定検索_AfterUpdate()
Call CallPrivate4
End Sub
Private Sub CallPrivate4()
Dim StrSQL As String
'サブフォームのレコードセットのSQL文を代入する
Dim MyName As Variant
'アクティブコントロール名を歳入する変数
Dim MyVariable As String
'フォーム上で取得した変数名
'DCount関数のレコード数を代入する変数
'アクティブなコントロール名を取得する
MyName = Me.ActiveControl.Name
'初期化
MyCount = 0
'SQL文の条件句の分岐条件をSELECT CASE文で対応して簡素化する
Select Case MyName
Case "txt単価契約品名検索"
MyVariable = " WHERE 単価契約.品名 LIKE '*" & [Forms]![MAIN購買依頼]![txt単価契約品名検索] & "*' ;"
'txt品目検索に該当するレコード数をカウントする
MyCount = DCount("品名", "単価契約", "品名 like '*" & [Forms]![MAIN購買依頼]![txt単価契約品名検索] & "*'")
Case "Cmd解除"
MyVariable = " ;"
'全レコード数をカウントする
MyCount = DCount("品名", "単価契約")
End Select
'サブフォームのレコードソースに代入するSQL文
StrSQL = "SELECT * FROM 単価契約 " & MyVariable
'SQL文をサブフォームのレコードソースに代入する
Me.Sub購買依頼.Form.RecordSource = StrSQL
'サブフォームを再表示させる処理
Forms![MAIN購買依頼]![Sub購買依頼].Form.Requery
Me.txt件数.Value = MyCount
End Sub
Private Sub ComboBoxInit()
'コンボボックスの初期化
Dim Ctl As Control
For Each Ctl In Me.Controls
With Ctl
'以下のIf文の説明内容
'Or演算子よりAndの演算子が優先されるので
'Or演算子の計算を先にさせるため、括弧で括っておく。
'でないと、コンボboxで選択した項目が以下のif文でtrueとなり
'コンボboxをnull値を代入してしまうため。
'IF文の内容は以下の通り
'コンボboxもしくはテキストboxである時、←これが優先事項なので括弧で括る。
'尚且つアクティブなコントロール名と一緒でない
'演算子の優先順位により論理的に正しくても
'得られる結果が違ってくる場合がある
'例
' 3 - 2 * 5 = 7
'(3 - 2 )* 5 = 5
'数学的に説明すると掛算と足算、引算が混載する場合は掛算や割算が優先される
'割算、掛算が混載する場合は左側から計算される。 足算、引算はその後になります。
'これを四則演算の法則といい、VBAのOR,AND等にも当てはまりますので
'ANDとORの演算子が混在するときでORを先に計算するときは括弧で括る。
If (.ControlType = acComboBox Or .ControlType = acTextBox) And _
.Name <> Me.ActiveControl.Name Then
'コンボボックスをNULL(空)に設定(アクティブコントロール以外)
.Value = Null
End If
End With
Next Ctl
End Sub
Sub ラベル情報()
' 商品名lbl.Caption = 商品コードcmb.Column(1)
' 商品区分説明lbl.Caption = DLookup("[説明]", "商品区分T", "[区分コード]=" & 商品コードcmb.Column(2))
' Me.lblR3番号.Caption = DLookup("[R/3コード]", "X0001GL勘定", "[R/3コード]=" & [MainGL勘定Pr]![SubGL勘定].Column(3))
Me.txtR3番号.Value = DLookup("[R/3コード]", "X0001GL勘定", [Forms]![MainGL勘定Pr]![小区分名称])
End Sub
Private Sub Cmd最後_Click()
Forms!MainGL勘定Pr.SetFocus
Forms!MainGL勘定Pr!X0001GL勘定.SetFocus
DoCmd.GoToRecord , , acLast
End Sub
Private Sub Cmd次_Click()
Forms!MainGL勘定Pr.SetFocus
Forms!MainGL勘定Pr!X0001GL勘定.SetFocus
DoCmd.GoToRecord , , acNext
End Sub
Private Sub Cmd先頭_Click()
Forms!MainGL勘定Pr.SetFocus
Forms!MainGL勘定Pr!X0001GL勘定.SetFocus
DoCmd.GoToRecord , , acFirst
End Sub
Private Sub Cmd前_Click()
Forms!MainGL勘定Pr.SetFocus
Forms!MainGL勘定Pr!X0001GL勘定.SetFocus
DoCmd.GoToRecord , , acPrevious
End Sub
|
|