Bonjour,
Tout d'abord, améliorer votre code me semble une bonne idée et pour ce utiliser une requête paramétrée
Select sum(bilan) as ZZ FROM tb_trades where date_close< :DI
(où DI est le paramètre)
En remarque, je ne sais pas quel est le SGBD, ni votre structure de table mais une requête avec un agrégat (SUM) nécessite souvent une clause GROUP BY
l'avantage de la requête paramétrée est que celle-ci pourra être préparée
Voilà ce que je propose (
comme pour votre précédent post j'écris le code "sans filet" cad directement sur le forum et donc sans test de syntaxe)
1 2 3 4 5 6 7 8 9 10 11 12
| FDQuery1.Close;
FDQuery1.SQL.Text :='Select sum(bilan) as ZZ FROM tb_trades where date_close< :DI'; // requête paramètrée
FDQuery1.Prepare; // permet d'améliorer le temps d'exécution par la suite du premier Open;
for i := 0 to sl.Count - 1 do
begin
FDQuery1.ParamByName('DI').asInteger:=i; // passage de la valeur du paramètre
FDQuery1.Open;
If FDQuery1.FieldByName('ZZ').isNull
then Chart1.Series[0].AddxY(i, 0) // pas de date_ close<i
else Chart1.Series[0].AddxY(i, FDQuery1.FieldByName('ZZ').asFloat);
FDQuery1.Close; // là, j'ai un doute sur le comportement de Firedac donc je préfère fermer le dataset avant de changer la valeur du paramètre
end; |
pour répondre aux autres questionnements
et le message d erreur '' n est pas une valeur en virgule flottante correcte.
en fait il faut lire NULL et pas ''
Si au lieu de sum(bilan) je teste avec un count(bilan), là tout fonctionne.
Count renvoi toujours une valeur ne serait-ce que 0
quand je fais un select distinct de bilan, ici tout fonctionne encore, ce qui me laisse penser que les champs ne sont pas vides.
Joker, cela dépend su SGBD
J aimerai savoir comment tester le résultat, ce qui m éviterait cette erreur.
j'ai déjà indiqué le test isnull mais on peut très bien intervenir directement au niveau de la requête presque tout les SGBD modernes connaissent COALESCE
J'imaginais que si le résultat était vide FDQuery1.RowsAffected retournerait 0 mais j ai toujours 1
RowsAffected opère plutôt avec des INSERT ou UPDATE c'est plutôt au RecordCount que vous pensez mais même ainsi la requête utilisée renvoie une ligne (avec la valeur NULL)
Partager