2010-11-30 14 views
0

J'ai un problème étrange et persistant ... (Aussi ma touche Majuscule droite a juste cessé de fonctionner, donc s'il vous plaît supporter avec mes casquettes éventuellement & symboles, essayer d'obtenir mes doigts formés pour utiliser le la touche de décalage vers la gauche est un problème.)ClientDataSet Problèmes bizarres de CalcFields

Je cours un événement CalcFields lorsqu'un ClientDataSet ouvre & passe en revue (par exemple, AutoCalcFields est true). Il prend chaque enregistrement et fait une petite modification, comme dans un champ arrive avec "88", il le change en "$ 88.00" et le met dans un nouveau champ, et ainsi de suite à des fins de mise en forme. Cela fonctionne très bien, le seul problème est que CalcFields semble complètement ignorer le premier enregistrement de l'ensemble. Il montre les enregistrements dans un DBGrid et le premier enregistrement est là, mais aucune de cette mise en forme ne lui a été faite. Donc, je parcours le code et CalcField ne touche jamais le premier enregistrement. Eh bien, en fait, il touche le premier enregistrement, (je suppose). Lorsque je parcours le code, CalcField se déclenche deux fois avec deux ensembles d'informations complètement vides. Je sais que CalcFields est exécuté lorsque l'ensemble de données est ouvert, et qu'il passe par là, c'est de là que vient la première entrée vide, ce qui est bien. La deuxième entrée vide arrive en premier quand elle passe par chaque enregistrement. Encore une fois, le premier enregistrement apparaît parfaitement intact dans DBGrid, mais complètement vide sur Calcfield.

Quelqu'un a-t-il une idée de la raison pour laquelle cela se produit? Cela me conduit fou et je l'ai suivi de haut en bas et ne peut pas comprendre ce que le diable se passe.

Voici le code CalcField, pour ce que ça vaut:

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); 
     } 

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

et voici le code qui l'exécute. notez que c'est un 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; 

Répondre

0

pourquoi ne pas utiliser la propriété DisplayFormat? Par exemple, dans un événement TClientDataSet.AfterOpen, faites quelque chose comme ceci:

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

Le problème n'est pas le formatage lui-même. C'est très bien. C'est que le CalcField ignore simplement le premier enregistrement. – Cyprus106

Questions connexes