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 :

Créer et utiliser une GTT avec firebird


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    avril 2014
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : avril 2014
    Messages : 94
    Points : 40
    Points
    40
    Par défaut Créer et utiliser une GTT avec firebird
    Bonjour,
    Comme suite à la précédente discussion sur les GTT firebird, j'ai fait un programme de test.
    Je peux créer une table temporaire mais au moment de la remplir avec les données d'une table persistante existante j'obtiens des erreurs ...
    Peut-être que j'oublie quelque chose ?
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 254
    Points : 35 990
    Points
    35 990
    Billets dans le blog
    54
    Par défaut
    Bonjour,

    le problème vient avant tout d'un peu de fainéantise avec cette utilisation de SELECT * FROMune simple vérification avec flamerobin permet de voir que la génération de la GTT est la clé de l'erreur

    Nom : Capture.PNG
Affichages : 128
Taille : 37,7 Ko
    à gauche , la structure de la GTT créée à droite celle qui aurait fallu créer pour utiliser ce SELECT * afin d'avoir les champs qui correspondent


    L'erreur ? la ligne 117 de l'unité unit2.pas add('order by NAME') ; à remplacer par add('ORDER BY RF.RDB$FIELD_POSITION');Cela étant, si pour des tests je comprends le principe de création d'une GTT dans le programme ce n'est certainement pas une chose à faire au sein d'une application multi utilisateurs.

    Pour rester je ne critiquerai pas trop le fait d'utiliser des ''constante'' dans les SQL mais +QuotedStr('constante') je trouve ça plus joli


    pour en finir le code peut se simplifier
    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
    procedure TForm1.Button4Click(Sender: TObject);
    var
    //  WFDSql : TFDQuery ;
      i : integer;
    begin
      //Lecture des données depuis employes dans PRESENTS
    //  WFDSql := TFDQuery.Create(nil) ;
    //  WFDSql.Connection := FDDB ;
    //  with WFDSql.sql do
    //  begin
    //    clear ;
    //    add('INSERT INTO PRESENTS');
    //    add('SELECT *  FROM EMPLOYES ');
    //    add('where PRESENT = ''Y''') ;
    //  end;
    //  WFDSql.ExecSQL ;
    //  freeandnil(WFDSql) ;
      fddb.ExecSQL('INSERT INTO PRESENTS SELECT * FROM EMPLOYES WHERE PRESENT=?',['Y']);
      i:=fddb.ExecSQLScalar('SELECT COUNT(*) FROM PRESENTS');
      Showmessage(i.ToString);  
      //Affichage de PRESENTS
     // FDQuery1.Open() ;
    end;
    le résultat du messsage ? 11 donc les enregistrements sont bien copiés.
    Etant en vacances je ne me suis pas penché sur la partie suivante à savoir fdquery1 qui n'affiche rien dans la grille (déjà dans le code fourni le datasource n'était pas lié et non active et la query pointait sur une autre table !)
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    avril 2014
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : avril 2014
    Messages : 94
    Points : 40
    Points
    40
    Par défaut
    Bonjour et merci pour tous ces éclaircissements,
    d'autant plus sympa d'avoir regardé de près !
    Je reprends après une petite pose moi aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'erreur ? la ligne 117 de l'unité unit2.pas add('order by NAME')
    En effet il ne fallait pas changer l'ordre des champs !

    merci pour les simplifications de code, je ne connaissais pas quotedstr et execSQLScalar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fdquery1 qui n'affiche rien dans la grille
    Effectivement il y avait un problème de liaison mal reporté dans mon exemple.

    Il me reste à reporter des modifications de la table temporaire vers la table persistante.
    un simple INSERT INTO EMPLOYES SELECT * FROM PRESENTS pour remplacer les valeurs peut-il fonctionner ?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 254
    Points : 35 990
    Points
    35 990
    Billets dans le blog
    54
    Par défaut
    Bonjour,
    Citation Envoyé par GrPtj Voir le message
    un simple INSERT INTO EMPLOYES SELECT * FROM PRESENTS pour remplacer les valeurs peut-il fonctionner ?
    J'utiliserai plutôt un UPDATE OR INSERT au vue des autres posts
    mais il vaudrait mieux une syntaxe explicite (plus je prend de l'age plus je desteste l'utilisation du *)
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    avril 2014
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : avril 2014
    Messages : 94
    Points : 40
    Points
    40
    Par défaut
    J'ai le résultat souhaité avec le code suivant
    mais j'imagine qu'il y a plus simple ?

    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
    WFDSql := TFDQuery.Create(nil) ;
    WFDSql.Connection := FDDB ;
    WFDSql.UpdateOptions.GeneratorName := 'EMPLOYES_BI' ;
    WFDSql.UpdateOptions.KeyFields := 'ID_EMPLOYES' ;
     
    FDQuery1.first ;
    while not FDQuery1.Eof do
    begin
      if FDQuery2.Locate('ID_EMPLOYES', FDQuery1.FieldByName('ID_EMPLOYES').AsInteger,[]) then
      begin
         with WFDSql.Sql do
         begin
           clear ;
           add('UPDATE EMPLOYES') ;
           add('set PRESENT=:0, NUMBADGE=:1, NOM=:2, PRENOM=:3') ;
           add('where ID_EMPLOYES=:4');
         end;
         WFDSql.ExecSQL('', [FDQuery1.FieldByName('PRESENT').AsString, FDQuery1.FieldByName('NUMBADGE').AsInteger, 
             FDQuery1.FieldByName('NOM').AsString, FDQuery1.FieldByName('PRENOM').AsString, FDQuery1.FieldByName('ID_EMPLOYES').AsInteger]) ;
      end
      else
      begin
         with WFDSql.Sql do
         begin
           clear ;
           add('INSERT INTO EMPLOYES') ;
           add('(PRESENT, NUMBADGE, NOM, PRENOM)') ;
           add('values (:0,:1,:2,:3)') ;
          end;
          WFDSql.ExecSQL('', [FDQuery1.FieldByName('PRESENT').AsString, FDQuery1.FieldByName('NUMBADGE').AsInteger, 
                FDQuery1.FieldByName('NOM').AsString, FDQuery1.FieldByName('PRENOM').AsString]) ;
       end ;
       FDQuery1.next ;
    end;
    freeandnil(WFDSql) ;

  6. #6
    Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    avril 2014
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : avril 2014
    Messages : 94
    Points : 40
    Points
    40
    Par défaut
    Avec ce code il me faudra gérer les suppressions à part

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 254
    Points : 35 990
    Points
    35 990
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par GrPtj Voir le message
    J'ai le résultat souhaité avec le code suivant
    mais j'imagine qu'il y a plus simple ?
    Oui, comme je l'ai écrit en utilisant UPDATE OR INSERT et en utilisant directement la connexion et un execsql
    Cela éviterait : la boucle sur la fdquery1 tout comme la création de WFDSql

    Avec ce code il me faudra gérer les suppressions à part
    ce serait de toute façon le cas. Je n'y ai pas longuement réfléchi mais, je ferais certainement les DELETE avant le UPDATE OR INSERT

    à verifier mes hypothèses

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM EMPLOYES WHERE NOT ID_EMPLOYES IN (SELECT ID_EMPLOYES FROM GTT)
    puis
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE OR INSERT INTO EMPLOYES(ID_EMPLOYES,PRESENT,NUMBADGE, NOM, PRENOM) SELECT ID_EMPLOYES,PRESENT,NUMBADGE, NOM, PRENOM FROM GTT
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  8. #8
    Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    avril 2014
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : avril 2014
    Messages : 94
    Points : 40
    Points
    40
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE OR INSERT INTO EMPLOYES (ID_EMPLOYES,PRESENT,NUMBADGE, NOM, PRENOM) SELECT ID_EMPLOYES,PRESENT,NUMBADGE, NOM, PRENOM FROM GTT
    il y un problème de syntaxe, select n'est pas attendu ...

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 254
    Points : 35 990
    Points
    35 990
    Billets dans le blog
    54
    Par défaut
    Bonjour,

    Ah, c'est vrai, j'avais (encore) oublié que cette syntaxe n'était pas acceptée (dommage d'ailleurs)
    reste bien évidemment la boucle sur fdQuery1 avec ou sans l'utilisation des Array DML
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  10. #10
    Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    avril 2014
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : avril 2014
    Messages : 94
    Points : 40
    Points
    40
    Par défaut
    Merci beaucoup, précis et réactif !

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

Discussions similaires

  1. Créer une vue avec Firebird sous LibreOffice
    Par JeanmiCoste dans le forum SQL
    Réponses: 2
    Dernier message: 17/11/2020, 13h16
  2. Créer et utiliser une librairie avec ressource
    Par La March dans le forum Android
    Réponses: 0
    Dernier message: 24/06/2014, 18h20
  3. [Free Pascal] Créer et utiliser une police
    Par xavier faure dans le forum Free Pascal
    Réponses: 4
    Dernier message: 06/05/2007, 21h55
  4. utiliser une transaction avec le composant DBExpress
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/06/2005, 15h10
  5. [MFC] Comment créer et utiliser une base Access
    Par maitre hibou dans le forum MFC
    Réponses: 3
    Dernier message: 10/05/2004, 19h11

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