JCL_tbl_ExportDefs_toFields

プロジェクトのデータ構造をfields.txtのフォーマットでテキストファイルに書き出す。書き出した「fields.txt」をエクセルやエディタで編集して、新たなデータベースプロジェクトを作るときに便利。

使い方
メソッド実行する。v13とv19で動作確認済み。v11では動かない。

引数
なし

//JCL_tbl_ExportDefs_toFields
//20231228 wat
//export_field_properties
//フィールドプロパティをタブ区切りのfieldsフォーマットで書き出し

C_TEXT($filePath)
C_TIME($doc)
C_LONGINT($i; $k)
C_TEXT($tblName; $fieldName)
C_LONGINT($type)
C_LONGINT($len)
C_BOOLEAN($index)
C_BOOLEAN($unique)
C_BOOLEAN($visible)
C_POINTER($tblPtr)
C_POINTER($field_ptr)

C_LONGINT($numOfTbls)

//4Dマニュアルサイトからゲット
ARRAY TEXT($aryTableNames; Get last table number)
ARRAY POINTER($aryTblPtrs; Get last table number)
If (Get last table number>0)  //データベースにテーブルがある場合
	For ($i; Size of array($aryTableNames); 1; -1)
		If (Is table number valid($i))
			$aryTblPtrs{$i}:=Table($i)
			$aryTableNames{$i}:=Table name($i)
		Else 
			DELETE FROM ARRAY($aryTableNames; $i)
		End if 
	End for 
End if 

$numOfTbls:=Size of array($aryTableNames)
If ($numOfTbls>0)
	//ファイル保存ダイアログ表示
	//$doc:=Select document(""; "fields.txt"; "txt"; "出力ファイル名:"; File name entry)
	$filePath:=Select document(System folder(Desktop)+"fields.txt"; "txt"; "出力ファイル名:"; File name entry)
	If (OK=1)
		//タブ区切りでテキストファイルに出力
		$doc:=Create document(Document; "txt")
		If ($doc#0)
			//ヘッダ
			SEND PACKET($doc; "フィールド一覧"+Char(Tab))
			SEND PACKET($doc; "テーブル数:"+String($numOfTbls)+Char(Tab))
			SEND PACKET($doc; String(Current date)+Char(Carriage return))
			
			SEND PACKET($doc; "テーブル名"+Char(Tab))  //A
			SEND PACKET($doc; Char(Tab))  //B
			SEND PACKET($doc; "フォーム作成"+Char(Tab))  //C
			SEND PACKET($doc; "レコード数"+Char(Tab))  //C
			SEND PACKET($doc; "コメント"+Char(Carriage return))  //E
			
			SEND PACKET($doc; "フィールド名"+Char(Tab))  //A
			SEND PACKET($doc; "タイプ"+Char(Tab))  //B
			SEND PACKET($doc; "長さ"+Char(Tab))  //C
			SEND PACKET($doc; "インデックス"+Char(Tab))  //D
			SEND PACKET($doc; "ユニーク"+Char(Tab))  //E
			SEND PACKET($doc; "非表示"+Char(Tab))  //F
			SEND PACKET($doc; "ラベル"+Char(Tab))  //G
			SEND PACKET($doc; "説明"+Char(Tab))  //H fieldsフォーマットで必要な列はHまで
			SEND PACKET($doc; "データが入っているレコードの数"+Char(Carriage return))  //I: fieldsフォーマットに不要な列
			
			
			For ($i; 1; $numOfTbls)
				//テーブル情報
				$tblName:=$aryTableNames{$i}
				SEND PACKET($doc; $tblName+Char(Tab))  //A
				SEND PACKET($doc; Char(Tab))  //B
				SEND PACKET($doc; "フォーム作る"+Char(Tab))  //C
				$tblPtr:=$aryTblPtrs{$i}
				ALL RECORDS($tblPtr->)
				SEND PACKET($doc; String(Records in selection($tblPtr->))+Char(Carriage return))  //D
				
				For ($k; 1; Get last field number($i))
					//フィールド情報
					$field_ptr:=Field($i; $k)
					
					$fieldName:=Field name($i; $k)
					GET FIELD PROPERTIES($i; $k; $type; $len; $index; $unique; $visible)
					
					SEND PACKET($doc; $fieldName+Char(Tab))  //A
					
					Case of   //B
						: ($type=Is alpha field)
							QUERY($tblPtr->; $field_ptr->#"")
							SEND PACKET($doc; "Is Alpha Field"+Char(Tab))
						: ($type=Is text)
							QUERY($tblPtr->; $field_ptr->#"")
							SEND PACKET($doc; "Is Text"+Char(Tab))
						: ($type=Is real)
							QUERY($tblPtr->; $field_ptr->#0)
							SEND PACKET($doc; "Is Real"+Char(Tab))
						: ($type=Is integer)
							QUERY($tblPtr->; $field_ptr->#0)
							SEND PACKET($doc; "Is Integer"+Char(Tab))
						: ($type=Is longint)
							QUERY($tblPtr->; $field_ptr->#0)
							SEND PACKET($doc; "Is LongInt"+Char(Tab))
						: ($type=Is date)
							QUERY($tblPtr->; $field_ptr->#!00-00-00!)
							SEND PACKET($doc; "Is Date"+Char(Tab))
						: ($type=Is time)
							QUERY($tblPtr->; $field_ptr->#0)
							SEND PACKET($doc; "Is Time"+Char(Tab))
						: ($type=Is boolean)
							QUERY($tblPtr->; $field_ptr->#False)
							SEND PACKET($doc; "Is Boolean"+Char(Tab))
						: ($type=Is picture)
							SEND PACKET($doc; "Is Picture"+Char(Tab))
						: ($type=Is subtable)
							SEND PACKET($doc; "Is Subtable"+Char(Tab))
						: ($type=Is BLOB)
							SEND PACKET($doc; "Is BLOB"+Char(Tab))
					End case 
					
					SEND PACKET($doc; String($len)+Char(Tab))  //C
					
					If ($index=True)
						SEND PACKET($doc; "1"+Char(Tab))  //D
					Else 
						SEND PACKET($doc; "0"+Char(Tab))  //D
					End if 
					
					If ($unique=True)
						SEND PACKET($doc; "1"+Char(Tab))  //E
					Else 
						SEND PACKET($doc; "0"+Char(Tab))  //E
					End if 
					
					If ($visible=True)
						SEND PACKET($doc; "1"+Char(Tab))  //F
					Else 
						SEND PACKET($doc; "0"+Char(Tab))  //F
					End if 
					
					SEND PACKET($doc; Char(Tab))  //G
					SEND PACKET($doc; Char(Tab))  //H
					SEND PACKET($doc; String(Records in selection($tblPtr->))+Char(Carriage return))  //I
					
				End for 
				
				SEND PACKET($doc; "-"+Char(Carriage return))  //テーブル区切り文字
				
			End for 
			
			//ファイルを閉じる
			CLOSE DOCUMENT($doc)
			
			//終了メッセージ
			ALERT("出力が終わりました。")
		End if 
	End if 
End if 

実行すると、次のようにファイル保存ダイアログが表示される。

[保存]をクリックすると、テキストファイルができる。「データが入っているレコードの数」によって、使っていなさそうなフィールドがわかる。

エクセルにペーストする。

フィールド属性はJCL_table_Generateに必要な「ユニーク」、「インデックス」、「非表示」の3項目。これでできたfields.txtは、JCL_table_Generateで読み込むことができる。(注意:テーブル名/フィールド名に全角文字が含まれていなければという条件付き。上記の例ではエラーになる。)