Trailheadの【Lightning Web コンポーネントファイルのプッシュとリリース】でハマったこと

Trailheadでハマった件

モジュールLightning Web コンポーネントの基本Lightning Web コンポーネントファイルのプッシュとリリースでハマったので備忘録。。。

ハマったこと

最後の「ファイルのリリース」でDev Hub組織にリリースできなかったです。。。

指示通りにスクラッチ組織を作成し、そのDevHub組織にリリースするところでエラーが出てしまいました。

Case.Product__c... とか SiteAdmin... とか

試したこと

次のことを試したらリリースできました。

どれが正解かよくわからない。。。

DevHub組織のコミュニティを有効化してからスクラッチ組織を作成。

クラッチ組織を作成する前にDevHub組織になるTrailhead Play Groundのコミュニティを有効化してから、再度スクラッチ組織を作成。

ケースのカスタム項目「Product」を削除

DevHub組織のケースオブジェクトに作成済みのカスタム項目Productを削除

E_Bikes.site-meta.xmlを修正

SiteAdminのエラーなどが出ていたので、上記ファイルを修正

場所は、e-bikes-lwc > force-app > main > default > sites内にあるxmlファイルです。

修正した2箇所

  1. <siteAdmin>にあるユーザ名を、スクラッチ組織のものからDevHub組織のものに変更
  2. <subdomain>にあるドメイン名を、スクラッチ組織のものからDevHub組織のものに変更(.my.salesforce.comの部分は不要。サブドメインですし)

これらの修正でなんとかリリースができました。

もし同じようなエラーに出くわして心が折れた方はお試しください。。

フローで連番を振ってみる

salesforceだと、Name項目またはカスタム項目で自動採番を使用できます。
 何も処理をせずに一意の連番を振ることができるので便利です。  

カスタム項目のデータ型

自動採番
各レコードに一意の連番を自動的に割り当てます。自動採番項目の最大文字数は 30 文字で、そのうち 20 文字がプレフィックスまたはサフィックスのテキスト用に予約されています。外部オブジェクトでは使用できません。

今回はフローでカテゴリごとに連番を振ってみます。

やってみたこと

選択したカテゴリごとに連番を振るようにしてみます。
連番オブジェクトをサンプルに作成。「カテゴリ」項目を選択して保存すると、カテゴリごとに連番を振って更新します。

処理フロー

  1. カテゴリを選択して保存
  2. プロセスビルダーからフローを起動
  3. 同じカテゴリのレコードから最大値を検索
  4. 最大値+1の値を振る
  5. レコードを更新

こんなイメージで設定します。

連番オブジェクト

連番オブジェクトには下記の項目を作ります。

項目 API参照名 目的 サンプル
連番名 Name Name項目を自動採番で設定 SN-0001
カテゴリ category__c 選択リスト。この選択した内容ごとに連番を振ります A
カテゴリ連番 serialNumberByCategory__c カテゴリごとの連番を格納します。 A-0001,B-0001
管理用連番 serialNumberForFlow__c カテゴリごとの連番を数値で保存し、フローで利用 1,2,3

フローを作成

リソースの設定

フローで使用する変数を設定します。(API参照名は任意の名前をつけてください)

  1. プロセスビルダーからIdを格納
    • API参照名:varId
    • データ型:テキスト
    • フロー外部での可用性:入力で使用可能(プロセスビルダーからの値を受け取るため)
  2. プロセスビルダーからカテゴリを格納
    • API参照名:varCategory
    • データ型:テキスト
    • フロー外部での可用性:入力で使用可能(プロセスビルダーからの値を受け取るため)
  3. フロー内で同じカテゴリのレコードを検索して、その最大値を格納
    • API参照名:varMax
    • データ型:数値
    • 小数点の位置:0
    • デフォルト値:0

同様にフローで使用する数式を設定します。

  1. varMaxで取得した最大値に1を加算します。
    • API参照名:setMax
    • データ型:数値
    • 小数点の位置:0
    • 数式:{!varMax} + 1
  2. カテゴリ連番を数式で設定します。
    • API参照名:setCategoryNumber
    • データ型:テキスト
    • 数式:{!varCategory} & "-" & LPAD(TEXT({!setMax}), 4, "0")

