Странная проблема ClientDataSet CalcFields
У меня странная и постоянная проблема... (Кроме того, моя правая клавиша Shift просто перестала работать, поэтому, пожалуйста, помните о моих, возможно, нечетных заглавных буквах и символах; пытаться научить мои пальцы пользоваться левой клавишей Shift - это боль.)
Я запускаю событие CalcFields, когда ClientDataSet открывает и просматривает записи (т. Е. AutoCalcFields имеет значение true). Он берет каждую запись и вносит в нее небольшие изменения, так как в поле входит "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 ответ
Почему бы не использовать свойство DisplayFormat? например, в событии TClientDataSet.AfterOpen сделайте что-то вроде этого:
dynamic_cast<TNumericField*>(DataSet->FieldByName("quantity_to_date_adjustment"))->DisplayFormat = "#,##0.00;(-#,##0.00)";