【问题标题】:master / detail problem with dbexpressdbexpress 的主/详细问题
【发布时间】:2010-12-17 01:22:46
【问题描述】:

我有一个使用 firebird 2.3 用 Delphi 2010 / dbExpress 编写的主/详细应用程序 我发现了一个问题

如果我在明细中有两个或三个或更多相同的数据行,更改其中一个中的任何数据也会更改其他行上的数据,我猜这是因为更新仅使用 invoice_id 和 serial 作为键且两种情况下数据相等,则两种情况下都进行更新。

主数据 发票 ID、序列号、客户 ID、日期 1,A,1.12 / 12 / 2010

详细数据 Invoice_id、序列号、数量、描述、价格 1,A,10,一些东西的盒子,52.52 1,A,10,一些东西的盒子,52.52

我想我可以通过使用字段 ltes 名称 ir line_no 来解决这个问题,其中每一行都有不同的数字,因此可以区分数据以进行如下更新:

Line_no、Invoice_id、序列号、数量、描述、价格 1.1,A,10,一些东西的盒子,52.52 2.1,A,10,一些东西的盒子,52.52

所以信息是一样的,但它也有line_no来区分更新中的信息

任何人都知道在客户端,在客户端数据集中执行此操作的任何方法,

非常感谢和问候

【问题讨论】:

  • 如果两行相同,dbexpress 和 99% 的语言/框架的 99% 的数据连接层将面临更新它的问题,因为没有标准的方法来编写更新语句来更改一次只有一行而不是两行,所以改变你的设计并定义一个主键,无论如何这是一个好习惯。

标签: delphi firebird dbexpress


【解决方案1】:

您的明细表中似乎没有主键(假设 invoice_id 是主表的外键。为了确保 FireBird(或任何 dbExpress 连接的数据库)更新正确的记录,您应该添加一个主键( autoinc 字段)到明细表。

【讨论】:

  • 这正是问题所在,客户端不知道 autoinc 值,因为它是在服务器上生成的,我需要从客户端生成某种值,例如行号或区分明细表中的值
  • 在客户端添加行并提交到服务器后,它们应该有一个 ID,您可以使用它来更新它们。我不明白你怎么能没有身份证?
猜你喜欢
  • 2012-03-12
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多