フローを作成

レコードを取得

プロセスビルダーから受け取ったIdとカテゴリを使って、連番オブジェクト内の同じカテゴリのレコードを検索し、その中で管理用連番の最大値を格納します。

フローの要素から「レコードを取得」をパレット上にドラッグします。

以下のような設定をします。

  • 表示ラベル:(任意でつければOK)
  • API参照名:(任意でつければOK)
  • オブジェクト:連番(実際は自分の組織の対象となるオブジェクトを指定してください)
  • 絞り込み
    • 条件の要件:条件を満たしている
    • 条件1:項目 = Id、演算子 = 次の文字列と一致しない、値 = {!varId}(更新対象のレコード自体が検索に含まれないようにするため)
    • 条件2:項目 = category__c、演算子 = 次の文字列と一致する、値 = {!varCategory}(同じカテゴリに限定するため)
  • 並び替え(管理用連番の最大値が一番最初になるよう並べ替えます)
    • 並び替え順:降順
    • 並び替え:serialNumberForFlow__c
  • 保存するレコード数:最初のレコードのみ
  • 手動割り当て変数(詳細):チェックを入れる
  • 項目値の保存場所:個別の変数に保存
  • 保存する変数を選択:項目 = serialNumberForFlow__c → 変数 = {!varMax}

「レコードを取得」の全体は以下のような感じです。

f:id:sweaty:20191116214054g:plain
レコードを取得

レコードを更新

「レコードを検索」から取得した最大値を加算して更新をします。加算は上の数式で作成したものを使います。

  • 表示ラベル:(任意でつければOK)
  • API参照名:(任意でつければOK)
  • 更新するレコードを検索してその値を設定する方法:レコードを識別する条件を指定し、項目を個別に設定
  • オブジェクト:連番(実際は自分の組織の対象となるオブジェクトを指定してください)
  • 絞り込み
    • 条件の要件:条件を満たしている
    • 条件1:項目 = Id、演算子 = 次の文字列と一致する、値 = {!varId}
  • 項目値を設定
    • 設定1:項目:serialNumberForFlow__c ← 値:{!setMax}
    • 設定2:項目:serialNumberByCategory__c ← 値:{!setCategoryNumber}

「レコードを更新」の全体は以下のような感じです。

f:id:sweaty:20191116215346g:plain
レコードを更新

フローのコネクタをつなげると下図のようになりますので、フローを保存して有効化をしてください。

f:id:sweaty:20191116215745p:plain
フロー図

プロセスビルダーを設定

保存したフローを呼び出すためのプロセスビルダーを設定します。ここでは作成したときを条件にします。

f:id:sweaty:20191116220139p:plain
開始条件

プロセスビルダーの条件は下記のようにカテゴリが空白でないことを条件にします。

f:id:sweaty:20191116220401p:plain
条件

フローを呼び出すアクションを設定します。カテゴリとレコードのIDを指定します。

f:id:sweaty:20191116220700p:plain
フローを起動

最後に有効化をします。

検証

実際にレコードを作成して、想定どおりに動くか確認します。

f:id:sweaty:20191116222447g:plain
検証

カテゴリごとに連番が振られるようになりました。

実際の運用では、カテゴリの入力を必須にしたりなど考慮することはありますのでご注意を。

フローで積み上げ集計をやってみた(2-2)

前回の続きで参照関係のオブジェクトで積み上げ集計をフローでやってみます。

前回の内容

処理を作成する

前回はリソースを作成しましたので、実際のフロー処理を作成します。

レコードの取得

