作成日:2024年11月18日
デフォルトフィールドを使って、テーブル作成をもっと簡単に


どうも、にゃん太です
大量のフィールドがあるテーブルを作成する事ってありますよね
単純に大変ですし、途中でうっかりフィールドタイプを間違える事もあると思います
今回のメモでは、デフォルトフィールドを使って、テーブルを簡単作成する方法を書いていきます
大量のフィールドを作成したい
FileMakerでカスタムアプリを作成していると、当然ですがフィールドを作成する必要があります
10や20程度ならいいですが、100や200のフィールドを作成するとなると、結構大変な作業です
また、頻繁にフィールドタイプが変わったりすると、フィールド作成時にフィールドタイプの選択を誤って違うタイプを設定して作成してしまう場合もあります
こうした場合には、デフォルトフィールドの機能を使い、フィールドを作成するのがおすすめです
デフォルトフィールドとは
そもそもデフォルトフィールドって何? という方もいらっしゃるかもしれません
これについては以前のメモ書きで書いていますのでそちらを見て頂くか、Claris社のサイトなどを参照してください
フィールド設定
とりあえずの前提として、下図の様なテーブル定義書があるとします

このファイルをインポートし、スクリプト処理でXMLファイルを生成する処理を実行する事で、次に作成するテーブルに自動的に希望するフィールドが含まれる、という挙動となります
デフォルトフィールド作成ファイルの構造
インポート項目の取り込み場所と各種パラメータ設定用のフィールドを用意します

また、デフォルトフィールドを改変しますので、既存データをバックアップし、処理後に復元する必要があります
その為のデータ保管場所を用意します

