FileMakerでアプリ作っていくよ【作って学ぼう】

# ぷろろーぐ
#### データトゥーンしたいな～。
みなさんFileMaker好きですか？スプラトゥーンも好きですか？
それならデータトゥーンしてみませんか？

今回はFileMakerで、実践的なアプリを作る過程を書き綴りたいと思います。
公式からはイカリング２なんていう便利なツールも出ていて、結構細かいログなんかも
残してくれるんですが、１３歳未満は使えないという謎の制限があります。
なので、子供のプレイログを保存するために作りたいと思います。
> 18-12-03：敵統計画面　を追記。ひとまずこれで完成！
> 18-11-28：バトル統計画面　を追記。
> 18-11-22：バトル一覧画面　を追記。
> 18-11-21：武器登録画面、バトル記録画面　を追記。
> 18-11-21：battle::idの既定値を修正([nagaikao](https://qiita.com/nagaikao)さん、ありがとうございます!)
> 18-11-16：リレーションを定義追加
> 18-11-16：誤字修正([khsk](https://qiita.com/khsk)さん、ありがとうございます!)
> 18-11-15：新規投稿

FileMakerのスキルアップが目的の人も、結局１番勉強になるのって作ることなんですよね。
なので、そういう方のためのチュートリアル的な記事になればとも思っています。

ものすごく細かいところの説明は、一部端折ってます。分かり難いところがあれば追記or回答しますのでコメントください！
間違いとかこうした方がいいよというのがあれば、同様にアドバイスいただけると幸いです。

#### こういう人むけ
- FileMaker好きな人
- スプラトゥーン好きな人（好きじゃなくても大丈夫だよ）
- スプラトゥーンで自分のプレイを分析してみたい人
- FileMaker初級～中級者で、もう一歩スキルアップしてみたい人（本当に始めたばかりの人だとちょっと難しいと思うので、基本操作レベルは習得しておいていただいたほうが良いかもしれません）
- イカリング２のバトルログを、サーバからAPIで取得してどうのこうのという難しいやつではないです。それは他の人がいろいろやってそうなので検索してみてね。

#### こんな感じの作るよー
【登録画面】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/7720a214-5693-c85f-a0bf-adcacccf9aeb.png)
【統計画面】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6a71fa63-6eff-6b67-6292-a383c8df407b.png)

# 準備（俗に言う「設計」のゆるいやつ）
#### 要件(野沢雅子風に言うなら「ねげぇ」)きめよーっと。
 1. ルールごとの勝率とキルレベル※知りたい
 2. ステージごとの〃
 3. 苦手な相手の武器が知りたい
 4. 得意な〃
 5. 武器は分類（シューター／ローラー　とか）でも分析したい

※１回のデスあたりに何キルしているか
#### どんな機能があればいいかな～。
- バトルの情報を入力する機能
    - ルール／ステージ／勝敗／日付／所要時間／ウデマエ
- 相手の情報入力する機能 
    - 武器／名前
- キル／デスを入力する機能
    - 相手の武器／武器区分(メイン／サブ／スペシャル)
- バトルを分析する機能
    - ルール別の勝利数／敗北数／キル数／デス数
    - ステージ別の〃
- 相手武器を分析する機能
    - 武器ごとのキル数／デス数／キルレベル
    - 分類ごとの〃
- 武器をメンテナンスする機能
    - 名前／分類／サブウェポン／メインウェポン／画像

#### じゃあ必要な画面は
- バトル結果入力画面
    - バトルの情報を登録
    - 対戦相手の情報を登録
    - キル／デスの情報を登録
- バトル統計画面
    - エリア別の統計表示
    - ステージ別の統計表示
- 対戦相手統計画面
    - 武器別の統計表示
    - 分類別の統計表示
- 武器メンテナンス画面
    - 武器の属性を登録　アップデートに備えて

#### 画面構成はこんな感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/40263750-cd18-106b-047e-8954e2411e40.png)
上に画面を切り替えるメニュー（ボタン群）、下に選択した画面を表示。
#### テーブル構成考えっか
- バトルテーブル（１バトルで１レコード）
- 対戦相手テーブル（バトルテーブルと１：４）
- キルテーブル（バトルテーブルと１：ｎ）
- デステーブル（バトルテーブルと１：ｎ）
- 武器テーブル（マスタ）

# 実際に作っていくよ
## ①テーブル作ろう
**バトルテーブル（テーブル名：battle）**

| フィールド名 | 型 | 説明 |補足／計算式等|
|:--|:-:|:--|:--|
|id|数字|ユニークなID|自動入力※|
|日付|日付|プレイした日||
|ルール|テキスト|例）エリア、ヤグラ||
|ステージ|テキスト|例）ハコフグ倉庫とか||
|キル|数字|キルした数||
|デス|数字|デスした数||
|スペシャル|数字|スペシャル発動した回数||
|勝敗|テキスト|勝 or 負||
|所要時間|時刻|バトル時間(最後までなら5:00）|分:秒として使う|
|ウデマエ|テキスト|例）A+、X2200||
|補足|テキスト|例）神試合！とか　日記的なもの||
|キル合計|集計|キル数の合計||
|デス合計|集計|デス数の合計||
|勝フラグ|計算|勝敗が「勝」の場合に1|勝敗="勝"|
|勝フラグ合計|集計|勝フラグの合計||
|負フラグ|計算|勝敗が「負」の場合に1|勝敗="負"|
|負フラグ合計|集計|負フラグの合計||
|キルレベル|計算|1デスあたりのキル数|Round(キル合計/デス合計;2)|
|勝率|計算|勝利数の割合|Round(勝フラグ合計 / Get ( 対象レコード数 );2)|
※ idには既定で現在のレコード数＋１が入るようにしておく。またユニークにしておく。
自分が使う武器を毎回変える人は「武器」フィールドがあったほうが良いですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/ce3d6be2-a146-6df7-67fa-ca4592f4293a.png)
``` If(Get( レコード総数 )<>Get( 対象レコード数 );Get( レコード総数 )+1;Get( 対象レコード数 )) ```
※ややこしい計算ですが、FileMakerのおかしな動作をカバーするためです。おまじないと思ってコピペしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/26d6c220-927b-119d-da54-090b308d9caf.png)
**対戦相手テーブル（テーブル名：enemy）**

| フィールド名 | 型 | 説明 |補足／計算式等|
|:--|:-:|:--|:--|
|バトルid|数字|対戦したバトルのID||
|武器|テキスト|使用武器||
|名前|テキスト|無くてもいいけど保存しておくと遊べそうｗ||
|回線落ち|数字|回線落ちした場合に1を登録||
|カウント|集計|バトルidのカウント|集計で使用する|

**キルテーブル（テーブル名：kill）**

| フィールド名 | 型 | 説明 |補足／計算式等|
|:--|:-:|:--|:--|
|バトルid|数字|対戦したバトルのID||
|武器|テキスト|使用武器||
|武器区分|テキスト|メイン/サブ/スペシャル など|既定で「メイン」をセット※|
|補足|テキスト|思い出とか　用途自由||
|カウント|集計|バトルidのカウント|集計で使用する|
※ 武器区分はメインが多いので、既定で設定されるようにしておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/aa0776bd-6372-1535-c550-693890b94b71.png)

