| Access実践入門 TOPへ |
| ■ マイクロソフトアクセス、入金入力と残高計算 | |
| 入金伝票 入金伝票は特に新しい機能は使っていません。 得意先の検索ボタンの処理を伝票入力と共通で使っています。 kdckの値で区別して、伝票と入金で得意先の検索が出来るようにしています。 得意先検索は、「fo得意先検索指定」と「fo得意先検索一覧」で構成されています。 ![]() 検索開始ボタンの[クリック時]に次のように指定しています。 DoCmd.OpenForm "fo得意先検索一覧", acNormal, , , acFormReadOnly 一覧表が表示されます。 ![]() 転記ボタンの[クリック時]に次のように指定しています If kdck = 1 Then Forms![fo伝票入力]![得意先番号] = Me![得意先番号] DoCmd.Close DoCmd.Close DoCmd.GoToControl "摘要" End If If kdck = 2 Then Forms![fo入金入力]![得意先番号] = Me![得意先番号] DoCmd.Close DoCmd.Close DoCmd.GoToControl "得意先番号" End If 削除の処理と同じように作られています。 |
|
| 繰越残高の計算 入金データの入力時に、前回請求算のコントロールに、日付をみて入金伝票入力前の得意先の残高を計算しています。 プロシージャを呼び出すことで、答えを取得するようにしています。 このプロシージャは、請求一覧表の残計算でも共通で使えるようにしています。 「fo入金入力」のデザインを見てください。 コントロール[得意先番号]の[フォーカス喪失時]を見てください。 次のように書いています。 Call nzan(Me!入金日付, Me!入金日付, Me!得意先番号, Me!得意先番号, Null) Me!前回請求残 = DLookup("差引残高", "to残計算") 差引請求残 = 前回請求残 - 入金 - 調整 入金計 = 入金 + 調整 nzan というプロシージャに処理を移しています。 そのときに引数を5つわたしています(カッコの中のもの) 初めの日付、終わりの日付、初めの得意先、終わりの得意先、得意先の締日 nzanというプロシージャは、5項目をわたして処理を移すことによって、作業ファイル「to残計算」にその答えを書き込むようにできています。 たとえば、次のようになります。 ![]() 入金からの処理では、レコードは1つだけですから、DLookup("差引残高", "to残計算")で、105000が前回請求残に転記されます。 その後、差引請求残と入金計のコントロールの値を再計算しています。 それでは、nzan()の処理内容を見ていきます。 Public Function nzan(sd, ed, st, et, sime) 1 Dim dbs As Database 2 Dim rst_1 As Recordset 3 Dim rst_2 As Recordset 4 Dim cd As String 5 Dim kuri As Long, nuki As Long, zei As Long, nkin As Long, chou As Long 6 DoCmd.OpenQuery "quto削除残計算明細" 7 DoCmd.OpenQuery "quto削除残計算" 8 kuri = 0 9 nuki = 0 10 zei = 0 11 nkin = 0 12 chou = 0 13 DoCmd.OpenForm "fo残計算", acNormal, , , , acHidden 14 td = DLookup("登録締切日付", "ta会社情報", "ID =1") 15 Form_fo残計算!締切日 = td 16 Form_fo残計算!開始日付 = sd 17 Form_fo残計算!終了日付 = ed 18 Form_fo残計算!開始得意先 = st 19 Form_fo残計算!終了得意先 = et 20 Form_fo残計算!締日 = sime 21 DoCmd.OpenQuery "qu残計算前残追加" 22 DoCmd.OpenQuery "qu残計算請求追加" 23 DoCmd.OpenQuery "qu残計算入金追加" 24 DoCmd.Close acForm, "fo残計算" 25 Set dbs = CurrentDb 26 Set rst_1 = dbs.OpenRecordset("qu残計算明細", dbOpenDynaset) 27 Set rst_2 = dbs.OpenRecordset("to残計算", dbOpenTable) 28 rst_1.MoveFirst 29 cd = rst_1!得意先番号 30 Do Until rst_1.EOF 31 If cd <> rst_1!得意先番号 Then 32 rst_2.AddNew 33 rst_2!得意先番号 = cd 34 rst_2!繰越残高 = kuri 35 rst_2!税抜額 = nuki 36 rst_2!消費税額 = zei 37 rst_2!入金額 = nkin 38 rst_2!調整額 = chou 39 rst_2!差引残高 = kuri + nuki + zei - nkin - chou 40 rst_2.Update 41 kuri = 0 42 nuki = 0 43 zei = 0 44 nkin = 0 45 chou = 0 46 cd = rst_1!得意先番号 47 kuri = rst_1!繰越残高 48 nuki = rst_1!税抜額 49 zei = rst_1!消費税額 50 nkin = rst_1!入金額 51 chou = rst_1!調整額 52 Else 53 If sd > rst_1!日付 Then 54 kuri = kuri + rst_1!繰越残高 + rst_1!税抜額 + rst_1!消費税額 - rst_1!入金額 - rst_1!調整額 55 Else 56 nuki = nuki + rst_1!税抜額 57 zei = zei + rst_1!消費税額 58 nkin = nkin + rst_1!入金額 59 chou = chou + rst_1!調整額 60 End If 61 End If 62 rst_1.MoveNext 63 Loop 64 rst_2.AddNew 65 rst_2!得意先番号 = cd 66 rst_2!繰越残高 = kuri 67 rst_2!税抜額 = nuki 68 rst_2!消費税額 = zei 69 rst_2!入金額 = nkin 70 rst_2!調整額 = chou 71 rst_2!差引残高 = kuri + nuki + zei - nkin - chou 72 rst_2.Update 73 rst_1.Close 74 rst_2.Close End Function 括弧の中の(sd, ed, st, et, sime)は、5項目の内容が入ってくる変数です。 1〜3行目は、変数の宣言です。 4〜5行目は、この中で計算に使う変数の宣言です。 6〜7行目は、作業ファイル「to残計算」と「to残計算明細」の前レコード削除のクエリーです。 8〜12行目は、ここで使う数値の入る変数をゼロで初期化しています。 13行目は、クエリーで抽出条件の指定に使うための作業用フォームを非表示で開いています。 14行目は、会社情報にある、登録締切日付を作業フォームに転記します 15〜20行目は、作業フォームに各引数を転記しています。 21行目の「qu残計算前残追加」では、得意先が持っている繰越残高を、締切日で転記。 22行目の「qu残計算請求追加」では、伝票データを転記。 23行目の「qu残計算入金追加」では、入金データを転記。 この3つの追加クエリーで「to残計算明細」が次のようになります。 ![]() 24行目で、作業フォームを閉じます。 25〜27行目はお決まりの形です。 26行目の、「qu残計算明細」は得意先順、日付順で並べたクエリーです。 28行目から残高計算なります。 28行目で、先頭のレコードに移動します。 29行目で、その先頭のレコードの得意先番号を変数cdに代入します。 30行目から63行目までがループ(繰り返し)構文です。 レコードの最後まで読みます。 31行目で、cdの内容とレコードの得意先番号と比較して、違う場合は 32〜51行まで処理して、62行に飛び、次のレコードに移動して処理を繰り返します。 比較して、同じだった場合は 53〜61行まで処理して、62行に飛び、次のレコードに移動して処理を繰り返します。 まず、違った場合について、(入金からの処理ではありえませんが、請求一覧では必要) 違うということは、得意先が変わったということですから、変わる前の得意先の答えを 作業ファイル「to残計算」に新しいレコードを追加して、書き込む処理をします。 書き込んだ後41〜45行目で、数値変数の初期化をしています。 46〜51行目で、さっそく次の得意先の1レコード目の内容を変数に代入します。 次に、同じだった場合について、 同じ得意先の伝票ですから、変数にプラスしていきます。 53行目で、日付が、始まる日付と伝票の日付と比較しています。 これは、会社情報の締切日付より後で、指定の初めの日付までの伝票は合計にはプラスしないで、繰越の数値に対しての計算になります。 指定した範囲の数値は、合計に反映しますので、56〜59行目の計算になります。 (入金からの処理では、差引残だけが欲しいので、関係ないですが・・・) このようなけいさんを繰り返して、最後までレコードを読んでいきました。 ただ、最後のレコードは、計算まではできていますが、書き込みの部分は、なにも処理されない状態になっていますので、64〜72行目で、レコードを追加しています。 このようにしてたとえば、「to残計算」が次のような結果になります。 ![]() 指定した答えが、書き込まれています。 請求処理では、そのまま請求一覧表になり、 入金では、差引残を使います。 |
|