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 :

Tri doublons requête SQL


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 28
    Points
    28
    Par défaut Tri doublons requête SQL
    Bonjour,

    J'aimerai bien un peu d'aide pour la réflexion que j'ai à fournir pour réussir à coder mon programme (ca fait un p'tit bout de temps, j'ai un peu de mal à me remettre dans le bain ) :

    J'ai une base de donnée avec une seule table contenant différents champs :

    Je voudrais faire un module avec des combobox qui permette de pouvoir rechercher les infos sans doublons lors de l'affichage du résultat

    exemple :

    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
    //////////////////////////////////   Recherche par reference
            SQLQuery1.Active:=False;
     
     
                if ComboBox3.Text = 'Selectionnez' then
                    // ben rien :)
                  else
                    begin
                    SQLQuery1.SQL.Clear;
                    SQLQuery1.SQL.Text:='SELECT *FROM TableDossiers'+' WHERE ref = ' + QuotedStr(ComboBox3.Items.Strings[ComboBox3.ItemIndex]);
     
     
                     SQLQuery1.Active:=True;
                     SQLQuery1.First;
                     if (SQLQuery1.RecordCount > 0) then
                       begin
     
                          While not  SQLQuery1.Eof do
                            begin
                              ListBox1.Items.Add(SQLQuery1.FieldByName('annee').AsString);
                              ListBox2.Items.Add(SQLQuery1.FieldByName('modele').AsString);
                              ListBox3.Items.Add(SQLQuery1.FieldByName('langue').AsString);
                              ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString);
                              ListBox5.Items.Add(SQLQuery1.FieldByName('quantite').AsString);
                              ListBox6.Items.Add(SQLQuery1.FieldByName('NomDossiers').AsString);
                              ListBox7.Items.Add(SQLQuery1.FieldByName('Id_Dossier').AsString);
                              SQLQuery1.Next;
                            end;
                        end;
                        SQLQuery1.Active:=False;
                      end;
    ///////////////////////////////////////
     
     //////////////////////////////////   Recherche par modèle
                //SQLQuery1.SQL.Clear;
                SQLQuery1.Active:=False;
                if ComboBox2.Text = 'Selectionnez' then
                    // ben rien :)
                  else
                    begin
                     SQLQuery1.SQL.Clear;
                     SQLQuery1.SQL.Text:='SELECT *FROM TableDossiers'+' WHERE modele ='  + QuotedStr(ComboBox2.Items.Strings[ComboBox2.ItemIndex]);
                     SQLQuery1.Active:=True;
                     SQLQuery1.First;
                     if (SQLQuery1.RecordCount > 0) then
                       begin
                          While not  SQLQuery1.Eof do
                            begin
                              ListBox1.Items.Add(SQLQuery1.FieldByName('annee').AsString);
                              ListBox2.Items.Add(SQLQuery1.FieldByName('modele').AsString);
                              ListBox3.Items.Add(SQLQuery1.FieldByName('langue').AsString);
                              ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString);
                              ListBox5.Items.Add(SQLQuery1.FieldByName('quantite').AsString);
                              ListBox6.Items.Add(SQLQuery1.FieldByName('NomDossiers').AsString);
                              ListBox7.Items.Add(SQLQuery1.FieldByName('Id_Dossier').AsString);
                              SQLQuery1.Next;
                            end;
                       end;
                       SQLQuery1.Active:=False;
                    end;
     
    ///////////////////////////////////////

    Ces deux bouts de code permettent de chercher dans la table les infos demandés mais si une référence et un modèle sont identiques la ligne sera affichée deux fois.

    J'ai pensé récupérer les ID dans une autre ListBox et de les filtrer et ensuite de refaire une requête avec les ID "rafraîchis" pour ensuite les afficher...

    Y'a t'il une autre solution ?

    En vous remerciant grandement par avance

    inc002

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    si j'ai bien compris tu veux afficher une listebox sans doublon;
    j'ai en revanche pas bien compris si les doublon etait sur la ref ou sur le modele OU sur la ref et le modele

    // tu trie tes resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLQuery1.SQL.Text:='SELECT * FROM TableDossiers'+' WHERE modele ='  + QuotedStr(ComboBox2.Items.Strings[ComboBox2.ItemIndex]) + ' order by ref,modele;';
    losque tu rempli ta combo

    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
    While not  SQLQuery1.Eof do
    begin
      if (oldRef <> SQLQuery1.FieldByName('ref').AsString) and (oldModele <> SQLQuery1.FieldByName('modele').AsString) then
      begin
        ListBox1.Items.Add(SQLQuery1.FieldByName('annee').AsString);                            
        ListBox2.Items.Add(SQLQuery1.FieldByName('modele').AsString);                          
        ListBox3.Items.Add(SQLQuery1.FieldByName('langue').AsString);                          
        ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString);                          
        ListBox5.Items.Add(SQLQuery1.FieldByName('quantite').AsString);                          
        ListBox6.Items.Add(SQLQuery1.FieldByName('NomDossiers').AsString);                            
        ListBox7.Items.Add(SQLQuery1.FieldByName('Id_Dossier').AsString);
        oldref :=   ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString;
        oldmodele :=   ListBox4.Items.Add(SQLQuery1.FieldByName('modele').AsString; 
      end;
      SQLQuery1.Next;
    end;
    voila la soluce la plus basique

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Merci Caesarus pour ta rapidité de réponse (désolé du lapsus )

    Pour t'expliquer clairement j'ai une 5 champs dans ma table
    (annee,modele,langue,ref,quantite)

    et j'ai des combobox qui se "remplissent" via la db avec les infos qu'elle contient.

    pour l'instant, lorsque l'on recherche via les combobox une langue "Francais" avec une ref "1418" il m'affiche dans les listbox deux résultats avec un qui contient Francais et l'autre qui content 1418 au lieu de me dire que l'enregistrement que je recherche N'existe Pas
    (qui content donc ET 1418 ET francais)
    Ais-je été suffisamment clair ?

    Merci encore

    inc002

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    alors si j'ai tout saisi ^^
    Tu as 5 combo qui filtre tes resultats.

    tu selectionnes français dans langue et dans tu selectionne ref 1418
    tu veux les resultats qui contiennent les deux criteres (dans une autre liste).

    eh bien en fonction de tes combos selectionnées tu crée ta requete de resultat (donc sur le onchange de chacune);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    addClauseWhere := ' Where ';
     
    if comboXXX.itemIndex > -1 then
      addClauseWhere := addClauseWhere + ' NomChampCorrespondant = ' + comboXXX.Items.Strings[comboXXX.itemIndex] +' AND ';
    // tu multiplie par le nombre de combo 
     
    AddClauseWhere := copy(addclauseWhere,0,length(addclauseWhere)-5);
    // supprime les 5 dernieres Lettres 'AND' et si aucune combo le 'Where'
     
    MaRequete := 'Select * from DOSSIER ' + addclauseWhere + ';';
     
    //tu execute ta requete et tu charge ta liste



    voilou

    c'est de tête donc pardonne les eventuelles erreurs de syntaxe, mais le systeme est la.

    PS : moi c caesarus pas claudius lol

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Désolé encore pour le lapsus de tout à l'heure, j'ai édité

    J'ai bien compris la démarche mais suis-je obligé de déclarer "AddClauseWhere" en tant que variable globale ? parce que dans le OnChange je vais me retrouver avec une valeur différente à chaque fois et une seule valeur finale en retour (la dernière en l'occurrence)

    Je joins un bout de code au post pour que vous puissiez m'expliquer dans la logique comment cela s'applique

    Merci beaucoup

    inc002

    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
    if ComboBox6.Text = 'Selectionnez' then
                    // ben rien :)
                else
                  begin
                  SQLQuery1.SQL.Clear;
                  SQLQuery1.SQL.Text:='SELECT *   FROM TableDossiers'+' WHERE NomDossiers = ' + QuotedStr(ComboBox6.Items.Strings[ComboBox6.ItemIndex]){+'JOIN SELECT NomDossier FROM NomDossiers WHERE Id_NomDossier = ' + IntToStr(ComboBox1.ItemIndex) };
     
     
                 SQLQuery1.Active:=True;
                 SQLQuery1.First;
                 if (SQLQuery1.RecordCount > 0) then
                   begin
     
                      While not  SQLQuery1.Eof do
     
                        begin
                          ListBox1.Items.Add(SQLQuery1.FieldByName('annee').AsString);
                          ListBox2.Items.Add(SQLQuery1.FieldByName('modele').AsString);
                          ListBox3.Items.Add(SQLQuery1.FieldByName('langue').AsString);
                          ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString);
                          ListBox5.Items.Add(SQLQuery1.FieldByName('quantite').AsString);
                          ListBox6.Items.Add(SQLQuery1.FieldByName('NomDossiers').AsString);
                          ListBox7.Items.Add(SQLQuery1.FieldByName('Id_Dossier').AsString);
                          SQLQuery1.Next;
                        end;
                    end;
                    SQLQuery1.Active:=False;
                   end;

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    non ^^ tu mets tjrs la meme procedure dans le onChange de tt les combo

    tu multiplie parcontre cette partie :

    if comboXXX.itemIndex > -1 then
    addClauseWhere := addClauseWhere + ' NomChampCorrespondant = ' + quotedstr(comboXXX.Items.Strings[comboXXX.itemIndex]) +' AND ';

    pour ttes les combo que tu as en mettant bien le nom de la combo et le champ associé, je remarque que j'avais oublié la fonction quotedStr pour mettre entre quote la valeur (seulement pour les champs string, date)

    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
     
    AddClauseWhere = ' Where ';
    if ComboBox6.Text <> 'Selectionnez' then
    AddClauseWhere := AddClauseWhere + 'NomDossiers = ' + QuotedStr(ComboBox6.Items.Strings[ComboBox6.ItemIndex]) + ' AND ';
     
    if ComboBox5.Text <> 'Selectionnez' then
    AddClauseWhere := AddClauseWhere + 'quantite= ' + QuotedStr(ComboBox5.Items.Strings[ComboBox5.ItemIndex]) + ' AND ';
     
     
    if ComboBox4.Text <> 'Selectionnez' then
    AddClauseWhere := AddClauseWhere + 'ref= ' + QuotedStr(ComboBox4.Items.Strings[ComboBox4.ItemIndex]) + ' AND ';
     
    ...Etc
     
    AddClauseWhere := copy(addclauseWhere,0,length(addclauseWhere)-5);
    // supprime les 5 dernieres Lettres 'AND' et si aucune combo le 'Where'
     
                  SQLQuery1.SQL.Clear;
                  SQLQuery1.SQL.Text:='SELECT *   FROM TableDossiers'+AddClauseWhere + QuotedStr(ComboBox6.Items.Strings[ComboBox6.ItemIndex]){+'JOIN SELECT NomDossier FROM NomDossiers WHERE Id_NomDossier = ' + IntToStr(ComboBox1.ItemIndex) };
     
     
                 SQLQuery1.Active:=True;
                 SQLQuery1.First;
                 if (SQLQuery1.RecordCount > 0) then
                   begin
     
                      While not  SQLQuery1.Eof do
     
                        begin
                          ListBox1.Items.Add(SQLQuery1.FieldByName('annee').AsString);
                          ListBox2.Items.Add(SQLQuery1.FieldByName('modele').AsString);
                          ListBox3.Items.Add(SQLQuery1.FieldByName('langue').AsString);
                          ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString);
                          ListBox5.Items.Add(SQLQuery1.FieldByName('quantite').AsString);
                          ListBox6.Items.Add(SQLQuery1.FieldByName('NomDossiers').AsString);
                          ListBox7.Items.Add(SQLQuery1.FieldByName('Id_Dossier').AsString);
     
    // ->> ca serais pas mieux d'utiliser une grille ?
     
                          SQLQuery1.Next;
                        end;
                    end;
                    SQLQuery1.Active:=False;
                   end;
    si tu veux eviter le chargement si il selectionne 'selectionnez'

    if (Sender as TComboBox).TEXT = selectionnez then exit
    // compare le texte de la combo qui appelle la fonction (parametre sender)

    le souci c'est si l'utilisateur veux deselectionner la langue .... ca rechargera pas ta liste

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    J'aurais besoin d'une peu plus d'explication s'il vous plaît :s

    J'ai déclaré la variable addClauseWhere en globale : string;

    J'ai mi en application ceci dans l'evenement OnChange

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    procedure TForm2.ComboBox1Change(Sender: TObject);
     
    begin
      addClauseWhere := ' Where ';
     
    if comboBox1.itemIndex > -1 then
      begin
        addClauseWhere := addClauseWhere + ' annee = ' + comboBox1.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' modele = ' + comboBox2.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' ref = ' + comboBox3.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' langue = ' + comboBox4.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' NomDossiers = ' + comboBox6.Items.Strings[comboBox1.itemIndex] +' AND ';
        // tu multiplie par le nombre de combo
     
      end;
     
    end;
     
    procedure TForm2.ComboBox2Change(Sender: TObject);
    begin
      if comboBox2.itemIndex > -1 then
      begin
        addClauseWhere := addClauseWhere + ' annee = ' + comboBox1.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' modele = ' + comboBox2.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' ref = ' + comboBox3.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' langue = ' + comboBox4.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' NomDossiers = ' + comboBox6.Items.Strings[comboBox1.itemIndex] +' AND ';
        // tu multiplie par le nombre de combo
     
      end;
    end;
     
    procedure TForm2.ComboBox3Change(Sender: TObject);
    begin
      if comboBox1.itemIndex > -1 then
      begin
        addClauseWhere := addClauseWhere + ' annee = ' + comboBox1.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' modele = ' + comboBox2.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' ref = ' + comboBox3.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' langue = ' + comboBox4.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' NomDossiers = ' + comboBox6.Items.Strings[comboBox1.itemIndex] +' AND ';
        // tu multiplie par le nombre de combo
     
      end;
    end;
     
    procedure TForm2.ComboBox4Change(Sender: TObject);
    begin
      if comboBox1.itemIndex > -1 then
      begin
        addClauseWhere := addClauseWhere + ' annee = ' + comboBox1.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' modele = ' + comboBox2.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' ref = ' + comboBox3.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' langue = ' + comboBox4.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' NomDossiers = ' + comboBox6.Items.Strings[comboBox1.itemIndex] +' AND ';
        // tu multiplie par le nombre de combo
     
      end;
    end;
     
    procedure TForm2.ComboBox6Change(Sender: TObject);
    begin
      if comboBox1.itemIndex > -1 then
      begin
        addClauseWhere := addClauseWhere + ' annee = ' + comboBox1.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' modele = ' + comboBox2.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' ref = ' + comboBox3.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' langue = ' + comboBox4.Items.Strings[comboBox1.itemIndex] +' AND ';
        addClauseWhere := addClauseWhere + ' NomDossiers = ' + comboBox6.Items.Strings[comboBox1.itemIndex] +' AND ';
        // tu multiplie par le nombre de combo
     
      end;
    end;
    et j'ai exécuté la requête de cette façon (dans un bouton, on OnClick)

    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
    SQLQuery1.Active:=False;
                 AddClauseWhere := copy(addclauseWhere,0,length(addclauseWhere)-5);
                 // supprime les 5 dernieres Lettres 'AND' et si aucune combo le 'Where'
                 MaRequete := 'Select * from TableDossiers ' + addclauseWhere ;
                 SQLQuery1.SQL.Clear;
                 SQLQuery1.SQL.Text:= MaRequete ;
                 SQLQuery1.Active:=True;
                 SQLQuery1.First;
                 if (SQLQuery1.RecordCount > 0) then
                   begin
     
                      While not  SQLQuery1.Eof do
     
                        begin
                          ListBox1.Items.Add(SQLQuery1.FieldByName('annee').AsString);
                          ListBox2.Items.Add(SQLQuery1.FieldByName('modele').AsString);
                          ListBox3.Items.Add(SQLQuery1.FieldByName('langue').AsString);
                          ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString);
                          ListBox5.Items.Add(SQLQuery1.FieldByName('quantite').AsString);
                          ListBox6.Items.Add(SQLQuery1.FieldByName('NomDossiers').AsString);
                          ListBox7.Items.Add(SQLQuery1.FieldByName('Id_Dossier').AsString);
                          SQLQuery1.Next;
                        end;
                    end;
                    SQLQuery1.Active:=False;
    Ou ais-je péché ? Si vous avez le temps de me repondre bien sur

    Merci encore

    inc002

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    ^^ tu as péché .... tu n'es pas assez une feignasse :p

    deja pas de variable globale
    deuxio ^^ comme je l'ai dit tu mets ComboBox1Change pour tout les onchange de chaque combo ( et pas a chaque fois une nouvelle fonction);
    3 le but de combo.itemIndex > -1 c'est d'etre sur que l'utilisateur a selectionné quelque chose ( ca vaut combo.text <> 'Selectionné' mais c plus propre
    donc pour ajouter un filtre tu test d'abord es ce que le gars a selectionner quelque chose avant de l'ajouter la clause where.

    par ex Comme tu as fait si le gars selectionne une langue (donc comboLangue.itemIndex > -1) ca filtre aussi par année : annee = 'selectionnez' ... ca va pas marcher terrible
    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
     
    procedure TForm2.ComboBox1Change(Sender: TObject);
    var
      addClauseWhere  : string;
    begin
      addClauseWhere := ' Where ';
     
    if comboBox1.itemIndex > -1 then
        addClauseWhere := addClauseWhere + ' annee = ' + comboBox1.Items.Strings[comboBox1.itemIndex] +' AND ';
    if comboBox2.itemIndex > -1 then
        addClauseWhere := addClauseWhere + ' modele = ' + comboBox2.Items.Strings[comboBox1.itemIndex] +' AND ';
    if comboBox3.itemIndex > -1 then
        addClauseWhere := addClauseWhere + ' ref = ' + comboBox3.Items.Strings[comboBox1.itemIndex] +' AND ';
    if comboBox4.itemIndex > -1 then
        addClauseWhere := addClauseWhere + ' langue = ' + comboBox4.Items.Strings[comboBox1.itemIndex] +' AND ';
    if comboBox6.itemIndex > -1 then
        addClauseWhere := addClauseWhere + ' NomDossiers = ' + comboBox6.Items.Strings[comboBox1.itemIndex] +' AND '; 
     
        // ou est passer la combo 5 ^^ ???
     
     
     SQLQuery1.Active:=False;
                 AddClauseWhere := copy(addclauseWhere,0,length(addclauseWhere)-5);
                 // supprime les 5 dernieres Lettres 'AND' et si aucune combo le 'Where'
                 MaRequete := 'Select * from TableDossiers ' + addclauseWhere ;// order ??
                 SQLQuery1.SQL.Clear;
                 SQLQuery1.SQL.Text:= MaRequete ;
                 SQLQuery1.Active:=True;
                 SQLQuery1.First;
                 if (SQLQuery1.RecordCount > 0) then
                   begin
     
                      While not  SQLQuery1.Eof do
     
                        begin
                          ListBox1.Items.Add(SQLQuery1.FieldByName('annee').AsString);
                          ListBox2.Items.Add(SQLQuery1.FieldByName('modele').AsString);
                          ListBox3.Items.Add(SQLQuery1.FieldByName('langue').AsString);
                          ListBox4.Items.Add(SQLQuery1.FieldByName('ref').AsString);
                          ListBox5.Items.Add(SQLQuery1.FieldByName('quantite').AsString);
                          ListBox6.Items.Add(SQLQuery1.FieldByName('NomDossiers').AsString);
                          ListBox7.Items.Add(SQLQuery1.FieldByName('Id_Dossier').AsString);
                          SQLQuery1.Next;
                        end;
                    end;
                    SQLQuery1.Active:=False;
    end;
    c'est bcp plus mieux :
    1 seule et unique fonction plutot que 1 par combo + 1 de chargement.
    = super feignasse

    ps : j'ai edit plusieurs fois (a chaque message relis au cas ou tu aurais loupé un truc)

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Merci pour ce compliment

    Malgré que mes professeurs me disais qu'il fallait toujours l'être

    J'ai appliqué cela comme il se doit donc à chaque fois que je sélectionne une langue par exemple, il s'affiche directement dans mes listbox la liste des produits correspondant à celle-ci (dû au OnChange) mais je ne vois pas comment je pourrais avoir le résultat escompté (à savoir pouvoir sélectionner plusieurs items dans mes combo et me débrouiller pour que j'arrive a avoir un résultat qui ne comporte que les ligne contenant les deux items séléctionnés ) j'ai donné aux ComboBox 2,3,4,6 le OnChange du combobox1.

    Merci encore de votre patience

    inc002

    EDIT : Lorsque un combobox est sélectionné, peu importe combo qui est activé c'est toujours la première valeur qui reviens

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Merci


    C'est bon mon problème est résolu, d'ailleurs ils se trouvent souvent entre la chaise et le clavier


    Bonne continuation et à bientôt !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 98
    Points : 72
    Points
    72
    Par défaut
    tu as bien 5 combo de filtre (chargées une fois) et en dessous 5 ou 6 listbox (chargées a chaque selection de filtre);

    hé bien normalement c bon :

    tu selectionne une langue ca t'affiche que les dossier qui on cette langue
    tu selectionne une année ca t'affiche que les dossier qui on cette année et cette langue

    comme lors du on change de la deuxieme combo
    combo1.itemIndex > -1 vu qu'on a selectionné la langue
    donc il va ajouter langue = 'XXX' AND
    puis comme combo2.itemIndex > -1 on vient de selectionné l'annee
    il va ajouter annee = 'XXXX'

    du coup addclauseWhere = ' Where langue = 'XXXX' AND annee = 'XXXX' AND '
    on retire les 5 dernieres lettres (le AND)

    ta requete ramene bien tout les enregistrement ou la langue = 'XXXX' et l'annee = 'XXXX'

    ainsi de suite pour chaque selection de combo

    en revanche .... je pense que tu devrais rajouter un combo.additem('Aucune langue',nil) au chargement des combos a chaque fois et changer les conditions combo.itemIndex > -1 par combo.itemIndex > 0
    pour permettre a l'utilisateur d'enlever le choix de langue (j'ai pris langue mais pareil pour tout tes criteres)

    tu peux aussi t'amuser a faire des tris en cascade : tu selectionne une langue
    et ca rempli tes combos avec les choix restant : si il n'y a pas d'année 1999 pour la langue francaise l'année 1999 ne sera pas dans la combo année.

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

Discussions similaires

  1. [AC-2000] Filtre/Tri et requête SQL
    Par DarkpaiN dans le forum IHM
    Réponses: 0
    Dernier message: 20/10/2010, 10h55
  2. Order du tri des requêtes SQL et optimisation
    Par grandelo dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/09/2010, 12h35
  3. Suppression doublons requête SQL
    Par dimferte dans le forum SQL
    Réponses: 6
    Dernier message: 02/12/2008, 10h02
  4. Requête SQL de tri par date
    Par Alain15 dans le forum Requêtes
    Réponses: 8
    Dernier message: 03/08/2006, 08h34
  5. Requête SQL pour afficher un tri
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2005, 15h27

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