Proj #001 キャンバスアプリで支払申請のフォームを作成するゾ～第3回 Patch関数でアイテムを新規登録しよう～

https://qiita.com/Novskiiiiiiiiii/items/194bf68d27100dd69e50

さていよいよキャンバスアプリからリストに新規データを登録してみようと思います。

まずはフォームを新規登録モードにします。

ツリービューからFormを選択して、プロパティのDefaultModeを変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/a2abd75e-3f2e-7726-8ed3-e49122fceb96.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/10dae444-f9e3-a815-b7c5-93cff70df44a.png)

初期値はEditモードになっているので、これをNewに変更します。

    FormMode.New

これで新規登録モードになりました。

続いて「申請ボタン」を追加します。

挿入　から　ボタン　を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/9988faf1-a22c-b5b2-1c34-83f564d10a2a.png)

フォーム上にぶっきらぼうにボタンが配置されました。
当然、このままでは動きません。
動いてもらっても困ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/23388d0e-b340-deb0-55e1-25df1407028a.png)

ボタンをテキトーな位置に移動したら、Patch関数を入力していきます。
数式のデフォルトは　false　になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/577d49c7-0738-6ff5-b13e-a6e7f8f5e656.png)

Patch関数の記述の方法は以前のTipsにも書いてあるので、そちらも併せてご覧ください。

https://qiita.com/Novskiiiiiiiiii/items/f5f330dd26da5c8a5ddd

Patch関数は今回のプロジェクトにおいての最重要関数なので、ゆっくり解説していきます。

試しに１項目登録するようなPatch関数を記述してみました。

    Patch(
        'hogehoge_datasource',
        Defaults('hogehoge_datasource'),
        {
            SF番号:DataCardValue3
        }
    )

DataCardValue3ってなんやねん問題が発生しましたので、
DataCardについて解説しておきます。

データソースから配置したフィールドには　DataCard　という名前が割り当てられています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/32c6a327-3290-e5a5-bb43-24d34fb38bac.png)

DataCardには「StarVisible」「ErrorMessage」「DataCardValue」「DataCardKey」
という4つのプロパティが最初からセットされています。

* StarVisible：必須項目の*を表示するプロパティ
* ErrorMessage：エラーメッセージを表示するプロパティ
* DataCardValue：DataCardの値を表示するプロパティ
* DataCardKey：データソースのフィールド名を表示するプロパティ

これらのプロパティはデータソースであるリストと連動しているので、
よくわからないからと言って無闇に削除しないようにしましょう。
（私はそれで泣きました）

入力用のフォームを作成した際に必ずついて回る仕様として、
必須項目のチェックがありますが、
リストでフィールドに設定した必須の設定をフォーム上で利用する際に、
これらのプロパティを使う事になります。
※Valid関数については、次回以降のQiitaで扱います。

とはいえ配置したフィールドの名称がDataCardのままではわかりづらいので、
わかりやすい名前に変更しましょう。
（私はそれで泣きました）

カードのプロパティを変更する場合には、プロパティのロックを解除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/f4652883-7eaf-4875-2792-6dfb7f741194.png)

カードの名称は以下の部分で変更します。
わかりづらいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/3b675227-0493-f42a-b3ad-a47c97881c03.png)

下のDataFieldやDefault、DisplayNameを変更しないように注意しましょう。
（私はそれで泣きました）

今回はこのDataCardを「dc_sf_number」と変更しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/9c9d0c88-9ab1-0d5c-8978-8b63529c332a.png)

頭の　dc　はDataCardである事を示しています。
sf_numberはSalesforceの管理番号、という意味です。

なぜdc_とつけたかと言うと、フォーム上で扱うフィールドはDataCardのみではなく、
別のリストをデータソースで使う場合や、テキスト入力フィールドなどと区別しやすくするためです。

以下は私の作成した設計書の一部です。
オブジェクトタイプに、DataCardやテキストラベルといった内容が記載してあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/14baf1e0-8d37-b233-3342-a1fd1ee2ac20.png)

オブジェクト名を見ると、
DataCardの中でも「dc_」「mst_」といった違いがあり、
テキストラベルの中でも「txt_」や「cf_」といった違いがあるのが確認できるかと思います。

このようにプレフィックスをわけているのは、

* データソースから配置したフィールド
* LookUp関数を使って表示させるフィールド
* 別のデータソースから参照するフィールド
* 独立したテキスト入力フィールド

を区別するためです。

フォームの上ではすべて同じテキストフィールドですが、
どのように値がセットされるかで制御や後続処理での扱いが異なるので、
細かい部分ですがこのあたりも意識してもらうとよりよい開発が出来るのではないかと思います。

こんな感じで、DataCardと、中の４つのプロパティを変更しています。
（そこはかとなく残念なネーミングセンス）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/0306b477-5bc0-da8b-7019-319b58c98c12.png)

それに伴いPatch関数の内容も変更しています。

    Patch(
        'hogehoge_datasource',
        Defaults('hogehoge_datasource'),
        {
            SF番号:dc_sf_numberValue
        }
    )

さて、では実際にフィールドに値を入れてアイテムを登録してみましょう。
アプリを実行するには再生ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/8131c0d8-1e39-6ff3-2486-b40552173f00.png)

以下のように数値を入力して、ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/e0a2d4f7-3c50-2bc9-ba6a-8ee50c092a7e.png)

おお勇者よ、怒られてしまうとはなにごとじゃ！

はい、エラーのようです。泣きます。ごめんなさい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/0e351e60-ba16-9b83-ecd7-490554f1ea8e.png)

以下のように修正しました。

dc_sf_numberに.Textを付与しないといけなかったようです。
さらに、SF番号フィールドは数値型のため、
Value関数を使用して文字列を数値型に変換しています。

dc_sf_numberValueのTextを数値化してリストのSF番号というフィールドにセットして
アイテムを新規登録する、というようなロジックになります。

    Patch(
        'hogehoge_datasource',
        Defaults('hogehoge_datasource'),
        {
            SF番号:Value(dc_sf_numberValue.Text)
        }
    )

今度は無事にアイテムがリストに登録されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/ae038f2f-0603-d191-442d-e7f98f4c0448.png)

次回は別のリストにあるアイテムを、フォーム上でマスタとして参照して
複数のフィールドを表示させる「LookUp関数」について記述しようと思います。

それではまた。

https://qiita.com/Novskiiiiiiiiii/items/c0ea6c4ccc1ef6dab4fc