4 votes

Comment est-il possible d'exécuter manuellement l'événement "OnCalcFields" ?

Disons que je veux temporairement désactiver le OnCalcFields (par exemple, en fixant cdsCalcFields := nil ) lors d'une opération fastidieuse sur un TClientDataSet. Comment puis-je dire au TClientDataSet d'effectuer un nouveau calcul des champs calculés lorsque je rattache l'élément OnCalcFields méthode ?

Une autre situation qui peut nécessiter un recalcul manuel est celle où certains champs calculés dépendent d'autres ensembles de données (par exemple, un champ calculé est utilisé pour contenir temporairement une valeur agrégée provenant d'un autre ensemble de données). Cela fonctionne bien dans la plupart des cas, car le OnCalcFields Les événements sont exécutés assez souvent pour obtenir la valeur correcte de l'autre ensemble de données. Mais dans certaines circonstances, un nouveau calcul est nécessaire pour obtenir la valeur correcte de l'autre ensemble de données.

Fixer le AutoCalcFields à la propriété False peut également vous mettre dans une situation où un recalcul manuel est souhaité.

J'ai vu plusieurs explications sur la manière de réduire l'exécution du OnCalcFields mais je n'arrive pas à trouver un moyen simple d'effectuer un nouveau calcul...

Des suggestions ?

6voto

Sertac Akyuz Points 32656

Les champs calculés sont calculés lorsque les enregistrements sont extraits de la base de données. Refresh (ou Fermer -> Ouvrir) sur l'ensemble de données pour forcer un nouveau calcul.

(Concernant les commentaires sur la question), pour forcer un re-calcul sur un seul enregistrement, vous pouvez appeler RefreshRecord sur l'ensemble des données. Si le descendant particulier de l'ensemble de données n'implémente pas la méthode, un message d'erreur Edit suivi d'un Cancel l'appel aurait le même effet.

2voto

L'appel à Refresh ou Close-> peut provoquer le rechargement de la table entière à partir de la base de données. Si ce n'est pas ce que vous voulez, vous pouvez simplement appeler la méthode OnCalc vous-même en lui passant le CDS. Cependant, vous devrez peut-être faire glisser le curseur manuellement.

with DisplayAcctListCDS do begin
  First;
  while not Eof do begin
    Edit;
    DisplayAcctListCDSCalcFields(DisplayAcctListCDS);
    Next;
  end;
end;

En supposant que DisplayAcctListCDS est votre TClientDataSet avec des champs calculés et que DisplayAcctListCDSCalcFields est la méthode d'événement générée pour OnCalcFields.

0voto

Ivan Ko Points 9

C'est un peu un hack, mais 100% de réponse à cette question pour moi !

DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X