プロセスビルダーを起動した子オブジェクトと同じ親をもつレコードを取得します。

  1. 要素からレコードを取得をパレット上にもっていきます
  2. 設定画面が開くので以下のような設定をします
    • 表示ラベル:親オブジェクトが同じ子オブジェクトを取得
    • API参照名:getChildren(好きな名前にしてください)
    • このオブジェクトのレコードを取得:子オブジェクト
    • 子オブジェクトレコードを絞り込み
      • 条件の要件:条件を満たしている
      • 項目:Parent__c
      • 演算子次の文字列と一致する
      • 値:{!varParentId}
      • レコードコレクション変数:{!listChildren}
      • 変数に保存する子オブジェクトを選択:IDSales__c(売上)を選択

f:id:sweaty:20191022181109g:plain
レコードを取得

ループ処理

取得したレコードを1件ずつ取り出すループ処理を作成します

  1. 要素からループをパレット上にもっていきます
  2. 設定画面が開くので以下のような設定をします
    • 表示ラベル:子オブジェクトをループ
    • API参照名:loopChildren
    • コレクション変数:{!listChildren}
    • ループ変数:{!child}

listChildrenに複数の子オブジェクトが格納されるので、1件ずつ取り出してchildに割り当てて処理をします。

f:id:sweaty:20191022183406g:plain
ループ

設定したら、レコードを取得からループ処理へ矢印をつなげて保存してください。

割り当て

先に設定したvarTotalに売上を足し込んでいきます

  1. 要素から割り当てをパレット上にもっていきます
  2. 設定画面が開くので以下のような設定をします
    • 表示ラベル:合計を算出
    • API参照名:calculateTotal
    • 変数値を設定
      • 変数:{!varTotal}
      • 演算子追加
      • 値:{!child.Sales__c}

f:id:sweaty:20191022185343g:plain
割り当て

設定が完了したら、ループから割り当てへ矢印をつなげます。 そのときにループコネクタを選択画面が表示されるので、コレクション内の項目ごとを選択して完了を選択し、割り当てからループに矢印をもどします。

f:id:sweaty:20191022195012g:plain
ループコネクタ

親レコードを更新

最後に親レコードにvarTotalで計算した合計値を更新します。

  1. 要素からレコードを更新をパレット上にもっていきます
  2. 以下の設定をします。
    • 表示ラベル:親レコードを更新
    • API参照名:updateParent
    • 更新するレコードを検索してその値を設定する方法:レコードを識別する条件を指定し、項目を個別に設定
    • 親オブジェクトレコードを絞り込み
      • 条件の要件:条件を満たしている
      • 項目:Id
      • 演算子次の文字列と一致する
      • 値:{!varParentId}
    • 親オブジェクトレコードの項目値を設定
      • 項目:sum__c
      • 値:{!varTotal}

設定したらループから矢印をつなげます

このときは自動的にループコネクタが選択された状態になります。

f:id:sweaty:20191022191601g:plain
レコードを更新

有効化

これまでの設定をすべて保存したら有効化ボタンを押してください

プロセスビルダーの設定

最後にフローを呼び出すプロセスビルダーを設定します。

子レコードが作成されたときに呼び出すようにします。
※売上が空欄の場合だったり、変更されたときなど実運用では考慮することがありますが今回は単純に作成されたときという条件で呼び出します。

  • ルール適用時のアクション種別でフローを選択
  • フローで作成したものを選択
  • フロー変数にvarParentIdを選択(これしか選べないはずです)
  • 種別を項目を参照にしてparent__cを選択してください

f:id:sweaty:20191022193359p:plain
アクション

最後にプロセスビルダーを有効化してください。

動作確認

実際に動作確認です。
キャッシュが残って更新がきれいにはいかなかったですが親オブジェクトの項目が子オブジェクトによって更新されたことが確認できました。

f:id:sweaty:20191022200642g:plain
検証結果

まとめ

フローを使うとプログラムがかけなくても複雑な処理を実装することができます。
ただしある程度の知識と慣れが必要だと思いますので、かんたんなものから始めてステップアップするのが良さそうです。
今回は使用しませんでしたが、決定という要素を使うことで条件分岐も可能となりより複雑な処理ができます。

今回の内容であればプロセスビルダーだけでも実装は可能ですが、一例として。。

フローで積み上げ集計をやってみた(2-1)

salesforceに積み上げ集計という便利な機能があります。

