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

Langage Delphi Discussion :

Récupération nom_table du champ sélectionné query


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut Récupération nom_table du champ sélectionné query
    Bonjour à tous,
    J’ai beau chercher je ne trouve pas, je ne sais pas non plus si cela est possible.

    Je suis en Delphi 6 + Access 2000.
    J’ai 1 query avec 3 tables, et je fais afficher les respectifs champs
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CBox_Search1.Items := q_procura1.FieldList
    dans 1 ComBobox, en déroulant le ComBobox il m’affiche les champs, ok jusque là,

    Maintenant est-ce que, il y a un moyen de faire précéder ces nom_champ avec leurs respectifs nom_table? Cela nous ferais quelque chose du genre (nom_table.nom_champ) ?

    Merci de votre aide.
    Cordialement
    810mcu

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    un code comme celui-ci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to q_procura1.FieldList.Count - 1 do
      CBox_Search1.Items.Add(TableName + '.' + q_procura1.FieldList.Strings[i]);
    je suppose que tu connais TableName, peut-être via q_procura1

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    Bonjour ShaiLeTroll,
    est merci de ton aide,

    Oui il est connu le SQL, dont voici un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select
    tableA.id_A,
    tableB.id_B,
    tableC.id_C,
    tableA.champ2_A
     
    from (tableA INNER JOIN tableB ON tableA.id_A = tableB.id_B) INNER JOIN tableC ON tableA.id_A = tableC.id_C
    Justement c est la TableName que je veut extraire vue qu il y est dans le sql du query
    qui prend 03 tables et que ces champs ce retrouve comme ITEMS du ComboBox

    que par la suite en sélectionnant l ITEM et ou en affichage j ai
    table_name.champ_name

    Slt,
    810mcu

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    A travers les n° d INDEX du ComboBox je peut aussi les retrouvées, je suis d accord,
    mais y a-t-il pas un moyen auto de récupérer cela ?

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Automatique non, car le nom des champs n'est pas forcément lié à une table (champs calculés, alias, vue) ou à une seule table (jointure).

    Par contre, analyser le SQL pour en extraire les champs est possible (copie du texte entre SELECT et FROM, séparation des champs par les virgules, correspondance avec ceux de la liste des champs du composant)
    Par contre cela nécessite que le format de la requête soit celui présenté (sinon l'analyse sera un peu plus compliquée).

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    Bonjour Linkin,

    Si je comprends il y a moyen en analysant le SQL, sorry la je ne vois pas comment,
    Si c est le SQL exacte que tu as besoin, pas de problème je le passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    cours_route.id_cr, 
    Vehicules.num_vehicule, 
    Remorques.num_remorque, 
    cours_route.lieu_depart, 
    cours_route.origine, 
    cours_route.destination, 
    cours_route.positionn, 
    cours_route.obs
     
    FROM (cours_route INNER JOIN Vehicules ON cours_route.id_vehicules = Vehicules.id_vehicules) INNER JOIN Remorques ON cours_route.id_remorques = Remorques.id_remorques
         (tableA INNER JOIN tableB ON tableA.id_A = tableB.id_B) INNER JOIN tableC ON tableA.id_A = tableC.id_C
    Slt.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Ah d'acccord, je n'avais pas compris la question !

    je pense que Linkin parlais de la forme du SQL, pour faciliter le parsage, il te faudrait respecter pour toutes les requêtes concernées un format comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    Table1.Champ1,
    Table1.Champ2,
    Table2.Champ1,
    Table2.Champ2
    FROM ...
    Ainsi avec une simple TStringList tu pourrais t'en sortir !

    Après si c'est juste une seule requête et qu'elle est en dur dans le code, remplit ta combobox en dur


    Il doit y avoir des possibilités tout de même, ADO, BDE ... sont capable de faire des mises à jour de jointure, est-ce la couche Delphi qui génère le SQL ? ou est cacher dans la couche OLE ou dans les DLL du BDE ??? fort probable !

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    Sorry ShaiLeTroll,

    TStringList… comment la faire et mettre en place… je ne vois pas !

    Tu dis que via le ADO, BDE… on peut récupérer ??? oups là je bloque !!!

    Je réécris mon besoin pour meilleure compréhension,
    Delphi6 + Access 2000
    voilà, un TDataSource + TAdoquery (SQL=celui lister plus haut)
    CBox_Search1 ou dans l event onEnter exécute ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    q_procura1.close;
    CBox_Search1.Text := '';
    CBox_Search1.Items.Clear;
     
    CBox_Search1.Items := q_procura1.FieldList;
    CBox_Condi1.Enabled := True;
    Edit_Search1.Enabled := True;
    là récupération des noms des champs, jusque là ça marche impec,
    après j ai encore un Edit_Search1 qui lui il faut saisir ce que l on recherche dans le champ du CBox_Search1

    Et maintenant avec ces critères je vais construire un autre query
    Comme j ai plusieurs tables je doit récupérer le nom_table de cette dernière

    Au fait l idée est qu il liste quelque chose du genre, comme ITEMS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CBox_Search1.Items.Add(TableName + '.' + q_procura1.FieldList.Strings[i]);
    Comme tu l as écrit plus haut ça serais parfait

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Citation Envoyé par 810mcu Voir le message
    Sorry ShaiLeTroll,

    TStringList… comment la faire et mettre en place… je ne vois pas !
    Euh, tu plaisantes ??? le SQL c'est déjà une TStrings !

    Il te suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if AnsiStartsText('SELECT', q_procura1.SQL.Strings[0]) then
    begin
      for i := 1 to q_procura1.SQL.Count - 1 do
      begin
        if AnsiStartsText('FROM', q_procura1.SQL.Strings[i]) then
          Break;
     
         CBox_Search1.Items.Add(StringReplace(q_procura1.SQL.Strings[i], ',', '', [rfReplaceAll]));
      end;
    end;
    Cela ne fonctionne que pour le forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    Table1.Champ1,
    Table1.Champ2,
    Table2.Champ1,
    Table2.Champ2
    FROM ...
    Maintenant imaginons un SQL qui ne respecte pas la norme, il y a une solution très simple aussi !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Table1.Champ1, Table1.Champ2,
    Table2.Champ1, Table2.Champ2 FROM ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQLText := q_procura1.SQL.Text;
    iSelect := Pos('SELECT ', SQLText);
    if iSelect > 0 then
    begin
      iFrom := Pos(' FROM ', SQLText);
      iSelect := iSelect + Length('SELECT ');
     
      if (iFrom > iSelect) then 
      begin
        FieldsText := Copy(SQLText, iSelect, iFrom - iSelect);
        CBox_Search1.Items.StrictDelimiter := True;
        CBox_Search1.Items.CommaText := FieldsText;
      end;   
    end;
    En D6 StrictDelimiter n'existe pas !
    Cela provoquera des problèmes avec l'espace et le CRLF dans CommaText, tu peux remplacer cela par par ExtractStrings ou ExplodeLazy


    Citation Envoyé par 810mcu Voir le message
    Tu dis que via le ADO, BDE… on peut récupérer ??? oups là je bloque !!!
    Je n'ai pas écrit ça !
    J'ai écrit que ADO ou le BDE en interne était capable de faire une résolution de nom pour la mise à jour de jointure, et j'ai bien mentionné que j'ignorais si c'était dans le code Delphi, dans les API bas niveaux ou tout simplement interne aux DLL et innaccessible

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    Bonjour ShaiLeTroll,

    Pour la 1ère solution super ça marche bien,

    Par contre pour la 2ém je n est pas réussi a la mettre en marche,
    et je suis curieux de la voir tournée,
    Je bloque et comme vous avez dit à la propriété StrictDelimiter qui n existe pas en D6.

    En essayant avec ExtractStrings pas de succès,

    Et ExplodeLazy également, je suis aller dans la page indiquer mais...,
    pouvez vous me dire quel serais la déclaration la plus indiquer pour mon cas, je suis un peut perdu pour cette 2ém possibilité.

    Sur le ADO et BDE, l idée n étais pas d écrire que vous avez affirmée, non, je pense que moi j ai mal interprété, je m en excuse.

    Je ne peux que vous remercier.

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    Je viens de faire quelques recherches sans succès.
    pour ExtractStrings ou ExplodeLazy
    Si vous pouvez me montré comment faire cette déclaration,
    je vous en remercie

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Tu es débutant ? c'est ton premier projet Delphi ? Tu aurais du le préciser

    Il y a plein d'exemple sur le Forum que j'ai déjà fourni sur l'utilisation de ExtractStrings ou ExplodeLazy
    ExtractStrings pour un débutant, l'astuce du transtypage du PChar et l'utilisation des [] pour définir un ensemble de char,
    ce n'est pas un cadeau mais a l'avantage d'être inclut dans la RTL !

    Pour ExplodeLazy, je fourni le code avec un cartouche décrivant les paramètres, c'est une fonction extrêmement simple à utiliser !
    Là, tu aurais dû réussir !

    Pense à déclarer ExplodeLazy avant de l'utiliser, le plus élégant serait de créer une unité dédiée à tes traitements de chaine et de l'inclure dans les uses !

    Avant de te lancer dans l'analyse SQL, il faudrait mieux maîtriser les classes de la RTL comme la TStringList !

    Déjà, il faut inclure l'unité Types qui existe en Delphi 6 puis que mon code a été utilisé en D6 et D7 !

    ExplodeLazy remplit un tableau, il faut le recopier !

    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
    var
      Fields: TStringDynArray; 
     
    SQLText := q_procura1.SQL.Text;
    iSelect := Pos('SELECT ', SQLText);
    if iSelect > 0 then
    begin
      iFrom := Pos(' FROM ', SQLText);
      iSelect := iSelect + Length('SELECT ');
     
      if (iFrom > iSelect) then 
      begin
        FieldsText := Copy(SQLText, iSelect, iFrom - iSelect);
        if ExplodeLazy(FieldsText, Fields, ',') > 0 then
          for i := Low(Fields) to High(Fields) do
            CBox_Search1.Items.Add(Trim(Fields[i]));
     
      end;   
    end;
    Tu aussi utiliser ExplodeLazyToStrings

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if (iFrom > iSelect) then 
      begin
        FieldsText := Copy(SQLText, iSelect, iFrom - iSelect);
        ExplodeLazyToStrings(FieldsText, CBox_Search1.Items, ',');
      end;
    très proche mais plus simple qu' avec ExtractStrings

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if (iFrom > iSelect) then 
      begin
        FieldsText := Copy(SQLText, iSelect, iFrom - iSelect);
        ExtractStrings([','], [], PChar(FieldsText), CBox_Search1.Items);
      end;

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    Re Bonjour ShaoLeTroll,

    Oui débutant sorry,

    j ai lue dans le forum que ExplodeLazy étais le plus rapide, de là ma curiosité de le voir tourné, et je pense il est de vous le code.

    si je comprends,
    je dois écrire un code dans une UNIT et l enregistrée comme ExplodeLazy,
    la déclarer et puis l utiliser dans l appli…

    mais quel code que je dois écrire? Sorry, Là je bloque !!!
    est ce que comme j ai détaillé c est juste ? la procédure a suivre, ci haut?

    merci encore.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    ExtractStrings a un défaut à mon avis c'est que les retour-charriot et les guillemets sont gérés comme séparateur, c'était la raison de faire mon propre Explode

    ExplodeLazy, oui c'est de moi, la fonction fait strictement le découpage sur le séparateur demandé sans fioriture et est optimisé pour D7 (sans FastMM)

    C'est les bases de base !

    Guide Pascal et Delphi
    IV. Premiers pas, découverte de Delphi
    IV-D. Notions de base de la programmation sous Delphi
    IV-D-1. La notion de projet


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    unit MyStrUtils;
     
    interface
     
    uses Types;
     
    function ExplodeLazy(const S: string; out A: Types.TStringDynArray; Separator: Char): Integer;
     
    implementation
     
    {* -----------------------------------------------------------------------------
    la fonction ExplodeLazy retourne un tableau de chaînes. Ce sont les sous-chaînes, extraites de S, en utilisant le séparateur Separator.
    @param S Chaine à découper
    @param A Tableau de Chaine qui recevra la découpe
    @param Separator Caractère qui délimitent une chaine pour la découpe
    @return Nombre de Séparateur Trouvé (peut-être différent du nombre de chaine dans A !)
    ------------------------------------------------------------------------------ }
    function ExplodeLazy(const S: string; out A: Types.TStringDynArray; Separator: Char): Integer;
    var
      I, J, K: integer;
      iLenS: integer;
    begin
      iLenS := Length(S);
     
      if iLenS = 0 then
      begin
        SetLength(A, 1);
        Result := 0;
        A[Result] := '';
        Exit;
      end;
     
      Result := 0;
      for I := 1 to iLenS do
        if S[I] = Separator then
          Inc(Result);
     
      if S[iLenS] = Separator then
        SetLength(A, Result)
      else
        SetLength(A, Result + 1);
     
      K := 1;
      J := 0;
      for I := 1 to iLenS do
        if S[I] = Separator then
        begin
          if K <> I then
            A[J] := Copy(S, K, I - K);
     
          Inc(J);
          K := I + 1;
        end;
      if K <= iLenS then
        A[J] := Copy(S, K, MaxInt);
    end;
     
    end.
    Faudrait vraiment apprendre les bases, on est pas là pour te faire un cours magistral en Delphi mais pour apporter des solutions techniques à des problèmes précis !

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Points : 47
    Points
    47
    Par défaut
    Bonjour a tous,

    Je tiens à remercier tous ceux qui on bien voulut m’aider.

    Merci a vous tous,
    je continue mes lectures

    810mcu

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

Discussions similaires

  1. Récupérer un champ sélectionner et le transmettre
    Par lodan dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/08/2006, 23h45
  2. Session problème de récupération d'un champ
    Par dunbar dans le forum Langage
    Réponses: 6
    Dernier message: 13/07/2006, 16h44
  3. Réponses: 6
    Dernier message: 26/01/2006, 00h01
  4. [TIBSQL] Problème de récupération d'un champs
    Par TitiFr dans le forum Bases de données
    Réponses: 6
    Dernier message: 07/08/2005, 13h33
  5. Récupération d'un champs
    Par gibet_b dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/07/2004, 11h19

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