**デステーブル（テーブル名：death）**

killテーブルと全く同じ定義なので割愛

**武器テーブル（テーブル名：weapon）**

| フィールド名 | 型 | 説明 |補足／計算式等|
|:--|:-:|:--|:--|
|分類|テキスト|例）シューター、ローラー など||
|シリーズ|テキスト|オリジナルの武器（例えばスシコラやオクタシューターは「スプラシューター」||
|名前|テキスト|武器の正式名称||
|サブ|テキスト|サブウェポン||
|スペシャル|テキスト|スペシャルウェポン||
|画像|オブジェクト|無くてもいいけど遊び心で||
## ②リレーション定義しよう
の前に、テーブルオカレンス名の命名規則について。

- リレーションの階層をピリオド「.」で区切る
- 同じ階層のテーブルオカレンスはアットマーク「@」に続けて、用途を記載

**ルートがbattleテーブルのリレーション**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/e1804b72-04ed-84b6-5e77-9bbe06376d0f.png)

| テーブルオカレンス名 | テーブル | 用途 | 結合条件 | 補足 |
|:--|:-:|:--|:--|:--|
|battle|battle|ルート|－||
|battle.enemy|enemy|対戦相手ポータル用|battle::id=enemy.kill::バトルid|レコード作成許可、関連レコード削除 ※1 |
|battle.kill|kill|キルポータル用|battle::id=battle.kill::バトルid|レコード作成許可、関連レコード削除|
|battle.death|death|デスポータル用|battle::id=battle.death::バトルid|レコード作成許可、関連レコード削除|
|battle.battle@ルール|battle|バトル統計用|battle::ルール=battle.battle::ルール||
|battle.battle@ステージ|battle|バトル統計用|battle::ステージ=battle.battle::ステージ||
|battle.enemy.weapon|weapon|対戦相手武器|battle.enemy::武器=battle.enemy.weapon::武器||
※1以下のチェックのことです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/ec7e1aa2-01a2-d4ef-4732-db57625c22f6.png)

**ルートがenemyテーブルのリレーション**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/4fef1c15-fef7-47a8-96b4-9060a510ad66.png)

| テーブルオカレンス名 | テーブル | 用途 | 結合条件 | 補足 |
|:--|:-:|:--|:--|:--|
|enemy|enemy|ルート|－||
|enemy.weapon|weapon|武器情報取得|enemy::武器=enemy.weapon::武器||
|enemy.battle|battle|バトル情報|enemy::バトルid=enemy.battle::id||
|enemy.kill|kill|武器別のキル統計用|enemy::武器=enemy.kill::武器||
|enemy.death|death|武器別のデス統計用|enemy::武器=enemy.death::武器||
|enemy.wepon.wepon@分類|wepon|武器の分類別の統計用|enemy.wepon::分類=enemy.wepon.wepon@分類::分類||
|enemy.wepon.wepon@シリーズ|wepon|武器のシリーズ別の統計用|enemy.wepon::シリーズ=enemy.wepon.wepon@シリーズ::シリーズ||
|enemy.wepon.wepon@分類.kill|kill|武器の分類別のキル統計用|enemy.wepon.wepon@分類::武器=enemy.wepon.wepon@分類.kill::武器||
|enemy.wepon.wepon@分類.death|death|武器の分類別のデス統計用|enemy.wepon.wepon@分類::武器=enemy.wepon.wepon@分類.death::武器||
|enemy.wepon.wepon@シリーズ.kill|kill|武器のシリーズ別のキル統計用|enemy.wepon.wepon@シリーズ::武器=enemy.wepon.wepon@シリーズ.kill::武器||
|enemy.wepon.wepon@シリーズ.death|death|武器のシリーズ別のデス統計用|enemy.wepon.wepon@シリーズ::武器=enemy.wepon.wepon@シリーズ.death::武器||
後半ちょっとややこしいな...。画面作るところで説明するかな。

## ③武器登録画面を作ろう
- 最初に武器登録画面を作っておきましょう。特に難しいところはないと思います。
    - レイアウト名：武器登録
    - レコードを表示（ＴＯ）：weapon
    - 表示：リスト形式のみ  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/25f5d4d7-da35-c781-7797-e59f9ef1a30e.png)

- メニューバーを作ります。  
とりあえずボタン５つ並べておいてください。スクリプトは全ての画面が完成後に設定します。
選択中のボタンだけ、アクティブであることが分かるようなデザインにします（この例だとオレンジ）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/1e4d63a4-552a-f923-6a83-9314eb837c3c.png)
フォントはニコカがスプラトゥーンぽいので、あわせたい方はダウンロードとインストールしてください。<br>
http://nicofont.pupu.jp/nicoca.html
※こだわらない方はスキップしてください
- 操作ボタン３種作ります。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/29f6ae5e-bc46-4eef-59cc-c37ae9893eef.png)  
新規ボタンには「新規レコード/検索条件」を割り当てます。
コピーボタンには「レコード/検索条件複製」を割り当てます。
削除ボタンには「レコード/検索条件削除」を割り当てます。
- タイトルとフィールドを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/2eb90a99-3a91-6997-1b90-cf1a468222d5.png)
タイトルはヘッダパートに、フィールドはボディパートに配置してください。

| 項目 |フィールド| オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|名前|weapon::名前|編集ボックス||
|サブ|weapon::サブ|編集ボックス||
|スペシャル|weapon::スペシャル|編集ボックス||
|シリーズ|weapon::スペシャル|編集ボックス||
|分類|weapon::スペシャル|編集ボックス||
|画像|weapon::画像|-|パディングは0で良いです![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/c9f76def-939f-a4d5-0d25-e938085fd3c7.png)|
完成です。いろいろ登録してみてください。画像は適当にネットとかで拾ってください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/1776b403-8ac3-94d2-cc23-08854c995b9e.png)

## ④バトル記録画面を作ろう
- 新規レイアウトを作成しましょう。
    - レイアウト名：バトル記録
    - レコードを表示（ＴＯ）：battle
    - 表示：フォーム形式のみ<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/9c53f9d1-fb17-93ba-4ee9-a0243e1a549d.png)
- メニューバーを作ります。武器登録画面と同じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/efbad61f-d904-8e05-79b3-1a68ff4affdb.png)  
「バトル記録」ボタンをアクティブな書式にします。
- 操作ボタン３種作ります。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/a9803063-9ce6-10ab-5b41-d1e144490a3c.png)<br>
新規ボタンには「新規レコード/検索条件」を割り当てます。  
削除ボタンには「レコード/検索条件削除」を割り当てます。  
コピーボタンは以下のスクリプトを作成して割り当てます。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6002deca-0340-0b8b-f836-230167d17c02.png)<br>
- バトル情報を追加します。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/3ea162fa-904c-4afe-b3f8-9c63ca47ecc1.png)<br>


| 項目 | オブジェクトタイプ | 補足 |
|:--|:--|:--|
|ステージ|ドロップダウンリスト|カスタム値一覧※1|
|ＩＤ|編集ボックス|ブラウズモードでの入力不可※2|
|勝敗|ラジオボタンセット|カスタム値一覧(勝/負)|
|ルール|ドロップダウンリスト|カスタム値一覧(最後に付録があるのでそこからコピーして)|
|ウデマエ|編集ボックス|カスタム値一覧にしてみても良い|
|日付|ドロップダウンカレンダー||
|時間|ドロップダウンリスト|カスタム値一覧(10分きざみで　2:00、2:10…　最後に付録があるのでそこからコピーして)|
|キル・デス|ドロップダウンリスト|カスタム値一覧(0～20くらい ご自身のウデマエにあわせて)|
|スペシャル|ドロップダウンリスト|カスタム値一覧(0～10くらい)|
|補足|編集ボックス||
※1 カスタム一覧は以下の手順で作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/ee797944-e40f-c8f0-345f-4bfbe9d4f53d.png)
一覧の表示切替～、値一覧の編集を許可、値一覧を使用して～　の３つは全てＯＮにします。
中身は最後に付録があるのでそこからコピーしてください。

※2 インスペクタの「データ」タブで、フィールド入力のブラウズモードをＯＦＦにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/ca42ca2f-fd47-f47b-8682-c017efebd81e.png)


- 対戦相手リストを追加します<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/b6cbb8bf-c35b-7a79-ebe6-5198e16b4dca.png)<br>
- ポータルを使います。![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/22a07291-8737-303c-7757-7b76e6d7501e.png)
    - 関連レコードは「battle.enemy」
    - スクロールバーはＯＦＦ（相手は４人固定なので）
    - 行数は４<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/2b950276-9030-22d9-40fe-17c63c1e021f.png)<br>

| 項目 | フィールド | オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|画像|battle.enemy.wepon::画像|-|ブラウズモードＯＦＦ|
|武器|battle.enemy::武器|ドロップダウンリスト|※値一覧は後述|
|名前|battle.enemy::名前|編集ボックス||
|回線落ち|battle.enemy::回線落ち|チェックボックスセット|カスタム値一覧(1だけ)|
|キルボタン|-|ボタン|※スクリプトは後ほど割り当てます|
|デスボタン|-|ボタン|※スクリプトは後ほど割り当てます|
※武器の値一覧は武器テーブルから取得します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/79be6f51-6a06-1812-8a06-e15054b9d313.png)

- キルリストを追加します<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/78d47663-9f13-89b0-487d-1d05a115ef7b.png)
- こちらもポータルを使います。
    - 関連レコードは「battle.kill」
    - スクロールバーはＯＮ
    - 行数はいくつでも構いません
    - インスペクタで名前を「キル一覧」にします（後で使います）。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/59984461-e50c-7aa4-b6f0-18c44119d405.png)
<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/b3148ac6-f159-52d4-8053-02c1c164fb0a.png)<br>

| 項目 | フィールド | オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|相手の武器|battle.kill::武器|ドロップダウンリスト|※値一覧は後述|
|武器区分|battle.kill::武器区分|ドロップダウンリスト|カスタム値一覧（メイン/サブ/スペシャル/他）|
|補足|battle.kill::補足|編集ボックス|用途は自由です（着地狩り、ホコショット等）|
|削除ボタン|-|ボタン|スクリプト「レコード/検索条件削除」を割り当てます。|
※武器の値一覧は現在のバトルの対戦相手から取得します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/230f1538-cd6a-8a96-b0fb-980037c06556.png)

- デスリストを追加します<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/4b782623-0e88-539a-1692-dfe65ed298b3.png)
- 内容はほぼキルリストと同じです。ＴＯがbattle.deathに変わっただけです。
    - 関連レコードは「battle.death」
    - インスペクタで名前を「デス一覧」にしておきます（後で使います）。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/b818a4b4-4d81-0093-3bc4-d170f2261281.png)<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/7ccb91e6-8f00-2ce8-538e-b78cd0184b00.png)
<br>

| 項目 | フィールド | オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|相手の武器|battle.death::武器|ドロップダウンリスト|※値一覧もキルリストと同じ|
|武器区分|battle.death::武器区分|ドロップダウンリスト|カスタム値一覧（メイン/サブ/スペシャル/他）|
|補足|battle.death::補足|編集ボックス|用途は自由です（着地狩り、ホコショット等）お好みでカスタム値一覧に|
|削除ボタン|-|ボタン|スクリプト「レコード/検索条件削除」を割り当てます。|

- キルボタン／デスボタン用のスクリプトを作成します。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/ab637e54-005b-edd4-1c25-f43eda768b44.png)
キルかデスかをスクリプト引数（パラメータ）で受け取ります。
現在行の武器を変数`$武器`に格納します。
キルなら「キル一覧」へ移動して、ポータルの最後の行へ移動します。
（ここで先ほどポータルに設定した名前を使ってます）
`battle.kill::武器`に先ほど格納した変数をセットします。このタイミングで
勝手にkillテーブルにデータが生成されます。
デスの場合も同様です。移動するポータルとセットするテーブルが違います。
最後にレコード確定して終わりです。

- 作成したスクリプトをボタンに割り当てます。<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/42b8ff79-a0c5-3ca7-ab25-d7eaac90ccbe.png)
「オプションのスクリプト率い数」に"キル"を設定すると、先ほど作成したスクリプトの
`Get( スクリプト引数 )`で受け取ることができます。
デスボタンもほぼ同じですので、演習がてらご自身でやってみてください。

- まだ中途半端ですが、一旦終わりにします。いろいろさわってみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/9600405b-e9f1-1be1-48ae-4a4343095630.png)



## ⑤バトル一覧画面を作ろう
- 新規レイアウトを作成しましょう。
    - レイアウト名：バトル一覧
    - レコードを表示（ＴＯ）：battle
    - 表示：リスト形式のみ<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/b8ad42a6-f7c3-097b-f458-dbb02ebb438c.png)

- メニューバーを作ります。作成済みの画面からコピーすると良いです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/e1a3c73a-6326-e2b9-bae8-e1a0bdefa278.png)

- 集計エリアを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/f4fb351a-ac76-eca9-0298-076fe10855f2.png)<br> 
ヘッダーパートに乗せてください。

| 項目 |フィールド| オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|勝利合計|battle::勝フラグ合計|編集ボックス|ブラウズモードでの入力不可|
|敗北合計|battle::負フラグ合計|編集ボックス|ブラウズモードでの入力不可|
|キル合計|battle::キル合計|編集ボックス|ブラウズモードでの入力不可|
|デス合計|battle::デス合計|編集ボックス|ブラウズモードでの入力不可|
|キルレベル|battle::キルレベル|編集ボックス|ブラウズモードでの入力不可|

- タイトルとフィールドを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/1d751b73-5824-9ff7-5f13-87c3bb85244d.png)<br>
タイトルはヘッダパートに、フィールドはボディパートに配置してください。  

| 項目 |フィールド| オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|id|battle::id|編集ボックス|ブラウズモードでの入力不可|
|日付|battle::日付|編集ボックス|ブラウズモードでの入力不可|
|ルール|battle::ルール|編集ボックス|ブラウズモードでの入力不可|
|ステージ|battle::ステージ|編集ボックス|ブラウズモードでの入力不可|
|キル|battle::キル|編集ボックス|ブラウズモードでの入力不可|
|デス|battle::デス|編集ボックス|ブラウズモードでの入力不可|
|スペシャル|battle::スペシャル|編集ボックス|ブラウズモードでの入力不可|
|所要時間|battle::所要時間|編集ボックス|ブラウズモードでの入力不可|
|勝敗|battle::勝敗|編集ボックス|ブラウズモードでの入力不可|
|ウデマエ|battle::ウデマエ|編集ボックス|ブラウズモードでの入力不可|

勝敗フィールドは見易くなるように、条件付書式を入れておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/35952d0c-1e7b-cde0-f84f-2101c4667740.png)
値が"勝"の時は背景をブルーに、"負"の時は背景をグレーにする。という条件にしています。

- 完成です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/4be531e3-18c2-1461-572e-cbcd829a5938.png)

## ⑥バトル統計画面を作ろう
- 新規レイアウトを作成しましょう。
    - レイアウト名：バトル統計
    - レコードを表示（ＴＯ）：battle
    - 表示：リスト形式のみ<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/600fd2c3-dc6c-6d4e-544f-23ae615893a9.png)

- メニューバーを作ります。作成済みの画面からコピーすると良いです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6a8eb7f4-3de0-3f3e-dad1-c51c30af6041.png)

- 統計ボタンを２つ作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/3022358a-82b1-7c95-d94a-182ec908f305.png)
ヘッダーパートに乗せてください。
「ステージ別ランキング」ボタンに以下のスクリプトを割り当てます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6d1da1db-c86a-194e-9615-4c8f7d6d4a32.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/76675e5a-03d3-836c-d800-dc897641f7e3.png)<br>

「ステージ」でソートすることにより、後ほど追加する集計パートが有効になります。また「集計フィールドに基づいて並べ替え」を利用して、勝利数が多い順に並ぶようにしています。ここは好みで変更しても良いです（敗北数、キル数、デス数）。

「ルール別ランキング」ボタンにも、同じようにソートのスクリプトを割り当ててください。演習としてご自身で設定してみてください。

- タイトルラベルを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/ba980a18-702c-b026-c2b4-2b7fd24cee1e.png)
ヘッダパートに配置してください。  

- ステージ別統計用の集計パートを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6cdd2f95-56c2-a500-c141-86f518f5348f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/3d57077c-cad3-7e9b-9755-0139873efe8c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/a10cd3bf-12c2-fc71-9bed-fb2f0d9a4730.png)

- 追加したパートに、フィールドを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/1c44a2f9-1687-978d-3809-11d62858a737.png)

| 項目 |フィールド| オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|ステージ|battle::ステージ|編集ボックス|ブラウズモードでの入力不可|
|試合数|計算|タブコントロール|※1 後述|
|勝利数|battle::勝フラグ合計|編集ボックス|ブラウズモードでの入力不可|
|敗北数|battle::負フラグ合計|編集ボックス|ブラウズモードでの入力不可|
|勝率|battle.battle@ステージ::勝率|編集ボックス|ブラウズモードでの入力不可|
|キル数|battle::キル合計|編集ボックス|ブラウズモードでの入力不可|
|デス数|battle::デス合計|編集ボックス|ブラウズモードでの入力不可|
|キルレベル|battle.battle@ステージ::キルレベル|編集ボックス|ブラウズモードでの入力不可|

※1 試合数はフィールドを作っても良いんですが、有名(?)な裏技で対応します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/3da3b539-2b23-fccf-06a9-e86ae2a0447d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/e382ed83-2a32-92d5-c70e-22fb52620ff7.png)
FileMakerは基本的に画面上に情報を表示するには、フィールドが必要となりますが、タブコントロールのタブ名には計算式が使えます。これを利用してフィールドを追加することなく計算結果を表示することができます。
`Count(battle.battle@ステージ::id)`
ちなみにこの計算式は、リレーションされたレコードのidの個数をカウントしています。
タブコントロールの背景色や枠線は透明にしておいてください。

【勝率とキルレベルについて】
ここには関連テーブルである「battle.battle@ステージ」を指定しました。ちょっと難しいのですが、これは現在のレコードと「ステージ」が一致する自己リレーションを使っています。例えば現在行のステージがハコフグ倉庫なら、過去の全てのハコフグ倉庫のバトルが繋がっています。なのでそのＴＯの集計フィールドを参照すると、ステージごとの集計結果が得られるというわけです。大事な考え方なので、頑張って理解してください。説明へたくそorz

- ルール別統計用の集計パートを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6d1af6ca-f725-2997-11b9-fd87948a0e22.png)
これもちょっと難しいかもしれませんが、演習としてご自身でトライしてみてください。ソート対象は「ルール」です。また勝率とキルレベルは「battle.battle@ルール」を参照します。

- 完成です。２つのボタンをクリックすると統計データが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6110410a-c142-b975-16b8-a20e3e580569.png)


## ⑦敵統計画面を作ろう
- 新規レイアウトを作成しましょう。
    - レイアウト名：敵統計
    - レコードを表示（ＴＯ）：enemy
    - 表示：リスト形式のみ<br>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/f48057bc-58fe-43e1-44f3-daaf6a032aa7.png)

- メニューバーを作ります。作成済みの画面からコピーすると良いです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/5e8ed051-b945-df28-e8fb-2499b2e9b96e.png)

- 統計ボタンを３つ作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/651b2171-c21c-8809-9983-04345567277d.png)

ヘッダーパートに乗せてください。
「武器別ランキング」ボタンに以下のスクリプトを割り当てます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6d1da1db-c86a-194e-9615-4c8f7d6d4a32.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/4e3b1553-1b08-f6a7-31a6-fb8db3bda4ff.png)
<br>

「武器」でソートすることにより、後ほど追加する集計パートが有効になります。また「集計フィールドに基づいて並べ替え」を利用して、登場回数が多い順に並ぶようにしています。

「シリーズ別ランキング」ボタンと「分類別ランキング」ボタンにも、同じようにソートのスクリプトを割り当ててください。演習としてご自身で設定してみてください。ソート順はそれぞれ以下の通りです。
シリーズ別ランキング：enemy.weapon::シリーズ
分類別ランキング：enemy.weapon::分類

- タイトルラベルを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/9cfc8798-3d9b-4bda-f3ac-2aef376a0842.png)
ヘッダパートに配置してください。  

- 武器別統計用の集計パートを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/6cdd2f95-56c2-a500-c141-86f518f5348f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/b3f5b33a-a212-5acd-4adb-fba923d007b5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/a10cd3bf-12c2-fc71-9bed-fb2f0d9a4730.png)

- 追加したパートに、フィールドを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/ce80d3e4-2a6c-72d5-a1dc-2b2d15f3edf2.png)


| 項目 |フィールド| オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|武器画像|enemy.weapon::画像|-|ブラウズモードでの入力不可|
|武器|enemy::武器|編集ボックス|ブラウズモードでの入力不可|
|カウント|enemy::カウント|編集ボックス|ブラウズモードでの入力不可||
|キル数|enemy.kill::カウント|編集ボックス|ブラウズモードでの入力不可|
|デス数|enemy.death::カウント|編集ボックス|ブラウズモードでの入力不可|
|キルレベル|計算|タブコントロール|※1 後述|

※1 キルレベルもタブコントロールの裏技で対応します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/c4eeab24-cbe8-fec3-8900-a51be72c3f24.png)


```
Let([

kill= enemy.kill::カウント;
death=enemy.death::カウント;
death=If(death = 0; 1; death)

];

Round(kill / death;2)

)
```
計算式はちょっと難しいのですが、Letという標準関数を使っています。Letは２つの引数を与えて使います。とても良く使う関数なのでここで覚えましょう！
`Let( 変数設定; 計算 )`の形式です。１つ目の引数で変数に値を設定しておいて、２つめの計算で変数の値を使って戻り値を作っています。今回の例だと先ず`kill`という変数に`enemy.kill::カウント`の値を、`death`という変数に`enemy.death::カウント`の値を設定しています。`death`は次の計算の分母になるので、もし0件なら1をセットするようにしています。変数設定は２つ以上ある場合、`[]`で囲む必要があります。
次に２つめの引数で計算をします。`Round()`というのは四捨五入を行うための標準関数で、２つの引数を与えて使います。１つ目の引数で対象となる数値を、２つめの引数で小数点以下の桁数を指定します。

- シリーズ別／分類別統計用の集計パートも追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/48c4b6c0-bc68-d3a3-87bd-dbb50f3b3146.png)

これもちょっと難しいかもしれませんが、演習としてご自身でトライしてみてください。イメージは付けませんが、各設定をまとめておきます。
【シリーズ別】
パート定義の小計対象フィールド → enemy.weapon::シリーズ

| 項目 |フィールド| オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|武器画像|enemy.weapon::画像|-|ブラウズモードでの入力不可|
|シリーズ|enemy.weapon::シリーズ|編集ボックス|ブラウズモードでの入力不可|
|カウント|enemy::カウント|編集ボックス|ブラウズモードでの入力不可||
|キル数|enemy.weapon.weapon@シリーズ.kill::カウント|編集ボックス|ブラウズモードでの入力不可|
|デス数|enemy.weapon.weapon@シリーズ.death::カウント|編集ボックス|ブラウズモードでの入力不可|
|キルレベル|計算|タブコントロール|※1 後述|
※1 タブ名の計算式

```
Let([

kill= enemy.weapon.weapon@シリーズ.kill::カウント;
death=enemy.weapon.weapon@シリーズ.death::カウント

];

Round(kill / death;2)

)
```
【分類別】
パート定義の小計対象フィールド → enemy.weapon::分類

| 項目 |フィールド| オブジェクトタイプ | 補足 |
|:--|:--|:--|:--|
|武器画像|enemy.weapon::画像|-|ブラウズモードでの入力不可|
|分類|enemy.weapon::分類|編集ボックス|ブラウズモードでの入力不可|
|カウント|enemy::カウント|編集ボックス|ブラウズモードでの入力不可||
|キル数|enemy.weapon.weapon@分類.kill::カウント|編集ボックス|ブラウズモードでの入力不可|
|デス数|enemy.weapon.weapon@分類.death::カウント|編集ボックス|ブラウズモードでの入力不可|
|キルレベル|計算|タブコントロール|※1 後述|
※1 タブ名の計算式

