PowerApps で、在庫管理、棚卸アプリの作り方【前編:入出庫管理機能】
PowerAppsで一般的な在庫管理アプリを作りました。これで在庫の入出庫管理と棚卸管理ができます。その完成デモを紹介し、その入出庫管理機能の作り方を説明しています。前回の現在庫量を取得しての新しい在庫量を計算する方法が肝になります。
(動画時間:9:30)
PowerApps で、在庫管理、棚卸アプリの作り方 【前編:入出庫管理機能】
マイク根上のPowerAppsオンラインコースの評価
こんにちは、リーンシグマ、ブラックベルトのマイク根上です。
業務改善コンサルをしています。
僕のPowerAppsのオンラインコースの受講生さんから、
今回在庫管理アプリのリクエストと次のありがたいコメントを頂きました。

「ブログを拝見し、大変参考になったのでUdemyのコースを受講しました。他では紹介されていない細かい便利な機能や実務的な使い方が紹介されておりとても勉強になりました。もっと早く受講していれば、と思わずにはいられません。委任を含むより高度な内容も習得したく上級編の公開を楽しみにしています。」
Makiさん、嬉しいコメントと動画リクエストありがとうございました。
Udemy.comで、今現在、僕のPowerAppsの初級編と中級編のコースがあり、
中級編コースは評価が4.4でベストセラーとなっています。
下の動画概要欄に半額以下で受講できるリンクがありますのでご覧下さい。
コースが半額になる「ディスカウントリンクページ」でご確認下さい。

完成在庫管理アプリ:入出庫処理実演
今日の本題はリクエストの多い在庫管理アプリの作り方です。
勿論実務では色んな状況がありますので、
今回は一般化したアプリの作り方で、
そこから応用をしてみて下さい。
まずはいつもの様に完成形をお見せします。
下図がスマホで使える在庫管理アプリです。
ちなみに画面がいつもと雰囲気が違いますね。
これはメニューバーの「テーマ」で簡単に変える事ができます。

商品にバーコードがあれば、
スキャンして商品を認識できる方が良いですが、
今回は簡単に上部のドロップダウンで商品を選びます。
そして、「個数」のテキストボックスに入出庫数を入力し、
「入庫」か「出庫」のボタンを押してクラウドに記録されます。
すると下のギャラリーにその時の日時、「科目」列に「入庫」もしくは「出庫」、
そして入庫であれば、プラスの、出庫であればマイナスの数量と
現在庫数が一番左に出てきます。
この作業を他の商品でもやっていき、
上のドロップダウンを切り替える事で商品毎の履歴が見えるのです。
完成在庫管理アプリ:棚卸処理実演
在庫管理で重要なのは棚卸ですね。
それもこのアプリでできてしまいます。
下図は前の図と同じものです。
同じ上部のドロップダウンで商品を選んで
「棚卸数」のテキストボックスで現棚卸数を入れて
「在庫調整」ボタンを押すだけです。

するとギャラリーにデータが一行追加され、
日時と、「科目」列に「棚卸」、「現在庫数」列にその棚卸数が代入され、
調整数を計算してくれてそれが「数量」列に表示されます。
他の商品でも同じことをやります。
既定では商品毎の在庫管理履歴が出ていますが、
アプリ左下の切り替えボタンで「商品毎」から「棚卸数」に変えると
日時が商品名に変わり、全商品の棚卸データになります。
そしてその右の「CSVに出力」ボタンを押すと
Power Automateを使って、この在庫数をCSVファイルにして、
自分にEメールで送る事ができるのです。
在庫管理アプリの入出庫管理機能の作り方
簡単なアプリですが、
日々の入出庫管理と棚卸までできる優れものです。
今回は前半の入出庫管理の機能の作り方をお見せし、
次の記事で棚卸機能の作り方をお見せします。
まず、データベースを下図の様にSharePoint(SP)リストで作りました。
リスト名が「在庫管理表」で、
各列のデータ型は一行テキスト型、日付と時刻型、
そして数値型のどれかになります。

商品の選択はドロップダウンで、その「Items」属性の式が次です。
ドロップダウンの「Items」属性
Split(“商品A、商品B、商品C”,”、”)
今回はSplit関数を使って直接商品名を入れていますが、
実務ではデータベースから引っ張ってきた方が良いです。
その下の個数を入れるテキスト入力の書式属性で「数値」にする事で、
ユーザーは数値のみ入力可能で間違い防止ができます。
「入庫」ボタンの「OnSelect」属性を見てみましょう。
「入庫」ボタンの「OnSelect」属性
Patch(
在庫管理表,
{日時: Blank()}, //Defaults(データベース名) よりも速い
{
商品名: DD_選択した商品1.Selected.Value,
日時: Now(),
科目: “入庫”,
個数: TI_今回の数量1.Text * 1,
現在庫数: First(
SortByColumns(
Filter(
在庫管理表,
商品名 = DD_選択した商品1.Selected.Value
),”OData__x65e5__x6642_”,
SortOrder.Descending
)
).現在庫数 + TI_今回の数量1.Text * 1
}
);
Reset(TI_今回の数量1)
Patch関数で「在庫管理表」データベースの各列に
新規でデータを入れています。
ここではポイントは3つあって、一つは第二引数です。
通常は皆さんDefaults関数を使って
新規の行を作成していると思いますが【例:Defaults(データベース名)】、
今回の様に一つの列にブランクを挿入するだけで【{日時: Blank()}】
同じ事ができるのです。
実はこの方がシステム的に処理数が少なく、
処理速度が速くなります。
SharePointリストの日本語列名の文字化けの対処の仕方
二つ目は第三引数内の「現在庫数」の計算の仕方です。
やっている事はその商品の前回の現在庫数に
今回の数量を足して入れています。
その部分の式がこうなります。
新しい現在庫数の計算式
First(
SortByColumns(
Filter(
在庫管理表,
商品名 = DD_選択した商品1.Selected.Value
),”OData__x65e5__x6642_”,
SortOrder.Descending
)
).現在庫数 + TI_今回の数量1.Text * 1
前回の現在庫数の計算方法は
まずFilter関数で選択した商品でデータを絞ります。
それを日時列で新しい順に並べ替えをしたいですが、
「日時」列がサジェスチョンに出てこず、
下図の様な文字化けが出てきます。

これは今回SharePointリストの列名を日本語で作ったので、
内部では文字化けをしてしまっているのです。
ではどの文字化けが日時列でしょうか?
今回のデータベースのSharePointリストにいき、
画面右上の「リストの設定」で、
今回作った作った「日時」列を選びます。

そして上図の様な次のページのURLの一番最後に出てくる文字列が
さっきのサジェスチョンで出てくるのです。
残念ながら日本語の全角だとこういう仕様になっているのです。
ですからSharePointリストで列を作るのは英語か、
半角ローマ字で作った方が良いでしょう。
「入庫」ボタンの「OnSelect」属性
Patch(
在庫管理表,
{日時: Blank()}, //Defaults(データベース名) よりも速い
{
商品名: DD_選択した商品1.Selected.Value,
日時: Now(),
科目: “入庫”,
個数: TI_今回の数量1.Text * 1,
現在庫数: First(
SortByColumns(
Filter(
在庫管理表,
商品名 = DD_選択した商品1.Selected.Value
),”OData__x65e5__x6642_”,
SortOrder.Descending
)
).現在庫数 + TI_今回の数量1.Text * 1
}
);
Reset(TI_今回の数量1)
二つ前の式を再掲しましたが、並べ替えをしただけでは複数行のテーブルなので、
First関数を使って最初の行、つまり、最新の日時の行を指定して、
その行の「現在庫数」列の値が前回の現在庫数になるのです。
ここでは入庫なのでその値に今回の数量を足す事で新しい現在庫数になります。
そしてポイントの3つ目は最後のReset関数で「今回の数量」の
テキスト入力コントロールを初期化して次の入力がし易くなるようにしています。
これで入庫ボタンの完成で新しい数量が追加できます。
出庫ボタンは入庫ボタンのOnSelect属性の式をコピペして、
「科目」列に代入する「入庫」を「出庫」に変えて
「個数」列に代入する数量をマイナスにし、
現在庫数列でさっきは今回の数量を足しましたが、
ここは出庫なので引きます。
これだけで出庫ボタンの完成です。
ギャラリーでの入出庫履歴の作り方

上図はアプリの完成形の再掲です。
その入出庫履歴はギャラリーで作っています。
そのItems属性を見てみましょう。
入出庫履歴のギャラリーの「Items」属性
If(
Toggle1.Value,
SortByColumns(
Filter(
在庫管理表,
科目 = “棚卸”
),
”OData__x65e5__x6642_”,
SortOrder.Descending
),
SortByColumns(
Filter(
在庫管理表,
商品名 = DD_選択した商品1.Selected.Value
),
”OData__x65e5__x6642_”,
SortOrder.Descending
)
)
この式はアプリ左下の切り替えボタンを押す度に
商品別の入出庫履歴と全商品の棚卸情報が切替表示される式ですが、
今回はIf文の第三引数の「商品別の入出庫履歴」を表示する式だけやります。
第二引数の部分は次回の記事でご説明します。
「商品別の入出庫履歴」を表示する部分の式
SortByColumns(
Filter(
在庫管理表,
商品名 = DD_選択した商品1.Selected.Value
),
”OData__x65e5__x6642_”,
SortOrder.Descending
)
まずFilter関数でデータベースから「商品名」列で
選択した商品だけでデータを抽出して、
それをさっきと同じ様に「日時」列で新しい順に並べ替えをしています。
そしてギャラリーの内部にテキストラベルを追加して、
その「Text」属性でThisItem演算子を使って各列を表示しています。
ギャラリー内の各列のラベルの「Text」属性
ThisItem.科目
ThisItem.個数
ThisItem.現在庫数
これでアプリ上部のドロップダウンで
商品毎の在庫履歴が見えるのです。
どうでしょうか?
このアプリは単純化してますが、
これだけでも入出庫管理が今まで紙とペンで
やっていた時より正確になり、
データがデジタル化されるので、
それを二次利用する事でさらなる業務改善ができる様になります。
次の動画では残りの棚卸機能と
そのデータをCSVファイルにしてEメールで取得する方法をお見せします。
「こちらの記事も読まれてます。」
- 【PowerApps】 Power Automate無しでギャラリーのデータをエクスポートする方法(在庫管理アプリの作り方後編)
- FIFO: 先入れ先出しを徹底させる四つのポイント【在庫管理】
- 適正在庫からの適正発注量の計算の仕方【サンプルファイル付】