機械翻訳について

実証済のコーディング手法の使用

次のガイドラインを使用して、オーダー管理拡張を作成します。

概要

実証済のコーディング手法を使用するペイロード

ノート

  1. 「IFの使用」. 開発環境のすべての条件で実行されるコードを記述しないでください。 かわりに、IF文を使用して、コードが特定のユースケースでのみ実行されるようにします。

    条件付きロジックなしで拡張ポイントが発生するたびに実行される文を記述し、拡張にエラーが含まれているとします。 拡張によって、テストする必要がある条件に関係なく、開発環境のすべての販売オーダーが失敗する場合があります。 この状況は、他の開発者に悪影響を及ぼす可能性があり、独自の拡張機能の管理がより困難になります。

    たとえば、shipInstructions属性を操作する拡張を記述するとします。 拡張の最初の文としてこの文を追加すると、使用しているユース・ケースに対してのみコードを実行できます。

    if (shipInstructions != "ValidateCustomerPONumber" ) return;

    文がtrueと評価された場合、拡張のロジックはそれ以上実行されません。 かわりに、フローは拡張を終了します。

    拡張をテストして本番にデプロイする準備ができたら、IFを削除します。

  2. 「空の値のチェック」. nullポインタ例外は避けてください。 参照する各属性に値が含まれていることを確認するIF文を使用します。 そうでない場合は、拡張からフローを返します。

  3. 「コメントの追加」. 各文が実装するロジックを正確に把握できるように、コードの各部分を文書化する詳細コメントを追加します。 コメントは、他のユーザーがコードの意図を理解するのに役立ちます。また、大規模な複雑なコードや長期間調べていないコードのトラブルシューティングにも役立ちます。

ノート
  • 拡張機能で新しい販売オーダーに対してのみ、またはリビジョンでのみアクションを実行する場合は、変更する販売オーダーが新規か改訂版かを決定する条件を追加してください。 このように、条件がfalseと評価された場合、拡張コードの残りの部分を評価しなくても、すぐに拡張を終了できます。

    構成品目、キット、出荷セットなど、オーダー明細に影響を与えるすべてのファクタを考慮します。

  • 簡易配列の使用やマップの初期化など、Groovy構造を利用します。

Groovyでの変数タイプの定義

Groovyは動的言語であり、各変数のタイプを定義する必要はありません。 たとえば、soldToPartyNameとLinesをそれぞれ型のない変数として定義できます。 オプションで、必要に応じてタイプを指定します。 たとえば、soldToPartyNameを文字列型として定義します。

各子エンティティに属性としてアクセスします。 たとえば:

header.getAttribute("Lines"), header.getAttribute("SalesCredits")

暗黙的な変数の使用

暗黙的な変数を各拡張とともに使用します。 定義する必要はありません。

暗黙変数

摘要

ヘッダー

オーダー・ヘッダー・オブジェクトを表します。 ヘッダー変数を使用して、オーダー・ヘッダー属性および子エンティティ行にアクセスします。

コンテキスト

実行中の拡張の名前やイベント・コードなど、各拡張がコンテキスト詳細にアクセスできるようにするコンテキスト・オブジェクト。 contextオブジェクトは、loggingなどのユーティリティおよびヘルパー・メソッドへのアクセスも提供します。

この形式を使用します。

context extension name

たとえば:

context Update Order Submit Date

参照販売オーダー・エンティティ

暗黙的なヘッダー変数を使用して、各オーダー・エンティティにアクセスします。 オーダー管理では、各エンティティが汎用行オブジェクトとして公開されます。 各拡張は、getメソッドまたはsetメソッドのみを参照できます。

処理

コード

属性値を読み取ります。

getAttribute("attributeName")

属性への書込み。

setAttribute("attributeName", attributeValue)

たとえば:

コード

説明

def soldToPartyName = header.getAttribute("BuyingPartyName");

BuyingPartyName属性の値を取得します。

header.setAttribute("ShippingInstructions", "Use only next-day air.");

ShippingInstructions属性の値を「翌日の空気のみを使用」に設定します。

def lines = header.getAttribute("Lines");

一連の行を返します。 イテレータを反復処理して個々の行にアクセスできます。

行のループ

販売オーダーのすべてのオーダー明細で、いくつかの属性を更新する必要がある場合があります。

販売オーダー54638のすべての50オーダー明細の出荷方法、梱包指示および支払条件を更新する必要があるとします。 各明細を個別に更新するための拡張を50個作成することは可能ですが、すべての明細のすべての属性を更新するための拡張を1つ作成してから、明細をループして属性を更新することをお薦めします。

このアプローチにより、拡張の50個のインスタンスを作成し、50個の異なるライン・ループ・チェックを実行する必要がなくなり、パフォーマンスが向上します。

ナビゲート行セット

オーダー管理は、各子エンティティを行セットとして返します。 たとえば、オーダー明細は販売オーダーの子です。 この例では、while nextを使用して各行(オーダー明細)をセット(販売オーダー)からループする方法を説明します。

各行をループするコード

これは説明を含むコードと同じです。

