1

これが私の3番目の質問です。これまでのところ優れた回答です^^

データの閲覧、編集に問題はありませんが、挿入には問題があります...

ここに私の疑問があります:金融/株式ソフトウェアでは、新しい注文を作成するフォームがあります。
当然、t_ordersテーブルに新しい行を挿入し、orderIdフィールドがt_ordersの行にリンクされたアイテムt_orderitemsテーブルに挿入する必要があります

CREATE TABLE `t_orders` (
    `orderId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `clientId` INT(10) UNSIGNED NOT NULL,
    ...)

CREATE TABLE `t_orderitems` (
    `orderitemId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `orderId` INT(10) UNSIGNED NOT NULL,
    ...)

--> INDEXES AND FOREIGN KEYS OMITTED <--

itemordersをグリッドに追加し、最後に[FinalizeOrder]ボタンをクリックするにはどうすればよいですか?

  • t_ordersで注文を作成します
  • その注文にリンクされているt_orderitemsにアイテムを挿入します

接続はADOを使用して行われます。

このようにすることが可能かどうかはわかりませんが、その場合はどうすればよいですか?

編集:ネストされたClientDataSetsを使用しようとしましたが、部分的に機能しますが、挿入された注文IDを取得する方法がわかりません

edit2:
別の問題が発生しました。ClientDataSetに複数のアイテムを追加できません。
OrderItemIdはすべてのアイテムで空であるため(データベースの挿入時にのみその値を取得できます)、2番目のアイテムを追加しようとすると、キー違反が発生します。何かアイデアはありますか?

UpdatemodeをupWhereKeyOnlyとは異なるものに設定し、pfInKeyをFalseに設定すると、機能しますが、オプションではないと思います

何か案は?

前もって感謝します!
アーサー。

4

4 に答える 4

1

DB からデータを取得し、グリッドにリンクされている ADO データセットがあると思いますか? そのために必要なのは中間層です。

TClientDataset を作成して ADO データセットに接続し、グリッドをクライアント データセットに接続します。新しい注文が入ったら、クライアント データセットで Append を呼び出し、新しい注文のデータを挿入します。これにより、グリッドに表示されます。変更を DB に保存する場合は、クライアント データセットで .Update を呼び出します。リンク先の ADO データセットを使用して、DB に更新を送信します。これをすべて設定する方法の説明については、TClientDataset のドキュメントを確認してください。これは、最近のバージョンで実際に十分に文書化されている数少ないものの 1 つです。

複数のテーブルを更新するには、マスター/詳細関係に関するドキュメントを参照し、相互にリンクされたこのような 2 つのデータセットを使用します。

于 2010-02-20T17:26:04.280 に答える
1

アプリケーションで 2 つのデータセット間に主従関係を作成すると、ADO はそれを自動的に処理できます。つまり、新しいレコードをマスター データセット (orders) に挿入すると、order_id を指定しなくても詳細データセット (order_items) に新しいレコードを挿入できます。これは、マスター データセットの現在のレコードの order_id が自動的に取得されるためです。詳細データセットの新しく挿入されたレコードに挿入されました。

データセット間のマスター/詳細関係を作成するには、詳細データセットに AdoTable を使用している場合、MasterSource をマスター データセットに接続されたデータソースに設定し、MasterFields プロパティを使用して 2 つのデータセット間の関係を定義します。AdoDataset または AdoQuery を使用している場合は、詳細データセットの DataSource プロパティをマスター データセットに接続されたデータソースに設定する必要があります。次に、マスター データセットのキー フィールドと同じ名前の SQL パラメーターを使用して、詳細データセットの SQL ステートメントに WHERE 句を追加する必要があります。あなたの場合、次のようになります。

SELECT * FROM t_orderitems WHERE OrderID = :OrderID

詳細データセットの MasterFields プロパティでリレーションシップを設定できるようになりました。

注文には複数のアイテムを含めることができるため、詳細データセット (order_items) で LockType を ltBatchOptimistic に設定して、新しいアイテムを挿入してもすぐにデータベースに送信されないようにすることができます。ltBatchOptimistic を使用すると、UpdateBatch メソッドを呼び出すまで、変更が一時的にクライアント メモリに保存されます。UpdateBatch は、すべての変更をデータベースに送信します。

注文をキャンセルする場合は、CancelBatch メソッドを呼び出して詳細データセットで行われた変更をキャンセルし、マスター データセットで作成された注文レコードを手動で削除する必要があります。

于 2010-02-21T12:54:04.743 に答える
0

解決済みhttp://edn.embarcadero.com/article/20847

于 2010-02-21T20:02:06.233 に答える
0

ありがとうRRUZ、これはまさに私が望んでいたものではありません(挿入する前に、すべてのオーダーアイテムOrderIdを手動で設定する必要があります)が、それを行います

with DataModule1.ADOQuery1 do
begin
  SQL.Text := 'SELECT LAST_INSERT_ID()';
  Open();
  First();
  LastInsertId := Fields[0].Value;
  Close();
end;
于 2010-02-21T02:58:12.440 に答える