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 :

[Firedac] Utiliser un FdScript


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut [Firedac] Utiliser un FdScript
    Bonjour,

    je sèche un peu sur l'utilisation de ce composant et peut être de ses propriétés de plus je voudrais pouvoir en gérer les erreurs.

    Voilà le topo je me réfère à la doc trouvée ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    with FDScript1 do begin
       SQLScripts.Clear;
       SQLScripts.Add;
       with SQLScripts[0].SQL do begin
         Add('INSERT INTO Brands VALUES (1, ''Audi'')');
         Add('INSERT INTO Brands VALUES (2, ''BMW'')');
       end;
       ValidateAll;
       ExecuteAll;
     end;
    en reprenant cet exemple je voudrais faire ceci :
    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
    with FDScript1.SQLScripts do begin
       Clear;
       with Add do begin
         Name := 'root';
         SQL.Add('@Audi');  // explicitly call 'Audi' script
         SQL.Add('@BMW'); // explicitly call 'BMW' script
       end;
       with Add do begin
         Name := 'Audi';
         SQL.Add('INSERT INTO Brands VALUES (1, ''Audi'');');
       end;
       with Add do begin
         Name := 'BMW';
         SQL.Add('INSERT INTO Brands VALUES (2, ''BMW'')');
       end;
     end;
     FDScript1.ValidateAll;
     FDConnexion1.StartTransaction;
     FDScript1.ExecuteAll;
     FDConnexion1.Commit;
    ce qui semblerait logique ?
    et je voudrai par l'intermédiaire de l'événement OnError du TFdScript obtenir le nom du script en erreur au cas où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FDScript1r(ASender: TObject;
      const AInitiator: IFDStanObject; var AException: Exception);
    begin
      showmessage(AInitiator.Name+slineBreak+AException.Message);
      FDConnexion1.Rollback;
    end;
    mais là , j'ai un problème, mon script ne fait ... rien !
    bien évidement, dans mon programme il ne s'agit pas des mêmes ordres ni table mais le principe est là.

    Y voyez vous une erreur de logique ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    et sans transaction, ça passe ?

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Pareil , en fait le code 1 est sans transaction et passe parfaitement (si bien sur il n'y a pas de clés en double)
    je n'ai pas fait encore tous les tests hors transactions, mais le script s'arrête dès qu'il y a une erreur (enfin selon l'option breakonerror)

    Un idée m'est venue ce matin : je crois que le onError est géré sur le ValidateAll (contrôle de syntaxe) et non sur le ExecuteAll (exécution du script)

    il est toujours possible de se rabattre sur un code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ExecuteAll then Commit else Rollback;
    je n'ai pas encore testé les ExecuteStep et trouve les calculs de TotalJobSize,TotalJobDone,Totalprct10Done loufoques, bref je découvre

    en tout cas ce qui suit fonctionne comme souhaité
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    FDConnection1.TxOptions.AutoCommit:=False; // obligatoire pour Firebird 
    with FDScript1.SQLScripts do begin
       Clear;
       with Add do begin
         Name := 'root';
         SQL.Add('@Audi');  
         SQL.Add('@BMW'); 
         SQL.Add('@Erreur');
         SQL.Add('@ter');
       end;
       with Add do begin
         Name := 'Audi';
         SQL.Add('INSERT INTO Brands VALUES (1, ''Audi'');');
         SQL.Add('INSERT INTO Brands VALUES (3, ''Audi bis'');');
       end;
       with Add do begin
         Name := 'BMW';
         SQL.Add('INSERT INTO Brands VALUES (2, ''BMW'');');
         SQL.Add('INSERT INTO Brands VALUES (4, ''BMW bis'');');
       end;
       with Add do begin
         Name := 'ter';
         SQL.Add('INSERT INTO Brands VALUES (5, ''Audi ter'');');
         SQL.Add('INSERT INTO Brands VALUES (6, ''BMW ter'');');
       end;
       with Add do begin
         Name := 'Erreur';
         SQL.Add('INSERT INTO Brands VALUES (1, ''Audi'');');
       end;
     end;
     FDScript1.ValidateAll;
     FDConnection1.StartTransaction;
     if FDScript1.ExecuteAll then  FDConnection1.Commit
                             else  begin
                                   showmessage(inttostr(fdscript1.TotalJobSize));
                                   fdConnection1.Rollback;
                             end;
     FDConnection1.TxOptions.AutoCommit:=True;
    Un autre essai
    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
    with FDScript1 do begin
       SQLScripts.Clear;
       SQLScripts.Add;
       with SQLScripts[0].SQL do begin
         Add('INSERT INTO Brands VALUES (1, ''Audi'');');
         Add('INSERT INTO Brands VALUES (2, ''BMW'');');
         Add('INSERT INTO TOTO VALUES (2);');                 // << table inexistante 
       end;
       ValidateAll;
       FDConnection1.StartTransaction;
       try
         if ExecuteAll then showmessage('OK')
                       else showmessage('NO');
         FDConnection1.Commit;
       except
         Showmessage('exception');
         FDConnection1.Rollback;
       end;
    end;
    1. le ValidateAll passe , donc mon idée du matin est fausse
    2. je ne passe jamais dans le Except

    Suite aux prochain tests , ce FdScript est plus ardu que je ne le pensais pour des questions de production je vais me rabattre sur le bon vieux ExecSQL en attendant des réponses (pb posé sur EDN := bouteille à la mer)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    je n'ai pas encore testé les ExecuteStep
    Encore plus ardu à comprendre ! cela à l'air d'être sympathique à première vue mais pas facile à comprendre à cause déjà d'une confusion pour une Variable nommée Position qui est un TPosition donc Y et X . Ce nom équivoque fait croire qu'il s'agit de la position sur la fiche mais non ! il s'agit en fait de la position dans le script en ligne, caractère. Pour comprendre il faut imaginer un TMemo contenant des lignes de SQL, Position X,Y donne alors la position du curseur.
    Bref ça ne répond pas à ma question concernant l'évènement OnError qui persiste à ne pas se lever, tout comme le try except d'ailleurs !

    Conclusion: il doit y avoir une propriété quelque part ou cela dépend du SGBD
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    en fait il s'agit d'un bug de la version Firedac XE7 , Dmitry Arefiev le "Firedac Architect" me l'a indiqué lorsque j'ai posé la question sur le forum EDN,
    il m'a fourni un patch (une ligne à corriger/ajouter dans un des sources) . Seulement voilà, pas la marche à suivre pour le faire !

    Quelqu'un a t-il déjà fait cette expérience ? Modifier un source de la "bibliothèque Delphi" s'avère être une partie délicate avec toutes les protections que Windows impose, (impossible d'écrire dans le répertoire de ces sources, erreur à la création du sous-répertoire History etc... en 2 mots : "Galère,Rames")
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut hello
    Si tu as le fichier .pas du source, tu le copies dans un répertoire accessible en lecture écriture, puis tu
    ajoutes le fichier à ton application.

    Sinon, tu peux lui demander le .dcu, qu'il suffira de copier en remplacement du fichier buggé.

    Cordialement

    André

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/03/2015, 16h42
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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