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残計算」が次のような結果になります。



指定した答えが、書き込まれています。
請求処理では、そのまま請求一覧表になり、
入金では、差引残を使います。