Странная проблема 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)";
Другие вопросы по тегам