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 requête selection


Sujet :

Delphi

  1. #21
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    nabil je sais, je l'ai bien dis

    Citation Envoyé par edam Voir le message
    dans tout les cas, tu as pris ta procédure de l'autre siècle et tu la mis tel quel, hhhhhhh
    il y a mieux à faire et aidons notre copain, non!!?
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  2. #22
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    salut,

    Pour afficher le résultat de la procédure de Serge et de Ph. B. dans la requête sans passer par une ListBox, faut-il ajouter un champ à la Query (à la conception) ou dans la table et ensuite faire un Select de ce champ qui servira à regrouper ces intervalles des Id_clients ?

    Rapellons-nous que l'objectif est :

    Localité: les "Id" qui vont avec


    @+

    NAbil

  3. #23
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    bon , j'avais du temps libre
    essayes quand même de comprendre le code , avant de faire un copier coller bête

    @philippe : si tu veux chercher la petite bête , je suis sur que tout n'est pas encore optimum

    ici , le résultat sera mis dans un mémo (resultmemo) , une ligne par localité

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT LOCALITE,NUMERO FROM CLIENTS ORDER BY LOCALITE,NUMERO
    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
     
    procedure TForm1.TestBtnClick(Sender: TObject);
    var wloc : String;   // localité en cours
         wNum: Integer;  // numero en cours
         sNum : Integer;  // debut de la suite
         LigneMemo : String; // resultat pour une localité
     
        // mise en forme de la ligne
        procedure ModifierLigne;
        var t : integer;   // utilisée pour le cas du EOF
        begin
         t:=Query1NUMERO.asInteger-Wnum;
         if Query1.EOF then t:=-1;  // force t a -1
     
         case t of
         0 : begin
             if Length(Lignememo)= Length(Wloc)
                 then LigneMemo:=Lignememo+' '+Inttostr(WNum)
                 else LigneMemo:=Lignememo+','+Inttostr(WNum) ;
             snum:=wnum;
             end;
         1 : Wnum:=Query1NUMERO.asInteger;
         -1 : if snum<>wnum then lignememo:=Lignememo+'...'+Inttostr(wnum);
         else begin
               if snum=wnum then Lignememo:=Lignememo+', '
               else Lignememo:=Lignememo+'...'+inttostr(wnum)+', ';
                wNum:=Query1NUMERO.asInteger;
                sNum:=Query1NUMERO.asInteger;
                Lignememo:=Lignememo+Inttostr(WNum);
              end;
         end;
        end;
     
    begin
    Resultmemo.Clear;
    Query1.Active:=True;
    wNum:=0;
    wLoc:='';
    while not Query1.Eof do
     begin
       if Wloc<>Query1LOCALITE.AsString then
        begin
          if WNum>0 then ResultMemo.Lines.Add(LigneMemo);
          wloc:=Query1LOCALITE.AsString;
          sNum:=Query1NUMERO.asInteger;
          wNum:=Query1NUMERO.asInteger;
          LigneMemo:=wloc;
        end;
       ModifierLigne;
       Query1.Next;
     end;
     ModifierLigne;
     ResultMemo.Lines.Add(LigneMemo);
     Query1.Active:=false;
    end;
    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. #24
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    bon , j'avais du temps libre
    essayes quand même de comprendre le code , avant de faire un copier coller bête

    @philippe : si tu veux chercher la petite bête , je suis sur que tout n'est pas encore optimum
    Taquin !
    Plus sérieusement, je laisse @NABIL74 travailler un peu et reprendre la piste que j'avais donnée au début de la discussion ou exploiter la votre...
    A ce titre, j'ai tendance à ignorer les sollicitations d'assistance de ce type faites par messagerie privée.
    Philippe.

  5. #25
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    bon , j'avais du temps libre
    essayes quand même de comprendre le code , avant de faire un copier coller bête
    Bonjour à tous,

    Merci pour le temps que tu as consacré à ce souci !

    Oui, j'ai toujours pris note de tes conseils.

    Mais là Serge t'es une bête

    Le code fonctionne correctement,c'est ça ce que je voulais.

    Une question, est-il possible avec cette procédure d'afficher le résultat de la procédure dans la Query sans passer par un TMemo? Car je dois faire un état qui englobe tout et bien sûr par la suite l'imprimé.

    Merci encore.

    @+

    Nabil

  6. #26
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    Une question, est-il possible avec cette procédure d'afficher le résultat de la procédure dans la Query sans passer par un TMemo?
    c'est clairement non , sauf a passer par une table temporaire du genre
    Table TEMP
    LOCALITE String
    MEMO blob
    j'aurais certainement dit autrement s'il s'était agit d'une base Firebird (d'ailleurs je l'ai déjà dit ) Cela aurait été un bon exemple d'utilisation de procédure récursives et d'utilisation de lanction LIST je pense . Si j'ai encore du temps a perdre (et que ce n'est pas déjà fait), je pense que j'essaierai !

    mais il est toujours possible d'imprimer directement le memo , ou de passer par des evenements de calcul pour chaque Localité . Tout dépend du générateur utilisé
    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

  7. #27
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    c'est clairement non , sauf a passer par une table temporaire du genre
    Oui, c'est ça que je voulais éviter avant que je pose ma question. Passer par une Table temporaire et puis insérer les enregistrements et par la suite, faire le traitement voulu (ça serait fait par une requête Sélection + un Union, ou un Left Join je pense).

    J'ai déjà crée il y a quelques temps une Table temporaire qui contient les champs: Localite (string [200]), IDS_Clients(Memo).

    Citation Envoyé par SergioMaster Voir le message
    mais il est toujours possible d'imprimer directement le memo , ou de passer par des evenements de calcul pour chaque Localité . Tout dépend du générateur utilisé
    ça c'est une autre paire de manches Serge.

    Mon générateur est ReportBuilder.

    Dans mon état, il y a deux colonnes : une pour la localité et l'autre pour les Id_clients.

    il faut donc copier à partir de chaque ligne:
    les mots de chaque localité (ex:Nantes) dans la 1ère colonnes et les ID correspondant dans la 2ème colonne.


    A+

    Nabil

  8. #28
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    Mon générateur est ReportBuilder.
    évidemment celui là je connais pas !

    pour ce qui est de mettre le résultat en table temporaire par contre c'est très facile , il suffit de modifier légèrement le code

    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
    59
    60
    61
    62
    63
    procedure TForm1.TestBtnClick(Sender: TObject);
    var wloc : String;   // localité en cours
         wNum: Integer;  // numero en cours
         sNum : Integer;  // debut de la suite
         LigneMemo : String; // resultat pour une localité
     
        // mise en forme de la ligne
        procedure ModifierLigne;
        var t : integer;   // utilisée pour le cas du EOF
        begin
         t:=Query1NUMERO.asInteger-Wnum;
         if Query1.EOF then t:=-1;  // force t a -1
     
         case t of
         0 : begin
             if Length(Lignememo)=0
                 then LigneMemo:=Inttostr(WNum)
                 else LigneMemo:=Lignememo+','+Inttostr(WNum) ;
             snum:=wnum;
             end;
         1 : Wnum:=Query1NUMERO.asInteger;
         -1 : if snum<>wnum then lignememo:=Lignememo+'...'+Inttostr(wnum);
         else begin
               if snum=wnum then Lignememo:=Lignememo+', '
               else Lignememo:=Lignememo+'...'+inttostr(wnum)+', ';
                wNum:=Query1NUMERO.asInteger;
                sNum:=Query1NUMERO.asInteger;
                Lignememo:=Lignememo+Inttostr(WNum);
              end;
         end;
        end;
    
        procedure insertligne;  
        begin
       // Query2 = INSERT INTO TABLETEMP(LOCALITE,LIGNE) VALUES (:LO,:LM)
        Query2.ParamByName('LO').asString:=wloc;
        Query2.ParamByName('LM').asString:=LigneMemo;
        Query2.ExecSQL; 
        end;
     
    begin
    Resultmemo.Clear;
    Query1.Active:=True;
    wNum:=0;
    wLoc:='';
    while not Query1.Eof do
     begin
       if Wloc<>Query1LOCALITE.AsString then
        begin
          if WNum>0 then insertligne;
          wloc:=Query1LOCALITE.AsString;
          sNum:=Query1NUMERO.asInteger;
          wNum:=Query1NUMERO.asInteger;
          LigneMemo:='';
        end;
       ModifierLigne;
       Query1.Next;
     end;
     ModifierLigne;
     insertligne;
     Query1.Active:=false;
    end;
    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

  9. #29
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    évidemment celui là je connais pas !

    pour ce qui est de mettre le résultat en table temporaire par contre c'est très facile , il suffit de modifier légèrement le code
    Salut à tous,

    @Serge : sans faire de pub, Report Builder est bon générateur d'état.

    Oui, c'est facile de mettre le résultat dans table temporaire et de le récupérer ensuite .

    Je n'ai pas Delphi là où je suis(au boulot. eh oui,dimanche c'est le début de semaine chez nous! ), donc je le testerai sûrement ce soir et je te dirai ce que ça donne mon ami.

    Mais c'est vrai Serge, "Paradox" c'est de la merde ,pardon pour ce mot
    c'est toujours limité en SQL, il y a plein de trucs qu'on peut pas faire sans parler des index qui sont pas à jour quand les tables sont endommagés. .Avant que je pose ma question sur le forum, j'ai déjà fait une recherche sur le net et j'ai bien sûr trouvé ton poste qui se rapport à la ma question mais sous Firdbird.

    enfin bon, merci encore.

    Nabil

  10. #30
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonjour à tous,

    @ Serge:

    ça marche bien sauf un petit détail dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    begin
       // Query2 = INSERT INTO TABLETEMP(LOCALITE,LIGNE) VALUES (:LO,:LM)
        Query2.ParamByName('LO').asString:=wloc;
    
       // "wloc" donne bien les Localités mais  "LigneMemo" 
    
    donne "Localité + numéros" alors qu'on a seulement  besoin  des numéros.   :mur:
    
        Query2.ParamByName('LM').asString:=LigneMemo;
        Query2.ExecSQL;
    A+

  11. #31
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    Bonjour à tous,

    @ Serge:

    ça marche bien sauf un petit détail dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    begin
       // Query2 = INSERT INTO TABLETEMP(LOCALITE,LIGNE) VALUES (:LO,:LM)
        Query2.ParamByName('LO').asString:=wloc;
    
       // "wloc" donne bien les Localités mais  "LigneMemo" donne "Localité + numéros" alors qu'on a seulement  besoin  des numéros. 
    
        Query2.ParamByName('LM').asString:=LigneMemo;
        Query2.ExecSQL;
    A+
    Euh ... est ce que tu comprends le code que t'as fournis Serge
    En regardant un minimum et en réfléchissant 2s on voit tout de suite où corriger.
    Une piste : regarde comment est renseigné LigneMemo plus haut dans le code.
    Modérateur Delphi

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

  12. #32
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Euh ... est ce que tu comprends le code que t'as fournis Serge
    En regardant un minimum et en réfléchissant 2s on voit tout de suite où corriger.


    un oubli de ma part , ça m'apprendra a faire du copier-coller pour corriger dessus .
    Néanmoins maintenant , c'est corrigé
    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

  13. #33
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    pour table temporaire je préfère Clientdataset, ou le composant proposé par Franck , mais aussi on peut imprimer directement dans report buider en utilisant les événements des champs
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  14. #34
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Euh ... est ce que tu comprends le code que t'as fournis Serge
    En regardant un minimum et en réfléchissant 2s on voit tout de suite où corriger.
    Une piste : regarde comment est renseigné LigneMemo plus haut dans le code.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case t of
         0 : begin
             if Length(Lignememo)= Length(Wloc)
                 then LigneMemo:=  Inttostr(WNum) ;  // j'ai effacé : Lignememo+' ' 
                // else LigneMemo:= Inttostr(WNum) ;
             snum:=wnum;
    C'est ok même pour l'insertion .

    Tu sais Serge, si je n'applique pas un tri des données, la procédure 'collecte' tous les ID_clients avec les localités qui lui correspondent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Query1.Active := False;
    Query1.SQL.Clear;
    Query1.SQL.Add(SELECT LOCALITE,NUMERO FROM CLIENTS ');
    Query1.SQL.Add(' ORDER BY LOCALITE,NUMERO');
    Query1.Active:=True;
    Mais quand ce tri est activer, elle loupe quelques ID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Query1.Active := False;
    Query1.SQL.Clear;
    Query1.SQL.Add(SELECT LOCALITE,NUMERO FROM CLIENTS  WHERE  Localite='''+DBEdit2.Text+''' ');
    Query1.SQL.Add(' ORDER BY LOCALITE,NUMERO');
    Query1.Active:=True;
    Le DBEdit2 est la Localite.

    Elle affiche seulement le début d'une série et pas sa fin
    Ex: Paris : 1,29-50,120-129,990-1020

    Le '1020' le loupe, elle m'affiche seulement '990'.
    c'est vraiment incompréhensible non !

    A+

    Nabil

  15. #35
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    holalala ...

    pourquoi n'y a t'il pas une table Client et une table Localité ?


    Table Clients :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    id_client, id_city, ...

    Table cities :

    1 : on bouffe moins de ressources pour stocker les id_client dans un champs non prévus pour ... au risque de se retrouver avec un champs de 42Peta-octet... :/
    2 : on simplifie les requêtes, le tris etc.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT cl.id_client, cl.name, ci.id_city, ci.name 
    FROM clients AS cl, cities AS ci
    WHERE cl.id_city=ci.id_city AND (autre condition) 
    ORDER BY ci.id_city, cl.id_client ASC

    et des group by et des count et des sum etc etc.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  16. #36
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    holalala ...

    pourquoi n'y a t'il pas une table Client et une table Localité ?


    Table Clients :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    id_client, id_city, ...

    Table cities :
    ça était comme ça au début.En réalité, J'ai la Table Clients avec les champs: id_client , Nom et prénom, Localité, téléphone,...

    Tu n'as pas bien compris mon souci, je veux détecter les trous des ID dans une série entière suivant chaque localité:Nantes : ID: 1,2,3,7 ,8,9,10,11, 25
    Je veux faire: 1-3, 7-11,25

    A+

  17. #37
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Si si j'avais compris, ce que je comprend pas c'est la finalité de trouver ces fameux trous ...

    pour moi ça raisonne comme un "se prendre la tête pour un truc inutile parce que mal foutus à la base".

    Tu t'embêterai moins a restructurer correctement que de chercher a faire "des trucs" qui te fond tourner en rond pour rien et au risque qu'a la fin d'une longue prise de tête infructueuse avec son lot de solutions improductives tu décide de refaire une structure correcte.

    Avec une telle structure, admettons que tu cherche ou est localisé le client 5 (à paris par exemple), et dans paris tu as '2-9,12-32'

    Tu fais quoi comme requête ?

    à part un truc imbuvable à base fonctions à la noix et de like bancale ?

    Et je parle même pas de la mise à jours de ce champs ... le mec qui en est à l'origine mériterais de bruler sur la stèle des sacrifices d'Oracle tiens...

    Après, oui, le coté défis est intéressant, pour ma part je ferai un traitement externe à base de delphi.

    Mais, ta base actuelle c'est le genre de truc que personne ne voudrais voir en Production.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  18. #38
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    Si si j'avais compris, ce que je comprend pas c'est la finalité de trouver ces fameux trous ...

    pour moi ça raisonne comme un "se prendre la tête pour un truc inutile parce que mal foutus à la base".

    Tu t'embêterai moins a restructurer correctement que de chercher a faire "des trucs" qui te fond tourner en rond pour rien et au risque qu'a la fin d'une longue prise de tête infructueuse avec son lot de solutions improductives tu décide de refaire une structure correcte.
    Bonjour à tous,

    @Dr.Who : je t'ai déjà dis que tu n'as pas bien pigé ce que je veux exactement, le but est dans un état de sortie (l'impression).

    je ne perd pas la tête pour un truc inutile.Voilà, admettant que dans une localité, j'ai 200 clients et qu'on veut imprimer chaque localité avec les ID_Clients.Tu remarquerais que ces Id vont prendre beaucoup d'espace :de 1 jusqu'à 200!
    Alors pourquoi pas les grouper comme :1-200 non?

    Citation Envoyé par Dr.Who Voir le message
    Avec une telle structure, admettons que tu cherche ou est localisé le client 5 (à paris par exemple), et dans paris tu as '2-9,12-32'

    Tu fais quoi comme requête ?

    à part un truc imbuvable à base fonctions à la noix et de like bancale ?
    Pour la recherche d'un client, on a pas besoin de cette procédure.Dans La Table Clients chaque enregistrement affiche un id_Client et sa localité, Un TEdit pour la recherche fera l'affaire.on tape '5' et on se pointe sur ce client.

    +A

    Nabil

  19. #39
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Elle affiche seulement le début d'une série et pas sa fin
    Ex: Paris : 1,29-50,120-129,990-1020

    Le '1020' le loupe, elle m'affiche seulement '990'.
    c'est vraiment incompréhensible non !
    non, cela veut simplement dire que le EOF est mal géré .
    c'est encore plus vrai de dire que tes modifications sont responsables de l'erreur. Pour preuve , le dernier code mettant le tout dans un memo donnait le résultat correct.

    1- je remarque que tu n'as pas fait la bonne correction

    2-
    le SQL avec un Where sur la Localité est une honte dans sa forme mais surtout dans le fond

    Code ça c'est pour la forme : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Query1.Active := False;
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT LOCALITE,NUMERO FROM CLIENTS  WHERE  Localite=:L');
    Query1.SQL.Add(' ORDER BY LOCALITE,NUMERO');
    Query1.ParambyName('L').asString:=DBEdit2.Text;
    Query1.Active:=True;

    pour le fond : s'il n'y a qu'une seule localité , alors il n'y a pas lieu d'utiliser le test sur le changement de localisation.

    3- en général quand on fait une édition ce n'est pas pour n'avoir qu'une seule ligne (donc dans notre cas une seule localité)

    je suis d'accord avec Dr Who sur la structure des tables bien que cela ne change rien à l'exercice. Ce genre d'exo était très en vogue en 1983 dans les écoles d'apprentissage a la programmation , a tel point que je voix encore le schéma de programmation (d'une méthode oubliée) dans ma tête . J'ai déjà également dit que Paradox n'etait certainement pas le meilleur choix bien que ce fut un très bon outil (au siècle dernier) quand les SGBD n'existaient pas encore.
    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

  20. #40
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    non, cela veut simplement dire que le EOF est mal géré .
    c'est encore plus vrai de dire que tes modifications sont responsables de l'erreur. Pour preuve , le dernier code mettant le tout dans un memo donnait le résultat correct.
    Serge: merci pour tes bonnes remarques.

    Oui c'est sûr que le EOF est mal géré car si on ajoute un ID_Client dont la Localité est la même pour la suite de série, il y est!

    ex: Paris :1,29-50,120-129,990-1020=> 1,29-50,120-129,990

    résultat ok après insertion:
    1,29-50,120-129,990[COLOR="rgb(46, 139, 87)"]-1020[/COLOR] , 2025


    je n'ai pas fait la bonne correction

    Citation Envoyé par SergioMaster Voir le message
    Code ça c'est pour la forme : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Query1.Active := False;
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT LOCALITE,NUMERO FROM CLIENTS  WHERE  Localite=:L');
    Query1.SQL.Add(' ORDER BY LOCALITE,NUMERO');
    Query1.ParambyName('L').asString:=DBEdit2.Text;
    Query1.Active:=True;
    J'ai essayé hier avec une requête paramétrée ,elle donne le même résultat que
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  Localite='''+DBEdit2.Text+'''
    Citation Envoyé par SergioMaster Voir le message
    je suis d'accord avec Dr Who sur la structure des tables bien que cela ne change rien à l'exercice. Ce genre d'exo était très en vogue en 1983 dans les écoles d'apprentissage a la programmation , a tel point que je voix encore le schéma de programmation (d'une méthode oubliée) dans ma tête . J'ai déjà également dit que Paradox n'etait certainement pas le meilleur choix bien que ce fut un très bon outil (au siècle dernier) quand les SGBD n'existaient pas encore.
    Oui, je suis tout à fait d'accord avec vous sur le choix de la BD Paradox, d'ailleurs je l'ai déjà dit.

    Au début de ce topic, j'ai dit que je veux améliorer une vieille application faite avec Paradox comme BD.

    Citation Envoyé par SergioMaster Voir le message
    pour le fond : s'il n'y a qu'une seule localité , alors il n'y a pas lieu d'utiliser le test sur le changement de localisation.
    Oui dans la mesure où on cherche à filtrer la query une une seul localité,
    mais dans le cas contraire ,on fait le Select déjà cité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Query1.Active := False;
    Query1.SQL.Clear;
    Query1.SQL.Add('SELECT LOCALITE,NUMERO FROM CLIENTS  WHERE  Localite=:L');
    Query1.SQL.Add(' ORDER BY LOCALITE,NUMERO');
    Query1.ParambyName('L').asString:=DBEdit2.Text;
    Query1.Active:=True;
    A+

Discussions similaires

  1. Problème requête SELECT condition WHERE string
    Par Glherbier dans le forum VBA Access
    Réponses: 3
    Dernier message: 27/10/2010, 18h43
  2. SQL Problème requête SELECT
    Par Seth_75 dans le forum Développement
    Réponses: 2
    Dernier message: 30/03/2009, 15h02
  3. Problème requête SELECT ORACLE
    Par vizlebiz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2008, 16h20
  4. Problème Requête SELECT sur champ texte
    Par arnaud_verlaine dans le forum WinDev
    Réponses: 5
    Dernier message: 02/10/2007, 21h19
  5. [SQL] Problème requête SELECT
    Par dolf13 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 04/07/2006, 23h54

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