スクリプト
処理を行うスクリプトを設定します
用意するスクリプトは下記の通りです
- デフォルトフィールドのバックアップ
- デフォルトフィールド復元
- 定義ファイルのインポート処理
- デフォルトフィールドの定義ファイルの生成
中身を順番に見ていきましょう
デフォルトフィールドのバックアップ
定義ファイルの保存場所は決まっていますので、その場所にあるファイルをオブジェクトフィールドに一時的に格納します
必須の処理となりますので、スクリプトトリガ「OnFirstWindowOpen」に設定します
バックアップ
If [Get ( デバイス ) = 1] 変数の設定 [$$path; 値: "filemac:" & Left ( Get ( FileMaker パス ); Position ( Get ( FileMaker パス ); "/"; 1; 2 ) ) & "Users/Shared/FileMaker/Shared/FMDefaultFields.xml"] Else If [Get ( デバイス ) = 2] 変数の設定 [$$path; 値: "filewin:/C:/ProgramData/FileMaker/Shared/FMDefaultFields.xml"] End If If [not IsEmpty ( $$path )] エラー処理 [オン] ファイルを挿入 [ターゲット:DefaultFiled::BK; 「$$path」] エラー処理 [オフ] End If
デフォルトフィールドの復元
デフォルトフィールドを元の設定に戻す処理です
これも必須の処理となりますので、スクリプトトリガ「OnLastWindowClose」に設定します
復元
エラー処理 [オン] If [not IsEmpty ( $$path )] If [DefaultField::BK = ""] ファイルを削除 [ターゲットファイル:「$$path」] Else フィールド内容のエクスポート [DefaultFiled::BK; 「$$path」; フォルダを作成:オン] End If End If エラー処理 [オフ] フィールド設定 [DefaultField::DF; ""] フィールド設定 [DefaultField::BK; ""]
定義ファイルのインポート処理
テーブル定義書ファイルをインポートする処理です
定型書式で作成されているとは限らないので、インポート時のダイアログは「あり」とします
インポート
ウインドウの固定 # 過去データを破棄 全レコードを表示 対象レコード削除 [ダイアログあり:オフ] エラー処理 [オン] レコードのインポート [ダイアログあり:オン] 変数の設定 [$err; 値: Get ( 最終エラー )] エラー処理 [オフ] If [$err = 0] 検索モードに切り替え [一時停止:オフ] フィールド設定 [DefaultFiledMaker::IN_フィールド名; "*"] フィールド設定 [DefaultFiledMaker::IN_フィールドタイプ; "*"] エラー処理 [オン] 検索実行 [] エラー処理 [オフ] 対象外のみを表示 対象レコード削除 [ダイアログあり:オフ] 全レコードを表示 End If
デフォルトフィールド定義ファイルの作成処理
インポートした情報に基づき、デフォルトフィールド定義ファイルを作成する処理となります
作成
ウインドウの固定 # DefaultFieldsの基礎タグ情報(前) 変数を設定 [$tagStart; 値: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>¶"] 変数を設定 [$tagStart; 値: $tagStart & "<FMDefaultFields version=\"2.1.0.0\" Source=\"19.0.1\" locale=\"English\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <ObjectList membercount=\"" & Get ( 対象レコード数 ) + 5 & "\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Field id=\"1\" name=\"主キー\" fieldtype=\"Normal\" datatype=\"Text\" comment=\"このテーブル内の各レコードの固有の識別子\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <AutoEnter type=\"Calculated\" prohibitModification=\"True\" overwriteExisting=\"True\" alwaysEvaluate=\"False\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Calculated>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Calculation>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Text><![CDATA[GET( UUID )]]></Text>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Calculation>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Calculated>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </AutoEnter>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Validation type=\"OnlyDuringDataEntry\" allowOverride=\"False\" notEmpty=\"True\" unique=\"True\" existing=\"False\"></Validation>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Storage autoIndex=\"True\" index=\"Minimal\" global=\"False\" maxRepetitions=\"1\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <LanguageReference name=\"Unicode\" id=\"2\"></LanguageReference>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Storage>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <TagList primary=\"True\">#_FMI_0 </TagList>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Field>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Field id=\"2\" name=\"作成情報タイムスタンプ\" fieldtype=\"Normal\" datatype=\"Timestamp\" comment=\"各レコードが作成された日付と時刻\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <AutoEnter type=\"CreationTimestamp\" prohibitModification=\"True\"></AutoEnter>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Validation type=\"OnlyDuringDataEntry\" allowOverride=\"False\" notEmpty=\"True\" unique=\"False\" existing=\"False\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Strict>FourDigitYear</Strict>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Validation>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Storage autoIndex=\"True\" index=\"None\" global=\"False\" maxRepetitions=\"1\"></Storage>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <TagList>#_FMI_0 </TagList>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Field>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Field id=\"3\" name=\"作成者\" fieldtype=\"Normal\" datatype=\"Text\" comment=\"各レコードを作成したユーザのアカウント名\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <AutoEnter type=\"CreationAccountName\" prohibitModification=\"True\"></AutoEnter>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Validation type=\"OnlyDuringDataEntry\" allowOverride=\"False\" notEmpty=\"True\" unique=\"False\" existing=\"False\"></Validation>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Storage autoIndex=\"True\" index=\"None\" global=\"False\" maxRepetitions=\"1\"></Storage>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <TagList>#_FMI_0 </TagList>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Field>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Field id=\"4\" name=\"修正情報タイムスタンプ\" fieldtype=\"Normal\" datatype=\"Timestamp\" comment=\"各レコードが最後に修正された日付と時刻\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <AutoEnter type=\"ModificationTimestamp\" prohibitModification=\"True\"></AutoEnter>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Validation type=\"OnlyDuringDataEntry\" allowOverride=\"False\" notEmpty=\"True\" unique=\"False\" existing=\"False\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Strict>FourDigitYear</Strict>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Validation>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Storage autoIndex=\"True\" index=\"None\" global=\"False\" maxRepetitions=\"1\"></Storage>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <TagList>#_FMI_0 </TagList>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Field>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Field id=\"5\" name=\"修正者\" fieldtype=\"Normal\" datatype=\"Text\" comment=\"各レコードを最後に修正したユーザのアカウント名\">¶"] 変数を設定 [$tagStart; 値: $tagStart & " <AutoEnter type=\"ModificationAccountName\" prohibitModification=\"True\"></AutoEnter>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Validation type=\"OnlyDuringDataEntry\" allowOverride=\"False\" notEmpty=\"True\" unique=\"False\" existing=\"False\"></Validation>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <Storage autoIndex=\"True\" index=\"None\" global=\"False\" maxRepetitions=\"1\"></Storage>¶"] 変数を設定 [$tagStart; 値: $tagStart & " <TagList>#_FMI_0 </TagList>¶"] 変数を設定 [$tagStart; 値: $tagStart & " </Field>¶"] # DefaultFieldsの基礎タグ情報(後) 変数を設定 [$tagEnd; 値: " </ObjectList>¶"] 変数を設定 [$tagEnd; 値: $tagEnd & "</FMDefaultFields>¶"] レコード/検索条件/ページへ移動 [最初の] Loop [フラッシュ:常に] 変数を設定 [$DF; 値: $DF & Let ( [ #fieldtype = " fieldtype=\"Normal\""; #datatype = " datatype=\"" & Case ( DefaultFieldMaker::フィールドタイプ = "数字"; "Number"; DefaultFieldMaker::フィールドタイプ = "日付"; "Date"; DefaultFieldMaker::フィールドタイプ = "時刻"; "Time"; DefaultFieldMaker::フィールドタイプ = "タイムスタンプ"; "Timestamp"; DefaultFieldMaker::フィールドタイプ = "オブジェクト"; "Binary"; "Text" ) & "\""; #dontChange = If ( DefaultFieldMaker::値変更禁止; " prohibitModification=\"True\""; "" ); #auto = Case ( DefaultFieldMaker::自動入力 = "シリアル番号"; "<AutoEnter type=\"SerialNumber\"" & #dontChange & "><SerialNumber increment=\"" & If ( Int ( DefaultFieldMaker::増分 ) = 0; 1; Int ( DefaultFieldMaker::増分 ) ) & "\" nextvalue=\"" & If ( Int ( DefaultFieldMaker::次の値 ) = 0; 1; Int ( DefaultFieldMaker::次の値 ) ) & "\" generate=\"OnCreation\"></SerialNumber></AutoEnter>¶"; DefaultFieldMaker::自動入力 = "データ"; "<AutoEnter type=\"ConstantData\"" & #dontChange & "><ConstantData>" & DefaultFieldMaker::自動入力値 & "</ConstantData></AutoEnter>¶"; DefaultFieldMaker::自動入力 = "計算式"; "<AutoEnter type=\"ConstantData\"" & #dontChange & "><Calculated><Calculation><Text><![CDATA[" & DefaultFieldMaker::自動入力値 & "]]></Text></Calculation></Calculated></AutoEnter>¶"; #dontChange ≠ ""; "<AutoEnter " & #dontChange & "></AutoEnter>¶"; "" ); #NotOverWrite = If ( DefaultFieldMaker::上書許可; " allowOverride=\"False\""; " allowOverride=\"True\"" ); #notBlank = If ( DefaultFieldMaker::空欄不可; " notEmpty=\"True\""; "" ); #unique = If ( DefaultFieldMaker::ユニーク; " unique=\"True\""; "" ); #validation = "<Validation type=\"OnlyDuringDataEntry\"" & #NotOverWrite & #notBlank & #unique & ">" & If ( DefaultFieldMaker::計算式で制限; "<Calculated><Calculation><Text><![CDATA[" & DefaultFieldMaker::計算式 & "]]></Text></Calculation></Calculated>"; "" ) & If ( DefaultFieldMaker::カスタムメッセージ ≠ ""; "<Message>" & DefaultFieldMaker::カスタムメッセージ & "</Message>"; "" ) & "</Validation>"; #global = If ( DefaultFieldMaker::グローバル; " global=\"True\""; "" ); #repetition = If ( Int ( DefaultFieldMaker::繰返 ) > 0; Int ( DefaultFieldMaker::繰返 ); 1 ); #storage = "<Storage" & #global & " maxRepetitions=\"" & #repetition & "\"><LanguageReference name=\"Japanese\" id=\"31\"></LanguageReference></Storage>"; #nameTag = Case ( DefaultFieldMaker::フィールドタイプ = "数字"; "n"; DefaultFieldMaker::フィールドタイプ = "日付"; "d"; DefaultFieldMaker::フィールドタイプ = "時刻"; "j"; DefaultFieldMaker::フィールドタイプ = "タイムスタンプ"; "m"; DefaultFieldMaker::フィールドタイプ = "オブジェクト"; "r"; "t" ) & If ( #auto ≠ ""; "a"; "" ) & "_"; #name = " name=\"" & #nameTag & DefaultFieldMaker::IN_フィールド名 & "\"" ]; $DF_IN & "<Field" & #name & #fieldtype & #datatype & " comment=\"" & DefaultFieldMaker::IN_備考 & ">" & #auto & #validation & #storage & "</Field>¶" )] レコード/検索条件/ページへ移動 [次の; 最後まできたら終了:オン] End Loop #DF用XMLファイルの書き出し フィールド設定 [DefaultField::DF; TextEncode ($tagStart & $DF & $tagEnd; "utf-8"; 4)] エラー処理 [オン] フィールド内容のエクスポート [DefaultField::DF; 「$$path」; フォルダを作成:オフ] If [Get ( 最終エラー ) ≠ 0] カスタムダイアログを表示 ["ERROR"; "「DefaultFields.xml」の作成に失敗しました"] 現在のスクリプト終了 [テキスト結果: ] End If
入力の自動化や制限などは手動入力で考えていますが、ルールが決まっているなら自動で処理も可能になります
サンプルファイル
ここまで書いてきましたが、文章だけだといまいちイメージが付かないかと思います
試作品はこちらからダウンロードできますので、ご興味がありましたら実際に試してみてください

以上で今日のメモ書きは終了です
内容はいかがでしたか?
もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください