おしえてあきらくん!その4(ForAllとPatch)

どうもPowerPlatform大好き芸人です。

GWに入ったのでシリーズ連続更新しときます。

 

おばちゃんにPowerAppsを夜な夜な教えてる奴ですね。

私はこのおばちゃんと喋るときだけ、音量を小さくします。

拡声器でも使ってんのかってくらい声デカい。

 

おばちゃん「ちょっとわたしさぁ!体調崩しててさぁ!!!!」

わい「その音声で体調悪かったら俺はいつも死の淵におるわ」

 

さて本題

 

Collectionの内容をどーんって入れたいの!

はい、いい加減言語化してくれw

このおばちゃんのいいところです(誉めてる)

 

先日VirtualMarathonでも座談会で日本が誇る名PowerPlatformer達が言ってたように、

「言語化」

大事です。

 

今自分がやってる作業を言語化して誰かに教えることが出来ないのに、

システム化できるわけないよねーって話。

システムってのは基本的に、

「ちょっとパン買ってこいよwww」

って言う流れでも

「どんなパンなのか」「どこに買いに行くのか」「いつまでにやるのか」「誰に届ければいいのか」「お金はどこから調達するのか」「目的地があるならばそこまでの経路はどうなのか」
この辺わからないと何もわからない赤子同然のシステム君は動けないんですね。

 

それを「定義しろ!」というと、意外と説明できない人多い。

自分のやってる作業なのに。

 

これを見てる一般ユーザーの人も管理部門の方も、まずは業務の見直しと細分化、そして言語化から始めてみましょう。

わりとゴミが混じってますからwww

 

はい。

まずは叱り散らかして、

「任意のcollectionの条件にあう内容だけを、SharePointの該当リストの該当列に参照一括登録がしたい」

という内容だということがわかりましたwww

 

課題があったら細分化すべき

はい、こちらも大事。

よくある失敗としては、例えばGoogleで

「任意のcollectionの条件にあう内容だけを、SharePointの該当リストの該当列に参照一括登録」

って検索して出るわけないんですよね。

 

たとえば上の文章は、

①任意のcollectionの中の条件にあるものだけに絞り込む

②複数Recordを指定する

③SharePointの列に任意のコントロールの内容を登録する

この三つの要件が合わさっているわけです。

 

答えから書くと

①Filter関数

②ForAll関数

③Patch関数

となるのですが、

結構な人たちがSTEPを踏まないで進んでしまう。

 

いきなりダンクはできないのです。

走って

跳んで

ゴールにボールを叩きつける

だからダンクができるんですね。

 

なので一つずつ解決していきます。

Filterの解説

Filterは結構わかりやすい関数だと思うので、ざっくり行きますが、

日本語で言うと

「ある集合の中に、さらに部分集合を作る」というイメージ。

 

f:id:hanakuso365:20210502153603p:plain

例えば下のようなGalleryがあります。

f:id:hanakuso365:20210502153715p:plain

ここで身長160cm以上のメンバーだけ抽出したい場合、

galleryのitemsの値を

Filter(データソース名,身長=>160)

としてあげれば身長160cm以上のメンバーだけ抽出し、表示してくれます。

f:id:hanakuso365:20210502154232p:plain

複数条件指定もできるため、

160cm以上で170cm未満のメンバーだけ抽出したい場合は、

galleryのitemsの値を

Filter(データソース名,身長>=160,身長<170)

とやってあげたらいいです。

f:id:hanakuso365:20210502154721p:plain

よくある構造としては

textinputに数値を入力させる導線ってのがあります。

よくいう絞り込みってやつですね。

f:id:hanakuso365:20210502155525p:plain

