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 :

Liste Tstrings et requête SQL


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut Liste Tstrings et requête SQL
    Bonjour,
    Je suis sous Delphi 7 et j'utilise INTERBASE 6.
    je récupère les noms des champs d'une table dans une liste (TemplistTable: Tstrings)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TemplistTable := TStringList.Create;
    dtModule.IBDatabase1.GetFieldNames(nomTable, TemplistTable);

    Pour ensuite les écrires dans un fichiers .sql dans la syntaxe suivante :
    INSERT INTO 'TABLE'(champ1,champ2,...,champn)
    VALUES(val1,val2...,valn)

    en parcourant la liste (TemplistTable: Tstrings) (il doit exister une fonction Separate ? )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for j := 0 to nbChamp - 1 do
      if j <> nbChamp-1 then
        req := req + TempListTable[j] + ','
      else
        req := req + TempListTable[j];
    Le problème est que j'ai le résultat suivant :

    INSERT INTO PRESTA_COMPO( PRST_CODEPC,PRST_NOLIGNE,PRST_QTE,TRF_CODEREF)
    VALUES(....)

    Les champs de la table sont classé par ordre alphabétique et non tels qui sont ordonnés dans la table (ce qui peut être assez génant dans une requête INSERT INTO), il faudrait donc :

    INSERT INTO PRESTA_COMPO( PRST_NOLIGNE,PRST_QTE,TRF_CODEREF,PRST_CODEPC)
    VALUES(....)


    Sinon j'ai un autre soucis, j'aimerais récupérer les valeurs de chaque enregistrement de la table pour les insérer dans la seconde ligne :
    VALUES(val1,val2...valn)

    J'ai commencer à taper la requête mais je sais pas si je vais vers la bonne solution...?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with dtModule.IBQuery1 do
    begin
      SQL.Close;
      SQL.Clear;
      SQL.Add('Select * from ' + nomTable);
      Prepared := true;
      Open;
      SQL.Clear; 
    end;
    en bref pour chaque enregistrement je dois retrouver une ligne type:
    INSERT INTO 'TABLE'(champ1,champ2,...,champn)
    VALUES(val1,val2...,valn)

    merci à vous

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Pour le non tri, tu peux mettre la propriété Sorted de ta TStringList à false.
    (mais je ne me souviens plus quelle est la valeur par défaut )

    J'ai commencer à taper la requête mais je sais pas si je vais vers la bonne solution...?
    Ca m'en a tout l'air
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if RecordCount > 0 then begin
       FetchAll;
       First;
       While not eof do begin
         // traitement des champs
         next;
       end;
    end;
    attention cependant au type des champs (soit par "Name", soit par "Index")

  3. #3
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    oki je te remerci pour ta contribution, je m'en vais tout de suite essayer tes indications.


    Je viens d'essayer pour mon problème de la List :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TemplistTable := TStringList.Create;
    TempListTable.Sorted := false;
    dtModule.IBDatabase1.GetFieldNames(nomTable, TemplistTable);

    Mais cela pas l'air de changer grand chose. Le problème vient peut-être de la manière dont je remplis ma List ?
    Je ne fais ni d'INSERT ni de Add.

    GetFieldNames ne trie pas la List pourtant ?
    dans la doc :
    GetFieldNames, méthode (TIBDatabase) Remplit une liste avec les noms des champs de la table.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Si tu inserts l'intégralité des champs, tu n'as pas besoin du nom des champs de la base de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO PRESTA_COMPO
    Values (...)
    Suffit largement

    Sinon pour recupérer la liste des champs dans l'ordre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    With IBdatabase do
    begin
      for i := 0 to Fields.count -1
        TempListTable.Add(Fields.Field[i].Displayname);
    end;
    Ou quelque chose dans le style, les composants IB bug chez moi (Vive D2005 l'usine a bug :/)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    Merci Malatar,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With IBdatabase do
    begin
      for i := 0 to Fields.count -1
        TempListTable.Add(Fields.Field[i].Displayname);
    end;
    Delphi me trouve pas la propriété Fields pour IBdatabase, par contre avec IBQuery.Fields ça fonctionne (j'ai bien les champs dans le bon ordre)

    Ainsi cela me parrait bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL.Clear;
      SQL.Add('Select * from ' + nomTable);
      Prepared := true;
      Open;
     
    begin
      for i := 0 to FieldCount - 1 do
        TempListTable.Add(Fields[i].DisplayName);
      end;

    De la à dire que c'est la meilleur solution

  6. #6
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Je pense que l'ordre avec lequel reviennent les champs dépend des tables "système" d'IB (les RDB$), il doit falloir creuser pour assigner ces tables, et compléter par le n° d'ordre de la colonne.

    => fais 1 recherche sur le Forum Interbase, j'y ai vu un post très récent là dessus.

  7. #7
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    => fais 1 recherche sur le Forum Interbase, j'y ai vu un post très récent là dessus.
    je vais y faire un tour alors

    Tant que vous êtes dans le coin, une dernière précision si c'est possible.

    Dans Le cas ci dessous on utilise FieldByName avec un "alias" pour travail sur le résultat de la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Close;
      SQL.Clear;
      SQL.Add('Select count(*) as nb from ' + nomTable);
      Prepared := true;
      Open;
      nbEnr := FieldByName('nb').AsInteger;
      Close;
    ...mais dans une requête où on veut récupérer tous les champs ?
    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
      close;
      SQL.Clear;
      SQL.Add('Select * from ' + nomTable);
      Prepared := true;
      Open;
     
      if RecordCount > 0 then begin
        FetchAll;
        First;
        While not eof do begin
          // traitement des champs
          //Je pensais utilisé une liste qui récupére les valeurs de 
          //l 'enregistrement en cours (TempListEnr.Add()  ) mais je vois pas       
         // comment faire ??
          next;
        end;
      end;
     
      SQL.Clear;
    Dans cette requête il y a donc aucun champs spécifié en particulier et j'aimerais savoir comment en travail avec une requête select *

  8. #8
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Il me semble que le nom des champs est accessible, comme si tu les avais mentionné dans la requète... (mais c'est sans garantie )

    Fais l'essai sur 1 champ et tu auras vite la réponse !

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par Gats
    => fais 1 recherche sur le Forum Interbase, j'y ai vu un post très récent là dessus.
    je vais y faire un tour alors

    Tant que vous êtes dans le coin, une dernière précision si c'est possible.

    Dans Le cas ci dessous on utilise FieldByName avec un "alias" pour travail sur le résultat de la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Close;
      SQL.Clear;
      SQL.Add('Select count(*) as nb from ' + nomTable);
      Prepared := true;
      Open;
      nbEnr := FieldByName('nb').AsInteger;
      Close;
    ...mais dans une requête où on veut récupérer tous les champs ?
    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
      close;
      SQL.Clear;
      SQL.Add('Select * from ' + nomTable);
      Prepared := true;
      Open;
     
      if RecordCount > 0 then begin
        FetchAll;
        First;
        While not eof do begin
          // traitement des champs
          //Je pensais utilisé une liste qui récupére les valeurs de 
          //l 'enregistrement en cours (TempListEnr.Add()  ) mais je vois pas       
         // comment faire ??
          next;
        end;
      end;
     
      SQL.Clear;
    Dans cette requête il y a donc aucun champs spécifié en particulier et j'aimerais savoir comment en travail avec une requête select *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
      for i := 0 to Fields.Count -1 do
        TempListEnr.add(Fields.Field[i].Asstring); // recupére les données de tous les champs et les mets dans TemplistEnr
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    j'ai rajouté la mention ORDER BY dans ma requête.


    merci à vous deux

  11. #11
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    salut

    J'ai une petite question : :

    Comment fait -on pour tester le type d'un champs?

    Je dois mettre entre cotes les données des champs chiffrés.

    les valeurs des champs sont récupérés dans une List : TstringList

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Fields.Fields[x].DataType
    Et dans TFieldType tu trouvera la liste des types reconnus.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/11/2014, 08h56
  2. Liste dans une requête SQL (IN)
    Par le_misterioso dans le forum Persistance des données
    Réponses: 2
    Dernier message: 14/05/2011, 19h17
  3. [MySQL] Liste déroulante et requête SQL
    Par dahu17 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 10/02/2008, 19h53
  4. Réponses: 6
    Dernier message: 11/04/2006, 10h56
  5. [MySQL] Problème de listes déroulantes liées avec requêtes sql
    Par richton95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2005, 16h04

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