FileMakerに入門してみて感じたこと総まとめ

昨年の秋頃に「社内システム育成日記」というブログを見て、FileMakerって色んな事が出来るんだなと驚いた。

https://hotspiringday.hatenablog.com/

名前しか聞いたことがなく、Accessほどではないが中小企業のコーポレートITの現場にあることが多い。ただ、出来るやつがいなくなって放置されているお客さんと出会ったり、ファイルベースではなくサーバ立てて共有しているケースに巡り会えなかったため、Access++ぐらいのもんかと思ってて向き合ってこなかった。

しかし、上述のブログを見て**「ちゃんと勉強すれば相当イケてる気がする」**という直感があり、勉強することにした。

FileMakerガチ勢の方、叱咤激励の鬼ツッコミをお待ちしています。

## 準備するもの

- 45日間無料で試用できるFileMaker Pro AdvancedをDL
- 45日間無料で試用できるFileMakerServerをDL
- https://content.filemaker.com/fmb18_reg-ja から、公式の教材とサンプルをDL
    - Basic/Intermediate/Advancedがある
- MacかWindowsマシン

入門教材は公式の教材でOK。市販の入門書買う必要ないです。図書館で市販の入門書を何冊か読んだけど、公式より内容が薄かった。

## データモデリングが先、画面開発は後

FileMakerで何かを作る時は、先にデータ構造を決める必要があった。まず、ここを誤解してた。先にテーブルを作らないと何も出来ない。画面にUIパーツをペタペタ貼っていって、それがあとから「はい、顧客テーブル」ってなるわけじゃなかった。

必要なテーブルを設計して、そのテーブルのどのフィールドを画面に出すかを決定する、という手順で開発が進むのであった。そのため、オブジェクトベースでの画面設計を行う必要がある。ユーザーの業務と操作するデータ構造をちゃんと分析し、好きな操作でデータを操作させるようにしてあげよう。

逆に言えば、**SQL書いたことがないとか、ER図？データモデリング？って人は、FileMakerやめたほうがいい。使いこなせる気がしない。**

FileMakerには繰り返しフィールドってのがあって、1つのフィールドに任意の数だけ複数の値を格納できる機能がある。公式ではない入門書にそういう記載があったが、実際に見てみると、非正規化された状態で複数の値が1レコードに入っていた。フィールド内に繰り返しがあるなんて、リレーショナルデータベースとはって話になる。こういうのは極めて良くないので、後術するポータル機能を使ってちゃんとテーブルを分割しよう。

## FileMakerの用語とか

### レイアウト
FileMakerの強力な武器が、このレイアウト機能。リスト表示、フォーム、表(Excel方眼)、レポートの４つがあり、モバイル用は別途レイアウトを定義すれば、それが適用される。実際にはFileMakerGoというアプリを入れて、そこで動かす。スマホのネイティブアプリの画面開発はクソだるいので、これはすごい。帳票作るのってだるいんだけど、凝った帳票でなければすぐ出来た。

リスト表示の場合は、各行のレイアウトを別途定義すれば良い。フォームも項目を適当に並べるだけ。似たような画面を大量に複製できるので、FileMaker的に良いかどうかわからんが、管理者向け画面と一般ピープル画面を2個作って、スクリプトで制御することも出来る。擬似的なワークフローをレイアウトの画面遷移で実装できる。

### ポータル
「ポータルは、関連テーブルからレコードを表示するレイアウトオブジェクトです」と公式に書いてあって、最初はよくわからなかったが、単純にキーでつながっているテーブルのレコードを操作できる機能だった。

ポータルをD&Dでドラッグしてキーでつながっているテーブルを指すと、顧客の商談履歴の表示並びに編集が可能になる。商談履歴は顧客に対してN件ありますからね。それも勝手にやってくれる。ソート順や結合条件も指定できる。顧客登録の画面で商談履歴の編集も可能だし、リレーションの設定によっては、参照のみに留めることが出来る。外部キーの親が消えたらどうなるのみたいな設定ができる。

確認してないけど、親→子→孫の一括操作も行けるらしい・・・！ 見積→見積明細→作業予定みたいな構造がサポート出来るなら、相当すごい。ゴイゴイスー。

### イベントハンドリング
イベントハンドリングも全てのオブジェクト(レイアウトそのものと、各UIパーツ)で定義できる。試してないけど、レイアウト全体にF1のキーイベントを貼って、適当なテキストボックスにF1のイベントを貼った場合、どっちが先に実行されるんだろう。VisualTree的な構造管理になっていれば、後者のローカルが先になるはず。イベントの伝播がどうなっているのかは未検証。

また、キーイベントのフォーカス移動も設定一つでできるので、とても楽。フォーカス制御だるいんすよね。1行2列入力グリッドも簡単に作れる。レイアウトのは位置を変えるだけ。

### テーブル設計
- 数字、テキスト、日付(時刻、タイムスタンプ)、オブジェクト、計算など
- 計算というのはカラムの値を組合わせて導出するやつ
- 列挙値に該当するものも当然ある。値一覧という。
- 自動採番も出来る
- 正規表現による入力フォーマットチェックはなさげ
- 面白いのは、ふりがな。漢字で打ち込んだ名称にふりがな設定をすると、自動でふりがなが振られる。ナイス。