子レコードの合計や件数などを項目ひとつで作成できるので重宝してます。
でも制限があり、主従関係がないと使えないという点で困ったことがありました。

(積み上げ集計のヘルプ)https://help.salesforce.com/articleView?id=fields_about_roll_up_summary_fields.htm

主従関係がなんとなくわからなくて。とか、必須にすべきかわからなくてやむを得ず参照関係にすることもあったりするのかと。

そこで参照関係にあるオブジェクトでの積み上げ集計をフローで試してみました。

試したこと

親オブジェクト(Parent__c)子オブジェクト(Child__c) で子レコードの数値項目売上を親オブジェクトの項目子レコード合計に積み上げ集計してみました。子オブジェクトに参照関係で親オブジェクトを設定しています。

大まかな処理イメージ

  1. 子オブジェクトのレコードを作成する(親オブジェクトに関連付ける)
  2. プロセスビルダーでフローを呼び出す
  3. 親オブジェクトが同じ子オブジェクトのレコードを検索
  4. 検索した子オブジェクトをループ処理して、合計値を計算
  5. 親レコードに4の値を渡して更新

こんな感じです。
本来であれば更新時やほかの条件を検討する必要があります。

フローを作る

新規フローの作成

なにはともあれフローを作成。

設定画面を開き、設定 > プロセスの自動化 > フロー と選択し、画面が開いたら新規フローのボタンをクリック。

フロー種別の選択は自動起動フローを選択します。

f:id:sweaty:20191022154227p:plain
自動起動フロー

フローに必要な要素を作成する

新規フローを作成すると、フロービルダーが起動します。

左にツールボックスがあり、その中に要素マネージャというタブがあります。

要素では、フローが行う処理としてレコードの検索、作成、更新、削除や、条件、ループ、割り当てなどがあります。

f:id:sweaty:20191022154538p:plain
ツールボックス > 要素

マネージャでは、フローで使うリソースを作成します。リソースとは、値を格納する変数や数式、フェーズなどが利用できます。 新規では「新規リソース」のボタンしかないので画像は割愛します。

(▼リソースのヘルプページ)https://help.salesforce.com/articleView?id=flow_ref_resources_variable.htm&type=5

では、今回のフローで使うリソースを作りますが、先ほどの処理内容から以下のものを用意します。

  • プロセスビルダーを呼び出した子オブジェクトの親オブジェクトIDを受け取る変数
  • 親オブジェクトIDが同じ子オブジェクト(複数レコード)
  • 合計
  • ループ処理時に使用する子オブジェクト(単一レコード)

これらにフローで処理する際に必要な途中経過の値などを格納します。

では作ってみましょう。

プロセスビルダーを呼び出した子オブジェクトの親オブジェクトIDを受け取る変数

子オブジェクトのレコードが作成されたときに、プロセスビルダーを呼び出す想定です。
呼び出したときにフローへそのレコードの親オブジェクトIDを渡し、親オブジェクトが同じIDの子オブジェクトを取得します。

新規リソースをクリックして以下のような設定をします。

  • リソース種別 = 変数
  • API参照名 = varParentId(ここの設定は任意です。自分でわかりやすい名前にしとくといいと思います)
  • 説明 = 任意の内容を記載します(必須ではないので空欄でもOK)
  • データ型 = テキスト
  • フロー外部での可用性 = 入力で使用可能にチェック

あとはブランクでOK。
後でプロセスビルダーから親オブジェクトIDをフローへ渡すために、入力で使用可能にチェックを入れる必要があります。

f:id:sweaty:20191022153342g:plain
プロセスビルダーからの値を格納する

親オブジェクトIDが同じ子オブジェクト(複数レコード)

先に受け取った親オブジェクトIDが同じ子オブジェクトを取得します。
取得した結果を格納する変数です。ここではオブジェクトを指定する必要があります。

  • リソース種別 = 変数
  • API参照名 = listChildren
  • 説明 = 任意の内容を記載します(必須ではないので空欄でもOK)
  • データ型 = レコード / 複数の値を許可(コレクション)にチェック
  • オブジェクト = 子オブジェクト

