はじめに
システム開発担当の「ほうがん」です。
FileMakerでシステム作成される方なら「カスタムダイアログ」を使用された事があると思います。
例えば、印刷を行う前に「ダイアログ」で「印刷を行う」、「印刷をキャンセルする」を選択させる、
レコードの削除を行う前に「ダイアログ」でレコードを「削除する」、「削除しない」を選択させるなど、様々な場面でダイアログを表示し、ユーザーにその時の処理を選択させ、その後の処理を分岐する、という風に使用されていると思います。
今回はこの「カスタムダイアログ」に関するTipsをお届けします。
1. カスタムダイアログの例(新規レコード作成)
レイアウト上のボタンに「新規レコード作成」を割り当てる場合のスクリプトを、カスタムダイアログを使って作成してみます。この際に考慮すべきは、ユーザーが間違って「新規レコード作成」ボタンを押してしまった場合を想定し、新規レコード作成をキャンセルする選択肢が必要です。それを踏まえた上でスクリプトは以下の通りです。
カスタムダイアログを作成[“新規作成” ; “レコードを作成します。よろしいでしょうか?”]
#レコード作成 or キャンセル
If [ Get ( 最終メッセージ選択 ) = 1 ]
新規レコード/検索条件
Else If [ Get ( 最終メッセージ選択 ) = 2 ]
現在のスクリプト終了 [テキスト結果 ; ]
End If
となります。
カスタムダイアログ部分の設定は以下のようになります。
実際のFileMakerのブラウズ画面で、このスクリプトを実行すると以下のダイアログが表示されます。
このうち、ウインドウ上部の名称が「タイトル」での設定部分、その下から「メッセージ」部分が表示されます。
下部にデフォルトボタン「OK」が右下、ボタン2「キャンセル」がその左側にあります。
因みに「OK」ボタンはデフォルトで選択された状態なのでマウスでクリックしなくても、キーボードの「Enter」や「Return」を押すことで「OK」ボタンを押したことになります。
スクリプトのIfステップに使っている「Get ( 最終メッセージ選択 )」という関数は、どのボタンが押されたかの判定に使います。
この場合、デフォルトボタン「”OK”」を押すと「Get ( 最終メッセージ選択 )」は「1」が返り、ボタン2「キャンセル」を押すと、「2」が返ります。ここでは設定していないですが、ボタン3(J)にテキストが入っていれば、ボタンを押した際に「3」が返ります。
つまり、
Get ( 最終メッセージ選択 ) = 1「OK」の場合には新規レコードを作成し、
Get ( 最終メッセージ選択 ) = 2「キャンセル」の場合には何もしないで終了
という処理になります。
私は、ユーザーにボタン操作を間違えて欲しくないので、デフォルトボタン「OK」から具体的な動作が想像しやすい「新規作成」や「作成する」とボタン名を変更しています。
私的には「OK」よりも「新規作成」の方が、どういった動作になるかを想像できて、ユーザフレンドリーな気がします。
2. カスタムダイアログの例(レコード削除の場合)
FileMakerでは間違ってレコードを削除してしまうと、削除したレコードを復活させるには、バックアップされたデータから復元したり、削除前に削除される情報を別のところに逃しておいたり、スクリプト中にトランザクション処理を噛ましておいたり、とずいぶん大変です。レコード削除はカスタムダイアログを出して慎重に処理を進める必要があります。
レコード削除をスクリプトにすると以下の通りです。
カスタムダイアログを作成[“レコード削除” ; “このレコードを削除します。よろしいでしょうか?”]
#レコード削除 or キャンセル
If [ Get (最終メッセージ選択 ) = 1 ]
現在のスクリプト終了 [テキスト結果 ; ]
Else If [ Get (最終メッセージ選択 ) = 2 ]
レコード/検索条件削除 [ダイアログあり ; オフ]
End If
この場合のカスタムダイアログ部分の設定は以下の通りです。
ブラウズ画面でこのスクリプトを実行すると以下のダイアログ表示となります。
新規レコード作成時のダイアログと比較すると、デフォルトボタンを「キャンセル」、ボタン2を「OK」と、ボタン名と逆にしています。先ほども記載しましたが、デフォルトが「OK」だとキーボードの「Enter」や「Return」が押された時にレコードが削除されてしまいます。削除など慎重な操作が求められる場合には「キャンセル」をデフォルト側にを、習慣化しておいた方が良いと思います。
それに伴い、If ステップも
「Get (最終メッセージ選択) = 1」「キャンセル」(デフォルトの時)に「現在のスクリプト終了」
「Get (最終メッセージ選択) = 2」「OK」の時、レコード削除
となります。
さらにレコードの削除ミスを減らすカスタムダイアログとなるよう工夫してみます。
ユーザーがどのレコードを削除しようとしているのか、これをメッセージ中に表記する事で、削除ミスを無くします。
「カスタムダイアログ」の設定画面で「メッセージ」の欄の右側の「指定(P)...」ボタンを押し、
「"【注】 会員番号 " & 住所録::会員番号 & "番 " & 住所録::氏名 & "さんのレコードを削除します。よろしいでしょうか?"」
と設定します。
※赤文字は住所録テーブルにある「会員番号」フィールドと「氏名」フィールドを指定しています。
ボタン側もボタン2「OK」から「削除する」と具体的な動作に変更します。
ブラウズ画面でこのスクリプトを実行すると以下のようなダイアログになります。
前のダイアログと比較してみます。
どちらが良いでしょうか?私は工夫を加えた上側のダイアログの方がユーザーに優しいと思います。
カスタムダイアログ内での分岐(関連レコードがある場合、無い場合の分岐)
世帯主とその家族が「世帯キー」という外部キーで関連レコード状態ある、以下のような「住所録」データベースを想定します。
住所録である人を削除する際に、その人と世帯キーで繋がっている家族がある場合と、無い場合で別々のダイアログを出すスクリプトを作成してみます。
#レコード削除を確認 世帯のあるなしで分岐
If [ Count ( 住所録_自己::世帯キー ) = 0 ]
カスタムダイアログを作成[“レコード削除” ; “【注】 会員番号 " & 住所録::会員番号 & "番 " &
住所録::氏名 & " さんの¶レコードを削除します。よろしいでしょうか?”]
If [ Count ( 住所録_自己::世帯キー )> 0 ]
カスタムダイアログを作成[“レコード削除” ; “【注】 会員番号 " & 住所録::会員番号 & "番 " &
住所録::氏名 & " さんの¶レコードを削除します。よろしいでしょうか?¶対象者の世帯ごと削除する場合には「世帯ごと削除」ボタンを押してください。”]
End If
#レコード削除 or キャンセル
If [ Get (最終メッセージ選択 ) = 1 ]
現在のスクリプト終了 [テキスト結果 ; ]
Else If [ Get (最終メッセージ選択 ) = 2 ]
レコード/検索条件削除 [ダイアログあり ; オフ]
Else If [ Get (最終メッセージ選択 ) = 3 ]
関連レコードに移動 [関連レコードのみを表示; テーブル: 「住所録_自己」; 使用するレイアウト<現在のレイアウト> ]
対象レコード削除 [ダイアログあり ; オフ]
End If
世帯を持たない人の場合のカスタムダイアログ設定は
でブラウズモードでこのスクリプトを実行し、ダイアログを表示させると
となります。
削除しようとする人に関連世帯がある(世帯キーが同一であるレコードがある場合)には
でブラウズモードで、この条件でスクリプトを実行すると
となります。
スクリプトのIfの条件分岐では、ブラウズモードでこの条件でスクリプトを実行する「キャンセル」と削除の部分は同じですが、3つ目のボタン「世帯ごと削除」というのが追加され、これが選択されるとGet (最終メッセージ選択 ) = 3となり、「世帯キー」の関連レコードに移動して、対象レコードを削除するという動作になります。
このスクリプトでは、Ifステップを利用して分岐を行っています。これをカスタムダイアログ内の分岐として処理を行うことも可能です。先の分岐スクリプトをカスタムダイアログ1ステップで分岐させます。
#レコード削除を確認 世帯のあるなしで分岐
カスタムダイアログを作成[“レコード削除” ; “"【注】 会員番号 " & 住所録::会員番号 & "番 " & 住所録::氏名 & " さんの¶レコードを削除します。よろしいでしょうか?"
& If (
Count ( 住所録_自己::世帯キー ) > 0 ;
"¶対象者の世帯ごと削除する場合には「世帯ごと削除」ボタンを押してください。" ;
""
)”]
#レコード削除 or キャンセル
If [ Get (最終メッセージ選択 ) = 1 ]
現在のスクリプト終了 [テキスト結果 ; ]
Else If [ Get (最終メッセージ選択 ) = 2 ]
レコード/検索条件削除 [ダイアログあり ; オフ]
Else If [ Get (最終メッセージ選択 ) = 3 ]
関連レコードに移動 [関連レコードのみを表示; テーブル: 「住所録_自己」; 使用するレイアウト<現在のレイアウト> ]
対象レコード削除 [ダイアログあり ; オフ]
End If
以下、実際のカスタムダイアログの設定画面です。
メッセージ部分の内容は以下のIf文を追記しています。
"【注】 会員番号 " & 住所録::会員番号 & "番 " & 住所録::氏名 & " さんの¶
レコードを削除します。よろしいでしょうか?"
& If (
Count ( 住所録_自己::世帯キー ) > 0 ;
"¶対象者の世帯ごと削除する場合には「世帯ごと削除」ボタンを押してください。" ;
""
)
ボタン3の内容も、ボタン名をコントロールするためIf文で記載しています。
If ( Count ( 住所録_自己::世帯キー ) > 0 ; "世帯ごと削除" ; "" )
これで、削除対象者に関連世帯があれば「世帯ごと削除」ボタンを出す、無ければボタンを表示しないが分岐できます。
はじめに記載したIfステップで分岐することなくカスタムダイアログの工夫だけでも同じ機能が実現出来ました。
カスタムダイアログ内での値の入力
カスタムダイアログ内では値を入力することも出来ます。この入力された値を元に、さらに処理を分岐させることが出来ます。
特定ユーザーがログイン時のパスワード入力を行う事を想定してダイアログを作成してみます。
カスタムダイアログの設定は以下の通りです。
上部の赤枠で囲んだ「入力フィールド」タブをクリックして設定すると入力欄付のダイアログが作成できます。
ここでは入力欄を3つまで使えて、それぞれ入力された値をフィールドか変数に保存できて、入力欄にラベルを付けられ、値がパスワードなどの場合には入力された値が「***」と表示されて直に読めないようにも設定出来ます。実際にこのカスタムダイアログをブラウズモードで実行してみると以下のダイアログが表示されます。
ここで入力された値が正しいパスワードかどうかを判定し、先の処理に進むなどに利用できます。
まとめ
カスタムダイアログは静的なテキストだけではなく、計算式(変数)も使用できるので状況に応じて「タイトル」、「メッセージ」、「ボタン名」がさまざまに変化するダイアログを作成する事が出来ます。また、ダイアログに入力欄を追加し、値を直接入力する事も可能です。
今回のTipsをこんな活用も出来るのだなって記憶の隅に留めておいていただけたら幸いです。
余談ではありますが、滋賀県びわ湖の大津港周りでは、毎年夏に開催されるびわ湖大花火大会以外でも頻繁に中規模、小規模の花火が上がり、毎回楽しませてもらっています。これからだとクリスマスイブとその前の土日、2025年新年を迎える0時過ぎにも結構な規模で花火が上がります。
小説「成瀬は天下を取りに行く」やNHKの「光る君へ」でも大津市が有名になりましたが、滋賀県は自然も豊富で、京都、大阪までも短時間で移動出来て、観光の拠点としても、住んでも良いところです。2024年には滋賀県にもコストコが出来ました。ぜひぜひ滋賀県へ、大津へお越しください。
今年も私のつたない記事にお付き合いくださり、本当にありがとうございました。どうぞ良いお年をお迎えください。皆様のご多幸をお祈りしております。