和紀Commentsこんにちは。ライジングサン・システムコンサルティングの岩佐です。この記事では、ドラッグ&ドロップ操作が可能なカレンダーソリューションを、FileMakerのカスタムAppに実装する方法をご紹介します。FileMakerの標準機能だけでも、カレンダー形式のレイアウトを作ることはそれほど難しくはありません。Googleカレンダーのようにスケジュールをドラッグ&ドロップで移動したり、スケジュールを入れたい場所をドラッグするだけで予定を入力したい日時をプリセットして登録ウインドウを表示するといった高い操作性を実現することは極めて困難です。そこで今回は、無料で公開されているJavaScriptライブラリを活用して、Googleカレンダーのように高い操作性を兼ね備えたカレンダーソリューションを、FileMakerで実現する方法をご紹介します。記事の最後には、無料のサンプルソリューションをダウンロードできるリンクを設けていますので、ぜひお手元で実際に動かして、その操作性の高さを確かめてみてください。)3-2.FullCalendarに対して、FileMaker内に保存されているスケジュール情報を渡す。3-3.カレンダー上で発生したイベント情報を受取り、適切な処理を実行する。今回、公開させていただくソリューションには、ドラッグ&ドロップ操作で可能な3つの機能が組み込まれています。1-1.タイムラインをドラッグして新規スケジュールを追加(select)こちらの動画のように、タイムライン上でスケジュール予約したい時間帯をマウスでドラッグすると、なぞった時間の開始・終了時間が自動的にセットされたスケジュール入力ウインドウが開きます。1-2.スケジュールをドラッグ&ドロップで移動(eventDrop)登録されているスケジュールは、ドラッグ&ドロップで、別の日にち、及び時間帯に移動することが可能です。頻繁にスケジュール変更が発生するようなソリューションで、この操作感が実現できるのはうれしいですよね。1-3.イベントの下端をドラッグして時間を変更(eventResize)こちらは、スケジュールの下端をドラッグすることで、登録されている時間枠を変更できる機能です。これも、時間変更が頻繁に発生する業務でのソリューションに実装できると嬉しい機能ですよね。動画で見ていただいたとおり、これだけの操作性をFileMakerの純正機能のみで実装することはまず不可能です。今回ご紹介するカレンダーソリューションは、FullCalendarというjQueryベースのJavaScriptライブラリを組み込み、そのライブラリとFileMakerを連携させることで、この操作性を実現しています。【FullCalendar】はオープンソースで、こちらのサイトにソースコードとマニュアルの全てが公開されています。usersまた、ご覧の通りこちらのソリューションはiPadでも同じようにドラッグ&ドロップでの操作が可能です。今回公開させて頂くソリューションには、多くのソリューションで求められるであろう3つの表示方法に対応しました。2-1.カレンダー表示(month)こちらは一般的な7日✕6週のカレンダー表示形式です。このカレンダービューでも、上の動画と同じように、スケジュールを選択してドラッグ&ドロップ操作でスケジュールの移動ができます。2-2.ウィークリースケジュール表示(agendaWeek)次に、週間スケジュール表示形式。この表示形式も、スケジュールを管理する多くのソリューションで求められるタイプの表示形式です。生産性向上が見込めますね。2-3.デイリースケジュール表示(month)最後にデイリースケジュール表示形式です。実は、FileMaker単体機能ではほぼ不可能な、このような重なったスケジュールも、美しく表示できます。スケジュールを表示している色と担当者(人)をひも付けて、関係者同士の空き時間を瞬時に見つける...なんてことも、簡単にできます。3.動作原理のご説明こちらのソリューションをデザインモードで開くと、ほぼ全面をWebビューアコントロールが占めています。カレンダーの表記はFileMakerで実装しているのではなく、全てWebビューアの中に埋め込まれたFullCalendarの機能を使っているのです。その御蔭で、カレンダーを描画する機能に関しては一切FileMakerで実装する必要はありません。FileMakerで実装するのは、概ね次の3つです。)FullCalendarは、データの表示とカレンダー上の操作のみを担当し、実データの作成・変更・削除はFileMaker側が担当することになります。FullCalendarとFileMakerが適切に対話をすることで、意味のあるひとつのソリューションを構成しているのです。FullCalendar(JavaScript)と、FileMakerの対話には、fmpプロトコルという仕組みを使います。fmpプロトコルの詳しい動作原理については、それだけでブログ1記事を書く必要があるほど、便利かつ奥深い機能です。Googleで「fmpプロトコル」や「FileMaker△URLスキーム」等のキーワードで検索すると、たくさんの優良記事が出てくると思いますので、是非そちらを参考いただけると助かります。弊社が過去に投稿したブログ記事の動画でも詳しく説明しているものがあるので、そちらのリングをご紹介させていただきます。シリーズは、ちょっと贅沢な内容です。Webサービスを使って、インタラクティブなデータ可視化ソリューションを実装する方法をご紹介します。pockets3-2.FullCalendarに対して、FileMaker内に保存されているスケジュール情報を渡す。FileMaker内に保存されているスケジュールデータは、JSON形式でFullCalendarに渡します。御存知の通り、Ver16よりFileMakerにもJSONデータをハンドリングするための組み込み関数が実装されました。お陰で、極めて少ないスクリプト、及び計算式の記述量でFullCalendarにスケジュール情報が渡せるようになりました。こちらは実際にFullCalendarに渡すスケジュールデータをJSON形式で現したものです。※Ver16より組み込まれたJSONFormatElements関数でフォーマッティングしたもです。Ver16より前のバージョンのFileMakerでこの手の処理を実装するには、プラグインを使うか、WebビューアにJavaScriptを組み込んでそちら側で処理を実装するか、もしくはFileMaker側に力技で実装するしかありませんでした。Ver16に実装されたJSON関連の組み込み関数のお陰で、このあたりの実装が随分楽になりました。3-3.カレンダー上で発生したイベント情報を受取り、適切な処理を実行する。FullCalendarには、標準で幾つかのイベントトリガが用意されています。今回は、その中でも代表的な「select」「eventDrop」「eventResize」「eventClick」そして、「viewRendar」という5つのイベントが発生した時に、FileMakerのスクリプトを呼び出す形でサンプルソリューションを作ってみました。次章から、これらのイベント関係をご説明します。4.今回使用した5つのFullCalendar標準イベント4-1.selectイベントselectイベントは、タイムラインをドラッグ操作した時にFullCalendar上で発生するイベントです。このイベントが発生すると、FileMaker側の【select】というスクリプトが呼び出されます。この時に、以下の引数を渡します。・ドラッグ操作で選択した開始日付:startDate・ドラッグ操作で選択した開始時間:startTime・ドラッグ操作で選択した終了日付:endDate・ドラッグ操作で選択した終了時間:endTime・イベントが発生したビュー:viewName(month/agendaWeek/agendaDay)・イベントが発生したビューの表示開始日:intervalStart・イベントが発生したビューの表示終了日:intervalEndFileMakerは、受け取った引数を元に、スケジュール登録用のカードウインドウを表示し、スケジュールテーブルに新規レコードを作成。初期値は引数で受け取った値をプリセットします。4-2.eventDropイベントeventDropイベントは、FullCalendar上で、登録済みのスケジュールをドラッグ&ドロップした時に発生します。このイベントが発生すると、FileMaker側の【eventDrop】スクリプトが呼び出されます。この時に、以下の引数を渡します。・FileMakerに格納されているイベントレコードのID値:ID・ドロップした場所の開始日付:startDate・ドロップした場所の開始時間:startTime・ドロップした場所の終了日付:endDate・ドロップした場所の終了時間:endTime・イベントが発生したビュー:viewName(month/agendaWeek/agendaDay)・イベントが発生したビューの表示開始日:intervalStart・イベントが発生したビューの表示終了日:intervalEndFileMakerは受け取った引数を元に、該当のスケジュールレコードを検索して、カードウインドウに表示します。この時、スケジュールが移動された位置の日時情報を引数として受け取るので、その情報をFileMakerの該当フィールドにプリセットします。カードウインドウ上で保存ボタンを押せば、その移動が確定。カードウインドウ右上の閉じるボタンを押せば、スケジュールの移動がキャンセルされ、元の位置に戻ります。4-3.eventReizeイベントeventReizeイベントは、FullCalendar上で、登録済みのスケジュールの下端をドラッグしてスケジュールの時間が変更された時に発生します。このイベントが発生すると、FileMaker側の【eventResize】スクリプトが呼び出されます。子の時に、以下の引数を渡します。・FileMakerに格納されているイベントレコードのID値:ID・リサイズした結果の開始日付:startDate・リサイズした結果の開始時間:startTime・リサイズした結果の終了日付:endDate・リサイズした結果の終了時間:endTime・イベントが発生したビュー:viewName(month/agendaWeek/agendaDay)・イベントが発生したビューの表示開始日:intervalStart・イベントが発生したビューの表示終了日:intervalEndFileMakerは受け取った引数を元に、該当スケジュールのレコードを検索し、カードウインドウに表示します。この時、変更された時間を引数として受け取るので、その情報をFileMakerの該当フィールドにプリセットします。カードウインドウ上で保存ボタンを押せば、その移動が確定。カードウインドウ右上の閉じるボタンを押せば、スケジュールの移動がキャンセルされ、元の位置に戻ります。4-4.eventClickイベントeventClickイベントは、FullCalendar上でスケジュールがクリックされた時に発生するイベントです。このイベントが発生すると、FileMaker側の【eventClick】スクリプトが呼び出されます。この時に、以下の引数を渡します。・FileMakerに格納されているイベントレコードのID値:ID・イベントが発生したビュー:viewName(month/agendaWeek/agendaDay)・イベントが発生したビューの表示開始日:intervalStart・イベントが発生したビューの表示終了日:intervalEndFileMakerは受け取った引数を元に、該当スケジュールのレコードを検索し、カードウインドウに表示します。4-5.viewRendarイベントviewRendarイベントは、FullCalendar上で、ビューの表示切り替えや、月・週・日の移動が発生してカレンダーが再描画されるタイミングで発生します。このイベントが発生すると、FileMaker側の【eventResize】スクリプトが呼び出されます。子の時に、以下の引数を渡します。・表示切り替え後のビュー:viewName(month/agendaWeek/agendaDay)・表示切り替え後のビューの表示開始日:intervalStart・表示切り替え後のビューの表示終了日:intervalEndFileMakerは受け取った引数を元に、該当期間のスケジュールをJSONでFullCalendarに渡します。※今回のサンプルでは、この機能は未実装です。※今回のサンプルプログラムは、FileMakerに登録されている全てのスケジュールデータをFullCalendarに渡す仕組みになっています。5.まとめ今回ご紹介したソリューションは、FileMakerの純正機能だけでは実現が困難な、操作性の高いカレンダーソリューションを、Webビューアを使って実現しました。FileMakerは、もともと開発生産性の極めて高い開発プラットフォームですが、そのトレードオフとして、今回のような高い操作性を実現する機能をFileMakerのみで開発することはできません。Webビューアを使い、ネット上に無料で公開されているFullCalendarのようなオープンソースライブラリを使いこなせれば、FileMakerの開発生産性の高さを活かしつつ、より高度なソリューションが開発できるようになります。今回ご紹介するソリューションをダウンロードして、実際に使ってみてください。ドラッグ&ドロップ操作が可能なカレンダーこちらのボタンからサンプルのカスタムAppをダウンロードしてください。※Ver16以上のFileMakerPro/FileMakerProAdvancedが必要です。※iPadで動かすためにはFileMakerGo16以上が必要です。※OSのバージョンや特定の環境下においては正常に動かない可能性もあります。Downloadsまた、ダウンロードしたソリューションの中身を解析して、自分のソリューションに組み込んでいただくこともできます。こちらから完全アクセス権の情報をご請求ください。BMWジャパンやDOLCE&GABBANAジャパンといった外資系企業、及び東証一部上場企業において、情報システム部門の立ち上げから基幹システムの企画・開発・運用まで幅広い経験と実績を持つ。2006年にフリーエージェントのITコンサルタントとして独立。株式会社ライジングサン・システムコンサルティングを創業する。現在はFileMakerプラットフォームとアジャイル開発を用いたシステム開発の内製化をサポートしている。