f:id:sweaty:20191022160336g:plain
listChildren

合計

合計を求めるには子オブジェクトの値(ここでは売上とします)をループ処理で足す必要があり、それを格納するリソースを作成します。

  • リソース種別 = 変数
  • API参照名 = varTotal
  • 説明 = 任意の内容を記載します(必須ではないので空欄でもOK)
  • データ型 = 数値

小数点の値やデフォルト値は0としておきます。

f:id:sweaty:20191022162809g:plain
varTotal

ループ処理時に使用する子オブジェクト(単一レコード)

こちらは先程のオブジェクトと同様で子オブジェクトを指定して、複数の値を許可のチェックは不要です。
API参照名はchildとしておいてください。

ここまでできたら一旦保存しておきます。 エラーが表示されますが、フローの動作を設定しないため表示されますので無視して問題ありません。

まだ続きますので、以降の処理は次で記載したいと思います。

レポートのPARENTGROUPVALとPREVGROUPVAL

レポートで集計関数を使おうと思うたびに毎回忘れて調べているので備忘録。 ヘルプページを読んで使いこなせている人を神と崇めたい。。。毎度わからなくなって調べている理解力の低さが悲しいところ。

集計関数

詳しい説明はヘルプページにお任せするとして、前月の数字を使いたければPREVGROUVAL、全体の合計を使いたかったらPARENTGROUPVALみたいなざっくり理解

PARENTGROUPVAL および PREVGROUPVAL

LEXになってから集計関数の設定方法も変わったようで使い慣れない。。。

サンプルレポート

よくありそうなパターンでレポートを作成。 月ごとの営業部門別売上を作ってみました。

f:id:sweaty:20190916002139j:plain
レポート途中イメージ

こんな感じで、年毎の推移や月ごと、部門ごとのマトリックスレポートに集計関数を実装してみたけど、 最初にわかりやすくするために数字だけを持ってくるようにしてみた。

拡大するとこんな感じ

f:id:sweaty:20190916004714j:plain
集計箇所

基本設定

  1. レポートのアウトラインから列のところにある▼をクリックして、集計項目を追加を選択
    f:id:sweaty:20190916002439j:plain
    設定画面
  2. 画像のような設定画面が表示される
    1. 列の名前:レポートに表示される名前
    2. 説明:自分でわかるように記載。特に表示されるわけではない
    3. 数式出力種別:数値パーセント通貨のいずれかを選択。
    4. 小数点:数式出力種別の小数点設定
      f:id:sweaty:20190916002719j:plain
      設定画面

今月の営業合計

今月の営業合計を営業部門と月のエリアに表示したい。 こんなときはPARENTGROUPVALを選びます。

これが表示できれば、あとは部門の数字と計算することで月ごとの売上に対して部門ごとの比率が計算できます。

まず集計関数の配置する場所を指定します。 部門と月の交差する部分に配置したいので、以下のような指定をします。

f:id:sweaty:20190916005242j:plain
集計項目の表示箇所

PARENTGROUPVALは「サマリーと結合」、「マトリックス」形式それぞれで指定する項目の数が異なる。 マトリックス

PARENTGROUPVAL(
  集計する値, 
  行グループ, 
  列グループ
)

を指定します。

こんな感じになります。

f:id:sweaty:20190916103720j:plain
完成イメージ

小計部分に項目名が表示されてしまうのが残念なところではある。。。

前月の数字

指標として前月比や前年比を使用することは多いと思います。 そんなときはPREVGROUPVALを利用します。

PREVGROUPVAL(
  集計する値, 
  集計グループ 
  [, どれだけ遡るかの数字]
)

集計する値と、どのグループで前の値を参照するか指定します。
この場合は、前月の実績を参照するので、集計グループに計上月を指定します。
どれだけ遡るかは入力しなければ一つ前を参照し、2ヶ月前を参照したかったら2を指定します。

f:id:sweaty:20190916111819j:plain
PREVGROUPVAL

これで前月の数字が参照できるので、比率の計算が可能になります。