Proj #002 取引先コード申請のオンライン化をするゾ～第1回 既存アイテムとの重複チェック～

https://qiita.com/Novskiiiiiiiiii/items/97e79643e873fdedd85b


「営業部が新規の取引先コードを申請してきたんですけど、もう同じ取引先が登録されてるんですよ～」

「な～に～！？」

男は黙って、重複チェック。

と、いう事でいま作ってるキャンバスアプリがこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/910b6119-57d9-cd8f-f6d8-ec0a2ca8e8d9.png)

取引先コードの新規登録や変更を申請できるフォームを作ってます。
前回の案件は経費精算の申請フォームで1画面でしたが、今回は複数画面です。
出来る事が増えていくのが楽しいですね。

さて、依頼部門からこんな要望がありました。

・申請部門が同じ
・取引先名が同じ
・メールアドレスが同じ

これらすべてを満たした場合に、「重複です～」とエラーメッセージを出したい、という要望。

具体的にはフォームに入力された３項目と同じ内容を持つアイテムがリスト側にあった場合に重複として扱いたい。

これを実装しました。

トリガーは、メールアドレスを入力した際のOnChangeプロパティ。
申請部門と取引先名は入力されている前提です。

OnChangeプロパティの中身がこちら。
    
    If( !IsMatch(txt_20_mail_address_1_2.Text, "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"),
     Notify("正しい形式で入力してください", NotificationType.Error),
     Notify("正しいメールアドレスです", NotificationType.Success));
    
    ClearCollect(MyCollection, sample_client_code); 
    
    Set(VarDepartmentCode, txt_5_Sinsei_bumon_code_2.Text);
    Set(VarClientName, txt_12_Title_2.Text);
    Set(VarEmail, txt_20_mail_address_1_2.Text);
    
    If(
       CountRows(
          Filter(MyCollection, 
             申請部門コード.Value = VarDepartmentCode && 
             取引先名 = VarClientName && 
             メールアドレス1 = VarEmail)
       ) > 0,Notify("エラー: 同じ申請部門コード、取引先名、メールアドレスのレコードが既に存在します。", NotificationType.Error));
    
    If(
       CountRows(
          Filter(MyCollection, 
             申請部門コード.Value = VarDepartmentCode && 
             取引先名 = VarClientName && 
             メールアドレス2 = VarEmail)
       ) > 0,Notify("エラー: 同じ申請部門コード、取引先名、メールアドレスのレコードが既に存在します。", NotificationType.Error));
    
    If(
       CountRows(
          Filter(MyCollection, 
             申請部門コード.Value = VarDepartmentCode && 
             取引先名 = VarClientName && 
             メールアドレス3 = VarEmail)
       ) > 0,Notify("エラー: 同じ申請部門コード、取引先名、メールアドレスのレコードが既に存在します。", NotificationType.Error));
    
    If(
       CountRows(
          Filter(MyCollection, 
             申請部門コード.Value = VarDepartmentCode && 
             取引先名 = VarClientName && 
             メールアドレス4 = VarEmail)
       ) > 0,Notify("エラー: 同じ申請部門コード、取引先名、メールアドレスのレコードが既に存在します。", NotificationType.Error))

冒頭でメールアドレスの形式を正規表現でチェックしてます。

    If( !IsMatch(txt_20_mail_address_1_2.Text, "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"),
     Notify("正しい形式で入力してください", NotificationType.Error),
     Notify("正しいメールアドレスです", NotificationType.Success));

続いてClearCollectでリストをコレクションに格納します。

    ClearCollect(MyCollection, sample_client_code); 

その次にフォーム上のそれぞれの値を変数にセットします。

    Set(VarDepartmentCode, txt_5_Sinsei_bumon_code_2.Text);
    Set(VarClientName, txt_12_Title_2.Text);
    Set(VarEmail, txt_20_mail_address_1_2.Text);

最後にそれらの変数をコレクションから検索してカウントを取得します。
1件以上ヒットしたら「重複しとるよ」とエラーメッセージを出します。

    If(
       CountRows(
          Filter(MyCollection, 
             申請部門コード.Value = VarDepartmentCode && 
             取引先名 = VarClientName && 
             メールアドレス1 = VarEmail)
       ) > 0,Notify("エラー: 同じ申請部門コード、取引先名、メールアドレスのレコードが既に存在します。", NotificationType.Error));

このIf文が4回あるのは、メールアドレスが1から4まであるので、

申請部門、取引先名、メールアドレス1
申請部門、取引先名、メールアドレス2
申請部門、取引先名、メールアドレス3
申請部門、取引先名、メールアドレス4

の順番にチェックしているわけです。

フォーム上にも1から4まであるので、それらすべてのメールアドレスのOnChangeプロパティに同じように設定します。

画面で見るとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/481bcbfd-11a6-2ad3-1347-8975c836527e.png)

プログラミング経験がないとなかなかハードルが高い内容だとは思いますが、
キャンバスアプリを使うとこんな制御も出来ますよ、というお話でした。

申請業務のオンライン化ってめちゃくちゃ需要あると思うので市民開発者がどんどん増えるといいなと思ってます。

お仕事のご依頼はX　https://x.com/Novskiiiiiiiiii
のDMでお気軽にご相談くださいませ。

https://qiita.com/Novskiiiiiiiiii/items/4a80fd1d051315e1c6f0