フィールドを追加する

カレンダーに独自のフィールドを追加するには、どのようにしますか?

概要

カレンダーでデータがどのように表示されるかの書式の多くは、「Calendar Source Data」レイアウト上に設定してあります。このレイアウトで、どのフィールドを「サマリ」に使用するかを決定します。「サマリ」は、すべてのカレンダーの画面上で表示されるイベントの属性です。「サマリ」フィールドに計算を用いることによりカレンダー上に何でも表示させることができます(たとえば、ユーザのイニシャルとイベントの詳細など)。

カレンダーを統合した際に、「zscEventSummaryCalc」という名前のイベントのテーブルにフィールドを作成しました。このフィールドの定義を編集して、カレンダーに追加のフィールドを含めます。詳しくは「複数行のイベント」のページを参照してください。

「Format Event Summary --- Edit the Style of the Event Text Here ---」スクリプトに、追加のコントロールがいくつかあります。

ただし「日」表示はスペースに余裕があり、「サマリ」に加えて何らかの情報を表示させることもできます。

「日」表示

イベントのテーブルにあるどのフィールドでも、カレンダーの「日」表示上に配置できます。また配置するフィールドを必要に応じて入力可能にすることもできますが、後述の通り、若干注意が必要です。

カレンダーを統合したときに、以下のフィールドの一致に基づいて「CalendarRows」から「Sample Events」へのリレーションシップをすでに作成しました。

CalendarEventUIDCalc_FirstValue = _id

「_id」の部分が、あなたのイベントのテーブルにあるプライマリーキー(ユニークID)です。このリレーションシップは、ガントチャートで使われますが、このリレーションシップによりイベントのテーブルから直接「日」表示にフィールドを追加することもできます。

次に、レイアウトモードで、カレンダーの「日」タブに切り替えます(レイアウトモードで「日」タブに切り替える方法は、「カレンダーのタブ」を参照してください)。そして、イベントのテーブルからフィールドを追加するだけです。これでオリジナルのカレンダーファイルにある「SampleEvents」テーブルからのフィールドになります。

「Refresh Calendar...」スクリプトの最後に「ウィンドウの再表示」ステップを追加して、「キャッシュ結合結果を書き込む」のオプションを使うようにします。パフォーマンスをできるだけ望む場合には、これをIfの記述にまとめて「$$sc_Mode = "Day Sched"」のときのみ、このステップが実行されるようにすることができます。その理由は、「Flush...」の部分はサーバからキャッシュされたデータを保管するためにFileMakerが行う作業の一部を取り消すので、ネットワークによってはデータを再び取得する必要がある場合にそのことに気づくためです。

複数のデータソース

そして、言うまでもないことですが、イベントのソースのテーブルのひとつひとつについて同様のリレーションシップを設定しない限りは、一度に動作するのは1つのテーブルに対してのみです。プライマリーキーがすべて前置されている場合、“真”となるリレーションシップは一度に1つだけであるため、このようにして他のイベントのフィールドをスタックすることができます。プライマリーキーが前置されていない場合はSeedCodeまでご連絡ください。解決のためのカスタムソリューションをご用意しております。

入力できるフィールド

イベントのテーブルに含まれるフィールドの入力を許可すると、情報が編集されてイベントの移動や色の変更が発生する可能性があることに注意してください。FileMakerは、あなたがフィールドを編集したためにカレンダーが再描画されるという状況を検知できません。このような場合には、フィールドに「Refresh Calendar」スクリプトをコールするスクリプトトリガを設定する必要があります(「OnObjectSave」のスクリプトトリガを推奨します)。このスクリプトには、パラメータを渡さないでください。

 

タブごとにフィールドを変更する

カレンダーの表示に応じて別のフィールドが見えるようにすることはできますか?

概要

はい、できます。上述のセクションでは「日」表示にフィールドを追加する方法を解説しましたが、他の表示で表示される項目を変えることもできます。ここで解説する例では、「月」表示にイベントのテーブルの「MyField」という名前のフィールドだけを表示し、他の表示ではカレンダーの「サマリ」に割り当てたフィールドを表示する方法を解説します。

変更内容

まず、ファイルのバックアップをとりましょう(^-^)

  1. 「Cast Events as Variables - Build Query」スクリプトを編集します。「Build Query 2」コメントを見つけます。このコメントの後にある、最初の「変数を設定」行を編集していきます。

  2. 「変数を設定」行の計算式には、「Let() 」の記述が含まれています。この「Let」は、変数「f」(フィールドのf)を、イベントのテーブルから引いてくるフィールドのリストに設定します。現在、最後の部分は、次のようになっています。

    & "." & Quote ( $$sc_FieldForStatus )

    このコードの直後に、次の部分を追加します。

    & If ( $$sc_Mode = "Month" ; ", " & $sc_Alias & "." & "MyField" )

    これにより、「MyField」フィールドがSQLクエリの結果に追加されるため、「月」表示が描画されるときにアクセスできるようになります。このようにフィールド名を文字通りにハードコードすることは、一般的にはあまりよい考えではありません。「MyField」の名前を変更すると、この計算式が壊れてしまうからです。しかし動作を見るだけの目的であれば、便利な方法です。動作を確認できたら前に戻り、「MyField」の部分をフィールドを指すカスタムの関数で置き換えてテーブル名を削除すれば、効率よくフィールド名をSQLセーフにすることができます。Kevin Frankが優れた関数を公開しています。http://www.filemakerhacks.com/?p=4924を参照してください。

    この計算式を拡張して、ほかのモードでも使用できるように新規フィールドを含めることもできます。参考:カレンダーで使用できるすべてのモードと表示については「カレンダーのモード」に記載しています。

    複数のソースがある場合は、これを拡張して「MyField」に相当するそれぞれのフィールドを含めるか、またはCase文と「sc_SourceNo」のそれぞれの値のフィールドを使って各ソースを含めることに注意してください。

  3. 「Read Event Summary by Number ( Number )」スクリプトを編集します。「Summary」のコメントの直後の行を編集します。計算式の1行目のこの部分を、

    Substitute ( GetValue ( $sc_Calendar ; 3 ) ;

    次のように変更します。

    Substitute ( GetValue ( $sc_Calendar ; If ( $$sc_Mode = "Month" ; 5 ; 3 ) ) ;

    ここにある数字の5と3は、SQLの結果によるcolumnです。「MyField」を「Status」の後に置くため、5番目のcolumnとなるからです。

  4. ソースが1つだけの場合は、「Get ( レイアウトテーブル名 )」の検証は省いてかまわないことに注意してください。この検証をすることで、カレンダーの動作は若干重くなります。この検証を省く場合は、上述の計算式の先頭の2行と最後の2行を削除します。 この時点で、「MyField」が1つだけの場合は、「月」表示のイベントの時間の横に表示されます。時刻も取り除きたい場合は、「Format Event Time --- Edit Time Formats for Events Here ---」スクリプトを編集します。スクリプトの最後の「変数を設定」の記述について、その4行目で「日」表示に関する行をコメントアウトしてあります。この行のコメントを解除し、モードの形式を「Day Sched」から「Month」に変更します。これで「月」表示から時刻が取り除かれます。

 これで完成です!