2

私は2つのテーブルを持っています:

OutputPackages (マスター)

|PackageID|

OutputItems (詳細)

|ItemID|PackageID|

OutputItems には、PackageID 列に設定された 'idxPackage' というインデックスがあります。ItemID は自動インクリメントに設定されています。

これらのテーブルにマスター/詳細を挿入するために使用しているコードは次のとおりです。

//fill packages table
for i := 1 to 10 do
begin
  Package := TfPackage(dlgSummary.fcPackageForms.Forms[i]);

if Package.PackageLoaded then
begin
  with tblOutputPackages do
  begin
    Insert;
    FieldByName('PackageID').AsInteger := Package.ourNum;
    FieldByName('Description').AsString := Package.Title;
    FieldByName('Total').AsCurrency := Package.Total;
    Post;
  end;

  //fill items table
  for ii := 1 to 10 do
  begin
    Item := TfPackagedItemEdit(Package.fc.Forms[ii]);
    if Item.Activated then
    begin
      with tblOutputItems do
      begin
        Append;
        FieldByName('PackageID').AsInteger := Package.ourNum;
        FieldByName('Description').AsString := Item.Description;
        FieldByName('Comment').AsString := Item.Comment;
        FieldByName('Price').AsCurrency := Item.Price;
        Post; //this causes the primary key exception
      end;
    end;
  end;
end;

IDE で MasterSource/MasterFields プロパティをいじらない限り、これは問題なく機能します。しかし、設定してこのコードを実行すると、主キー「ItemID」が重複しているというエラーが表示されます。

何が起こっているのかわかりません - これはマスター/詳細への私の最初の進出であるため、何かが間違っている可能性があります。このプロジェクトでは ComponentAce の Absolute Database を使用しています。

これを正しく挿入するにはどうすればよいですか?

アップデート

わかりました。データベースで主キーの制約を削除しましたが、何らかの理由で、OutputItems テーブルの自動インクリメント機能が期待どおりに機能していないことがわかりました。上記のコードを実行した後の OutputItems テーブルは次のようになります。

ItemID|PackageID|
1     |1        |
1     |1        |
2     |2        |
2     |2        |

すべての ItemID 値が一意ではない理由はまだわかりません....何かアイデアはありますか?

4

3 に答える 3

2

項目テーブルに追加ではなく挿入を使用すると、動作が異なりますか? ここでの私の推測では、詳細への追加は空のデータセットを「見る」ため、自動インクリメント ロジックは 1 から始まり、次のレコード 2 など、それらの値が既に割り当てられていても...別のマスター レコードに割り当てられていると思います。 .

過去に使用した 1 つの解決策は、次に使用するレコード ID 番号を保持する UniqueNums という名前の新しいテーブルを作成することでした。数値を使用したので、そのテーブルをロックし、値を増やして書き戻し、ロックを解除して使用します。これにより、発生している特定の問題を回避できる場合があります。

于 2009-06-18T21:24:02.507 に答える
0

まず第一に、私の意見では、コードによる自動インクリメントと ID の設定のアイデアが衝突します。進むべき明確な道筋は、コードで自分でキーを生成することです。特に、マスター/ディテールの挿入を必要とするマルチ ユーザー アプリでは、ディテールに適切なキーを挿入することは困難です。

そのため、コードで ID を生成します。テーブルを設計するときは、ID フィールドを主キーに設定しますが、自動インクリメントは設定しません。私が間違っていなければ、操作には Append が使用されます。

また、ビジュアルコントロールが有効になっている間、繰り返しているようですか? (Item.Activated) . ただし、操作は本質的にバッチ プロセスです。GUI のパフォーマンスについては、接続されている db コントロールを無効にしてから操作を実行することを検討する必要があります。マスター/詳細スコープにあるため、これは、他の 2 つのカーソルが期待どおりに繰り返されないという問題である可能性があります。

于 2009-06-21T13:23:48.807 に答える
0

Append/Insert を Edit に置き換えてみましたか?
「FieldByName('PackageID').AsInteger := Package.ourNum;」をスキップします。ライン。

M/D 関係は、必要に応じて詳細レコードを自動的に追加し、詳細テーブルの主キーも設定すると思います。

これも、主キーの重複エラーの原因である可能性があります。別のレコードを追加/挿入しようとすると、レコードは M/D 関係によって既に作成されています。

于 2010-05-16T07:14:34.613 に答える