ClientDataSet CalcFields奇怪的麻烦

时间:2010-11-30 17:46:21

标签: c++ c++builder c++builder-6

我有一个奇怪而持久的问题......(我的右移键也停止工作,所以请忍受我可能的奇数帽和符号;试图让我的手指训练使用左移键是痛苦。)

当ClientDataSet打开时,我正在运行CalcFields事件。记录(即AutoCalcFields为真)。它需要每个记录并对其进行一些修改,因为在字段中输入“88”,它将其更改为“$ 88.00”并将其放入新字段中,依此类推以进行格式化。这很有效,唯一的问题是CalcFields似乎完全忽略了集合中的第一条记录。它显示了DBGrid中的记录,并且第一个记录就在那里,但是没有对它进行任何格式化。所以我逐步完成代码,CalcField从不触及第一条记录。嗯,实际上,它触及第一条记录,(我假设)。当我单步执行代码时,CalcField会使用两组完全空白的信息触发两次。我知道在数据集打开时执行CalcFields,然后逐步执行,这是第一个空白输入来自的地方,这很好。第二个空白输入首先进入每个记录。同样,第一条记录在DBGrid中完全显示完整,但在Calcfield上完全空白。

有没有人知道为什么会这样?这让我 疯狂 ,我已经上下跟踪它,无法弄清楚到底发生了什么。

这是CalcField代码,它的价值在于:

void __fastcall TDataModule1::sdsSEARCHCalcFields(TDataSet *DataSet)
{
        // to view for debugging.... 
        DataSet->FieldByName("MISBN")->AsString;

       AnsiString formattedField;
       String field;
       double dInputPower;

       dInputPower = DataSet->FieldByName("MBILL$")->AsFloat;
       formattedField = FormatFloat("#,##0.00", dInputPower);
       DataSet->FieldByName("BILL")->Text = formattedField;

       dInputPower = DataSet->FieldByName("MTGUID")->AsFloat;
       formattedField = FormatFloat("#,##0.00", dInputPower);
       DataSet->FieldByName("GUID")->Text = formattedField;

       field = DataSet->FieldByName("MISBN")->AsString;     
       int lght = field.Length();
       String str = field.SubString(14, 1);
       if (field.Length() > 13 && field.SubString(14, 1) == ".")
       {
            DataSet->FieldByName("ISBN")->Text = field.SetLength(13);
       }

}
//---------------------------------------------------------------------------

这是执行它的代码。请注意,这是一个ctQuery ......

DataModule1->sdsSEARCH->Active = false;
DataModule1->cdsSEARCH->Active = false;
DataModule1->dsSEARCH->Enabled = false;
DataModule1->sdsSEARCH->CommandType = ctQuery;
DataModule1->sdsSEARCH->CommandText = queryStr;
DataModule1->sdsSEARCH->Active = true;
DataModule1->cdsSEARCH->Active = true;
DataModule1->dsSEARCH->Enabled = true;

1 个答案:

答案 0 :(得分:0)

为什么不使用DisplayFormat属性?例如,在TClientDataSet.AfterOpen事件中执行以下操作:

dynamic_cast<TNumericField*>(DataSet->FieldByName("quantity_to_date_adjustment"))->DisplayFormat = "#,##0.00;(-#,##0.00)";