テーブル定義書「fields」を読み込んでテーブルを作成する。
使い方
メソッドエディタを開いて実行する。実行するとファイル選択ダイアログが表示される。ここでfieldsフォーマットのテキストファイル(UTF-8)を選択する。フォーマットが正しければ「N個のテーブルを作成しました。」のメッセージが表示される。
fieldsフォーマット
fieldsと呼ばれるテキストファイルのフォーマットは次のとおり。
1行目はテーブル情報行。2行目から「-」(ハイフン、半角)だけの行までがフィールド情報行で、1テーブルのフィールド群。ハイフンの次の行は次のテーブル情報行、というように最後のハイフンまでテーブル定義を繰り返し記述する。
1行目(テーブル情報行):テーブル名 接頭辞 オプション フィールド数(参考) 空白 テーブル日本語名 テーブル説明
2行目からN行(フィールド情報行):フィールド名 データ型 データ長(文字列のみ) インデックス ユニーク フィールド項目名(ラベル) フィールド説明
テーブル情報区切り、最後の行:-(ハイフンのみ)
たとえば「LETTER」というテーブルと「LExBL」というテーブルのサンプルを以下に示す。
通常のテーブル
「LETTER」は請求書を送るための送り状を保存するテーブル。顧客IDを持つことで顧客テーブルと1対Nの関係にある。顧客名と顧客住所は変わるかもしれないので、その時点での情報を保存している。
LETTER | LE | フォーム作る | 25フィールド | レター | 送り状 | |
ID | Is LongInt | 0 | 1 | 0 | 0 | |
KO_ID | Is LongInt | 0 | 1 | 0 | 顧客ID | |
KO_NAME | Is Alpha Field | 80 | 0 | 0 | 顧客名 | 送り状発行時の顧客名 |
KO_ADDRESS | Is Text | 0 | 0 | 0 | 顧客住所 | 同住所 |
TITLE | Is Alpha Field | 80 | 0 | 0 | タイトル | |
BODY | Is Text | 0 | 0 | 0 | 本文 | |
REMARK | Is Text | 0 | 0 | 0 | 備考 | |
DEL_FLAG | Is LongInt | 0 | 0 | 0 | 削除フラグ | |
CREATE_DATEMARK | Is Alpha Field | 20 | 0 | 0 | 作成日 | |
UPDATE_DATEMARK | Is Alpha Field | 20 | 0 | 0 | 更新日 | |
_ |
マッチングテーブル
「LExBL」はマッチングテーブルと呼ばれる構造を持つ。ここでマッチングさせるのは送り状「LETTER」テーブルと請求書「BILL」テーブル。これらのテーブルはN対Nの関係にある。一つの送り状で複数の請求書を送ったり、一つの請求書を複数の送り状で何回も送る可能性がある。このような関係はそれぞれのレコードIDをセットで保存するためのテーブルを用意する。ID以外のフィールドは日付と削除フラグだけ。これがマッチングテーブル。どちらかのIDでクエリーしたあとでタイトルや日付はLETTERやBILLテーブルから取得する。
LE_x_BL | LEXBL | フォーム作る | 6フィールド | 送り状x請求書マッチング |
ID | Is LongInt | 0 | 1 | 0 |
LE_ID | Is LongInt | 0 | 1 | 0 |
BL_ID | Is LongInt | 0 | 1 | 0 |
CREATE_DATEMARK | Is Alpha Field | 20 | 0 | 0 |
DEL_FLAG | Is LongInt | 0 | 0 | 0 |
DEL_DATEMARK | Is Alpha Field | 20 | 0 | 0 |
_ |
【解説】
テキストファイルを読み込んでSQL文に変換、それをExecute SQLコマンドで実行している。フィールド名が「ID」をPrimary key(重複不可、ヌル値を不許可、インデックス)に設定。インデックス属性とユニーク属性だけサポート。あとは4Dのテーブル設定でマニュアル操作する。
//JCL_tbl_import
//JCL_import_tables
//20111005 wat
//20121001 wat rename, 20130429 wat mod
//外部テキストファイルのフィールド定義を読み込んでテーブル作成
//20150826 yabe フォーム作成フラグ追加
C_LONGINT($dlg_ok)
C_BLOB($fileBlob) //読み込んだファイルの内容
C_TEXT($fileText) //読み込んだファイル
ARRAY TEXT($aryTableName;0) //テーブル名の配列
ARRAY LONGINT($aryStartLineNr;0) //テーブル定義始まりの行番号の配列
ARRAY TEXT($aryPrefix;0) //フィールド名のプリフィックスの配列
ARRAY TEXT($aryFormsFlag;0) //20150826 フォームを作るかどうかのフラグの配列「フォーム作る」なら作成
C_LONGINT($i;$numOfTables)
//定義ファイルを選択
$dlg_ok:=JCL_file_SelectFileDlg (->$fileBlob)
If ($dlg_ok=1)
//読み込んだファイルの内容を4Dの文字セットにエンコード
$fileText:=Convert to text($fileBlob;"UTF-8")
//テーブル名の配列を得る
$numOfTables:=JCL_tbl_Names_fromFile ($fileText;->$aryTableName;->$aryStartLineNr;->$aryPrefix;->$aryFormsFlag)
For ($i;1;$numOfTables)
//テーブルを作成
JCL_tbl_Create_bySQL ($fileText;$aryTableName{$i};$aryStartLineNr{$i};$aryPrefix{$i})
//インデックスを作成
JCL_tbl_Index_create ($fileText;$aryTableName{$i};$aryStartLineNr{$i};$aryPrefix{$i})
End for
C_TEXT($msg)
$msg:="完了"+Char(Carriage return)
$msg:=$msg+String($numOfTables)+"個のテーブルを作成しました。"
ALERT($msg)
End if
【文字列長の考え方】
短い文字列は20文字、名前のようなちょっと長い文字列は80文字、もっと長い文字列で1行にしたい場合は255文字、改行付きの長い文字列はTextにしている。プログラミングする際に長さを気にしていると非効率。通常はプログラムの方で制約をかければよく、本当に気にしなければならない時だけテーブル構造を最適化することにしている。
【フォームを作る】
テーブルによってはデータメンテナンスのためのフィールドを自動生成したくない場合がある。このようなテーブルにはテーブル情報行の3列目に「NoForm」と記述する。