IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Problème ADOQuery + Post + OnCalcFields


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut Problème ADOQuery + Post + OnCalcFields
    Bonjour,

    J'ai un soucis avec une requête ADO dont le résultat est affiché dans une grille.

    Cette requête contient des champs calculés, et possède une fonction OnCalcFields.

    J'ai besoin de pouvoir modifier manuellement la valeur des champs calculés de l'enregistrement courant, donc je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                  Q_Declinaison.disablecontrols;
                  Q_Declinaison.Edit;
                  Q_Declinaison.FieldByName('CA_Access').AsInteger:=Q_Declinaison.FieldByName('CA_Access').AsInteger+10;
                  Q_Declinaison.Post;
                  Q_Declinaison.enablecontrols;
    Le problème, c'est qu'au moment du post, la query va passer dans son OnCalcFields pour TOUS les enregistrements affichés dans la grille, ce qui est super long.

    Comment faire pour que le OnCalcFields ne se fasse que sur l'enregistrement qui vient d'être modifié ??

    La présence ou absence des enable/disable controls ne change rien.

    La requête tape dans une base SQL server, en direct via une ADOConnection, pas de BDE, pas d'ODBC.


    Merci d'avance
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  2. #2
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    bonjour,

    champ calculer au niveau de SQL SERVER (computed) ?
    Il me semble que l'on ne peut modifer directement un champ calculer et seul les champs impliquant le champ calculer sont modifiable.
    Post ton code ..
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  3. #3
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par freud Voir le message
    champ calculer au niveau de SQL SERVER (computed) ?
    Non, champs calculé créé dans la TQuery (FieldKind = fkCalculated)

    Citation Envoyé par freud Voir le message
    Il me semble que l'on ne peut modifer directement un champ calculer et seul les champs impliquant le champ calculer sont modifiable.
    si si, ça marche trés bien (enfin, avec un champ calculé Delphi)


    Citation Envoyé par freud Voir le message
    Post ton code ..
    c'est déjà fait..
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Ton champ calculé est CA_Access ?
    Si oui, je ne vois pas comment ton code peut fonctionner, puisque la valeur de CA_Access se calcule en faisant référence à sa propre valeur.

    @+ Claudius

  5. #5
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Et pourtant, ça marche trés bien.

    Dès que je change la valeur de CA_Access, elle s'affiche bien dans la grille.
    Et si entre temps je change une des valeurs de la formule du champ calculé, le calcul se fait bien.

    Mon problème n'est pas un problème de calcul du champ courant, tous les calculs sont corrects, mais le fait que ce sont tous les champs de la grille qui repassent pas le OnCalcField, d'où un ralentissement conséquent.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par fredfred Voir le message
    Dès que je change la valeur de CA_Access, elle s'affiche bien dans la grille.
    Que la situation soit vraiment claire, j'ai peur de ne pas bien saisir:
    • Le champ AC_Access est-il ton champ calculé ?
    • Le code que tu as posté dans ton 1° message est-il l'implémentation de OnCalcField ?


    @+ Claudius

  7. #7
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Oui, CA_Access est bien le champ calculé.

    Sa valeur est déterminée, soit par le OncCalcfield, soit par les incrémentations que je fais manuellement à divers endroits du programme.

    Le code que j'ai posté n'est pas le OnCalcField, c'est juste un exemple d'incrémentation ponctuelle.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Bon je ne comprends pas ta façon de procéder.

    Quelques règles à ne pas oublier:
    1. Un champ calculé se base sur les données physiques de la table, donc calculé à l'aide des champs de type fkData uniquement. Pas d'appel à sa propre valeur (éventuellement avec un autre champ calculé, évalué précédemment).
    2. On ne met jamais de Edit/Post dans un évènement OnCalcField.
    3. Pour rappel: un champ calculé est une donnée volatile


    Voici un exemple bateau d'utilisation d'un champ calculé.

    2 champs physiques (fkData): TotalHT, TauxTVA
    2 champs calculés (fkCalculated): TotalTVA, TotalTTC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      FieldByName('TotalTVA').AsCurrency := FieldByName('TotalHT').AsCurrency * FieldByName('TauxTVA').AsFloat;
      FieldByName('TotalTTC').AsCurrency := FieldByName('TotalHT').AsCurrency + FieldByName('TotalTVA').AsCurrency;
    C'est tout.
    Faire Un Edit/Post déclenche l'évènement OnCalcField. D'où très certainement tes problèmes de lenteur.

    @+ Claudius

  9. #9
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Un champ calculé se base sur les données physiques de la table, donc calculé à l'aide des champs de type fkData uniquement. Pas d'appel à sa propre valeur (éventuellement avec un autre champ calculé, évalué précédemment).
    Je sais, mais on peut modifier la valeur dun champ calculé en dehors du OnCalcField. C'est ce que je fais, et ça marche.

    Citation Envoyé par Cl@udius Voir le message
    On ne met jamais de Edit/Post dans un évènement OnCalcField.
    Je sais, et je n'en ai pas.

    Citation Envoyé par Cl@udius Voir le message
    Pour rappel: un champ calculé est une donnée volatile
    Je sais, et ça me vas bien.


    Citation Envoyé par Cl@udius Voir le message
    Faire Un Edit/Post déclenche l'évènement OnCalcField.
    Normal.

    Mais j'en revient à mon problème, qui est que le post déclenche le OnCalcField de tous les enregistrements de la grille, pas seulement celui qui vient d'être modifié.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  10. #10
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,
    Citation Envoyé par fredfred Voir le message
    Je sais, mais on peut modifier la valeur dun champ calculé en dehors du OnCalcField. C'est ce que je fais, et ça marche.
    Quel est l'intérêt de définir la valeur d'un champ calculé en dehors du OnCalcField. Je me demande si le champ calculé est vraiment adapté à ton besoin.

    Citation Envoyé par fredfred Voir le message
    Mais j'en revient à mon problème, qui est que le post déclenche le OnCalcField de tous les enregistrements de la grille, pas seulement celui qui vient d'être modifié.
    En réalité le OnCalcField ne se déclenche pas pour tous les enregistrements de la requête mais uniquement sur ceux qui sont visibles sur ta DBGrid.

    Dans la mesure du possible, j'évite d'utiliser les champs calculés sauf sur des jeux d'enregistrement très restreint. Sinon cela devient vite très lourd.
    Soit je calcule mon champ dans la requête, ou bien je défini un champ calculé directement au niveau de la BDD.

    @+ Claudius

  11. #11
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Re,
    Quel est l'intérêt de définir la valeur d'un champ calculé en dehors du OnCalcField. Je me demande si le champ calculé est vraiment adapté à ton besoin.
    J'utilise un champ calculé parce que ma reqûete est une jointure sur trois tables, et le champs calculé en question est un compteur d'opérations effectuées par l'utilisateur à un moment donné.

    A l'ouverture de la requête, le calcul est initialisé par le nb d'enregistremts présents dans différentes tables. Mais l'ajout ou la suppression d'enregistrements dans ces tables doit se refléter immédiatement dans la grille principale, sans pour autant relancer toute la requête, d'où le champ calculé que je modifie manuellement, et encore une fois, ce système fonctionne bien.

    Le stockage de cette valeur dans la BDD n'a aucun interêt, et compliquerait d'autant plus l'affichage de la grille.


    Citation Envoyé par Cl@udius Voir le message
    En réalité le OnCalcField ne se déclenche pas pour tous les enregistrements de la requête mais uniquement sur ceux qui sont visibles sur ta DBGrid.
    C'est bien ce que j'ai dit
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  12. #12
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    as-tu essayer de désactiver le AutoCalcfields au moment oû tu n'as pas besoin et de le réactiver par la suite ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AutoCalcfields:=False ;
    AutoCalcfields:=True ;
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  13. #13
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    AutoCalcFields à false peut réduire les appels a OnCalcFields, enfin il me semble.
    Akim Merabet

  14. #14
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    AutoCalcField est figé à False dès le départ, et je n'y touche pas.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/10/2006, 09h39
  2. Formulaire au comportement étrange : problème de POST
    Par Chlipouni dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2006, 11h36
  3. Problème Methode POST
    Par nguthans dans le forum Langage
    Réponses: 3
    Dernier message: 13/01/2006, 20h28
  4. Problème methode POST
    Par raptor70 dans le forum Langage
    Réponses: 18
    Dernier message: 24/10/2005, 10h57
  5. [HTTPS] Problème de Post et Get avec Apache et SSL
    Par bartrik dans le forum Apache
    Réponses: 5
    Dernier message: 17/09/2004, 08h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo