2010-11-30 2 views
0

У меня есть странная и постоянная проблема ... (Также моя правая клавиша сдвига перестала работать, поэтому, пожалуйста, несите мои, возможно, нечетные колпачки & символов, пытаясь заставить мои пальцы научиться использовать левая сменная клавиша - боль.)Нечетная проблема ClientDataSet CalcFields

Я запускаю событие CalcFields, когда открывается ClientDataSet & проходит через записи (т. е. AutoCalcFields является истинным). Он принимает каждую запись и делает для нее небольшую модификацию, так как в поле входит «88», оно меняет его на «$ 88,00» и помещает его в новое поле и т. Д. Для форматирования. Это отлично работает, единственная проблема заключается в том, что CalcFields полностью игнорирует первую запись в наборе. Он показывает записи в DBGrid, и первая запись есть, но ни одно из этих форматирования не было сделано. Поэтому я просматриваю код, и CalcField никогда не касается первой записи. Ну, на самом деле, это касается первой записи (я предполагаю). Когда я выхожу через код, CalcField срабатывает дважды с двумя совершенно пустыми наборами информации. Я знаю, что CalcFields выполняется, когда набор данных открыт, и, пройдя через него, откуда приходит первый пустой вход, что хорошо. Второй пустой ввод приходит первым, когда он проходит через каждую запись. Опять же, первая запись обнаруживается совершенно неповрежденной в DBGrid, но полностью пустой в Calcfield.

Есть ли у кого-нибудь идеи о том, почему это происходит? Это заводит меня crazy и я отслеживал его вверх и вниз и не могу понять, что происходит.

Вот код 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; 

ответ

0

Почему бы не использовать свойство DisplayFormat? например, в событии TClientDataSet.AfterOpen выполните следующие действия:

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

Проблема не в самом форматировании. Хорошо. Это означает, что CalcField просто пропускает первую запись. – Cyprus106 2010-12-10 20:09:19

Смежные вопросы