1

这是我的第三个问题,到目前为止回答很好^^

我在浏览、编辑数据时没有问题,但是插入...

这是我的疑问:在财务/股票软件中,我有一个创建新订单的表单,
自然我需要在 t_orders 表中插入一个新行,并在t_orderitems表中
插入项目,其中orderId字段链接到t_orders中的一行

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 对于所有项目都是空的(我只能在数据库插入时获取该值),所以当我尝试添加第二个项目时,它给了我密钥违规,有什么想法吗?

如果我将 Updatemode 设置为不同于 upWhereKeyOnly 并将 pfInKey 设置为 False 它可以工作,但我认为这不是一个选项

有任何想法吗?

提前致谢!
亚瑟。

4

4 回答 4

1

我假设您有一个 ADO 数据集,它从您的数据库中获取数据并链接到网格?你需要做的是一个中间层。

创建一个 TClientDataset 并将其连接到您的 ADO 数据集,然后将网格连接到客户端数据集。当有新订单进来时,在客户端数据集上调用 Append 并将新订单的数据插入其中。这将使它显示在网格上。如果要将更改保存到数据库,请在客户端数据集上调用 .Update。它将使用它链接到的 ADO 数据集将更新发送到数据库。查看 TClientDataset 上的文档以获取有关如何设置这一切的说明;这是最近版本中为数不多的实际上记录得很好的东西之一。

要更新多个表,请查看有关主/从关系的文档,并使用两个这样的数据集,相互链接。

于 2010-02-20T17:26:04.280 回答
1

如果您在应用程序中的两个数据集之间建立主从关系,ADO 可以自动处理它。这意味着,一旦您将新记录插入主数据集(订单),您就可以在您的详细信息数据集(订单项)中插入新记录,而无需指定 order_id,因为将自动检索主数据集中当前记录的 order_id,并且插入新插入的详细信息数据集记录中。

要在数据集之间建立主/详细关系,如果您使用 AdoTable 作为详细数据集,则可以将其 MasterSource 设置为连接到主数据集的数据源,并使用 MasterFields 属性定义两个数据集之间的关系。如果您使用的是 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

谢谢RRUZ,这不正是我想要的(我仍然需要在插入之前手动设置所有orderitems 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 回答
0

解决了http://edn.embarcadero.com/article/20847

于 2010-02-21T20:02:06.233 回答