【问题标题】:Trying to modify read-only DataSet field试图修改只读数据集字段
【发布时间】:2011-01-24 11:47:22
【问题描述】:

我使用 C++ Builder 6.0

我使用 TADODataSet 执行以下 SQL 语句:

SELECT Id, SUM(Saldo) AS Saldo 
FROM Table 
GROUP BY Id

我仅将此 DataSet 用于报告。无需将日期更新回数据库。 当我尝试修改字段“Saldo”时

adospCard->Edit();
adospCard->FieldByName("Saldo")->AsFloat=0.0;
adospCard->Post();

我得到错误: 无法修改字段“Saldo”。 我添加了这一行

adospCard->FieldByName("Saldo")->ReadOnly=false;

并且不再发生错误,但字段“Saldo”没有更改。

adospCard->Edit();
//adospCard->FieldByName("Saldo")->AsFloat=1536.5
adospCard->FieldByName("Saldo")->AsFloat=0.0;
//adospCard->FieldByName("Saldo")->AsFloat=0
adospCard->Post();
//adospCard->FieldByName("Saldo")->AsFloat=1536.5

如何更改“Saldo”字段值?

【问题讨论】:

  • 你为什么要改变它?它实际上只是 db 计算的一个值,而不是“真实”字段。
  • 我了解“saldo”不是真实字段,但当 Id 为时,客户需要在某些报告中更改此值……

标签: c++ ado c++builder


【解决方案1】:
  1. 向您的数据集添加计算字段。
  2. 计算 Saldo 的正确值 在此计算字段中(您可以 如果你使用 Saldo 作为它的来源 想要)
  3. 在您的报告中显示此计算字段 而不是 Saldo 字段。

编辑: 有关如何添加计算字段的示例,请参见 hereherehere

--杰罗恩

【讨论】:

  • Th.打开数据集时如何添加计算字段?
【解决方案2】:

正如 ldsandon 所说,您不能在计算“Saldo”字段时对其进行修改。 如果您需要在 Id 为“某物”时将值设置为零,则最好在查询中执行此操作。最佳方法取决于将值设置为零的标准。

或者,将原始查询的结果保存在临时表中,然后在将结果返回到报告之前对其进行修改。

最后,您使用的是什么报告工具?呈现报告时是否可以更改“Saldo = 0”?

【讨论】:

  • 查询结果(报告)显示在网格中。 Saldo=0 只是一个简单的例子。真实的报表非常复杂,有15-20个计算字段,并且计算字段将被更改的逻辑非常复杂,并且这个逻辑取决于用户输入......在渲染报表或SQL语句上是不可能的。
  • 在这种情况下,为什么不将查询结果加载到您可以修改的数据结构中,然后对值应用必要的更改?
【解决方案3】:

考虑将结果存储在 ClientDataset 中 - 如果可以确保结果不会太大。

我不使用“TADODataSet”,所以以下可能不适用:)...

当我使用我选择的数据库(即 Advantage 数据库服务器)执行相同(或类似)操作时,我会使用带有 TSQLQuery 组件(启用 RequestLive 属性)的 INTO 子句。例如:

SELECT Id, SUM(Saldo) AS Saldo INTO #TempTable FROM Table GROUP BY Id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2018-05-28
    相关资源
    最近更新 更多