[バックオーダー]タブでは、バックオーダーに関連付するリストのプロパティを定義します。リストの[フィールド]タブに移動するには、ツールボックスで目的のリストをダブルクリックします。次に、[バックオーダー]タブを選択します。
このタブには、次のプロパティがあります。
バックオーダーキューの方法
バックオーダーキューの方法は、指定された値に対してバックオーダーに優先順位を付ける方法を定義します。値がリストにプッシュされると、未処理のバックオーダーは、その値に対して、このキュー方法で定義された順に処理されます。少なくとも1つのプラー依存フィールドを参照するSQL ORDER BYステートメントであることが必要です。これは、バックオーダーキューの方法を使用して、1つのエントリに対してバックオーダーに優先順位を付けるためです。エントリ値に関連するデータのみを取得するORDER BYステートメントは、すべてのバックオーダーに同じ結果の値を返すため、バックオーダーに適切な優先順位を付けることができません。
例:
ORDER BY Puller.priority DESC
- これは、最も高い値の「優先度」ラベルを持つプラーに優先順位を付けます。
ORDER BY pullerPriority DESC
- この例は、基本的に前の例と同じですが、ここではpullerPriorityという名前の動的なプラー依存の式フィールドを明示的に追加し、puller.priority
式を指定する必要がある点で異なります。 この式は、FlexSimにプラーの「優先度」ラベルの値を確認するように指示します。
ORDER BY distance ASC
- この例は、最小の距離値を持つバックオーダーに優先順位を付けます。これは通常、値とプラー間の距離を定義します。
バックオーダーキューの方法を定義するときは、バックオーダーにラベル値を保存してから、SQLのORDER BY句で特別なBackOrder
キーワードを使用することもできます。この方法でバックオーダーの特定の値に応じてキューの方法を定義できます。そのためには、最初にバックオーダーラベルに値を保存する必要があります。次のコードで、プルの結果のバックオーダーにある「priority」という名前のラベルを4という値と一緒に保存します。
List list = List("List1");
List.PullResult result = list.pull("", 1, 1);
if (result.backOrder)
result.backOrder.priority = 4;
バックオーダーにラベル値を保存したら、バックオーダーキューの方法でアクセスできます。
ORDER BY BackOrder.priority DESC
プラーオブジェクトにラベルを保存でき、バックオーダーキューの方法でラベルにアクセスできるため、通常、この手順は必要ありません。ただし、同一のプラーオブジェクトに同時に複数のプルリクエストが発生する可能性があり、プルリクエストをキューの方法で区別する必要があるときは、バックオーダーでラベルを保存し、アクセスする手順が役立ちます。
独自のプラーのみ
同じプラーで複数のバックオーダーを禁止する場合は、このチェックボックスをオンにします。このチェックボックスがオンになっている場合に既存のバックオーダーと同じプラーでプルリクエストが行われると、そのプルリクエストは前のプルリクエストを置き換えます。
バックオーダー処理の前に複数のプッシュを許可
このチェックボックスをオンにすると、リストはプッシュ後に実質0秒間待機してから、プッシュされた値のバックオーダーを処理します。つまり、複数の値が同じシミュレーション時間にリストにプッシュされた場合は、これらの値がすべてリストに表示された後、バックオーダーが実行されます。
この設定は、次のような場合に役立ちます。まず、プルクエリでORDER BY句を使用してリストからプルする場合は、クエリを評価する前にすべての値をリストに許可することが望ましいため、最初に取得するとすぐにプルする値だけでなく、プッシュされたすべての値を考慮できます。次に、リクエスト数よりも少ない必要数を使用してリストからプルする場合は、バックオーダーを実行する前に複数のプッシュされた値をリストに許可することで、リクエスト数に近づけることができます。
複数のプッシュを許可するため、リストは、バックオーダーを処理するために値がリストにプッシュされた後、実質ゼロ時間でイベントを作成します。このイベントは値がプッシュされた時間とまったく同じ時間に作成されるわけではないため、「実質」ゼロ時間となります。むしろ、このイベントの時間は、倍精度浮動小数点値で表せる最小量ずつ増加します。つまり、元のプッシュとまったく同じ時間で作成されたすべてのイベントは、元の値がプッシュされた後に作成された場合でも、バックオーダー処理イベントより前に実行されます。バックオーダー処理時間はプッシュ時間とまったく同じではありませんが、実質同じです。
このチェックボックスをオンにすると、listpush()コマンドは常にnullを返します。つまり、バックオーダーはプッシュと同期して処理されないため、listpush()コマンドがプッシュされた値のプラーを示す有効な値を時間内に返して処理されることはありません。
プッシュですべての値を再評価
デフォルトでは、リストのバックオーダーはリストにプッシュされた新しい値のみを評価します。新しい値がリストにプッシュされるたびに、すべての値(リストの既存の値とリストにプッシュされる値)がすべてのバックオーダーに対して評価されるようにする場合は、このチェックボックスをオンにします。これは、別の値がリストにプッシュされたときに、リストの既存の値が変更されたり、プルされたりする可能性がある動的フィールドがある場合に重要になります。
エントリを評価する前に注文を並べ替える
リストのすべてのエントリについてバックオーダーが再評価されたとき、バックオーダーを並べ替える方法がこの設定で決まります。デフォルトはチェックされていません。ここでは、リストはリストのエントリごとに処理を繰り返し、特定のエントリに関連付けられているバックオーダーを並べ替えてから、最も優先度の高いバックオーダーをエントリと照合します。または、このチェックボックスをオンにすると、リストでバックオーダーを1回並べ替えてからバックオーダーごとに処理を繰り返し、プルクエリに基づいてバックオーダーを処理します。
バックオーダー再評価イベント
このペインでは、バックオーダーを再評価する必要がある時期を定義できます。これは、通常、バックオーダーがアクティブな間に結果が変更される可能性のあるWHERE句をプルリクエストに含める場合のみ必要です。たとえば、WHERE queueSize <= 5
queueSizeが5を超えるポイントでプルリクエストが行われた場合は、queueSizeが5未満になると、そのプルリクエストを再評価できます。FlexSimは、この状態が変更される可能性のある時期を自動で認識しないため、再評価をトリガーするイベントを定義する必要があります。
再評価イベントを追加するには、 ボタンをクリックし、追加するイベントを選択します。次に、リッスンするイベントタイプを選択します。
再評価イベントには、次のようないくつかのカテゴリがあります。
- プラーイベント - プラーイベントは、プラーで発生するイベントです。ここでは、プラーはオブジェクトである必要があります(数値や文字列ではありません)。バックオーダーが作成されると、リストはプラーオブジェクトで定義されたイベントをリッスンし、イベントが起動すると、バックオーダーがリスト内のすべての値に対して再処理されます。
- 値イベント - 値イベントは、値(エントリのプライマリ値)で発生するイベントです。ここでは、値はオブジェクトである必要があります(数値や文字列ではありません)。値がリストにプッシュされると、リストは値オブジェクトで定義されたイベントをリッスンし、イベントが起動すると、すべてのバックオーダーがそのエントリに対して再処理されます。
- グローバルイベント - グローバルイベントは、値またはバックオーダーに関連付けられていないイベントです。リストはこのイベントをリッスンし、イベントが発生するたびにすべてのバックオーダーを再処理します。
- 時間間隔 - タイマー間隔イベントにより、リストは一定の時間間隔でバックオーダーを繰り返し再評価します。最初のバックオーダーが追加されると、リストはタイマーループを開始し、指定した時間が経過した後、バックオーダーを再評価します。バックオーダーキューが空になるとタイマーループが終了します。