2010-09-03 23 views
0

J'ai un problème de précision avec un outil de création de rapports que j'utilise. Le problème est qu'il lit les données d'un TADODataset à la volée mais convertit les champs ftBCD en doubles.Problème avec les champs ftCurrency avec ADODatasets

Cela provoque des erreurs d'arrondi lors de l'exécution d'opérations au niveau du rapport (sommes, etc.).

Je voudrais spécifier mes champs de devise comme ftCurrency, pas ftBCD pour empêcher ce hapening.

Si je crée un champ comme:

TFieldDef.Create(ADODataset.FieldDefs, 
    'test', 
    ftCurrency, 
    0, 
    True, 
    0 
); 

ADODataset.CreateDataSet; 

En utilisant la montre, je peux voir que ADODataset.Fields[0].DataType a une valeur de ftBCD.

Existe-t-il un moyen de spécifier explicitement un champ ftCurrency dans un TADODataset afin qu'il ne soit pas affecté en tant que champ ftBCD?

+1

Si elle convertit les champs ftBCD doubler à la volée, il peut aussi le faire avec des champs ftCurrency. Dans un sens, les champs ftCurrency sont une sorte de champ ftBCD "pauvre". Les champs ftCurrency sont définis (en pierre presque) pour maintenir l'exactitude à 4 décimales, ce qui signifie que 42.0000 restera tel quel et ne sera pas "détruit" à 41.999999999999. D'autre part, les champs ftBCD ont la même capacité, mais le nombre de décimales auxquelles ils maintiennent l'exactitude peut être défini par champ et peut être beaucoup plus grand que 4. OTOH il peut être capable de traiter des champs de devises sans avoir de ftBCD soutien. –

Répondre

0

Essayez ceci:

ADODataSet.FieldByName('AField').Currency := True; 
+0

Merci. Bien que vous ayez besoin de typer est comme: TCurrencyField (ADODataSet.Fielddefs [i]). Devise: = True; – Mattl

+0

Bien que cela définisse le champ dans l'ensemble de données comme une devise, il n'est toujours pas transmis au pipeline du moteur de génération de rapports. Je vais devoir enquêter plus loin. – Mattl

+0

j'ai oublié à ce sujet, je suis un peu pressé. content que ça a marché. meilleures salutations, – RBA