Filter(コレクション名,年齢>=Value(テキストインプットのコントロール名.Text),年齢<Value(テキストインプット2のコントロール名.Text)

をGalleryのitemsに仕込んであげれば

f:id:hanakuso365:20210502162007p:plain

こんな感じで条件付きの要素を表示できます。

ForAllの解説

ForAll関数は

「任意の集合の中に含まれる要素を、すべて任意の処理方法で処理する」

ってやつです。

例えば下図のaという部分集合に含まれるものを全て消したい!

みたいな処理をしてくれます。

f:id:hanakuso365:20210502162516p:plain

 任意集合に属する要素だけ消したいならば

ForAll(任意集合名,命令)

と書けばいいのです。

 

って言っても、出現するのがcollection操作だったり一括登録だったりだけな気がする。

ですのでUpdateIf関数若しくは、次に説明するPatch関数と相性がいいと思います。

Patchの解説

Patchは日本語でいうと

「任意要素を任意集合の任意列に登録/編集する」

というものです。

ここまでくると日本語のほうがわかりづらいので図示してみます。

※SubmitFormを理解されてるならば、SubmitFormをForm無しで直接行えると思っていただければと思います。

 

例えば任意コントロールの値を、別の集合の新規要素の「name」という列に登録したい場合

Patch(登録先集合名,Default(登録先集合名),{name:登録したい要素名})とすれば、

下のように登録できるわけです。

  • Default関数を使用→新規登録
  • ここで条件を指定する(LookUpなど)→条件に適合したものを編集

となります。

 

Default関数を使用した例

f:id:hanakuso365:20210502172457g:plain

Patchはかなり使いやすく、

左のリストから選択したものを右のリストに入れる、みたいな動きも再現できます。

(サイ○ウズみたいな)

 

f:id:hanakuso365:20210502173521g:plain

 

編集だけならRecord指定のUpdate関数若しくはUpdateIf関数で出来ますが

 新規登録だとPatch使用になります。

ForAll+Patchとは

多分Patchまでたどり着けば、Google先生のPatchキーワードでの検索結果はほとんどが、「ForAll+Patchで一括登録!」みたいなブログが出てくると思います。

 

「ある集合Aの要素をすべて、Bという集合の新規要素の任意列として登録する」

という問題を関数で紐解けばいいわけですね。

凄いわかりやすく言うと

「「「「何言ってるかわからない!」」」」

まぁ見たほうが早いです。

 

正解が下にございます。

一期生という部分集合を全てBの集合の名前列だけ登録する、ってことをしています。

右はSPOのリストを呼んでいますので、

ForAll(「左のcollectionの名前を1期生でfilterしたもの」,Patch(「登録先SPOL」,{「左の名前列」:「登録先列名」}))

ってやってあげてます。

f:id:hanakuso365:20210502185747g:plain

 

おばちゃんはこれ教師用アプリのゼミ日報を登録させてました。

結構こういう導線多いと思うので使ってみてください(・∀・)

いきなり色んなことを叶えようとしない

夢だの目標だの掲げることは誰でもできますが、

じゃあその夢や目標を叶えるためにやることってありますよね?

 

夢なんて誰でも見れる、目標なんて誰でも作れる

でも布団の中で妄想するだけで終わるのです。

完璧主義の私が言うのはアレですが、完璧になるのは明日でいいのです。

今日はFilterだけ、今日はPatchだけ…

そうやって大きな目標を「気づいたら叶ってた!」「振り返ってみたらスゴイ距離を走ったんやな…」って黄昏れとったらええねん。

おわりに(千里の道も一歩から)

情シスって仕事をしていてよく思うのは、

「わかってるつもりで、ふんわりとしかわかってない人間が多い」

ということ。

 

A「因数分解わからなくて困っているんですよ」

わい「そうなんですね、じゃあ式の展開はわかりますか?」

A「因数分解だっつってんだろ!因数分解教えろよ!」

わい「ごめんなさい…じゃあ因数って何か日本語で説明してください」

A「ぐぬぬ…」

って人は結構いるんです。

 

因数ってのは

「原因/要因」となる「数」だから「因数」って言うんですね。

つまり誰かが何かをするときの「原因/要因」となる数のこと。

ここで初めて

「人間」が「式を展開」するとき、「要因(なくてはならない要素)」と定義する「数(式)」を「因数」って言うんやな…って学ぶんですね。

 

じゃあ「因数分解」ってのは「展開される前の数(因数)に戻す」ってことだとわかる。

それを本当の意味で「理解する」というのです。

 

今回の「教えてあきらくん」では一つ一つかみ砕き、解釈をして理解できないところは、MicrosoftのDocsなど覗いてあげれば簡単に理解ができるところでなのに、

いきなり色んな要件を解決しようとしたから、自学ができなかった典型ですね。

 

基礎問題すらできない人間が応用問題ができるわけが無いように、

各々の関数すら理解できない人間が長く複雑な要件を理解できるはずがないだろう!

土鍋でご飯炊く前に、まずは炊飯器でご飯炊けるようになりなさい!ってことですね。

違うか?違うか。

 

とても細かいパーツを自分の中で組み立てる、という考え方を忘れず学ぶと、

頭の中で生み出したそのアイデアを、頭の中で組み合わせて、

「この関数使ったらイケるかなー?」「こういう組み方の方が美しいんじゃないか?」

などのワクワクが増えます。

 

一歩目のワクワクから積んでいきましょー

 

There is more to life than increasing its speed.

ゆっくりでええんやで。ってガンジーも言ってる。

 

GW中にあと何本か書くつもり。

それでは!