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

Composants VCL Delphi Discussion :

[D10.3] Applyupdate, commit avec Disablecontrols BUG ?


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Responsable associatif
    Inscrit en
    Octobre 2005
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : Octobre 2005
    Messages : 229
    Par défaut [D10.3] Applyupdate, commit avec Disablecontrols BUG ?
    Bonjour à tous,

    Je suis tombé sur un bon gag !
    Je suis sur une base FB3.0 avec des Query Firedac. Détails est relié à commandes. Mon but est de remplir un nouveau champ de la table details (noligne)
    Voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
       commandes.DisableControls;
       details.DisableControls;
       commandes.First;
       while commandes.Eof=false do
       begin
         i:=0;
         while details.Eof=false do
         begin
           details.Edit;
           detailsnoligne.Value:=i;
           details.Post;
           details.Next;
           inc(i);
         end;
         details.ApplyUpdates();
         details.CommitUpdates;
         memo1.Lines.Add(commandesrefcom.asstring);
         commandes.Next;
       end;
       commandes.enableControls;
       details.enableControls;
    Si je disable les contrôles, ça va très vite, mais les commit ne se font pas dans la base !!!
    Si je ne les disable pas, évidemment c'est moins rapide puisque il faut tout afficher dans mes grid, mais les commit se font et ma table est bien mise à jour.
    Incroyable non ? ou bien je passe à côté de quelque chose ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    details c'est TFDQuery ?



    while commandes.Eof=false do pas très habituel comme écriture, je pratique plutôt le while not commandes.Eof do, je m'en suis d'ailleurs fait une template
    Sinon, j'aurais remis un details.First() à chaque changement de commandes, c'est une relation Maitre-Detail entre TFDQuery, je suppose que details est paramétré et que c'est commandes qui bind automatiquement via la relation sauf que la documentation averti à ce sujet dans ces termes si l'on regarde cet extrait de la documentation de Data.DB.TDataSet.DisableControls

    Si l'ensemble de données est le maître d'une relation maître/détail, l'appel de DisableControls désactive aussi la relation maître/détail. L'initialisation de BlockReadSize au lieu de l'appel de DisableControls actualise les ensembles de données détail pendant que vous faites défiler l'ensemble de données, mais n'actualise pas les contrôles orientés données.
    C'est donc parfaitement en accord avec la documentation ...
    Un petit Close Bind Open manuel de details à partir de commandes ne doit pas être bien difficile, je les sais pour l'avoir écrit en ADO

    A tentez ce BlockReadSize, j'ignore si mettre 1 suffit ou si il faut mettre RecordCount pour lire d'un coup tout commandes sans que ça défile la grille
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Je n'ai pas vu de starttransaction ?

    et je trouve quand même que c'est beaucoup de code alors que cela pourrait se régler via Firebird plus directement via procedure ou SQL directement, surtout que ce doit certainement être du ponctuel

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    CommitUpdates c'est lié à CachedUpdates pour le BDE Like
    Et ce n'est pas le Commit de la Connection lié à un StartTransaction, ce n'est pas au même niveau
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    CommitUpdates c'est lié à CachedUpdates pour le BDE Like
    Ah oui, zut j'ai pas fait gaffe, je ne suis pas très CachedUpdates faut dire
    En plus comment est connecté details ? c'est une table, une query en tout cas un disablecontrol ça doit pas aider à mettre la liaison !

    en tout cas, pur Firebird j'écrirai un EXECUTE BLOCK
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    SET TERM !;
    EXECUTE block as
    DECLARE VARIABLE I BIGINT;
    DECLARE VARIABLE NUMCMDE BIGINT;
    DECLARE VARIABLE OLDCMDE BIGINT;
    DECLARE VARIABLE K VARCHAR(17);
    begin
      I=0;
      OLDCMDE=-1;
      FOR SELECT RDB$DB_KEY,COMMANDE FROM LIGNES ORDER BY COMMANDE INTO :K,:NUMCMDE DO
       begin
          IF (Oldcmde<>NUMCMDE) THEN 
           BEGIN
            I=0;
            OLDCMDE=NUMCMDE;
           END 
          I=I+1;
          UPDATE LIGNES SET NUMERO=:I WHERE RDB$DB_KEY=:K;
       end
     END !
     SET TERM ; !
    je n'ai jamais essayé de EXECUTE BLOCK directement dans firedac ce pourrait être intéressant.

    Un petit test s'imposait : avec un FDScript cela passe comme une lettre à la poste

  6. #6
    Membre éclairé
    Homme Profil pro
    Responsable associatif
    Inscrit en
    Octobre 2005
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : Octobre 2005
    Messages : 229
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    en tout cas, pur Firebird j'écrirai un EXECUTE BLOCK
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    SET TERM !;
    EXECUTE block as
    DECLARE VARIABLE I BIGINT;
    DECLARE VARIABLE NUMCMDE BIGINT;
    DECLARE VARIABLE OLDCMDE BIGINT;
    DECLARE VARIABLE K VARCHAR(17);
    begin
      I=0;
      OLDCMDE=-1;
      FOR SELECT RDB$DB_KEY,COMMANDE FROM LIGNES ORDER BY COMMANDE INTO :K,:NUMCMDE DO
       begin
          IF (Oldcmde<>NUMCMDE) THEN 
           BEGIN
            I=0;
            OLDCMDE=NUMCMDE;
           END 
          I=I+1;
          UPDATE LIGNES SET NUMERO=:I WHERE RDB$DB_KEY=:K;
       end
     END !
     SET TERM ; !
    je n'ai jamais essayé de EXECUTE BLOCK directement dans firedac ce pourrait être intéressant.

    Un petit test s'imposait : avec un FDScript cela passe comme une lettre à la poste
    Je suis bien d'accord, mais ça faisait partie de mon apprentissage des query de Firedac, et je ne suis pas encore assez costaud en SQL. Ton exemple me fera progresser, c'est sur !
    En tout cas, merci à tous les deux de votre soutien!

    Pat

  7. #7
    Membre éclairé
    Homme Profil pro
    Responsable associatif
    Inscrit en
    Octobre 2005
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : Octobre 2005
    Messages : 229
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    details c'est TFDQuery ?
    oui



    while commandes.Eof=false do pas très habituel comme écriture, je pratique plutôt le while not commandes.Eof do, je m'en suis d'ailleurs fait une template
    Oui, bon...
    Sinon, j'aurais remis un details.First() à chaque changement de commandes, c'est une relation Maitre-Detail entre TFDQuery, je suppose que details est paramétré et que c'est commandes qui bind automatiquement via la relation sauf que la documentation averti à ce sujet dans ces termes si l'on regarde cet extrait de la documentation de Data.DB.TDataSet.DisableControls

    Damned ! j'étais tellement sur de moi que je n'ai pas jeté un oeil dans la doc. A posteriori, je ne l'ai pas trouvé dans la doc de la version CE.

    C'est donc parfaitement en accord avec la documentation ...

    Un petit Close Bind Open manuel de details à partir de commandes ne doit pas être bien difficile, je les sais pour l'avoir écrit en ADO
    Je ne connais pas, je vais regarder...

    A tentez ce BlockReadSize, j'ignore si mettre 1 suffit ou si il faut mettre RecordCount pour lire d'un coup tout commandes sans que ça défile la grille[/QUOTE]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Rollback/commit avec ajax
    Par isyara dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/01/2007, 13h53
  2. cpan: problème de commit avec o conf
    Par iscab dans le forum Modules
    Réponses: 1
    Dernier message: 20/11/2006, 15h11
  3. Problème avec JFileChooser (BUG ?)
    Par vano dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 05/05/2006, 09h03
  4. Enchainement de plusieurs FORM avec Jvs -> bug
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 17/04/2006, 20h46
  5. Transactions CommitRetaining et Commit avec Delphi
    Par Jacques Deyrieux dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 30/09/2005, 16h34

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