arayada0118
@arayada0118

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Power Appsのアプリ開発において、Uppdate関数でエラーが出ている

解決したいこと

Power Appsで献立を管理するアプリを作成しています。
検索画面、献立の詳細画面、登録結果画面、グラフの確認画面を作っており、データソースは材料名のリストと献立名のリストと登録用のリストの3つ用意しています。

検索画面で週の予算、日付、曜日、食材名を入力し、食材名から料理名を検索しギャラリーで表示します。
ギャラリーの料理名を選択し保存ボタンで保存後、詳細画面で料理名に紐づく使用食材名、その食材費、食材費総額、残額を表示します。
その後、食材費総額と残額をデータソースに上書きする(同じレコードに書き込む)形で登録します。
今回の開発では、項目はカードではなく、テキストボックスやテキストラベルで等配置しているため、SubmitFormではなく、Patch関数(検索画面で使用)やUppdate関数(詳細画面で使用)を使用しています。

現在詳細画面に登録ボタンを追加し、OnSelectにUpdate関数を記載しており、記載時点ではエラーは出ていないのですが、登録ボタンを押下すると、以下のようなエラーメッセージが表示されました。

以下エラーメッセージのフィールド名は諸事情により伏字にさせて頂きますが、データソースの項目を確認したところ、該当の項目は一意識別子であり、必須欄がシステム要件となっておりました。

Copilotで質問したり、Webで調べる等しておりますが、勉強を始めたばかりで解決の糸口がなかなかつかめないため、解決方法や解決のヒントをご教授頂けますでしょうか。
大変お手数ですが、よろしくお願いいたします。

発生している問題・エラー

Update関数の使用中にネットワークエラーが発生しました:フィールド'XXXX'は必須です。

該当するソースコード

//SelectedDay:前画面で選択した日付
Update(
'データソース名',
LookUp('データソース名', 日付 = SelectedDay),
{
//TotalFoodCost:食材費総額のテキストラベル、balance:残額のテキストラベル
食材費総額: Value(TotalFoodCost.Text),
残額: Value(balance.Text)
}
);

自分で試したこと

データソースを削除し、再度追加する、更新する等試しましたが、エラーは解消しませんでした。
フィールド'XXXX'を以下変数に代入し、Update関数の残額の下に追加したところ、以下エラーメッセージが表示されてしまいました。
また、「Notify("取得したID: " & recordID, NotificationType.Information);」というソースをUpdate関数の下に記載したところ、上記Notifyで指定したメッセージは表示されていました。

【修正後のソース】
//該当項目を変数にセットする
Set(
recordID,
LookUp('データソース名', 日付 = SelectedDay).XXXX'
);

//SelectedDay:前画面で選択した日付
Update(
'データソース名',
LookUp('データソース名', 日付 = SelectedDay),
{
//TotalFoodCost:食材費総額のテキストラベル、balance:残額のテキストラベル
食材費総額: Value(TotalFoodCost.Text),
残額: Value(balance.Text),
列名: recordID
}
);

【エラーメッセージ】
Update関数の使用中にネットワークエラーが発生しました:'XXXX'はサーバーにより生成されるため、指定できません。

0

1Answer

Updata関数を使用してレコードの操作を行う場合は、対象のデータテーブルの列全体を指定する必要があります。

例えば以下のようなレコードを対象とします。

  • 商品リスト

    ID(オートナンバー) 商品グループ 商品名 単価
    1 ドリンク お茶 100

このレコードの単価を変更したい場合、Update関数では以下のように記述してあげる必要があります。

Update(
	"商品リスト",
	"変更したいレコード",
	{
		ID:1,
		商品グループ:"ドリンク",
		商品名:"お茶",
		単価:200
	}
);

単価列のみを変更したい場合であっても、レコード内すべての列の値を指定する必要があるのです。
そのため、記載した列に不足がある場合は「Update関数の使用中にネットワークエラーが発生しました:フィールド'XXXX'は必須です。」というエラーが発生します。

更に注意なのが、SharePointリストではID列はオートナンバー(レコード登録時に自動で生成され、後から変更はできない)となります。
なのでメッセージ通りID列の値を指定したところで、結局「Update関数の使用中にネットワークエラーが発生しました:ID列はサーバーにより生成されるため、指定できません。」というエラーが発生してしまうのです。

ということで、SharePointリストの操作にあたりUpdate関数は不向きとなります。

ではどうすれば良いかというと、Patch関数、またはUpdateIf関数を使用することになります。
それぞれ以下のようになります。

Patch(
	"商品リスト",
	Lookup(
		"商品リスト",
		ThisRecord.ID = 1
	),
	{
		単価:200
	}
);
UpdateIf(
	"商品リスト",
	ThisRecord.ID = 1,
    {
		単価:200
	}
);

それぞれの特徴としては以下の通りです。

  • Patch関数
    • データテーブルに対して更新だけでなく挿入の操作もでき、工夫すればアップサートのような処理も実装できる。
    • 1つのレコードしか操作できない。(複数レコードを一括更新などはできない)
  • UpdateIf関数
    • 条件を満たす複数のレコードを一括で更新することができる。
    • データテーブルに対し挿入などの操作はできない。

該当のコードを見たところ日付列を条件としているようですが、
複数レコードヒットしてそれらをまとめて更新したければUpdateIf関数、
1つの特定レコードだけ更新したければLookup関数の条件を詳細にしてPatch関数を使用するのがベターかと思われます。

2Like

Comments

  1. @arayada0118

    Questioner

    解決策をご教授頂き、ありがとうございます。
    また、ご助言頂き、ありがとうございます。
    とても分かりやすく、理解することができました。

Your answer might help someone💌