### テーブルオカレンス（TO)
これがFileMakerの肝な気がする。すごく簡単に言えば、ユースケースに沿ってデータモデリングをする仕組み。FileMakerでは、1つのテーブルに対して複数のテーブルオカレンス(TOと書くらしい)を作ることが出来る。

ベストプラクティスとしては、管理したい業務単位で適切なリレーションを設定し、それを使いまわしていく。画面によっては、リレーション構造は一緒だが結合条件も変えたいみたいなのがある場合、自分が求めるリレーションを定義して画面開発を行えるようになっている。テーブルオカレンスをコピペして増やしても、元々のテーブル定義には影響がない。当たり前だけど。オブジェクトベースの画面設計をちゃんとやれば良い。

試してないが、テーブル定義を変更すれば、きっとテーブルオカレンスも自動的に反映されるはずだ。

FileMakerの流儀では親から子供に対して、左から右にリレーションを貼る。親から子に流れていくほうが見やすいので、それでいいと思う。

### トランザクション
トランザクション管理もサポートしているが、デフォルトではEnterキーが押されたりフォーカスが外れると、入力中のデータをコミットしちゃう。Accessも同じらしい。そういう忖度は求めていなかった。登録ボタンを押した時に限って、コミットして欲しいじゃないですか。

それじゃ困るということで、https://qiita.com/nakatomodesu/items/aef768741a4b4108790e に詳しく制御方式が書いてあった。

### 共有について
Accessみたいにファイルを共有することも出来るが、FileMakerServerというサーバー用のプロダクトがあるのでそれを使えばいい。AWSのマーケットプレイスでセットアップ済みのイメージがあるので、それを使えばAWSで運用できる。ただ、時間課金だと死ぬほど高い。

気になるのは、FileMakerServerってクラスタ構成できるんですかね？ ALB(ELB) + FileMakerServer+ バックエンドはRDSみたいな構成。外部データソースにつなげるってあったから、FileMaker側で接続情報を定義すれば、サーバーとDBを別立てにすることは可能な気がする。未検証。

FileMakerServerがSPOFにならざるを得ない構成は困るなぁと思ったわけで。

また、ESSという外部データソースをつなげる機能もあるが、これはAccessのリンクテーブルと同じようなもので、データをフェッチしてFileMaker側に落として、FileMakerの機能で操作するものらしい。あぶねえなこれ。

### 認証と権限管理について
この辺が面倒な印象。来週検証したい。パスワードの暗号化とか大丈夫なのかな。暗号化の関数あるらしいけど。ログイン認証ってどうやるのが良いんだろうか。サーバー側で認証引き回せるのかな。

### グローバルフィールド
これもFileMaker独自の概念で面白かった。アプリケーション全体で保持できるフィールドで、クイック検索の検索用語とか、ログインユーザー情報などの保存で使うもので、HTTPセッションみたいなもの。ユーザー単位・ひいてはアプリケーション単位で共通化したいものに使う。設定情報とかかな？

### スクリプト
すんげー独特。変数を設定という日本語名のスクリプトを使ったりする。構文が独特なので慣れが必要。まぁ、非技術者にとっては、ガリガリとVBAで書かれるより引数やオプションをちょいちょい指定するだけで済むから、そっちのほうが仕様が明確になるので、良いのかも。

もちろん、独自の関数を使って、それを自分のスクリプト内で参照することも出来るが、17以降(今は18が最新)のバージョンじゃないとそれが出来なかったらしい。「スクリプトを名前で実行」というそうだが、今まではどうやって共通化してたんだ。

HTTP通信の関数もあるし、JSON操作もできるようなので、WebAPIを参照して値をゲットするのは全然できる。ただ、JSONを回してNレコードを突っ込むみたいなのは、未検証。

### 細かい制御について
このあたりが未検証。

- 明細行の挿入と削除(複数行もサポートしたい)
    - 子画面から複数のデータを貰って、N行を明細に追加したい
    - 子画面の戻り値が配列だったらどうしましょ
- リスト行で、チェックボックスがついている行だけを取得する方法が知りたい
    - チェックが付いているものだけ一括で状態変更、みたいなの
    - チェックしたらコミットされるのかな。それは辛い。やめて。
- レイアウトを切り替えた時に、遷移前の状態が残せるようにしたい
    - デフォルトでは残っているような印象
- スクリプト及び管理メニューを一切触れないようにしたい
    - カスタムメニューとかいうやつですかね
- 分離モデル開発
    - データもロジックも全部1つのファイルになったら、役割分担できない。辛い。
    - ファイルを分けて、連携させることで実現できるとある。そうでしょうね。
- 入力値の取得はできるのだろうか
    - 登録ボタンを押した時に、入力値を元に任意のSQLを投げて動かしたい
- リスト表示のページング(ページ送り
    - 任意のSQLを投げてページを調整するしか無いのか、それとも何か方法があるのか 

## FileMakerはVisualStudio的な開発ツールと同じ
データモデリングができて、設計手法気をつけて適切にやれば、すごく使える。使う人が使えば、kintoneより使い勝手の良い業務アプリケーションが出来る気がするが、開発ノウハウが確立されてないと死ぬ。ちゃんと勉強しよう。

なにか分かれば、適宜追記していきます。