ClientDataset Calcfieldsの奇妙なトラブル
-
29-09-2019 - |
質問
私には奇妙で永続的な問題があります...(また私の右シフトキーが機能しなくなったので、私のおそらく奇妙なキャップとシンボルに耐えてください;左シフトキーを使用するように指を訓練しようとすることは痛みです。)
ClientDatasetが開いてレコードを通過するときにCalcfieldsイベントを実行しています(つまり、Autocalcfieldsが真実です)。すべてのレコードが必要であり、フィールドに「88」が入っているため、「$ 88.00」に変更され、新しいフィールドに配置するなど、フォーマットの目的のために、それを少し変更します。これはうまく機能します。唯一の問題は、Calcfieldsがセットの最初のレコードを完全に無視しているように見えることです。 dbgridのレコードが表示され、最初のレコードがありますが、このフォーマットはありません。だから私はコードを踏み出し、Calcfieldは最初のレコードに触れない。まあ、実際、それは最初のレコードに触れます(私は仮定しています)。コードを踏むと、Calcfieldは2つの完全に空白の情報セットで2回発射します。データセットが開いているときにCalcfieldsが実行され、踏み込んでいることは、最初の空白の入力が登場する場所です。これは問題ありません。 2番目の空白の入力は、各レコードを通過するときに最初に行われます。繰り返しますが、最初のレコードは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;
解決
DisplayFormatプロパティを使用してみませんか?たとえば、TclientDataset.afteropenイベントでは、次のようなことを行います。
dynamic_cast<TNumericField*>(DataSet->FieldByName("quantity_to_date_adjustment"))->DisplayFormat = "#,##0.00;(-#,##0.00)";