'======================= '「新規伝票」ボタンをクリックしたときの処理 '======================= Private Sub Command1_Click() Dim rs As ADODB.Recordset, d_id As Long '変数の定義 DataEnvironment1.Connection1.BeginTrans 'トランザクションを開始する DataEnvironment1.MakeDenpyouRecord Date '新しくdenpyouテーブルにレコードを作成する 'コマンドMakeDenpyouRecordの定義は:insert into denpyou(date) values(?) Set rs = DataEnvironment1.rsGetMaxID_Denpyou 'denpyouテーブルのidの最大値を得る 'コマンドGetMaxID_Denpyouの定義は:select max(id) from denpyou rs.Open 'コマンドGetMaxID_DenpyouのSQLステートメントを実行する d_id = rs.Fields(0).Value '実行結果を得る。最初のレコードの最初のフィールドがidの最大値 rs.Close 'レコードセットは閉じておく DataEnvironment1.NewDenpyouRec d_id '新しく作ったレコードだけのレコードセットを得る。これによりパラメータクエリーが実行される 'コマンドNewDenpyouRecの定義は:select * from denpyou where id=? Set rs = DataEnvironment1.rsNewDenpyouRec 'パラメータを設定して実行したSQLステートメントの結果をレコードセットとして得る Set Text1.DataSource = rs 'Text1はidフィールド用のテキストボックス Text1.DataField = "id" 'プロパティを設定して、レコードセットとテキストボックスをバインドする Set DataCombo1.DataSource = rs 'DataCombo1はcustomer_idフィールド用のテキストボックス DataCombo1.DataField = "customer_id" '選択肢に関する設定はプロパティで行う Set Text2.DataSource = rs 'Text2はdateフィールド用のテキストボックス Text2.DataField = "date" DataEnvironment1.MakeMeisaiRecord d_id '明細のレコードを新しく作成する 'コマンドMakeMeisaiRecordの定義は:insert into meisai(denpyou_id,item_id) values(?,1001) DataEnvironment1.MeisaiNewDenpyou d_id '明細部分のレコードセットを構築するため、パラメータを設定してSQLステートメントを実行 'コマンドMeisaiNewDenpyouの定義は:select name,unit_price,qty,price,item_id,denpyou_id,id from meisai_item_name where denpyou_id=? order by id Set rs = DataEnvironment1.rsMeisaiNewDenpyou '明細部分のレコードセットを得る Set MSHFlexGrid1.DataSource = rs 'レコードセットをグリッドに設定する FitGrid MSHFlexGrid1 'グリッドの各列の幅をデータに合わせて調整する DataCombo2_Change '初期状態で、「単価」のテキストボックスにデータがあるようにする Command1.Enabled = False 'ボタンの利用の可否をコントロール Command2.Enabled = True Command3.Enabled = True End Sub '======================= '「新規明細」ボタンをクリックしたときの処理 '======================= Private Sub Command2_Click() Dim rs As ADODB.Recordset, d_id As Long '変数の定義 d_id = Text1.Text 'denpyouテーブルのidフィールドの値を得る DataEnvironment1.MakeMeisaiRecord d_id '明細のレコードを新しく作成する 'コマンドMakeMeisaiRecordの定義は:insert into meisai(denpyou_id,item_id) values(?,1001) Set rs = DataEnvironment1.rsMeisaiNewDenpyou '明細のレコードセットを取得する rs.Close '明細のレコードセットをいったん閉じる DataEnvironment1.MeisaiNewDenpyou d_id '再度明細のレコードセットを得るため、パラメータを設定してSQLステートメントを実行 Set MSHFlexGrid1.DataSource = rs 'グリッドにレコードセットを再設定する rs.MoveLast '編集対象となる明細レコードを最後のレコードにする FitGrid MSHFlexGrid1 'グリッドの各列の幅をデータに合わせて調整する End Sub '======================= '「更新」ボタンをクリックしたときの処理 '======================= Private Sub Command3_Click() Dim rs As ADODB.Recordset, d_id As Long, ed_id As Long '変数の定義 d_id = Text1.Text 'denpyouテーブルのidフィールドの値を得る ed_id = Text5.Text 'meisaiテーブルのidフィールドの値を得る DataEnvironment1.UpdateMeisai _ DataCombo2.BoundText, _ NullZero(Text3.Text), NullZero(Text4.Text), ed_id 'meisaiテーブルに対して更新をかける 'コマンドUpdateMeisaiの定義は:update meisai set item_id=?, qty=?, unit_price=? where id=? Set rs = DataEnvironment1.rsMeisaiNewDenpyou '明細のレコードセットを得る rs.Close 'いったんレコードセットを閉じる DataEnvironment1.MeisaiNewDenpyou d_id 'パラメータを与えてレコードセットを再構築 'rs.Requeryだとパラメータの設定がなされないのでこうしないといけない Set MSHFlexGrid1.DataSource = rs 'レコードセットをグリッドに設定 rs.MoveFirst '明細のレコードセットの先頭に rs.Find "id=" & ed_id '現在更新シタレコードをカレントレコードにする CalcSum '合計などを計算する FitGrid MSHFlexGrid1 'グリッドの各列の幅をデータに合わせて調整する End Sub '======================= '「作業終了」ボタンをクリックしたときの処理 '======================= Private Sub Command4_Click() Dim rs As ADODB.Recordset '変数の定義 Set rs = DataEnvironment1.rsNewDenpyouRec 'denpyouテーブルのレコードセットを取得し rs.CancelUpdate '更新内容は破棄する rs.Close 'レコードセットを閉じる Set rs = DataEnvironment1.rsMeisaiNewDenpyou '明細側のレコードセットを取得し rs.Close 'レコードセットを閉じる DataEnvironment1.Connection1.RollbackTrans 'ロールバックを行う Unload Form5 'フォームを閉じる End Sub '======================= '「伝票確定」ボタンをクリックしたときの処理 '======================= Private Sub Command5_Click() Dim rs As ADODB.Recordset '変数の定義 Set rs = DataEnvironment1.rsNewDenpyouRec 'denpyouテーブルのレコードセットを取得し rs.Fields("price_sum") = Text6.Text '合計金額をprice_sumフィールドに設定 rs.Update '更新内容を確定する rs.Close 'レコードセットを閉じる Set rs = DataEnvironment1.rsMeisaiNewDenpyou '明細側のレコードセットを取得する rs.MoveFirst Do While (Not rs.EOF) 'レコードセットのレコードを順番に処理を行う DataEnvironment1.ZaikoAdj _ rs.Fields("qty").Value, _ rs.Fields("item_id").Value '明細の商品の個数に応じて在庫調節を行う 'コマンドZaikoAdjの定義は:update items set stocks=stocks-? where id=? rs.MoveNext Loop rs.Close 'レコードセットを閉じる DataEnvironment1.Connection1.CommitTrans 'コミットする Unload Form5 'フォームを閉じる End Sub '======================= '商品名をコンボボックスで選択したときの処理 '======================= Private Sub DataCombo2_Change() Dim i_id As Long i_id = DataCombo2.BoundText 'コンボボックスでの選択結果を取得 Set rs = DataEnvironment1.rsitems 'itemsテーブルのレコードセットを取得 rs.MoveFirst rs.Find "id=" & i_id '選択した項目のレコードをカレントにする Text4.Text = rs.Fields("unit_price") 'unit_priceフィールドを取り出し、Text4に設定する End Sub '======================= 'フォームを開くときの処理 '======================= Private Sub Form_Load() Command2.Enabled = False Command3.Enabled = False End Sub '======================= '定義関数:NullZero ' 引数がNullや "" ならば0、そうでないなら数値を戻す '======================= Private Function NullZero(d As Variant) As Long If IsNull(d) Then NullZero = 0 ElseIf d = "" Then NullZero = 0 Else NullZero = CLng(d) End If End Function '======================= 'グリッドの選択セルを変更したときの処理 '======================= Private Sub MSHFlexGrid1_RowColChange() Dim rs As ADODB.Recordset, d_id As Long, j As Integer '変数の定義 'グリッド中の「id」フィールドの列が何番目かを調べる For j = 1 To 100 If MSHFlexGrid1.ColHeaderCaption(0, j) = "id" Then Exit For Next j MSHFlexGrid1.Col = j 'idフィールドの列をカレントにする Set rs = DataEnvironment1.rsMeisaiNewDenpyou '明細のレコードセットを取得 rs.MoveFirst rs.Find "id=" & MSHFlexGrid1.Text 'グリッドの現在の行のid列の値を持つレコードをカレントレコードにする End Sub '======================= '合計や消費税を計算する '======================= Private Sub CalcSum() Dim rs As ADODB.Recordset, s As Long, d_id As Long '変数の定義 d_id = Text1.Text 'denpyouテーブルのidフィールドの値を得る DataEnvironment1.CalcSum d_id '合計を求めるクエリーを実行する 'コマンドCalcSumの定義は:select sum(unit_price*qty) from meisai where denpyou_id=? Set rs = DataEnvironment1.rsCalcSum 'クエリー結果をレコードセットとして得る rs.MoveFirst s = rs.Fields(0).Value '最初のレコードの最初のフィールドが計算値 rs.Close 'レコードセットを閉じる Text6.Text = s '合計のテキストボックスに設定 Text7.Text = Int(s * 0.05) '消費税のテキストボックスに設定 Text8.Text = s + Int(s * 0.05) '総計のテキストボックスに設定 End Sub '======================= '明細のグリッドの列幅をデータにあわせる '======================= Private Sub FitGrid(gr As MSHFlexGrid) Dim i As Integer, j As Long, maxW As Long, curW As Long gr.AllowUserResizing = flexResizeBoth 'グリッドの列幅調整を手作業でもできるように For i = 0 To gr.Cols - 1 '各列について繰り返す gr.Col = i '現在の列をカレント列に gr.Row = 0 '1行目をカレント行に maxW = TextWidth(gr.Text) 'カレントセルのセル幅を、フォントサイズ、文字バイト数から求める(* 20 / 3 というのは適当に試行錯誤して決めた数値) For j = 1 To gr.Rows - 1 '2行目以降について gr.Row = j 'カレント行に設定し curW = TextWidth(gr.Text) '列幅を求める If curW > maxW Then maxW = curW '最大の列幅であれば、それを変数に残す Next j gr.ColWidth(i) = maxW * 1.2 '列幅を最大値に設定する Next i End Sub =================================================== Private Sub rscustomers_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Dim targetRS As ADODB.Recordset Dim pos As Integer, num As Integer Set targetRS = DataEnvironment1.rscustomers pos = targetRS.AbsolutePosition num = targetRS.RecordCount Form2.Label1.Caption = pos & "/" & num If pos = 1 Then Form2.Command2.Enabled = False Else Form2.Command2.Enabled = True End If If pos = num Then Form2.Command1.Enabled = False Else Form2.Command1.Enabled = True End If End Sub Private Sub rsMeisaiNewDenpyou_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) If pRecordset.EOF Or pRecordset.BOF Then Exit Sub 'EOFあるいはBOFなら設定すべきレコードが取得できないのでプロシージャを抜ける fVal = pRecordset("qty").Value 'カレントレコードのqtyフィールドの値を取り出す If IsNull(fVal) Then 'Nullかどうかのチェックをしないと、Nullをテキストボックスに設定すればエラーになる Form5.Text3.Text = "" 'NullならText3を空白にする Else 'ここはフォームの外なので、フォーム名のForm5から記述する Form5.Text3.Text = fVal 'Nullでないなら、その値をText3に設定 End If fVal = pRecordset("unit_price").Value '同様にunit_priceの値をText4に設定 If IsNull(fVal) Then Form5.Text4.Text = "" Else Form5.Text4.Text = fVal End If fVal = pRecordset("id").Value '同様にidの値をText5に設定 If IsNull(fVal) Then Form5.Text5.Text = "" Else Form5.Text5.Text = fVal End If fVal = pRecordset("item_id").Value 'item_idの値をDataCombo2に設定 If Not IsNull(fVal) Then Form5.DataCombo2.BoundText = fVal End If End Sub