プログラマーになるのは諦めた

ノーコード・ローコード勉強するおじさんのブログ

Power Apps - 期間の重複をチェックする

こんにちは。kickyです。
予約システムなどを作る際、すでに登録されている期間と、自分がこれから予約したい期間が重複しているのかどうかチェックしたい場合があります。Power Appsでどのようにチェックすればよいか、試してみました。

参考
日付期間の重複チェック - Qiita
DateDiffすごく便利 - Qiita

結論から言うと、DateDiff関数を使います。

f:id:kicky60136227:20210626143604p:plain

対象日時、比較日時、ともに開始日時は終了日時を越えていないものとします。

比較終了日付 < 対象開始日付 Or 対象終了日付 < 比較開始日付

2つの式のOrを取り、どちらかの式のDateDiffが0より大きいならば、期間重複はしていないとみなせます。

対象と比較① → 3000 Minutes で0より大きい
f:id:kicky60136227:20210626150701p:plain

対象と比較② → 3960 Minutes で0より大きい
f:id:kicky60136227:20210626150713p:plain

実際には、複数ある対象日時と比較していくことが多いと思うので、ループで複数回処理する工夫が必要ですね。

説明は以上なのですが、このままでは面白くないので、Power Appsで期間の重複をチェックする画面を作りました。
f:id:kicky60136227:20210627212640g:plain
Button1は比較開始日時<比較終了日時になっている場合に表示する。
Button2は比較開始日時<比較終了日時になっていて、かつ、対象開始日時~対象終了日時と重複しない場合に表示する。
という仕組みを入れています。

ポイントを絞って解説します。

参考
Power Apps for Teams の DateTime 列にはご注意を! (時間ずれる) - MoreBeerMorePower
Power Appsで選べる「日付の選択」パーツでは、日付は入力できても、時刻まで入力できないようです。そこで時刻入力用の別パーツ(ドロップダウンなど)と組み合わせる必要があるのですが、「日付の選択」で選んだ値(SelectedDate)は日付+00:00:00を含む「日付」で取り出されるようです。このままだと非常に扱いにくいので、いったん文字列にして時刻の文字列とくっつけてから、全ての文字列をDateTimeValue関数の中に入れて「日時」に変換しました。
※DateDiff関数は中身のデータ型が「日時」である必要があります。

TextInput3.Default

f:id:kicky60136227:20210627215538p:plain

Button1は比較開始日時<比較終了日時となるときだけ表示されるようにしました。If関数のなかに、DateDiff関数の結果が0より大きい(つまり正)ときのみtrueとなる条件を入れています。

Button1.Visible

f:id:kicky60136227:20210627220429p:plain

Button2は先ほどのButton1の条件を満たしたうえで、「比較終了日付 < 対象開始日付 OR 対象終了日付 < 比較開始日付」を満たすために、If、And、Orの入れ子になっています。

Button2.Visible

f:id:kicky60136227:20210627221215p:plain

条件式の書き方はPower Apps独特なのでこのあたりが分かりやすいです。
PowerApps 今更だけどPowerAppsのifを調べてみた | 仕事のあれこれ

Power Apps - リストのリレーションとSelectedとThisItem

こんにちはkickyです。

Power Appsにちょっとずつ慣れてきて、1つのフォームから1つずつリストを操作するのは分かりました、でももう少し複雑なデータ構造を作りたい場合はどうすれば良い?という疑問が当初ありました。データベースのリレーションってやつです。(一般的な用語なので知らない方はググってください)

2つの単純なリストを考えます。

f:id:kicky60136227:20210615223605p:plain

部署リストと氏名リストを作りました。一番左の「ID」は上から順に自動で振られたものです。氏名リストの「部署ID」が2つのリストのアイテムを紐づけて、データは1対多の関係になっています。

要は

営業部に佐藤さん、田中さん、伊藤さん

総務部に高橋さん、渡辺さん

経理部に鈴木さん

がそれぞれ所属している、ということを表します。

これをPower Appsで表示したい場合はどうなるでしょうか。色々な表示方法が考えられますが、代表的な2つのパターンを試してみます。

 

1つ目はクリックして選んだIDに対応するデータを表示する場合です。

これには「Selected」を使用します。

f:id:kicky60136227:20210615232131g:plain

左の緑エリアをGallery1、右のオレンジエリアをGallery2とします。

f:id:kicky60136227:20210616222954p:plain

Gallery1とGallery2は同じ階層にあります。

 

 Gallery1.Items

f:id:kicky60136227:20210616221529p:plain

 Gallery2.Items

f:id:kicky60136227:20210616221554p:plain

氏名リストのうち、Gallery1で選択(Selected)したIDと、部署IDが一致するもののみ表示するようにFilter関数でフィルタリングをしています。マウスでクリックするアイテム(=ID)を変えると、Gallery2のアイテムも変わっていく仕組みです。Selectedは最後に選んだものを保持するので、Navigate関数と組み合わせて新しいスクリーン上のギャラリーでデータを表示することもできます。

 

2つ目はギャラリーの中に小さなギャラリーを入れ子にする場合です。

これには「ThisItem」を使用します。

f:id:kicky60136227:20210616222132g:plain

親の緑エリアをGallery3、子のオレンジエリアをGallery4とします。

親ギャラリーのなかに子ギャラリーを入れています。親ギャラリー(緑エリア)を選んだ状態からギャラリー追加アイコンを押すことで、入れ子にできます。

f:id:kicky60136227:20210616223811p:plain

Gallery3の1つ下の階層にGallery4があります。

 

Gallery3.Items

f:id:kicky60136227:20210616223939p:plain

Gallery4.Items

f:id:kicky60136227:20210616224040p:plain

ギャラリーは複数のアイテムを表示することができますが、ThisItemでそのアイテムを指定できます。つまりGallery3のThisItemは

1行目 ThisItem.部署 : "営業部" , ThisItem.ID : 1

2行名 ThisItem.部署 : "総務部" , ThisItem.ID : 2

3行目 ThisItem.部署 : "経理部" , ThisItem.ID : 3

といった具合です。子ギャラリーのGallery4では、親ギャラリーGallery3のThisItem.IDと、氏名リストの部署IDが一致するもののみ表示するようにFilter関数でフィルタリングをしています。

以上、リレーションのリストを2通りの方法で試してみました。キャンバスアプリはあまり複雑なデータベースには向かないので素直にモデル駆動型(Dataverse)を使いましょう、というのがセオリーのようですが、ライセンスの関係で使えなかったりするので(弊社もそう)これくらいのリレーションであれば表示できますよ、というご紹介でした。 

ThisItemとSelectedについては私よりも説明がお上手な

zezeze.hateblo.jp

Makoto Maedaさんのブログをご参照ください。

Power Apps - SharePoint 列の追加・修正・削除

ローコードでアプリを作るときの肝は「データベースの設計方法」なのでは、と最近思い始めています。こんにちはkickyです。

Power Appsでアプリを作り始めた最初の頃、調べても見つけることができなかったちょっとしたハマり所を書こうかなと思います。

 

以下のようなSharePointリストと接続するPower Appsアプリを作ったとします。

f:id:kicky60136227:20210613170812p:plain

f:id:kicky60136227:20210613171017p:plain

で、今でもよくやっちゃうんですが、アプリのレイアウトを色々作りこんだあとに、「リストのこの列が不要だったので消したい」となることが結構あります。今回は「電話番号」の列をリスト側で削除します。

f:id:kicky60136227:20210613171554p:plain

 そうなると、Power Appsからつなぎにいく「電話番号」の列が無くなっているので当然エラーになります。

f:id:kicky60136227:20210613172036p:plain

「電話番号」のカード丸ごと削除してしまえばOKです。ここは簡単。

 

つぎ、すでに存在する列の名称を変更したい場合。

リスト側で「郵便番号」を「年齢」に変更します。

f:id:kicky60136227:20210613172422p:plain

で、Power Appsをみると

f:id:kicky60136227:20210613175733p:plain

はい、「郵便番号」のままですね。

接続しているデータを更新してみます。

f:id:kicky60136227:20210613175902p:plain

で、これでも変わりません。ボタンを新規で作ってSubmitFormしてみます。

f:id:kicky60136227:20210613175952p:plain

f:id:kicky60136227:20210613180017p:plain

リストをみると「年齢」に先ほど入力した数字が入っています。

f:id:kicky60136227:20210613180121p:plain

Power Apps側のラベルを手動で「年齢」に変えれば良いのですが、何となく気持ち悪い。何故かというと

f:id:kicky60136227:20210613180235p:plain

カードが「郵便番号」のままなのです。自動更新されないのですね。こういうときはFormを選んだ状態から「フィールドの編集」→「フィールドの追加」を押すと、新しく追加した「年齢」が選べるはずです。追加するとこんな感じ。「郵便番号」のフィールドは削除しました。

f:id:kicky60136227:20210613180334p:plain

 テストしてみます。

f:id:kicky60136227:20210613180751p:plain

リストの「年齢」列にきちんと保存できました。

f:id:kicky60136227:20210613180826p:plain

つぎ、新しい列を追加したい場合。先ほどと全く同様です。「メールアドレス」列を追加したいと思います。

f:id:kicky60136227:20210613181001p:plain

リストに列を追加しただけではPower Apps側が更新されません。先ほどと同様「データ」で「最新の情報に更新」を行ってください。そうすると

f:id:kicky60136227:20210613181522p:plain

こんな感じで「フィールドの編集」→「フィールドの追加」で「メールアドレス」が追加できるようになるはずです。

テストしてみます。

f:id:kicky60136227:20210613181615p:plain

f:id:kicky60136227:20210613181625p:plain

はい、これでOKです。

 

Power Appsはデータベースとつなげると、各カードの幅や高さを自動で割り当ててくれて非常に便利なのですが、そのままのレイアウトでOKということは稀で、色々自分で調整したくなります。レイアウトを作りこんだあと、項目の過不足に気づいてデータベースを修正するまでは良いのですが、Power Appsで全部の項目を取り込み直すと、これまで作ってきたレイアウトが全て吹っ飛んでしまいます。そんなときは焦らず、データベースを修正したあとPower Apps側で追加修正した項目だけを取り込みましょう。

Power Appsに慣れた方には「当たり前」レベルだと思いますが、こういう小さなハマりポイントの積み重ねが結構な時間の消費になってしまいます。初心者さんの参考になれば幸いです。

Power Platformをはじめる前に

私が勤めている会社では、Office関連のアプリケーションを定額で利用できるMicrosoft365(旧名:Office365)を契約しています。このプランの中にMicrosoftのローコード開発ツール「Power Platform」が含まれていましたが、社内の一部の人間を除いて存在すら知られておらず、また本格的に使っている人もいませんでした。「ぜひこれを社内に広めたいです」と上司にお願いして勉強を始めたのがキッカケです。このブログではPower Platform(主にPower Apps、Power Automate)の話題を取り扱っていこうと思います。

Power Platformって一体何?という方は↓

Microsoft Power Platform とは - 吉田の備忘録

Microsoft吉田さんの記事をご覧ください。

 

会社の仕組みを使って個人のブログをやることに抵抗があったのですが、最近参加させてもらったオンライン勉強会でMicrosoft365開発者プログラムという存在を知りました。本番環境には使えませんが、Microsoft365 E5相当のプランが無料で利用できるのでブログを書くには十分なものですし、下手に会社の情報が流出する心配もありません。「とりあえず無料でやってみたい」という方はぜひ使ってみてはいかがでしょうか。90日の期限付きですがMicrosoftいわく「頻繁に開発している場合は、サブスクリプションの有効期限が切れることがありません。 自動的に延長されます。」とのことでそれを信じて使っています。(切れてしまっても再度申し込めます)

私も半年程度Power AppsとPower Automateについて勉強してきたのですが、周りに相談できる人がいなかったのでほとんどオンラインで情報を集めてきました。最近は少しずつ書籍も発売されているようですが無料で勉強したいという方の為に私がやった勉強方法を記載します。


YouTube
はじめてのPower Apps 2020 #1 - 在宅します!宣言アプリを作ろう

https://www.youtube.com/watch?v=q7f1zNjRnRc

全く何も分からない、そもそも何なの?という方は、YouTubeがおススメです。動画を見ながら真似をして触ってみましょう。深いところを知りたければ日本語以外の動画をみることもありますが、ビジュアル的にわかりやすいので英語聞き取れなくても結構イケます。

 

・ブログ

吉田の備忘録 - Power Apps、Power Automate 等のマイクロソフト系サービスをご紹介

先ほども記載しましたが、吉田さんのブログがおススメです。新しい情報が盛りだくさんです。Power Platformのややこしいところで、契約している料金プランによって出来ることと出来ないことがあるのですが、Microsoftのページを読んでもよく分からないので吉田さんのブログで確認させてもらっています。

 

・ユーザーグループ

Japan Power Apps User Group

Facebookですがグループに参加しなくても見ることができます。レベルの高い人たちが積極的に意見交換しているので、眺めているだけで勉強になります。

 

・オンライン勉強会

ある程度触れるようになると「これどうやるんだっけ?」とかの疑問が出てきます。どうしても分からない時は詳しい人に質問できるオンライン勉強会への参加がおススメです。コロナの影響か、数年前に比べてオンライン勉強会の数は増えた印象があります。最初は敷居が高いと思うかもしれませんが、初心者さんウェルカムな勉強会がほとんどなので気軽に申し込んでしまえば良いと思います。勉強会を探すには

connpass - エンジニアをつなぐIT勉強会支援プラットフォーム

がおススメです。

勉強会で知り合った人とかのTwitterをフォローすると、最新情報をつぶやいてくれてたりしますし自分自身のモチベーションも保てるので良いかもしれません。

 

また良い勉強法を発見したら随時更新していきます。

 

Power Platformはまだまだこれから進化していくと確信しています。ぜひ皆さん一緒に勉強していきましょう。

自己紹介

はじめまして。kickyと申します。

 数年前にプログラミングの独学を始め、一時期はプログラマーに転職しようとしていましたが、バリバリエンジニアの友人・知人に話を聞いていくうち、この年齢から未経験でトップのエンジニアを目指すには厳しいと気づいてしまった。

 

私はプログラマーになるのを諦めました。

 

モヤモヤした数年間を経て情シス部門に異動。

でもなー、何か作りたい思いはあるんだよな。プログラミングできんけど。

そんな時に出会った、今流行りのノーコード、ローコード。

 

情シス歴1年弱の似非エンジニアおじさんが、ノーコード、ローコードを勉強します。

「それ、コード書かなくてもできますよ?」が口癖のノンプログラマーになりたい。