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

 Delphi Discussion :

Problème de nombres de quotes


Sujet :

Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut Problème de nombres de quotes
    Bonjour,

    [Delphi Tokyo 10.2.3 VCL]

    Un de mes neurones a du lâché, car je tourne en rond depuis 14h00 sur ce truc !

    Soit un mémo lequel on saisi des codes (en l’occurrence des codes matières), un par ligne. Je cherche à transformer ce mémo en une clause SQL CODE IN (...)
    ce qui s'avérait simple
    je procéde par exemple ainsi
    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
     
    var s,s1 : String;
        l,n : integer;
    //    SL : TStringList;
    begin
    // SL:=TStringList.Create;
    // try
     n:=0;
     SelMatieres:='';
     for l:=0 to Matieres.Lines.Count-1 do
         begin
          S:=Trim(Matieres.Lines[l]);
          if Length(S)>0 then
           begin
             S:=LeftStr(s,5);
             if n>0 then SelMatieres:=SelMatieres+',';
    //         SL.Add(QuotedStr(s));
             SelMatieres:=SelMatieres+Format('%s',[QuotedStr(s)]);
             if n=0 then s1:=s;
             inc(n);
           end;
         end;
    //finally
    //  SelMatieres:=SL.CommaText; ou SelMatieres:=SL.DelimitedText;
    //  SL.Free;  
    //end;
    j'ai également tenté l'approche par une TStringList comme indiqué par les commentaires

    probléme, mon résultat a toujours trop de quotes !
    Citation Envoyé par mémo
    1445
    0865
    1713
    Citation Envoyé par Résultat
    '''1445''','''0865''','''1713'''
    => erreur SQL
    et si je met pas QuotedStr(s) bien évidement plus de Quotes et mon SQL est faux !

    attendu : '1445','0865','1713'

    notez que cette même routine fonctionne correctement en D3 !
    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
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    un truc rapide pour voir

    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
     
     n:=0;
     SelMatieres:='';
     for l:=0 to Matieres.Lines.Count-1 do
         begin
          S:=Trim(Matieres.Lines[l]);
          if Length(S)>0 then
           begin
             S:=LeftStr(s,5);
             if n>0 then SelMatieres:=SelMatieres+',';
             SelMatieres:=SelMatieres+Format('"%s"',[s]);
             if n=0 then s1:=s;
             inc(n);
           end;
         end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Re,

    j'y ai pensé mais la "0123" fait que le SQL plante avec 0123 colonne inconnue

    j'ai même poussé le bouchon en utilisant format('?%s?',[S]);
    puis en faisant un S:=StringReplace(S,'?',#39,[rfReplaceAll]);
    je me retrouve (encore) avec 2 ' mais un autre message d'erreur SQL nombre d'arguments incorrects !
    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
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    tu est sur du coup des colonne commençant par des chiffre ???
    je suis surpris
    en règle générale je fait un truc de ce genre
    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
     
      SelMatieres:='';
       for l:=0 to Matieres.Lines.Count-1 do
       begin
         S := Trim(Matieres.Lines[l]);
         if trim(S) <> '' then
         begin
           StrChp := LeftStr(s,5);
    	   if trim(StrChp) Then 
    	   begin
                 if Trim(SelMatieres) = '' Then 
    	       SelMatieres:=Format('_%s',[StrChp]) 
    	     else
                   SelMatieres:=SelMatieres+Format(',_%s',[StrChp]);
    	   end;   
             end;
          end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Re,

    Non, non, pas de nom de colonnes commençant par des chiffres (j'suis pas encore sénile )

    cette partie doit s'inclure dans une instruction de la forme
    MacroWhere:= ' WHERE CODE IN ('+selmatieres+'); ( c'est une utilisation des macros de Firedac)
    Query.MacroByName('W').asRaw:=MacroWhere;

    étrangement voici mon dernier test :

    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
     
    var s,s1 : String;
        l,n : integer;
        SL : TStringList;
    begin
     n:=0;
     SelMatieres:='';
     SL:=TStringList.Create;
     try
      SL.QuoteChar:=#0;
      for l:=0 to Matieres.Lines.Count-1 do
         begin
          S:=Trim(Matieres.Lines[l]);
          if Length(S)>0 then
           begin
             S:=LeftStr(s,5);
             SL.Add(QuotedStr(S));
             if n=0 then s1:=s;
             inc(n);
           end;
         end;
    finally
      SelMatieres:=SL.DelimitedText;
      showmessage(Selmatieres);
      SL.Free;
    end;
    showmessage me montre un truc correct
    '1234','12345','0865'
    la concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MacroWhere:= ' WHERE CODE IN ('+selmatieres+');
    je me reprend les doubles '
    WHERE CODE IN (''1234'',''12345'',''0865'')
    comme si il y avait un helper qui doublait !
    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
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    elle ressemble a quoi ta requête de base ?
    tu n'aurais pas un truc du genre
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pour répondre à cette dernière question, non il n'y a rien de semblable.
    Tout à fait en fin de soirée mon neurone semble s'être rebranché du coup j'ai trouvé d'où venait l'erreur "nombre d'arguments incorrects" qui s'était glissé !
    Le dernier code fonctionne donc correctement l'astuce avec la StringList (je me demande si je devait pas remplacer par un TList<String> ) est dans le SL.QuoteChar:=#0;un autre truc qui semble m'avoir échappé est la présentation des valeurs chaines via le débogueur, je ne faisait pas attention mais la même valeur avec le showmessage se faisait sans double '.

    En conclusion, une tempête dans un verre d'eau due à un neurone défaillant
    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

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

Discussions similaires

  1. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28
  2. [SQL-Server] Problèmes de guillemets et quotes dans un INSERT
    Par gregb34 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/05/2006, 09h40
  3. Problème de nombre de caractères max dans Listbox
    Par jojoestpetit dans le forum Access
    Réponses: 1
    Dernier message: 09/04/2006, 11h39
  4. problème avec nombre au niveau forms
    Par momo9237 dans le forum Oracle
    Réponses: 2
    Dernier message: 08/11/2005, 18h22
  5. Réponses: 1
    Dernier message: 11/10/2004, 10h47

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