自分用なので、汎用性は一切無視、好き勝手に、かつ、できるだけ手を抜いて作ろうとしています。
WAMPは最初が面倒だし、そもそも必要性がないので、今回は不採用。
SQLiteを、初めて使ってみることにしました。
dllファイルをpathが通ったフォルダに置けば良い、という手軽さは有難いです。
MySQLのworkbenchみたいなGUIのフリーソフトを探した結果、PupSQLiteを使わせていただいております。
作者の方に感謝しています。
以下のCREATE文は、このソフトの「テーブル定義文の表示」機能によるものです。
データベースのテーブルは3つです。
勘定科目(大)と勘定科目(中)と取引です。
勘定科目(大)は、一般的な、勘定科目コードと科目名のテーブルです。
現金、普通預金、○○費、というようなものを格納します。
CREATE TABLE [kamoku_L] (
[klcode] INTEGER NOT NULL DEFAULT '1000' UNIQUE,
[klname] VARCHAR(20),
PRIMARY KEY([klcode])
);
勘定科目(中)は、例えば普通預金を口座別にも集計したい、思って設定したものです。
だから、科目コードと、科目名と、所属する勘定科目(大)の科目コードをフィールドとするテーブルです。
CREATE TABLE [kamoku_M] (
[kmcode] INTEGER NOT NULL DEFAULT '1000' UNIQUE,
[kmname] VARCHAR(20),
[kl_id] INTEGER DEFAULT '1000',
PRIMARY KEY([kmcode])
);
取引は、複式簿記の仕訳帳のイメージです。
但し、借方金額と貸方金額を常に等しくして入力するため、金額フィールドは単一です。
フィールドは、取引ID、日付、金額、借方科目コード、摘要、貸方科目コードです。
CREATE TABLE [torihiki] (
[tori_id] INTEGER PRIMARY KEY AUTOINCREMENT,
[hiduke] DATETIME,
[kingaku] INTEGER,
[karicode] INTEGER NOT NULL REFERENCES [kamoku_M]([kmcode]),
[tekiyou] VARCHAR(100),
[kashicode] INTEGER NOT NULL REFERENCES [kamoku_M]([kmcode])
);
フィールド名とかは完全に自己流ですが、平にご容赦下さい。
また、制約とかも正解かどうかわかりませんが、とりあえずこれで。
データ入力は、IME制御とか科目を選択肢から選ぶとかといった支援機能がないと面倒なので、そこは自作します。
以前に使用経験があったので、Delphiでアプリケーションを作ることにしました。
Delphi 10.3 Community Editinをインストールしました。
今回初めてFireDACを使いました。
VCLフォームにTFDConnectionとTFDQueryとTDataSourceとTDBGridとかを配置しています。
ネットの情報では、TFDPhysSQLiteDriverLinkとTFDGUIxWaitCursorの配置が必須、とのことでしたが、何故かナシでも動作しています。
前者は最初に一度配置してみましたが、削除しても何の影響もなかったため、そのままにしています。
また、後者は、一度も配置していません。
今はまだ、アプリケーションを作りながらデータ入力を進めている途中です。
なお、前記の取引テーブルを単純に SELECT * FROM torihiki で呼び出すと、当然ながら科目欄はコード番号で表示されるため、訳が分かりません。
そこで、先日公開したSQL文を使うことによって、科目コードを科目名に変換して表示します。
但し、実用上は、日付順に入力するとは限らない(例えば預金通帳を1冊ずつ入力する場合など)ため、先ほどのSQL文の末尾に ORDER BY hiduke を付加する必要があります。
一応、再掲しておきます。
SELECT
tori_id,hiduke,kingaku,l1.klname,m1.kmname,tekiyou,
l2.klname,m2.kmname,karicode,kashicode
FROM torihiki AS t
INNER JOIN kamoku_M AS m1 ON t.karicode=m1.kmcode
INNER JOIN kamoku_L AS l1 ON m1.kl_id=l1.klcode
INNER JOIN kamoku_M AS m2 ON t.kashicode=m2.kmcode
INNER JOIN kamoku_L AS l2 ON m2.kl_id=l2.klcode
ORDER BY hiduke;
ネットの情報では、複数テーブルの結合が使われている場合は結果セットは変更できない、とのことでしたが、大丈夫でした。
SQLプロパティが上記のSQL文であるTFDQueryを配置したVCLアプリケーションで、レコードの更新などができます。
WAMPは最初が面倒だし、そもそも必要性がないので、今回は不採用。
SQLiteを、初めて使ってみることにしました。
dllファイルをpathが通ったフォルダに置けば良い、という手軽さは有難いです。
MySQLのworkbenchみたいなGUIのフリーソフトを探した結果、PupSQLiteを使わせていただいております。
作者の方に感謝しています。
以下のCREATE文は、このソフトの「テーブル定義文の表示」機能によるものです。
データベースのテーブルは3つです。
勘定科目(大)と勘定科目(中)と取引です。
勘定科目(大)は、一般的な、勘定科目コードと科目名のテーブルです。
現金、普通預金、○○費、というようなものを格納します。
CREATE TABLE [kamoku_L] (
[klcode] INTEGER NOT NULL DEFAULT '1000' UNIQUE,
[klname] VARCHAR(20),
PRIMARY KEY([klcode])
);
勘定科目(中)は、例えば普通預金を口座別にも集計したい、思って設定したものです。
だから、科目コードと、科目名と、所属する勘定科目(大)の科目コードをフィールドとするテーブルです。
CREATE TABLE [kamoku_M] (
[kmcode] INTEGER NOT NULL DEFAULT '1000' UNIQUE,
[kmname] VARCHAR(20),
[kl_id] INTEGER DEFAULT '1000',
PRIMARY KEY([kmcode])
);
取引は、複式簿記の仕訳帳のイメージです。
但し、借方金額と貸方金額を常に等しくして入力するため、金額フィールドは単一です。
フィールドは、取引ID、日付、金額、借方科目コード、摘要、貸方科目コードです。
CREATE TABLE [torihiki] (
[tori_id] INTEGER PRIMARY KEY AUTOINCREMENT,
[hiduke] DATETIME,
[kingaku] INTEGER,
[karicode] INTEGER NOT NULL REFERENCES [kamoku_M]([kmcode]),
[tekiyou] VARCHAR(100),
[kashicode] INTEGER NOT NULL REFERENCES [kamoku_M]([kmcode])
);
フィールド名とかは完全に自己流ですが、平にご容赦下さい。
また、制約とかも正解かどうかわかりませんが、とりあえずこれで。
データ入力は、IME制御とか科目を選択肢から選ぶとかといった支援機能がないと面倒なので、そこは自作します。
以前に使用経験があったので、Delphiでアプリケーションを作ることにしました。
Delphi 10.3 Community Editinをインストールしました。
今回初めてFireDACを使いました。
VCLフォームにTFDConnectionとTFDQueryとTDataSourceとTDBGridとかを配置しています。
ネットの情報では、TFDPhysSQLiteDriverLinkとTFDGUIxWaitCursorの配置が必須、とのことでしたが、何故かナシでも動作しています。
前者は最初に一度配置してみましたが、削除しても何の影響もなかったため、そのままにしています。
また、後者は、一度も配置していません。
今はまだ、アプリケーションを作りながらデータ入力を進めている途中です。
なお、前記の取引テーブルを単純に SELECT * FROM torihiki で呼び出すと、当然ながら科目欄はコード番号で表示されるため、訳が分かりません。
そこで、先日公開したSQL文を使うことによって、科目コードを科目名に変換して表示します。
但し、実用上は、日付順に入力するとは限らない(例えば預金通帳を1冊ずつ入力する場合など)ため、先ほどのSQL文の末尾に ORDER BY hiduke を付加する必要があります。
一応、再掲しておきます。
SELECT
tori_id,hiduke,kingaku,l1.klname,m1.kmname,tekiyou,
l2.klname,m2.kmname,karicode,kashicode
FROM torihiki AS t
INNER JOIN kamoku_M AS m1 ON t.karicode=m1.kmcode
INNER JOIN kamoku_L AS l1 ON m1.kl_id=l1.klcode
INNER JOIN kamoku_M AS m2 ON t.kashicode=m2.kmcode
INNER JOIN kamoku_L AS l2 ON m2.kl_id=l2.klcode
ORDER BY hiduke;
ネットの情報では、複数テーブルの結合が使われている場合は結果セットは変更できない、とのことでしたが、大丈夫でした。
SQLプロパティが上記のSQL文であるTFDQueryを配置したVCLアプリケーションで、レコードの更新などができます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます