お知らせ

お知らせ NEWS

FileMakerを使った多次元配列の実現方法

2019年1月10日 /マージBLOG、システム開発、お知らせ
新年、明けましておめでとうございます。
皆様におかれましては輝かしい新年をお迎えのこととお喜び申し上げます。
本年も変わらぬお引き立ての程よろしくお願い申し上げます。


ご挨拶が遅くなりました。
初めまして。
2018年4月から入社いたしました。開発部・プログラマの新田あかねです。
短期大学を卒業したばかりの新人プログラマです。

短期大学では主にプログラミングを行っており、
卒業研究では、PHPを用いてTOEIC対策用英単語Webアプリを作成しつつ、プログラミングスキルを高めていきました。

入社後は、初めて担当したプロジェクトでFileMakerを扱うことになりました。
初のプロジェクト、初のFileMakerということもあり、不安でいっぱいでしたが、
先輩方からたくさんご教授いただき何とか乗り越えることができました。

今回はそのプロジェクト中に考え込んだ、FileMakerでの多次元配列実現について少しお話ししようと思います。

今回は従業員のシフト管理システムを作ると想定します。
そして、先月のシフトを丸々今月のシフトに反映させる機能が欲しい、という要望があったとします。
PHPで作成するならば、$シフト[社員CD][日にち]の中にシフトの値をどんどん入れていって、、、と考えると思います。
しかしFileMakerは1次元しか実現できません。
最近まで当たり前のように多次元配列を使っていたため戸惑ってしまい、
挙句の果てには変数名の欄に無理やり”$シフト[][]”と書いてしまう始末です。

以下、多次元配列を実現するために私が考えた方法です。

FileMakerを使った多次元配列の実現方法



今回はこのようなテーブル設計をしています。




シフトシフト明細社員マスタ
シフトCD
日付
シフト明細CD
シフトCD
社員CD
シフト_1日
シフト_2日
シフト_3日
社員CD
社員名

※FileMakerでは列名に日本語を使用します。


同じフィールド名はリレーションを張っていると考えてください。

今回は10月のシフトを反映させて11月のシフトを新規作成するという設定で行います。

まずは、10月のシフト明細レコードを絞り出して、すべての社員CDをLOOPで$社員CD[]に入れていきます。
それと同時にその社員のシフト値も$シフト[]に改行区切りで入れていきます。
入れ終わった後は$シフト[]の先頭の改行をReplaceで除いてくださいね。

#社員のシフト
ウインドウの固定
レイアウト切り替え[「Dシフト明細」(Dシフト明細); アニメーション:なし]
検索モードに切り替え[一時停止:オフ]

#前月のシフトCDを使ってシフト明細を絞る
フィールド設定[Dシフト明細::シフトCD; $シフトCD]
エラー処理[オン]
検索実行[]
If[Get ( 最終エラー ) > 0]
現在のスクリプト終了 [テキスト結果:]
End If

レコード/検索条件/ページへ移動 [最初の]
変数を設定 [$対象レコード数; 値: Get(対象レコード数)]
変数を設定 [$要素数; 値: 0]
Loop
#社員CDを記録
変数を設定 [$社員CD[$要素数]; 値: Dシフト明細::社員CD]
変数を設定 [$フィールドの数; 値: 0]
フィールドへ移動 [Dシフト明細::シフト状況1]
Loop
#前月のシフトを記録
変数を設定 [$シフト[$要素数]; 値: $シフト[$要素数] & "❡" & Get ( アクティブフィールド内容 )]
変数を設定 [$フィールドの数; 値: $フィールドの数 + 1]
次のフィールドへ移動
Exit Loop If [$フィールドの数 > 31]
End Loop

#先頭の改行を取り除く
変数を設定 [$シフト[$要素数]; 値: Replace ( $シフト[$要素数] ; 1 ; 1 ; "" )]

変数を設定 [$要素数; 値: $要素数 + 1]
レコード/検索条件/ページへ移動 [次の; 最後まできたら終了:オフ]
Exit Loop If [$対象レコード数 < $要素数]
End Loop


これで変数の中身は
$社員CD[1] = 1人目の社員CD
$シフト[1] = 1人目の社員の1日目のシフト値、1人目の社員の2日目のシフト値・・・

$社員CD[2] = 2人目の社員CD
$シフト[2] = 2人目の社員の1日目のシフト値、2人目の社員の2日目のシフト値・・・
      ・
      ・
      ・

となっています。



次に11月のシフトを新規作成して、シフト明細で11月のシフト明細レコードに絞ります。
そしてgetvalueで値を取得しながら、11月のシフト明細に社員CDとシフト値を入れていきましょう。
(フィールドには一つ一つ値を入れていかないといけませんが、、、)
社員一人ずつLoopで実行していきます。

Loop
フィールド設定[Dシフト明細::社員CD; $社員CD[$要素数]]
フィールド設定[Dシフト明細::シフト状況1; GetValue ( $シフト[$要素数] ; 1 )]
フィールド設定[Dシフト明細::シフト状況2; GetValue ( $シフト[$要素数] ; 2 )]
フィールド設定[Dシフト明細::シフト状況3; GetValue ( $シフト[$要素数] ; 3 )]


これで10月のシフトが11月にコピーされました!


この手法は様々な場面で使いますが、「フィールド設定」ステップを31日分書かないといけないのがとても面倒です、、、。
「シフト状況 + $項目数」の様に、フィールド名に変数を利用できればLoopで回せられるのですが。

いかがでしたでしょうか。皆様、他にいい方法がありましたら是非ともご教授お願い致します。

入社して早9か月が経ちました。
技術者としてまだまだ未熟な私ですが、
2019年は、2018年に経験しなかった新たな言語、システムに挑戦し、先輩方の背中に追いつけるよう自分のスキルをどんどん高めていきたいと思います!

改めまして、本年もマージシステムをどうぞよろしくお願いいたします。
新田(プログラマー)
Skill:PHP / Java / JavaScript / PostgreSQL  Like:絵を描くこと、ピアノ