Order Managementの拡張機能を使用した大量の販売オーダーのインポート
インポートする大量のオーダー管理拡張を使用します。
1時間ごとに100,000のオーダー・ラインを処理し、毎日1,000,000を超えるオーダー・ラインを処理する必要があるとします。 変換ルールのかわりに、オーダー管理拡張を使用することをお薦めします。 拡張機能により、大量の明細を処理する際のパフォーマンスが向上します。
拡張機能の使用方法の詳細は、「オーダー管理拡張の作成の概要」を参照してください。
詳細および例については、「Oracle Supply Chain Management CloudのREST API」に移動し、Order Managementを展開して、Order Hubの販売オーダーをクリックします。
ガイドライン
拡張機能を確認してください:
- オーダーをインポートする前に顧客を作成します。
- 品目を識別します。
- オーダー明細のProductIdentifier属性またはProductNumber属性の値を設定します。 値が品目を一意に識別していることを確認してください。
- Product Information Management(製品情報管理)作業領域に、これらの属性が参照する品目が含まれていることを確認します。
- オーダー明細のオーダー数量属性を正の数値に設定します。
- 保存時または送信リクエストの開始時イベントに新しいオーダー明細を追加します。 発行の終了イベントに明細を追加しないでください。
- クローズまたは取消されていない販売オーダーに新規明細を追加します。 販売オーダーがクローズ済または取消済の場合は、その販売オーダーに新規明細を追加できません。
- 変換ルールによって既存の明細がまだ変換されていない場合にのみ、既存のオーダー明細を参照する新規明細を追加します。
- 構成品目を販売オーダーに追加しません。 拡張を使用して構成品目を販売オーダーに追加することはできません。
- 送信終了イベント中に新規オーダー明細を販売オーダーに追加しません。
変換ルールによって、多数の処理が自動的に実行されます。 ただし、拡張機能を使用する場合は、次の処理を実行するように拡張をコーディングする必要があります:
- ソース明細の数量に従って、追加するオーダー明細のデフォルト数量を設定します。
- ソース明細に従って数量をカスケードまたは操作するか、他の属性に従って数量を指定する必要があります。
- ソース明細を変更または削除する場合は、ソース明細に対して作成した新規明細を変更または削除する必要があります。
ノート
- 「大量の販売オーダーのインポートおよび配送」オプトイン機能を有効にする必要があります。 詳細は、「FBDIでのREST APIを使用した大量販売オーダーのインポート」を参照してください。
- オプションとして、送信リクエストの開始時に即時応答オーダー・プロファイルを有効にできます。 その場合、オーダー・ハブRESTサービスの販売オーダーは、販売オーダーの発行を開始すると応答します。 有効にしない場合、RESTは販売オーダーの送信が終了した後に応答します。
- REST APIはoracleビジネス・ルールをコールできませんが、3つの拡張ポイントすべてで使用できます。
- 拡張機能と変換ルールを使用して新規明細を同時に追加することはできません。 拡張または変換ルールを使用する必要があります。
- 変換ルールと拡張は、新しい行の価格を0に設定します。
- オーダー管理作業領域で新規明細を編集することはできません。
例
このサブ・トピックの例では、これらの値を使用しているものとします。
ProductIdentifier | ProductNumber |
---|---|
149 | AS54888 |
2157 | AS92888 |
ソース明細にオーダー1行以上を追加
品目AS54888をインポートし、2つの別々のオーダー明細に変換する必要があるとします。 1行のAS92888品目は数量が15で、もう一方の行のAS54888品目は数量が20になります。
import oracle.apps.scm.doo.common.extensions.CreateLineParams;
if( !"CREATE_MUL_LINES".equals( header.getAttribute("CustomerPONumber" ) ) ) return;
def lines = header.getAttribute("Lines");
while( lines.hasNext() ) {
def line = lines.next();
//If the source line is closed, cancelled, or already transformed, then you can't add it to the sales order.
// See if the source line is closed.
def isClosed = line.isClosed()
// See if the source line is canceled.
def isCanceled = line.isCanceled()
// See if the source line is already transformed.
def isTransformed = line.isTransformed();
if (isClosed || isCanceled || isTransformed) { // Skip if the line is closed, canceled, or already transformed.
continue;
}//Get the name of the item thatâs on the order line.
def productName = line.getAttribute("ProductName");
if (isClosed || isCanceled || isTransformed || productName != 'AS54888') { // Skip this section if the line is closed, canceled, already transformed, or the item on the line isn't AS54888.
continue;
}
def orderedQuantity = line.getAttribute("OrderedQuantity");
//// Add the first transformed line AS92888
def createLineParams = new CreateLineParams();
createLineParams.setProductNumber("AS92888");
//createLineParams.setProductIdentifier(2157);
createLineParams.setOrderedUOM("Each")
createLineParams.setOrderedQuantity(15);
def transformedLines = line.getTransformedLines("AS92888");
//def transformedLines = line.getTransformedLines(2157);
if (transformedLines.size() == 0) { // If you haven't already added the line, then add it now.
line.createNewLine(createLineParams);
}
//// Add the second transformed line AS54888
createLineParams.setProductNumber("AS54888");
//createLineParams.setProductIdentifier(149);
createLineParams.setOrderedUOM("Each")
createLineParams.setOrderedQuantity(20);
transformedLines = line.getTransformedLines("AS54888");
//transformedLines = line.getTransformedLines(149);
if (transformedLines.size() == 0) { // add new line if it is not created before
line.createNewLine(createLineParams);
}
}
条件に従って明細を追加
ソース明細が条件を満たす場合にのみ、新規オーダー明細の追加を指定できます。 インポート・ペイロードにAS54888品目が含まれ、その数量が100の場合にのみ行を追加するとします。
import oracle.apps.scm.doo.common.extensions.CreateLineParams;
if( !"CREATE_LINE_IF_AS54888&QTY100".equals( header.getAttribute("CustomerPONumber" ) ) ) return;
def lines = header.getAttribute("Lines");
while( lines.hasNext() ) {
def line = lines.next();
def isClosed = line.isClosed()
def isCanceled = line.isCanceled()
def isTransformed = line.isTransformed();
if (isClosed || isCanceled || isTransformed) { // Skip if the line is closed or canceled, or if the line is already transformed.
continue;
}
def orderedQuantity = line.getAttribute("OrderedQuantity"); // get the original line's quantity
def productNumber = line.getAttribute("ProductNumber"); // get the original line's product number
if (productNumber == "AS54888" && orderedQuantity == 100) {
//def transformedLines = line.getTransformedLines("AS92888");
def transformedLines = line.getTransformedLines(2157);
if (transformedLines.size() == 0) { // If you haven't already created the transformed line, then create it now.
def createLineParams = new CreateLineParams();
//createLineParams.setProductNumber("AS92888");
createLineParams.setProductIdentifier(2157);
createLineParams.setOrderedUOM("Each")
createLineParams.setOrderedQuantity(orderedQuantity);
line.createNewLine(createLineParams);
}
}
}
変換したオーダー明細の取消
ソース明細を変更または削除する場合は、ソース明細に対して作成した新規明細を変更または削除する必要があります。 ソース明細を取り消しても、変換済明細は自動的に取り消されません。
この例では、ソース明細または取消済明細を削除するたびに、変換済明細が削除されます。
import oracle.apps.scm.doo.common.extensions.CreateLineParams;
import oracle.apps.scm.doo.common.extensions.Line;
if( !"CANCEL_TRANSFORMED_LINES".equals( header.getAttribute("CustomerPONumber" ) ) ) return;
def lines = header.getAttribute("Lines");
while( lines.hasNext() ) {
def line = lines.next();
def isClosed = line.isClosed();
def isCanceled = line.isCanceled();
def isTransformed = line.isTransformed();
def orderedQuantity = line.getAttribute("OrderedQuantity");
if (orderedQuantity == 0 && !isTransformed) { //Source line is canceled
List<Line> transfomrLines = line.getTransformedLines(); //Get all the transformed lines for the current line.
for (Line transformedLine : transfomrLines) {
def orderedQuantityTL = transformedLine.getAttribute("OrderedQuantity");
if (orderedQuantityTL != 0 && transformedLine.isOpen()) {
transformedLine.setAttribute("OrderedQuantity", 0);
}
}
}
}
失敗の例
拡張機能を作成し、エラーが表示されるとします。
Request failed because order management extension CREATE_LINE_CLOSED_CANCELED attempted to add new line that references a closed or canceled line. Happens during event On Save. You can use an order management extension to add a new order line that references an existing order line only if the existing line isnt closed or canceled.
クローズ済、取消済またはすでに変換済の販売オーダーに新規明細を追加しようとしたために失敗した拡張機能の例を次に示します。
"import oracle.apps.scm.doo.common.extensions.CreateLineParams;
if( !"CREATE_LINE_CLOSED_CANCELED".equals( header.getAttribute("CustomerPONumber" ) ) ) return;
def createLineParams = new CreateLineParams();
createLineParams.setProductNumber("AS54888");
createLineParams.setOrderedUOM("Each")
createLineParams.setOrderedQuantity(50);
def lines = header.getAttribute("Lines");
while( lines.hasNext() ) {
def line = lines.next();
def isTransformed = line.isTransformed();
def transformedLines = line.getTransformedLines();
if (isTransformed || transformedLines.size() > 0) {
continue;
}
line.createNewLine(createLineParams);
}"
この問題を回避するには、コードの最初にこのスニペットを追加します。
// See if the source line is closed.
def isClosed = line.isClosed()
// See if the source line is canceled.
def isCanceled = line.isCanceled()
// See if the source line is already transformed.
def isTransformed = line.isTransformed();
if (isClosed || isCanceled || isTransformed) { // Skip if the line is closed, canceled, or already transformed.
continue;
}