この第三章では、『自治会用会計業務支援ソフト』の中核とも言えるプログラムの内容と解説、さらにデータベースを利用してのプログラムの主要な命令について解説していきたいと思う。
ここではまず、この『自治会用会計業務支援ソフト』の中核をなすデータベースのプログラムについて解説していく。
データベースを利用して膨大なデータ(情報)を管理していくためには、まず、最初に「データベーステーブル」を作成しなければならない。なので、まず「エリアス」というものを作成していくことになる。「エリアス」とは、データベースに付ける別名のことである。データベースにエリアスを付けることでデータベースの種類(ローカル・サーバー)、データベースの形式(Paradox・dBASE・Microsoft Accessなど)、保存されている場所(コンピュータ名・ディレクトリ・ファイル名等)をプログラム側で意識する必要がなくなる。
次には「テーブル」を作成する。今回のシステムではテーブルを2つ作成し、使用することにした。テーブル作成の際、テーブルの構造で示される表にテーブル内のフィールドが示されており、本システムでは以下の図のようにそれぞれテーブルを定義し、作成している。(表1・表2)
| 項目名 | 型 | 幅 | キー | 項目名 | 型 | 幅 | キー | |
|---|---|---|---|---|---|---|---|---|
| DATE | D(日付型) | Gakuseki_Number | A(文字型) | 8 | ※ | |||
| KOMOKU | A(文字型) | 20 | Password | A(文字型) | 10 | |||
| HINMOKU | A(文字型) | 40 | Name | A(文字型) | 30 | |||
| TANKA | $(金額型) | |||||||
| KOSU | S(整数型) | |||||||
| 表1.Main.DBのテーブル定義 | 表1.Main.DBのテーブル定義 | |||||||
パスワード入力画面ではLabelコンポーネント・Editコンポーネント・Buttonコンポーネント、そしてTableコンポーネントを使用してフォームを作成している。
ここでは、「OK」ボタンをクリックした時、学籍番号とパスワードが一致しているのであれば、メイン画面を表示するプログラムとなっている。そこで、あらかじめ、氏名・学籍番号・パスワードを入力できるようなテーブルを作成する。
また、データベースデスクトップでテーブル構造を変更できるので、学籍番号の列をキーに指定しておく。そうすることにより、FindKeyメソッド(キー列から探し出して合っていたらTrueを返して、そのレコードに移動する)を活用して処理することができるようにした。
そして、Tableコンポーネントを利用して、そこからのデータを呼び出して学籍番号と同じレコードのパスワードが正しいか判定し、正しければメイン画面を表示する処理を作成した。処理の内容は以下のように行っている。
procedure TForm4.Button1Click(Sender: TObject);
begin
if Table1.FindKey([Edit2.Text]) = True then
if Edit3.Text = Table1.FieldByName('Password').AsString then
Form1.ShowModal
else MessageDlg('パスワードが違うか入力されていません。',mtError,[mbOK],0)
else MessageDlg('学籍番号が違うか入力されていません。',mtError,[mbOK],0);
end;
また、「キャンセル」ボタンをクリックした時の処理は以下のように行っている。
procedure TForm4.Button2Click(Sender: TObject);
var
Ans: Word;
begin
Ans := MessageDlg('パスワード入力を終了しますか?', mtConfirmation,[mbYes,mbNo],0);
Case Ans of
mrYes:
Form4.Close;
mrNo:
end;
end;
次にメイン画面でのプログラムについて解説をしていく。ここでは、項目の入力等はDBGridコンポーネントの中で行っていくため、入力時のプログラムはない。しかし、その後の〔金額〕・〔消費税〕・〔収入金額〕・〔支出金額〕・〔残高〕の計算はDataModule内のTableコンポーネントの中で計算を行うようにしている。
各項目の計算処理の内容はそれぞれ以下のようになっている。
DBGridコンポーネントに残高の計算結果を表示させるには、計算フィールドを使ったやり方ではうまくいかない。これは、計算フィールドの値がDBGridコンポーネントに表示されるタイミングの問題が関係していて、データセットから値を読み出す度に何度も計算を行っているからで、フォームが開いたままの状態で何もDBGridコンポーネントを操作しなければ結果は一応正しく表示される。
しかし、スクロールさせると間違った値に書き換わってしまう。これを防いで計算フィールドに結果を表示させるためには、以下のように配列を宣言し、これに残高の結果を取得しておく必要がある。
var
Zandaka: array [1..50000] of Currency; // 残高保存用配列
テーブル内での各項目の計算処理は以下のように処理を行う。
procedure TDataModule2.Table1CalcFields(DataSet: TDataSet);
var
n: Integer;
項目『金額』の計算処理
begin
DataSet.FieldByName('KINGAKU').AsCurrency :=
DataSet.FieldByName('TANKA').AsCurrency *
DataSet.FieldByName('KOSU').AsInteger;
項目『消費税』の計算処理では、「前期繰越金」や「受取利息」・「コピーカード費」等の項目には消費税はかからないようになっているので、その項目が選ばれた場合には、〔消費税〕の値を「0円」となるよう、以下の処理を行うようにしている。
begin
if DataSet.FieldByName('KOMOKU').AsString = ('前期繰越金') then
DataSet.FieldByName('TAX').AsCurrency := 0
else if DataSet.FieldByName('KOMOKU').AsString = ('今年度自治会費') then
DataSet.FieldByName('TAX').AsCurrency := 0
else if DataSet.FieldByName('KOMOKU').AsString = ('受取利息') then
DataSet.FieldByName('TAX').AsCurrency := 0
else if DataSet.FieldByName('KOMOKU').AsString = ('コピーカード費') then
DataSet.FieldByName('TAX').AsCurrency := 0
else DataSet.FieldByName('TAX').AsCurrency := DataSet.FieldByName('KINGAKU').AsCurrency * 0.05;
DataSet.FieldByName('TAX').AsCurrency := Round(DataSet.FieldByName('TAX').AsCurrency);
end;
また、項目『収入金額』の計算処理では、「前期繰越金」や「今年度自治会費」・「受取利息」の項目が選択された場合、〔支出金額〕の値を「0円」となるよう、以下の処理を行うようにしている。
begin
if DataSet.FieldByName('KOMOKU').AsString = ('前期繰越金') then
DataSet.FieldByName('SYUKKIN').AsCurrency := 0
else if DataSet.FieldByName('KOMOKU').AsString = ('今年度自治会費') then
DataSet.FieldByName('SYUKKIN').AsCurrency := 0
else if DataSet.FieldByName('KOMOKU').AsString = ('受取利息') then
DataSet.FieldByName('SYUKKIN').AsCurrency := 0
else DataSet.FieldByName('SYUKKIN').AsCurrency :=
DataSet.FieldByName('KINGAKU').AsCurrency + DataSet.FieldByName('TAX').AsCurrency;
end;
なお、項目『支出金額』の計算処理でも、上記の『収入金額』の計算処理と同じように「前期繰越金」や「今年度自治会費」・「受取利息」以外の項目が選択された場合、〔収入金額〕の値を「0円」となるような処理を行うようにしている。
begin
if DataSet.FieldByName('KOMOKU').AsString = ('前期繰越金') then
DataSet.FieldByName('NYUKIN').AsCurrency := DataSet.FieldByName('KINGAKU').AsCurrency
else if DataSet.FieldByName('KOMOKU').AsString = ('今年度自治会費') then
DataSet.FieldByName('NYUKIN').AsCurrency := DataSet.FieldByName('KINGAKU').AsCurrency
else if DataSet.FieldByName('KOMOKU').AsString = ('受取利息') then
DataSet.FieldByName('NYUKIN').AsCurrency := DataSet.FieldByName('KINGAKU').AsCurrency
else DataSet.FieldByName('NYUKIN').AsCurrency := 0;
end;
項目『残高』の計算処理では、「RecNo」プロパティを使用し処理を行っている。このプロパティは、データセット内のアクティブレコードを示しており、TDataSetでの値は常に −1である。通常、アプリケーションは TDataSetレベルではアクセスしないかわりに、TTableなどの下位クラスで再宣言され、実装されたRecNoプロパティがアクセスされる。そして、レコード番号をサポートしていない派生データセットにフォールバックプロパティを提供する。そこで、これを利用し、「RecNo−1」を変数nに格納して、Table内で処理を行っている。処理の内容は以下の通りである。
begin
with Table1 do
begin
n := RecNo - 1;
if (n = 0) then
begin
if DataSet.FieldByName('SYUKKIN').AsCurrency > 1 then
Zandaka[n] := 0 - FieldByName('SYUKKIN').AsCurrency
else if DataSet.FieldByName('NYUKIN').AsCurrency > 1 then
Zandaka[n] := FieldByName('NYUKIN').AsCurrency
end
else if DataSet.FieldByName('SYUKKIN').AsCurrency > 1 then
Zandaka[n] := Zandaka[n-1] - FieldByName('SYUKKIN').AsCurrency
else if DataSet.FieldByName('NYUKIN').AsCurrency > 1 then
Zandaka[n] := Zandaka[n-1] + FieldByName('NYUKIN').AsCurrency;
FieldByName('ZANDAKA').AsCurrency := Zandaka[n];
end;
end;
end;
// ----------------------------------------------------------------------------
procedure TDataModule2.Table1AfterOpen(DataSet: TDataSet);
begin
with Table1 do
begin
OnCalcFields := Table1CalcFields; // 配列が出来てからイベントを行う
// すべての残高を配列に格納するために、最終レコードに一旦レコード移動させる
DisableControls;
while (Eof = false) do
Next;
First;
EnableControls;
end;
end;
この処理はボタンをクリックするとグラフ画面のフォームを表示する処理を行っている。処理の内容は以下の通りである。
Form3.ShowModal;また、グラフ画面のフォームをでは「DBChart」コンポーネントを利用し、グラフ表示を行っている。このコンポーネントを利用し、テーブル内のデータをグラフで表示させるためには、設定を行わなければならない。
設定の仕方としては、このコンポーネントをフォーム上に貼り付け、そのコンポーネント上でダブルクリック(または、右クリックし「チャートの編集」を選ぶ)し、「DBChartの編集」ダイアログボックスを開く。その後、「系列」タブの「追加(A)」ボタンをクリックし、TeeChartギャラリーの中からDBChart1では「円」、DBChart2では「折れ線」を選択する。すると、それぞれ「Series1」、「Series2」が追加される。
次に、追加した「Series1」、「Series2」のプロパティを設定するのだが、それぞれの設定の仕方は、「系列」タブを選択し、「一般」の「凡例に表示する」、「マーカ」の「表示」のチェックをはずす。そして「データ」タブの部分は、以下の図のように設定する事となる。(図1)