コード

説明

def lines = header.getAttribute("Lines");

オーダー・ヘッダーのgetAttributeメソッドをコールして、オーダー明細の行セット・イテレータにアクセスします。

while( lines.hasNext() ) {

明細行セットに次の行が含まれているかどうかを確認し、行セットにそれ以上行が含まれないまでループします。

def line = lines.next();

次のオーダー明細行を取得します。

  • whileを通る最初のループで、1行目から2行目に移動します。

  • whileを通る2番目のループで、2行目から3行目に移動します。

  • 同様に続行します。

line.SetAttribute("BillingTransactionTypeIdentifier, 12345L");

オーダー明細の請求トランザクション・タイプの値を12345Lに設定します。

簡潔にするために、この例では、値12345Lをハードコードします。 ほとんどの場合、値をハード・コードするのではなく、変数またはその他のロジックを定義する方が多くなります。

これはコメントなしで同じコードです。


  while( lines.hasNext() ) {
  def line = lines.next();
  line.SetAttribute("BillingTransactionTypeIdentifier, 12345L");
}

孫エンティティの行セットのナビゲート

孫エンティティにアクセスします。

次に示す拡張機能の例を示します:

  • オーダー明細の手数料コンポーネント行にアクセス

  • オーダー明細を取得

  • オーダー明細の下にあるオーダー手数料行にアクセス

  • オーダー手数料から手数料コンポーネント行にアクセス

コード

説明

def lines = header.getAttribute("Lines");

オーダー・ヘッダーのメソッドgetAttributeを使用して、オーダー明細の行セット・イテレータにアクセスします。

while( lines.hasNext() ) {

明細行セットに次の行が含まれているかどうかを確認し、行セットにそれ以上行が含まれないまでループします。

def line = lines.next();

次の行を取得します。

def charges = line.getAttribute("OrderCharges");

オーダー明細のオーダー手数料の行セットを取得します。

while( charges.hasNext() ) {

オーダー手数料行をループします。

def charge = charges.next();

行セットから次のオーダー手数料を取得します。

def chargeComps = charge.getAttribute("ChargeComponents");

子エンティティの手数料コンポーネントの行セットを取得します。

while( chargeCompo.hasNext() ) {

現在の手数料の手数料コンポーネントをループします。

def chargeComp = chargeCompo.next();

次の料金コンポーネントを取得します。

def currency = chargeComp.getAttribute("ChargeCurrencyCode");

現在の手数料コンポーネント行から属性ChargeCurrencyCodeの値を取得します。

これはコメントなしで同じコードです。

def lines = header.getAttribute("Lines"); //get the lines row set
while( lines.hasNext() ) {//determine whether more lines exist
  def line = lines.next();
  def charges = line.getAttribute("OrderCharges");
  while( charges.hasNext() ) {
    def charge = charges.next();
    def chargeComps = charge.getAttribute("ChargeComponents");
    while( chargeCompo.hasNext() ) {
      def chargeComp = chargeCompo.next();
      def currency = chargeComp.getAttribute("ChargeCurrencyCode");
    }
  }
}

拡張機能をセキュリティ保護

ジョブ・ロールに従ってロジックを記述します。 たとえば、オーダー管理へのサインイン時にOrder Entry Specialistが使用するジョブ・ロールに従って、処理を禁止する拡張機能や、販売オーダーのデフォルト値を設定する拡張機能を作成します。 この例では、オーダー入力スペシャリスト・ジョブ・ロールのコードであるORA_FOM_ORDER_ENTRY_SPECIALIST_JOBを参照します。

このトピックでは、事前定義済ジョブ・ロールを使用します。 セキュリティ要件に応じて、独自のジョブ・ロールを作成する必要があります。

権限の設定方法の詳細は、「Order Managementのセキュリティ・リファレンス」を参照してください。

ジョブ・ロールの定義方法ORA_FOM_ORDER_ENTRY_SPECIALIST_JOB

ノート

  1. セキュリティ・コンソールを使用して、拡張で参照する必要があるジョブ・ロールとロール・コードの詳細を取得します。 詳細は、Oracle ERP Cloudのセキュリティ・コンソールの概要、ERPの保護を参照してください。

  2. isUserInRoleメソッドを使用します。

  3. isUserInRoleの最初のパラメータで、セキュリティ・コンソールで定義されているロール・コードを参照します。

拡張と変換ルールを一緒に使用しない

このルールは、拡張が追加した明細を削除または変更する可能性があるため、オーダー管理拡張および製品変換ルールを使用してオーダー明細を同じ販売オーダーに追加しないでください。

たとえば、拡張を使用して明細1を販売オーダー65748に追加し、ルールを使用して明細2を同じ販売オーダーに追加した場合、ルールによって明細1が削除され、オーダーの保存や発行、改訂時に明細2が追加されます。

別の例として、拡張を使用して数量が2のAS54888品目を販売オーダー65748の明細1に追加し、ルールを使用して明細1に数量が10のAS29888を追加すると、ルールによってAS54888と数量が削除され、数量が10のAS29888が追加されます。