Flex Gateway新着情報
Governance新着情報
Monitoring API Manager
これは進行中のベータリリースです。ベータ状態での Anypoint Code Builder の使用には、該当するベータサービス契約条件が適用されます。 |
Salesforce から取引先責任者レコードを取得しました。次に、レコードを更新する必要があるかどうかを決定するロジックを追加できます。更新する必要がある場合、保存された情報を新しい値で更新する必要があります。これを行うには、Scatter-Gather プロセッサーを使用して、Salesforce 組織と MySQL データベースの両方への要求を並列で実行する必要があります。
次の手順を実行します。
Salesforce 環境に対するクエリを設定します。
詳細は、サービスへのクエリの設定を参照してください。
Postman や AdvancedRestClient などの REST クライアントをインストールします。
Anypoint Code Builder で contact-sync.xml
ファイルを開きます。
[Set Return Message (返すメッセージを設定)] Set Variable コンポーネントの後の ([Add component (コンポーネントを追加)]) アイコンをクリックします。
「scatter」
と入力して [Scatter Gather] を選択します。
Scatter-Gather コンポーネント内に次のロジックを追加します。
<scatter-gather doc:name="SF and DB update">
<route doc:name="SF Update">
</route>
<route doc:name="DB Update">
</route>
</scatter-gather>
最初に、Salesforce のレコードの更新が必要な場合にレコードを更新する手順を実装することができます。この目的では、次を定義する必要があります。
更新が必要かどうかを決定するロジック
Salesforce Connector を使用してレコードを更新するために必要な操作
このチュートリアルの前半で、レコードから取得した電話番号を phonenumberSFVar
という変数に保存しました。この変数を、phonenumberVar
という別の変数に保存されている、POST 要求のクエリパラメーターで受け取った値と比較できるようになりました。
POST 要求の電話番号と Salesforce から取得した番号を比較するには、Choice ルーターを DataWeave 式と共に追加して、Salesforce の既存の電話番号と新しい電話番号が同じかどうかを確認します。同じ場合、[Phone number in Salesforce already up to date (Salesforce の電話番号はすでに最新)] というメッセージをログに記録し、Set Variable コンポーネントを追加して値 [Phone number in Salesforce already up to date] (Salesforce の電話番号はすでに最新) を変数 ReturnMessageSF
に設定します。
Anypoint Code Builder で contact-sync.xml
ファイルを開きます。
[SF Update (SF 更新)] ルートの後に Choice ルーターを追加します。
<choice doc:name="Phone needs update?">
<when doc:name="No Update needed" expression="#[vars.phonenumberSFVar == vars.phonenumberVar]">
<logger doc:name="Logger" message='#["Phone number in Salesforce already up to date"]' />
<set-variable value='#["Phone number in Salesforce already up to date. "]' doc:name="Set Return Message" variableName="ReturnMessageSF" />
</when>
<otherwise doc:name="Update needed" >
</otherwise>
</choice>
<otherwise/>
要素に次を入力します。
変数 IdVar
および phonenumberVar
を使用して電話番号を更新/挿入する Transform Message コンポーネント。
成功した更新を記録して、値 [Phone number in Salesforce successfully updated] (Salesforce の電話番号が正常に更新されました) を ReturnMessageSF
変数に割り当てます。
<ee:transform doc:name="SF update message">
<ee:message>
<ee:set-payload>
<![CDATA[%dw 2.0
output application/java
---
[{
Id: vars.IDVar,
Phone: vars.phonenumberVar
}]]]>
</ee:set-payload>
</ee:message>
</ee:transform>
<salesforce:update type="contact" config-ref="Salesforce_Config" doc:name="Update" />
<logger doc:name="Logger" message='#["Phone number in Salesforce successfully updated"]' />
必要な場合に対象 MySQL データベースのレコードを更新する手順を実装するには、次を定義する必要があります。
更新が必要かどうかを決定するロジック
Database Connector を使用してレコードを更新するために必要な操作
Anypoint Code Builder で contact-sync.xml
ファイルを開きます。
db:select
操作を [DB Update (DB 更新)] route
プロセッサーの下に追加し、[Contacts (取引先責任者)] テーブルのすべての項目を選択して、取引先責任者の名と姓で絞り込みます。
<db:select config-ref="Database_Config" doc:name="Select Contact from DB" >
<db:sql>
<![CDATA[SELECT * FROM Contacts WHERE FirstName = :firstname AND LastName = :lastname]]>
</db:sql>
<db:input-parameters>
<![CDATA[#[{
firstname: vars.firstnameVar,
lastname: vars.lastnameVar
}]]]>
</db:input-parameters>
</db:select>
<logger doc:name="Logger" />
Choice ルーターを使用して取引先責任者がデータベースにすでに存在しているかどうかを検出するロジックを追加します。
<choice doc:name="Does Contact exist in DB?" doc:id="piomzk" >
<when expression="#[payload.phoneNumber[0] == null]" doc:name="Contact does not exist" >
</when>
</choice>
取引先責任者はデータベースに存在しないため、Choice ルーターの [contact does not exist (取引先責任者が存在しない)] when
分岐を使用して、取引先責任者の詳細を含む新しい行を挿入し、必要に応じて ReturnMessageDB
変数を設定します。次のコードは手順の詳細を示しています。
<db:insert config-ref="Database_Config" doc:name="Insert Contact in DB">
<db:sql>
<![CDATA[INSERT INTO Contacts (FirstName, LastName, PhoneNumber) VALUES (:firstname, :lastname, :phone)]]>
</db:sql>
<db:input-parameters>
<![CDATA[#[{
firstname: vars.firstnameVar,
lastname: vars.lastnameVar,
phone: vars.phonenumberVar
}]]]>
</db:input-parameters>
</db:insert>
<logger level="INFO" message='#["Contact in database created"]' />
<logger doc:name="Logger" message='#["Contact in database created"]' />
<set-variable value='#["Contact in database created. "]' doc:name="Set ReturnMessageDB" variableName="ReturnMessageDB"/>
レコードがデータベースに存在する場合、otherwise
分岐を Choice ルーター内に作成して電話番号を抽出し、phonenumberDBVar
という変数に割り当てて、取引先責任者の電話番号を文字列としてキャストします。
<otherwise doc:name="Contact exists in the DB" >
<set-variable value="#[payload.phoneNumber[0] as String]" doc:name="Set phone in DB" doc:id="tkqxdt" variableName="phonenumberDBVar"/>
</otherwise>
別の Choice ルーターを追加して、古い電話番号と新しい電話番号が同じかどうかを確認します。番号が同じ場合、必要に応じてログに記録して ReturnMessageDB
を更新します。番号が同じではない場合、データベースの電話番号を更新し、ログに記録して ReturnVariableDB
を更新します。
次のコードサンプルを [Set phone in DB (DB の電話を設定)] set-variable
コンポーネントの下に追加します。
<choice doc:name="Does phone number need update">
<when doc:name="Already up to date" expression="#[vars.phonenumberDBVar == vars.phonenumberVar]">
<logger doc:name="Logger" message='#["Phone number in Database already up to date"]' />
<set-variable doc:name="Set ReturnMessageDB" value='#["Phone number in Database already up to date. "]' variableName="ReturnMessageDB" />
</when>
<otherwise doc:name="Needs update" >
<db:update config-ref="Database_Config" doc:name="Update phone number in DB">
<db:sql>
<![CDATA[UPDATE Contacts SET PhoneNumber = :Phone WHERE FirstName = :firstname AND LastName = :lastname]]>
</db:sql>
<db:input-parameters>
<![CDATA[#[{
firstname: vars.firstnameVar,
lastname: vars.lastnameVar,
Phone: vars.phonenumberVar
}]]]>
</db:input-parameters>
</db:update>
<logger doc:name="Logger" message='#["Phone number in Database successfully updated"]' />
<set-variable doc:name="Set ReturnMessageDB" value='#["Phone number in Database successfully updated. "]' variableName="ReturnMessageDB" />
</otherwise>
</choice>