```
Let([

kill= enemy.weapon.weapon@分類.kill::カウント;
death=enemy.weapon.weapon@分類.death::カウント

];

Round(kill / death;2)

)
```

`enemy.weapon.weapon@シリーズ.kill`とか`enemy.weapon.weapon@分類.death`とかが超ややこしいですね。リレーションシップグラフを確認してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/fcde8ca4-ee08-e1e5-48b6-c899d1b339ed.png)

①現在行の敵の「武器」を元に、武器テーブルからデータを取得
②「①」で取得した武器テーブルの「シリーズ」を元に、再度武器テーブルからデータを取得（同じシリーズの武器一覧取得）
③「②」で取得した武器リストの「武器」を元に、killテーブルからデータを取得（これで、現在行の敵の武器と同じ「シリーズ」の、killの集計情報が取得できる）

書いてても、とても難しいです。説明へたくそorz
実際にデータを入れてみると分かり易いかもしれません…。

- 完成です。３つのボタンをクリックすると統計データが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/8b41ab52-e426-bf2d-16a5-4eaaab137ffc.png)

## ⑧メニューバーにスクリプト設定しよう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/35d37a1f-4fbe-565b-bc40-83a60a653e98.png)
これは全然難しくありません。
各ボタンに、対象のレイアウトへ移動するスクリプトを設定するだけですね。
《バトル一覧の例》
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251813/7c22a4cc-b3a3-7871-0dd3-87bc2178e0f4.png)

**これで全て完了なので、さわり倒してください。**

# ふろく
## 用語集
| 用語 | 説明 | 補足 |
|:--|:--|:--|
|テーブルオカレンス（ＴＯ）|説明しにくい…。テーブルとレイアウトをつないでくれるやつ。見たいな感じか…。感覚で覚えるしかないですね。||
|ルート|本記事では、最上位という意味で使ってます||
## カスタム値一覧（コピペして使ってね）
※2018-11-28時点
【ルール】
ガチアサリ
ガチエリア
ガチホコ
ガチヤグラ
【ステージ】
バッテラストリート
フジツボスポーツクラブ
ガンガゼ野外音楽堂
タチウオパーキング
コンブトラック
海女美術大学
チョウザメ造船
ホッケふ頭
マンタマリア号
モズク農園
エンガワ河川敷
Bバスパーク
ザトウマーケット
ハコフグ倉庫
デボン海洋博物館
アロワナモール
アジフライスタジアム
ショッツル鉱山
モンガラキャンプ場
スメーシーワールド
ホテルニューオートロ
アンチョビットゲームズ
ムツゴ楼
ミステリーゾーン
【対戦時間】
5:00
4:50
4:40
4:30
4:20
4:10
4:00
3:50
3:40
3:30
3:20
3:10
3:00
2:50
2:40
2:30
2:20
2:10
2:00
1:50
1:40
1:30
1:20
1:10
1:00

# まとめ
また長くなっちゃったなー。
もっと説明うまいと良いんだけど…。とりあえず誰か作ってみてください。
躓いたらコメントください。
本当はチェック処理とか、装飾とかまだまだやることはいろいろありますが、とりあえずこれをテンプレートとして、後はご自信でいろいろと味付けしてみてください。
扱っているのはスプラトゥーンのバトルログですが、他の用途でもベースとしての考え方は同じだと思います。いろいろな用途に応用してみてください。

ランタイムアップしたいけど、どこに上げればいいのかわからん。Qiitaで用意してくれないかな～
## 教訓
自分が興味のあることがネタ、いくらでもがんばれるぞ。

:cat:こちらも暇があればご覧ください。:cat:
　[FileMakerで登録／キャンセル制御したい](https://qiita.com/nakatomodesu/items/aef768741a4b4108790e)
　[FileMakerで分離モデルしてみたい](https://qiita.com/nakatomodesu/items/0bbb9f4846c1d104e6ad)
　[FileMakerでレスポンス悪いときに確認すること](https://qiita.com/nakatomodesu/items/19d061804481cf109ac7)
　[FileMaker 一歩進んだシステム開発 -汎化-](https://qiita.com/nakatomodesu/items/4e6c63a02a2f8f454c5b)
  [FileMaker 一歩進んだシステム開発 - 怖くないよカスタムメニュー -](https://qiita.com/nakatomodesu/items/04cba3d760503fbbc674)