2012-04-30 5 views
3

私は最近、数量値引き割引をインポートするSageインポートツールを作成することを任されました。問題のセージ200 - アイデンティティ列の代わりのカウンターテーブル - 異常な動作

セージ200のテーブルは以下のとおりです。

  • StockItem - 商品メイン表
  • StockItemDiscount - メイン割引表
  • StockItemQtyDiscBreak - ディスカウント数量価格
ブレイク

私はボアしません私の質問には関係ないので、スキーマ情報を持っているなら、3つのテーブルすべての主キーがアイデンティティが設定されていないBigInt です。StockItemには多くの割引があり、1割引には多くの数量割引があります。

それでは、インポートルーチンを作成するために、sage(SQLプロファイラを使用)で手動で割引と改行を作成した場合、Sage 200がSQLに対して行ったことを分析しなければなりませんでした。私が言うように、Sage 200はアイデンティティ列を使用せず、代わりにカウンタテーブルを使用します。 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を加えた値)

すべてのテーブルが同じカウンタを共有しているので、1つのテーブルの5行で別のテーブルのIDにギャップが生じます。彼らがなぜこれを好きにするのか?

iが尋ねる理由:StockItemDiscountに行を挿入した後、私はその後、​​&インサート置換に関連するすべての行を削除する必要がある - しかし、SQLプロファイラを使用して、iが5以上を挿入しない限り、私は、カウンタテーブルの増分参照カントディスカウント(6回目は再びカウンターテーブルに当たってしまいますが、セージUIがそれらの10個のIDを使用してさまざまなインサートを予約していて、必要に応じてさらに10個を予約しているかのようになります。 ?

+0

おそらく彼らは移植性の理由からこれを行ったでしょう。 – PepperBob

+0

ああ、一度に10のIDを割り当てると、一括挿入を実行するとデータベースの負荷が減少します。 – PepperBob

+0

私はそれが事実かもしれないと思う(SageはSQLサーバー製品として200を大胆に販売しているが) - 私はセージ200を内外に知っている人が私に良い答えを与えることができるか、これらの新しい行を挿入します。 – HeavenCore

答えて

0

論#1:

彼らはN0に挿入され、将来の編集のためにN1-N9を予約していますか?

論#2:

彼らは親レコードのN0を使用して、子レコードのIDのようN1-N9を使用していますか?あなたは5つのテーブルすべてが同じカウンターと方法を使用していると言いましたが、そうは思われません。

N1-N9が使用されている行はありますか?

論#1aの&#2aを:彼らはこれらのいずれかを実装するためのもの、と彼らは以前にこれを実装していないし、このモデルから離れて行きましたが、決して自分のコード/メソッドをクリーンアップ彼らの心を変更し、または

+2

理論#3:開発者はどのようにデータベースを設計するのか分かりませんでしたか? – HLGEM

+0

悲しいことに、それは最も可能性の高い答えです –

2

Sageは、データベースに直接書き込むようには設計していません(この場合、開発をサポートしていません)。

セージを使用すると、オブジェクトを経由してデータベースへの書き込みを可能にするSDKを持っており、これは為替レートや割引など

SDKを入手するには、認定セージの開発者、であることが必要ですをインポートする書き込みルーチンのプロセスを簡素化しています今度はお金が必要です。

0

理論#4開発者は、経験の浅い「開発者」がデータベースにデータを書き込むことを防ぐため、また収入を保護するためにデータベースとやりとりすることを難しくするために、レコードを挿入するロジックを意図的に難読化しようとしていました私は彼らが何をしているか正確に知っていたと思う。

0

賢明なAPIは、dbo.SYSCounterの増分値をブロック10で引いてIDを管理する。未使用のカウンタは、終了時にダンプされます。あなたは安全にSYSCounterをxx millionだけ押し込んで、そのIDをあなたの仕事に使うことができます。

直接SQL編集はサポートされていません。 IDを操作すると、監査証跡を見ている人にとっては明らかです。 SDKに文書化されたAPIを使用することをお勧めします。あなたのBPやサードパーティーの開発者と話をして詳細を知りましょう。

関連する問題