私は最近、数量値下げ割引をインポートする Sage インポート ツールの作成を任されました。
問題の Sage 200 テーブルは次のとおりです。
- StockItem - メイン商品テーブル
- StockItemDiscount - メイン割引テーブル
- StockItemQtyDiscBreak - 割引数量の価格分岐
私の質問とは関係ないので、スキーマ情報で退屈することはありません.3つのテーブルすべての主キーは、 IDが設定されていないBigIntです(ため息).1つのStockItemには多くの割引があり、1つの割引には多くの数量割引があります.休憩。
さて、インポート ルーチンを作成するには、最初に (SQL プロファイラーを使用して) sage で割引と割引を手動で作成した場合に、Sage 200 が SQL で行ったことを分析する必要がありました。私が言うように、Sage 200 は ID 列を使用せず、代わりにカウンター テーブルを使用します。
StockItemDiscount に新しい行を挿入すると、次のことが行われました。
UPDATE [Counter] SET [NextValue] = [NextValue] + 10 WHERE [CounterID] = 1
次に、新しい ID を選択します。
SELECT NextValue FROM Counter WHERE CounterID = 1
次に、カウンターから選択したばかりの新しい値を使用して、新しい行を挿入します。
INSERT INTO StockItemDiscount (StockItemDiscountID, /.../) VALUES (@NewID, /.../)
私の質問はこれです: 一体なぜセージはこのようにやっているのですか? その背後にある理由は何でしょうか?(具体的には、値を読み取る +10 THEN)
すべてのテーブルも同じカウンターを共有しているため、1 つのテーブルに 5 行あると、別のテーブルの ID にギャップが生じます。
私が尋ねる理由:行を i に挿入した後StockItemDiscount
、関連する行を削除してStockItemQtyDiscBreak
置換を挿入する必要があります-ただし、SQL プロファイラーを使用すると、5 つ以上の割引を挿入しない限り、カウンターテーブルの増分が表示されません (6 番目でヒットします)カウンター テーブルをもう一度見てみましょう。Sage UI がそれらの 10 個の ID を予約してさまざまな挿入に使用し、必要に応じてさらに 10 個を予約しているように見えます。これは私には非常に奇妙に思えます。