図2.DBChrat1・DBChrat2のプロパティ設定
さらに、メイン画面のフォーム作成時にフォームの左上の『×』ボタンを使用不可にする処理を行うのが望ましいと考えた。なぜなら、会計帳簿記入という特性上、終了の処理を1ヶ所で行う方が帳簿記入の際にミスを減少させることができると考えたからである。処理の内容は以下の通りである。
procedure TForm1.FormCreate(Sender: TObject);
var
h: HMENU;
begin
h := GetSystemMenu(Handle, false);
DeleteMenu(h, SC_CLOSE, MF_BYCOMMAND);
DrawMenuBar(handle);
end;
よって、上記の事より『メニュー→終了』で終わらせるように処理を行う。処理の内容は以下の通りになっている。
procedure TForm1.Exit1Click(Sender: TObject);
begin
if MessageDlg('帳簿記入を終了しますか?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
Form4.Close
else
end;また、西暦を4桁で入力できるような処理も行うようにした。これも、上記の『×』ボタンを使用不可にする処理の際にも述べたように、会計帳簿記入という特性上、本システムを永続的に使用できるように考慮して作成しているからである。なお、この処理の際に使用している『initialization』コードの中で初期化を実行している。処理の内容は以下の通りである。
initialization
ShortDateFormat := 'yyyy/mm/dd';