JCL_table_generate

テーブル定義書「fields」を読み込んでテーブルを作成する。

使い方
メソッドエディタを開いて実行する。実行するとファイル選択ダイアログが表示される。ここでfieldsフォーマットのテキストファイル(UTF-8)を選択する。フォーマットが正しければ「N個のテーブルを作成しました。」のメッセージが表示される。

fieldsフォーマット

fieldsと呼ばれるテキストファイルのフォーマットは次のとおり。

1行目はテーブル情報行。2行目から「-」(ハイフン、半角)だけの行までがフィールド情報行で、1テーブルのフィールド群。ハイフンの次の行は次のテーブル情報行、というように最後のハイフンまでテーブル定義を繰り返し記述する。

1行目(テーブル情報行):テーブル名 接頭辞 オプション フィールド数(参考) 空白 テーブル日本語名 テーブル説明
2行目からN行(フィールド情報行):フィールド名 データ型 データ長(文字列のみ) インデックス ユニーク フィールド項目名(ラベル) フィールド説明
テーブル情報区切り、最後の行:-(ハイフンのみ)

たとえば「LETTER」というテーブルと「LExBL」というテーブルのサンプルを以下に示す。

通常のテーブル

「LETTER」は請求書を送るための送り状を保存するテーブル。顧客IDを持つことで顧客テーブルと1対Nの関係にある。顧客名と顧客住所は変わるかもしれないので、その時点での情報を保存している。

LETTERLEフォーム作る25フィールド レター送り状
IDIs LongInt0100
KO_IDIs LongInt010顧客ID
KO_NAMEIs Alpha Field8000顧客名送り状発行時の顧客名
KO_ADDRESSIs Text000顧客住所同住所
TITLEIs Alpha Field8000タイトル
BODYIs Text000本文
REMARKIs Text000備考
DEL_FLAGIs LongInt000削除フラグ
CREATE_DATEMARKIs Alpha Field2000作成日
UPDATE_DATEMARKIs Alpha Field2000更新日
_

マッチングテーブル

「LExBL」はマッチングテーブルと呼ばれる構造を持つ。ここでマッチングさせるのは送り状「LETTER」テーブルと請求書「BILL」テーブル。これらのテーブルはN対Nの関係にある。一つの送り状で複数の請求書を送ったり、一つの請求書を複数の送り状で何回も送る可能性がある。このような関係はそれぞれのレコードIDをセットで保存するためのテーブルを用意する。ID以外のフィールドは日付と削除フラグだけ。これがマッチングテーブル。どちらかのIDでクエリーしたあとでタイトルや日付はLETTERやBILLテーブルから取得する。

LE_x_BLLEXBLフォーム作る6フィールド送り状x請求書マッチング
IDIs LongInt010
LE_IDIs LongInt010
BL_IDIs LongInt010
CREATE_DATEMARKIs Alpha Field2000
DEL_FLAGIs LongInt000
DEL_DATEMARKIs Alpha Field2000
_

【解説】
テキストファイルを読み込んで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」と記述する。