[power apps]テニスコート申請画面を作成する Part5 会場選択フォームの実装(レスポンシブ対応/全手順公開)

やること

  • 会場選択Formを実装する。
  • 会場IDを入力し、検索後に一致する会場情報を画面上に表示する。
  • 会場情報はマスタから取得するため、手入力できないようにする。

手順

1.オブジェクト名の修正

データソースをもとに編集フォームを追加すると、申請データの各列はデータカードというオブジェクトで表示される。

データカード名は「列名_DataCardXX」となり、内部には「StarVisible」「ErrorMessage」「DataCardValue」「DataCardKey」の4つのオブジェクトで構成される。

まずデータカード名は名前が長すぎることと意味の持たない連番が割り振られるため、短縮するために「card + 列名」とする。
また、内部の4つのオブジェクトのうち実際に利用するのはDataCardValueのみである。こちらもデータカードの名前に倣って「val + 列名」にする。

本来であれば列名も英単語に置き換えるのが良いだろうが、ベストな英単語を考えるのが労力的にしんどいため、今回は日本語にしている。

  1. 以下のようにオブジェクトの名前を変更する

2.検索条件項目を追加

レイアウトの整形は一番最後の記事で行うため、検索ボタンは一番下に追加する。
フォーム直下のオブジェクトは全てデータカードで構成されており、統一性を持たせるため、およびレスポンシブ対応の実装をしやすくするため検索条件の入力テキストもデータカードの中に挿入する。

  1. 会場選択Form」のフィールドの編集リンクを選択
  2. 三点リーダ「…」をクリックし、「+カスタムカードの追加」を選択
  3. データカード「DataCard1」が追加されたことを確認
  4. 追加されたデータカードの名前を「card検索条件会場ID」に変更
  5. 直下にテキストオブジェクト「val検索条件会場ID」、検索アイコンオブジェクト「ico検索条件会場ID」を追加
    検索アイコンは「+挿入 > アイコン > 検索」にある。
  6. 各プロパティを以下のように設定
    /** プロパティ名: 設定値 */
    
    /** アイコンのサイズはテキストボックスの高さを取る正方形 */
    Width : val検索条件会場ID.Height
    Height: val検索条件会場ID.Height
    
    /** 高さはテキストボックスと同じにする */
    Y: val検索条件会場ID.Y
    
    /** x + width でテキストボックスの隣に隣接し、heightを引くことでテキストボックスの内側に隣接させる。 */
    X: val検索条件会場ID.X + val検索条件会場ID.Width - val検索条件会場ID.Height
    
    /** 周りの余白。虫眼鏡アイコンの周りに余白があるとスマートに見える */
    PaddingBottom: 4
    PaddingLeft: 4
    PaddingRight: 4
    PaddingTop: 4
    
    /** 背景色がないと虫眼鏡マークが見づらいため、適当な色を設定 */
    Fill: RGBA(102, 182, 227, 1)
    /** プロパティ名: 設定値 */
    
    /** デフォルトで入っている文字が邪魔であるため、空白を設定 **/
    Default: ""

3.自作関数の追加

改めて、会場マスタにどんなデータが入っていたかを思い出すために再掲する。

会場IDは半角英数字でアルファベットは大文字である。
そのため、「a001」や「A001」と入力されると厳密には一致しないため、検索条件ありませんという結果になってしまう。

それではあまりにも不親切であるため、ユーザーが入力し終わった後に全角→半角、小文字→大文字の自動変換処理を加える。
小文字→大文字についてはPower Appsの標準関数Upperが用意されているが、全角→半角については悲しいことに標準関数がないため自前で用意しなければいけない。

  1. 自作関数の機能の有効化
    Power Appsのデフォルトの設定では、自作関数の作成ができないため、作成機能を有効にする必要がある
    ・Power Apps右下の歯車マークの設定を選択
    ・続いて、左メニューから「更新」を選び、ユーザー定義関数をONに切り替え
    ・保存して更新するのダイアログでOKを選択
  2. ツリービューで「コンポーネント」タブを選択
  3. 「+新しいコンポーネント」を選択
  4. Component1」が作成されるため、「StringUtilsDef」に名前を変更
  5. コンポーネント全体のプロパティを設定

    /** プロパティ名: 設定値 */
    
    /**
      どういった機能であるか分かりやすくするために、説明文を付ける
    */
    説明: "文字列を扱うコンポーネント"
    
    /**
      コンポーネントはあくまでも自作関数の利用が目的であるため、
      申請画面で表示されないようサイズを0にする
    */
    表示: オフ
    Width: 0
    Height: 0
  6. プロパティウィンドウから「+新しいカスタム プロパティ」を選択
    どの全角文字と、どの半角文字が対応するかの紐づけ情報を保持するためのテーブルを用意する。
  7. 以下のように各項目を設定し、「作成」をクリック
  8. ツリービュー上のプロパティのプルダウンから「WideHalfTable」を選択
  9. 以下のコードを張り付け

    /** プロパティ名: 設定値 */ 
    Table(
      { wide: "0", half: "0"}
      , { wide: "1", half: "1"}
      , { wide: "2", half: "2"}
      , { wide: "3", half: "3"}
      , { wide: "4", half: "4"}
      , { wide: "5", half: "5"}
      , { wide: "6", half: "6"}
      , { wide: "7", half: "7"}
      , { wide: "8", half: "8"}
      , { wide: "9", half: "9"}
      , { wide: "A", half: "A"}
      , { wide: "B", half: "B"}
      , { wide: "C", half: "C"}
      , { wide: "D", half: "D"}
      , { wide: "E", half: "E"}
      , { wide: "F", half: "F"}
      , { wide: "G", half: "G"}
      , { wide: "H", half: "H"}
      , { wide: "I", half: "I"}
      , { wide: "J", half: "J"}
      , { wide: "K", half: "K"}
      , { wide: "L", half: "L"}
      , { wide: "M", half: "M"}
      , { wide: "N", half: "N"}
      , { wide: "O", half: "O"}
      , { wide: "P", half: "P"}
      , { wide: "Q", half: "Q"}
      , { wide: "R", half: "R"}
      , { wide: "S", half: "S"}
      , { wide: "T", half: "T"}
      , { wide: "U", half: "U"}
      , { wide: "V", half: "V"}
      , { wide: "W", half: "W"}
      , { wide: "X", half: "X"}
      , { wide: "Y", half: "Y"}
      , { wide: "Z", half: "Z"}
      , { wide: "a", half: "a"}
      , { wide: "b", half: "b"}
      , { wide: "c", half: "c"}
      , { wide: "d", half: "d"}
      , { wide: "e", half: "e"}
      , { wide: "f", half: "f"}
      , { wide: "g", half: "g"}
      , { wide: "h", half: "h"}
      , { wide: "i", half: "i"}
      , { wide: "j", half: "j"}
      , { wide: "k", half: "k"}
      , { wide: "l", half: "l"}
      , { wide: "m", half: "m"}
      , { wide: "n", half: "n"}
      , { wide: "o", half: "o"}
      , { wide: "p", half: "p"}
      , { wide: "q", half: "q"}
      , { wide: "r", half: "r"}
      , { wide: "s", half: "s"}
      , { wide: "t", half: "t"}
      , { wide: "u", half: "u"}
      , { wide: "v", half: "v"}
      , { wide: "w", half: "w"}
      , { wide: "x", half: "x"}
      , { wide: "y", half: "y"}
      , { wide: "z", half: "z"}
      , { wide: ".", half: "."}
      , { wide: "-", half: "-"}
      , { wide: "ー", half: "-"}
      , { wide: "‐", half: "-"}
      , { wide: "―", half: "-"}
      , { wide: "@", half: "@"}
      , { wide: "_", half: "_"}
    )
  10. もう一度「+新しいカスタム プロパティ」を選択
    以下のようにプロパティを設定
    続いて、関数に渡すための変換元文字列の引数を定義する
    「+新しいパラメータ」をクリック
  11. 以下のようにパラメータを設定し、作成ボタンをクリック
  12. 自作関数に対して作成ボタンをクリック
  13. 作成した関数がカスタムプロパティの欄に表示されることを確認
  14. ConvertWideToHalf」に以下のコードを張り付け

    /** プロパティ名: 設定値 */ 
    
    Concat(
      Split(Trim(str), "")
      , 
      Coalesce(
        LookUp(StringUtilsDef.WideHalfMapTable, wide = Value).half
        , Value
      )
    )

    処理の流れとしては、「Split(Trim(str), "")」で余分な空白を除きながら、入力文字を1文字ずつ分割する。
    LookUp(StringUtilsDef.WideHalfMapTable, wide = Value).half」で変換できるのであれば半角に変換する。
    Concat」で分割した文字を再度結合する、ということをやっている。

