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 et TFDScript


Sujet :

Bases de données Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    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 388
    Points : 2 999
    Points
    2 999
    Par défaut Firedac et TFDScript
    Bonjour

    J'ai un problème avec le composant TFDScript et je ne comprends pas pourquoi.
    J'ajoute un script au composant et je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Script := FDScript1.SQLScripts.FindScript('CreerTableRequetes');
        if Assigned(Script) then
          FDScript1.ExecuteScript(Script.SQL);
    Le code passe bien mais le script qui devrait créer une table ne fait rien.

    Pour que ça fonctionne, je dois faire forcément un FDScript1.ExecuteAll.
    Mais pour moi, ça veut que ça va exécuter touts les scripts que j'aurais pu ajouter au composants.
    Même en lisant l'aide fournie, je ne comprends pas comment faire.

    Il y a forcément une façon d'exécuter un script choisi sinon ça n'aurait aucun sens de pouvoir en stocker plusieurs.

    Quelqu'un pourrait-il me dire où est mon erreur on ce que je n'ai pas pigé ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    C'est aussi ce que j'avais espéré à l'époque de mes essais ; une bibliothèque de scripts pour centraliser toutes les requêtes (et les appeler par un nom) à la place de les avoir sous forme de chaîne dans les procédures.

    Mais il semblerait plutôt qu'il y aie un script général (le premier) qui fasse des branchements sur des scripts secondaires sans possibilité d'appeler celui qui t'intéresse à un temps T, ou, les exécuter tous du premier au dernier sans distinction.

    Peut-être que quelque chose m'a échappé mais ce principe n'avait aucune utilité pour moi, je n'ai pas poussé plus loin !

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Déjà, il faudrait voir le texte du script ?
    on peut exécuter des scripts séparés via l'indice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLScripts[1].ExecuteAll;
    Cela fait longtemps que je n'ai pas remis le nez dans des scripts à plusieurs blocs
    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
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    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 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est aussi ce que j'avais espéré à l'époque de mes essais ; une bibliothèque de scripts pour centraliser toutes les requêtes (et les appeler par un nom) à la place de les avoir sous forme de chaîne dans les procédures.

    Mais il semblerait plutôt qu'il y aie un script général (le premier) qui fasse des branchements sur des scripts secondaires sans possibilité d'appeler celui qui t'intéresse à un temps T, ou, les exécuter tous du premier au dernier sans distinction.

    Peut-être que quelque chose m'a échappé mais ce principe n'avait aucune utilité pour moi, je n'ai pas poussé plus loin !
    Alors, moi aussi c'est ce que j'espérais mais c'est finalement (après une bonne prise de tête et un forum qui m'a aiguillé) plus subtil que ça.

    En fait, le script[0] est celui qui est toujours exécuté mais pas en prenant su SQL.
    Les autres sont des scripts "standards" qui sont nommés.

    Exemple :
    mon scripts[1] est un create d'une table A et je le nomme CreateTableA
    mon scripts[2] est un create d'une table B et je le nomme CreateTableB

    Si je veux exécuter le script de création de la table A, je dois mettre dans le SQL du script[0] (le tout premier ajouté) la chaîne de @CreateTableA

    Si je fais un ExecuteAll, il lancera le script nommé qui se trouve dans son SQL.

    Si je veux exécuter celui pour la table B, je dois mettre dans le SQL du script[0] la chaîne de @CreateTableB

    Si je veux exécuter les deux, je mets dans le scripts[0]
    @CreateTableA
    @CreateTableB

    Conclusion le premier script n'est qu'une liste des noms de scripts dans la liste à partir de l'indice 1.

    Franchement, c'était bien se casser la tête pour concevoir un truc pareil.

    En complément, pour exécuter tous les scripts de 1 à count on fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      I: NativeInt;
    begin
      with FDScript1 do
      begin
        SQLScripts[0].SQL.Clear;
        for I := 1 to Pred(SQLScripts.Count) do
          SQLScripts[0].SQL.Add('@' + SQLScripts[I].Name);
        ExecuteAll;
      end;

  5. #5
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Conclusion le premier script n'est qu'une liste des noms de scripts dans la liste à partir de l'indice 1.
    Franchement, c'était bien se casser la tête pour concevoir un truc pareil.
    En complément, pour exécuter tous les scripts de 1 à count on fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      I: NativeInt;
    begin
      with FDScript1 do
      begin
        SQLScripts[0].SQL.Clear;
        for I := 1 to Pred(SQLScripts.Count) do
          SQLScripts[0].SQL.Add('@' + SQLScripts[I].Name);
        ExecuteAll;
      end;
    Euh... alors oui, mais non.

    Le TFDScript est un conteneur de scripts SQL. L'indice 0 est un peu spécial car il bénéficie de commandes dédiées comme des alias vers les autres scripts nommés. Les autres indices peuvent être traités séparément.
    https://docwiki.embarcadero.com/Libr...ript.TFDScript

    Comme l'indique la doc, ExecuteAll et ValidateAll sont effectivement dédié à l'exécution des commandes SQL présentes dans le script 0 d'un TFDScript, mais ça inclut aussi des alias permettant de pointer sur les autres éléments disponibles
    :
    https://docwiki.embarcadero.com/Libr...ipt.SQLScripts
    https://docwiki.embarcadero.com/Libr...ipt.ExecuteAll
    https://docwiki.embarcadero.com/Libr...pt.ValidateAll

    Dans le cas où on veut exécuter des commandes stockées dans une chaine c'est bien la méthode ExecuteScript() qu'on doit appeler en lui passant les commandes. Et ça fonctionne très bien, je m'en sers dans mes scripts d'initialisation/modifications de bases de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i := version + 1 to FDScript1.SQLScripts.Count - 1 do
      begin
        FDScript1.ExecuteScript(FDScript1.SQLScripts[i].SQL);
        inc(version);
      end;
    M'est avis que le problème de départ vient d'autre chose que le composant. Que contenait le script "CreerTableRequetes" ? Etait-il bien trouvé dans la liste ? Etait-il en indice 0 (qui est en fait écrasé par ExecuteScript) ?

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    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 388
    Points : 2 999
    Points
    2 999
    Par défaut
    pour le contenu du script, rien de plus simple que ça.
    CREATE TABLE IF NOT EXISTS requetes (
    nom text NOT NULL UNIQUE,
    texte text NOT NULL
    );
    J'y ai ajouté des lignes de remplissage de la table ensuite.
    Pour ce qui est de mon problème il est au moins résolu pour ça.

    Maintenant, en lisant plus avant le lien wiki, je lis :

    The script can also call other scripts, such as a subroutine, through the @ <script>, @@ <script>, START <script>, or INPUT <script> commands. In that case, <script> is either the item name from the SQLScripts collection, or the external file name. For example, the 'root' script executes the 'first' and 'second' subscripts:
    Mon anglais est très mauvais mais je vois effectivement que @unscript va exécuter un script qui porte le nom unscript.
    Ensuite, le @@ , il fait quoi par exemple ?

    Est-ce que ça correspond à un SQL standard que je ne connaîtrai pas ? Ou est-ce une partie de réduite d'une liste de commandes ? Dans ce cas, où se trouve la liste complète ?

    à part ça, merci pour ces explications , je vais étudier l'exemple que tu fournis sur ton site

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    pour le contenu du script, rien de plus simple que ça.
    Si simple que cela ne nécessite pas de TDScript
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TDatasModule.FDConnectionAfterConnect(Sender: TObject);
    var Script : String;
    begin
     Script :='CREATE TABLE IF NOT EXISTS requetes ('+
    'nom text NOT NULL UNIQUE,'
    +'texte text NOT NULL)');
          FDConnection.ExecSQL(Script);
    end;
    Il y eut des données à ajouter en sus (un paquet de Inserts) alors, oui, ç'eut été différent.

    Dérivé du programme présenté par Patrick où il utilise un FDScript https://github.com/Serge-Girard/Gest...ptesPersonnels
    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

  8. #8
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Mon anglais est très mauvais mais je vois effectivement que @unscript va exécuter un script qui porte le nom unscript.
    C'est bien ça, ils remplacent le "@nomdescript" par la liste des commandes stockées sous ce nom dans le TFDScript courant.

    Citation Envoyé par Papy214 Voir le message
    Ensuite, le @@ , il fait quoi par exemple ?
    Pas vu de "@@", c'est probablement une faute de frappe s'il y en a un quelque part.

    Citation Envoyé par Papy214 Voir le message
    Est-ce que ça correspond à un SQL standard que je ne connaîtrai pas ? Ou est-ce une partie de réduite d'une liste de commandes ? Dans ce cas, où se trouve la liste complète ?
    C'est du bidouillage lié à TFDScript, une sorte de système de macro commandes (s'il faut y mettre un nom).

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    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 388
    Points : 2 999
    Points
    2 999
    Par défaut
    @ <script>, @@ <script>, START <script>, or INPUT <script>

    c'est extrait du wiki

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Mon anglais est très mauvais mais je vois effectivement que @unscript va exécuter un script qui porte le nom unscript.
    Mais le wiki peut aussi être en français

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ensuite, le @@ , il fait quoi par exemple ?
    Tu parles de ce wiki
    où il est indiqué que
    '@@' exécute un script comportant un nom de fichier relatif au chemin du script parent.
    je n'ai jamais utilisé cette technique, mais il me semble clair que dans ce cas c'est @@nomdefichier (fichier texte contenant du SQL)
    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

  11. #11
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    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 388
    Points : 2 999
    Points
    2 999
    Par défaut
    ah ben voilà ! Là c'est plus clair :-)

    Merci à tous ... J'aurais appris des choses utiles aujourd'hui et ça va bien me faciliter la tâche.

    Bonne journée

  12. #12
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    N'y a-t-il pas une version surchargée de la méthode qui résumerait FDScript1.ExecuteScript(FDScript1.SQLScripts[i].SQL); en FDScript1.ExecuteScript(i); ?
    Mais ce serait pê trop simple ou trop de bonheur, l'outil ayant l'air d'être destiné sinon adapté à des problématiques complexes... ;-)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Je ne crois pas que cette surcharge existe, de plus il faudrait que ce soit uniquement si des scripts du type @script et non avec appel de fichiers
    D'ailleurs, dans ces conditions, une surcharge FDScript1.ExecuteScript(nomduscript) serait encore mieux
    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

  14. #14
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    N'y a-t-il pas une version surchargée de la méthode qui résumerait FDScript1.ExecuteScript(FDScript1.SQLScripts[i].SQL); en FDScript1.ExecuteScript(i); ?
    Mais ce serait pê trop simple ou trop de bonheur, l'outil ayant l'air d'être destiné sinon adapté à des problématiques complexes... ;-)
    Je trouve ça aussi dommage (et un peu idiot) de ne pas l'avoir ajouté pour le ExecuteScript(). Un truc justifiant une demande de nouvelle fonctionnalité sur https://quality.embarcadero.com

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

Discussions similaires

  1. Mise à jour de Firedac (Update 2)
    Par SergioMaster dans le forum Delphi
    Réponses: 11
    Dernier message: 02/05/2014, 21h37
  2. XE2 FireDac ODBC : message d'erreur
    Par artmicro dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/08/2013, 09h05
  3. XE4 , Firedac et datasnap
    Par SergioMaster dans le forum Bases de données
    Réponses: 8
    Dernier message: 01/06/2013, 09h40
  4. Embarcadero propose FireDAC pour l'accès aux Bdd
    Par John Colibri dans le forum Delphi
    Réponses: 0
    Dernier message: 01/03/2013, 06h56

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