4.自作関数の呼び出し

今度は作成した自作関数をアプリケーション側から呼び出していく。

  1. 「+挿入」> カスタム > StringUtilsDefを選択
  2. StringUtilsDef_1」が追加されるが、末端の連番が気持ち悪いため「StringUtils」に変更
    コンポーネントの時点で「StringUtils」とせずあえてDefを付けたのはこのため。
    Power Appsではコンポーネントの定義と利用する側さえ名前の重複が許されないという不自由な仕様がある。
  3. val検索条件会場IDのプロパティを以下のように設定
    /** プロパティ名: 設定値 */
    Default: cond会場ID
    OnChange: Set (cond会場ID, Upper(StringUtils.ConvertWideToHalf(Self.Text))); 

    OnChangeはイベントプロパティで、テキストの値が書き換わったという動作を検知して、Set関数が呼ばれる。

    ローコード特有の複雑な処理が隠蔽されすぎて、途中の過程が飛ばされてなんやかんや動くというやつ。
    テキストの値をプログラム側から変更したい場合、Defaultには変数を設定しておくとよい。と覚えておけばいいと思う。

  4. 動作確認
    検索条件テキストに「abCD12ー@」を張り付けて、フォーカスが離れたときに半角に変換されればよい。

5.会場マスタの追加

Power Appsからマスタを参照するにはSPOリストと同様にデータソースの追加を行う。

  1. Power Apps上部メニュー > 「データの追加」
  2. 検索項目で「Excel」と入力
  3. 「Excel Online Business」を選択
  4. SharePointサイト > ドキュメントを選択
  5. 「マスタ」ディレクトリを選択
  6. 会場マスタを選択
  7. 会場マスタにチェックを入れる
  8. 「Excelテーブルにある一意の列を使用する」を選択し、「連番」を一覧から選び追加ボタンをクリック
    「自動生成した~」を選んだ場合、エクセルファイルのマスタに勝手にID列が追加されてしまう。
    更にそのIDが20桁くらいのランダムな英数字なのでマスタの見栄えも悪くなるよねということで事前に連番の列を用意した次第である。
  9. データメニューに会場マスタが追加されていることを確認


 

6.検索処理の実装

少し横道にそれてしまったため、本題の検索ボタンを押して、マスタからデータを参照する機能を実装する。

  1. ico検索条件会場ID」のクリックイベントとして以下のプロパティを編集
    /** プロパティ名: 設定値 */ 
    
    OnSelect: Set (temp会場検索結果レコード, LookUp(会場マスタ, ID = 検索条件会場Text.Text))

    LookupはPower appsの標準関数で、条件に合致する1件のレコードを取得することができる。
    そのままでは検索結果がすぐに消えてしまうため、OnSelectプロパティが呼ばれたあとでも参照できるようにSet関数でtemp会場検索結果レコードとして保存をしている。

また、検索結果がヒットしなかった場合についてはPart10 入力チェックの追加の記事でまとめて触れるため、今回はスルー。

6.検索結果の表示

会場ID」~「会場都道府県」の5つのオブジェクトに対して以下の手順を繰り返し行う。

  1. オブジェクトの詳細設定の「プロパティを変更するためにロックを解除します。」をクリック
    Power Appsの親切心で、デフォルトでは各プロパティが読み取り専用になっているため、それを解除する必要がある。
  2. 以下の通りプロパティを設定
    /** プロパティ名: 設定値 */ 
    
    /**  
      検索結果の項目を設定
      XXにはオブジェクト名と一致する項目を選択
    */
    Default: temp会場検索結果レコード.XX
    
    /** ユーザーから手入力ができないように、入力禁止モードを設定 */
    DisplayMode: DisplayMode.Disabled

7.動作確認

プレビュー画面で検索ボタンをクリックし、各項目に検索結果が反映されればOK

 

記事一覧