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. #1
    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 Problème requête selection
    salut à tous,
    je tourne en rond depuis quelque temps sur une requête.

    Voilà, j'ai une Table 'Localité' dont les champs sont:
    -Id_Client.
    -Localité.

    Chaque Localité peux avoir un ou plusieurs 'Id_Clients'. Des fois Ces 'id' peuvent se suivre ,mais des fois non.
    exemple:
    -Localité : Paris => Id_Client: de '1' jusqu'à '10' , '65' , de '100' jusqu'à '106'.
    -Localité : Lyon => Id_Client: 125, 201, 206, de '230' => '235'.

    voici un exemple en image.

    http://imageshack.us/photo/my-images/818/exempleux.jpg

    merci.
    A+

    NABL74

  2. #2
    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
    Bonjour,
    Citation Envoyé par NABIL74 Voir le message
    je tourne en rond depuis quelque temps sur une requête.
    Je crains que vous ne tourniez encore longtemps en rond...
    On ne sait pas ce quel but vous cherchez à atteindre, ce que vous avez pu écrire, en quoi cela ne marche pas...
    Philippe.

  3. #3
    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 Ph. B. Voir le message
    Bonjour,
    Je crains que vous ne tourniez encore longtemps en rond...
    On ne sait pas ce quel but vous cherchez à atteindre, ce que vous avez pu écrire, en quoi cela ne marche pas...
    Bonjour,
    Eh oui Ph. B, je tourne en rond toujours cher ami

    Le but que je cherche à atteindre c'est de grouper les "Id_Client" s'il leurs "Id" se suivent.

    Par exemple :
    Dans la même localité, il y a les ID :de 1,2,3,4,5,6,....jusqu'à 200.
    Si dans un Etat (comme Report Builder ou autre), la colonne réservée pour les "Id" va prendre beaucoup d'espace non?

    Alors, je veux les regrouper comme ça: 1-200.c'est pour gagner de l'espace dans un Etat (Report Builder).

    J'ai essayé avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Select Localite, Min(Id_Client), Max(Id_Client)
    FROM Localité
    Where Localite=Localite
    mais ça na pas donné le résultat que j'espérais .

    -Localité : Paris => Id_Client: de '1' jusqu'à '200' , '65' ,90, de '300' jusqu'à '360'.
    je veux le faire comme ça:ID: 1-200 , 65 , 90 , 300-360.

    J'ignore si j'ai bien exposé mon problème ou non.

    Merci .
    @+

    NABIL74

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 656
    Points : 5 213
    Points
    5 213
    Par défaut
    A moins d'un script SQL, il n'est pas possible d'obtenir ce résultat surtout si les données sont dans la même tâble.

    La requête suivante te permettra de lister les localité et les client rattachés (par ordre croissant)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Localité, Id_Client FROM Localité ORDER BY Localité, Id_Client

    Ensuite, avec une simple iétration du peux faire le traitement que tu veux. Exemple avant la boucle tu initialise une variable temporaire avec une chaine vide et une variable dans laquelle tu inscrit la localité. Puisque c'est trié par localité tu peut tester si ta valeur temporaire est différente de la localité courante et ainsi tu sais que tu as changé de localité. Pour chaque localité trouvé tu liste les id des clients et à la fin tu la formate comme tu veux.

    PS : Un conseil, ne nomme pas un champ avec le même nom que la table et surtout EVITE LES CARACTERES ACCENTUES.

  5. #5
    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 popo Voir le message
    A moins d'un script SQL, il n'est pas possible d'obtenir ce résultat surtout si les données sont dans la même tâble.
    @ popo,
    oui les données sont dans la même table c'est ça qui est ennuyeux!

    pour la requête que tu m'as filé, je l'ai testée il y a quelques jours mais hélas!

    Citation Envoyé par popo Voir le message
    Ensuite, avec une simple iétration du peux faire le traitement que tu veux. Exemple avant la boucle tu initialise une variable temporaire avec une chaine vide et une variable dans laquelle tu inscrit la localité. Puisque c'est trié par localité tu peut tester si ta valeur temporaire est différente de la localité courante et ainsi tu sais que tu as changé de localité. Pour chaque localité trouvé tu liste les id des clients et à la fin tu la formate comme tu veux.
    C'est facile à dire de le faire pour moi

    je continue mes tests.

    @+

    NABIL74

  6. #6
    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 NABIL74 Voir le message
    Le but que je cherche à atteindre c'est de grouper les "Id_Client" s'il leurs "Id" se suivent.
    ...
    Ok, j'ai compris cette fois.
    Ce n'est pas faisable en l'état en une seule requête.
    Quel est le moteur de base de données ?
    Philippe.

  7. #7
    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 Ph. B. Voir le message
    Ok, j'ai compris cette fois.
    Ce n'est pas faisable en l'état en une seule requête.
    Quel est le moteur de base de données ?
    Bonsoir,

    @ Ph. B
    SGBD :paradox (Eh oui !en réalité, c'est une vieille application que je veux améliorer).

    Tu m'as dis que ce n'est pas faisable en l'état en une seule requête,si c'est possible en plusieurs requêtes, c'est pas grave,l'essentiel c'est que j'obtiens mon objectif.

    Merci.

    A+

    NABIL74

  8. #8
    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 NABIL74 Voir le message
    SGBD :paradox (Eh oui !en réalité, c'est une vieille application que je veux améliorer).
    C'est bien ce que je redoutais...
    Citation Envoyé par NABIL74 Voir le message
    Tu m'as dis que ce n'est pas faisable en l'état en une seule requête,si c'est possible en plusieurs requêtes, c'est pas grave,l'essentiel c'est que j'obtiens mon objectif.
    Si c'est Delphi 7 qui est utilisé, je bâtirais la solution comme suit :
    1. création d'un ClientDataSet avec la structure qui va bien pour le rapport, entre autre une colonne "RegroupId" de type string et dont la taille doit être définie en fonction des données (si trop petite, les informations seront tronquées...),
    2. parcours de la table pour identifier les regroupements et alimenter le ClientDataSet,
    3. transmission du ClientDataSet au rapport pour édition.

    Le ClientDataSet serait en mémoire, aussi si le volume de données est trop important, il faudra plutôt envisager une table temporaire Paradox.
    Mais il y a peut être une solution plus fine, à réfléchir...
    Philippe.

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    J'ai dans mes archives un programme (une fonction) qui listait les "trous" de facturations , en fait la fonction inverse de celle recherchée, mais je peux toujours la retrouver pour donner une idée .

    je mettais les résultats dans un Memo tout bête ^^
    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

  10. #10
    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 Ph. B. Voir le message
    C'est bien ce que je redoutais...

    Si c'est Delphi 7 qui est utilisé, je bâtirais la solution comme suit :
    1. création d'un ClientDataSet avec la structure qui va bien pour le rapport, entre autre une colonne "RegroupId" de type string et dont la taille doit être définie en fonction des données (si trop petite, les informations seront tronquées...),
    2. parcours de la table pour identifier les regroupements et alimenter le ClientDataSet,
    3. transmission du ClientDataSet au rapport pour édition.

    Le ClientDataSet serait en mémoire, aussi si le volume de données est trop important, il faudra plutôt envisager une table temporaire Paradox.
    Mais il y a peut être une solution plus fine, à réfléchir...
    Bonjour à tous,

    @ Ph. B.: Merci,
    oui, je suis sous Delphi 7 ent.
    Les données peuvent atteindre au maximum 100000 à 130000 enregistrements. Avec la méthode que tu m'as proposée, j'ignore si c'est faisable avec ce nombre d'enregistrement sans parler de la consommation de ressources.

    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select Localite,Min(Id_client),Max(Id_client) from Localite where Localite=Localite
    mais ça n'a pas donné le résultat espéré.

    @ Sergio:merci, Serge.
    essaye de trouver cette fonction quand tu auras le temps.

    En fait, si ce n'est pas possible de trouver une solution à ce problème, comment faire pour regrouper la série Des "Id_Clients" même en le faisant en plusieurs lignes:

    Exemple:
    - Localité : Paris : ID :=> 1,2,3,4,5...200.
    - Localité : Paris : ID :=> 300,301,302,304,305.
    - Localité : Paris : ID :=> 320,321...342.

    Je veux les regrouper comme ça:

    - Localité : Paris : ID :=> 1-200. (1 ère ligne)
    - Localité : Paris : ID :=> 300-305. (2e ligne )
    - Localité : Paris : ID :=> 320-342. (3e ligne )
    .
    .

    Merci les gars.

    @+
    NABIL

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonjour,

    Je ne sais pas si paradox le gère mais il existe un moyen d'y arriver avec la clause UNION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Localite From Localite Where Id_Client in ('1','2','3','4','5','6') 
    UNION
    SELECT Localite From Localite Where Id_Client in ('30','52','63')
    UNION
    SELECT Localite From Localite Where Id_Client in ('100','101','102','103','104','105')
    la seule contrainte est de lister les ID pr groupe avant.

    Bye

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    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
    {Recherche de trous dans le Carnet}
    procedure TAnnees.Bt_TrouClick(Sender: TObject);
    var n : LongInt;
        trou : String;
    begin
    QEntete.Active:=False;
    QEntete.SQL.Clear;
    QEntete.SQL.Add('SELECT DISTINCT(NUMERO) FROM FACTURES WHERE ANNEE="'+CodeSaison.Text+'"');
    QEntete.SQL.Add('ORDER BY NUMERO');
    QEntete.Active:=True;
    n:=0;
    ListeTrou.Items.Clear;
    with QEntete do
    begin
     DisableControls;
     try
       First;
       while not EOF do
       begin
         if n+1 < FieldByName('NUMERO').Value then
           begin
            Trou:=IntToStr(n+1);
            if FieldByName('NUMERO').Value > n+2 then
                Trou:=Trou+'...'+IntToStr(FieldByName('NUMERO').Value-1);
            ListeTrou.Items.Add(Trou);
           end; {if}
         n:=FieldByName('NUMERO').Value;
         Next;
       end; {while}
     finally
      if FieldByName('NUMERO').AsInteger <Numeros.FieldByName('NUMBER').AsInteger then
      begin
          Trou:=IntToStr(FieldByName('NUMERO').AsInteger+1);
          if FieldByName('NUMERO').AsInteger+1 < Numeros.FieldByName('NUMBER').AsInteger
             then Trou:=Trou+'...'+IntToStr(Numeros.FieldByName('NUMBER').AsInteger);
          ListeTrou.Items.Add(Trou);
      end;
      EnableControls;
     end; {try}
    end;  {with}
    QEntete.Active:=False;
    if ListeTrou.Items.Count>0 then ListeTrou.Visible:=True;
    end;
    @Buzleclair Nabil recherche les numéros , donc l'union est a exclure

    dommage quand même que ce soit Paradox , cela aurait été l'exemple 'presque' parfait avec Firebird et une utilisation des Requêtes Recursives
    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. #13
    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
    @ Serge; merci pour ce tuyau.

    Comme j'ignore si 'Numeros' est une table ou une requête, j'ai fait un test en le supprimant et garder "FieldByName('Num_Objet').AsInteger",
    ça marche sur Paradox quand j' mais il y a un souci sur la détection des séries des "ID_client". des fois,cette boucle affiche des ID qui ne se trouvent pas dans la table "Localite" en plus le 'début' et la 'fin' soit il sont '-1' ou '+1'.

    je m'explique:

    Paris : 1,2,3...200
    St Denis : 1000.
    Lyon : 2000,2001...2030.
    Grenoble: 5000,5001,5002.

    il m'affiche:
    Paris : 1 ...199.
    St Denis:1001.
    Lyon : 2002,2029.
    Grenoble : rien.

    je ne sais pas où ça coince!
    Bien sûr j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ANNEE="'+CodeSaison.Text+'"'
    Par 'Localite'.


    a+

    Nabil

  14. #14
    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 NABIL74 Voir le message
    @ Serge; merci pour ce tuyau.
    @SergioMaster avait parfaitement compris ce que je voulais dire.
    Citation Envoyé par NABIL74 Voir le message
    Comme j'ignore si 'Numeros' est une table ou une requête
    FieldByName('Numero'), cela concerne une table selon vous ?
    Citation Envoyé par NABIL74 Voir le message
    je ne sais pas où ça coince!
    D'où l'intérêt du débogage pas à pas...

    J'ai repris le principe de la méthode donnée par @SergioMaster pour l'adapter à des recherches de séquences. Cela donne :
    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
    // Recherche des intervalles
    procedure TForm1.BtnIntervallesClick(Sender: TObject);
    var
      Deb,
      Fin,
      Courant: Integer;
    begin
      ListeSequence.Clear;
     
      QEntete.Active := False;
      QEntete.SQL.Clear;
      QEntete.SQL.Add('SELECT DISTINCT(NUMERO) FROM FACTURES WHERE ANNEE = ' + QuotedStr(CodeSaison.Text));
      QEntete.SQL.Add('ORDER BY NUMERO');
      QEntete.Active := True;
     
      with QEntete do
      begin
        DisableControls;
        try
          First;
          Deb := MaxInt;
          Courant := MaxInt;
          while not EOF do
          begin
            Fin := FieldByName('NUMERO').AsInteger;
            if Deb > Fin then
            begin
              Deb := Fin
            end
            else
            begin
              if Courant + 1 < Fin then
              begin
                if Deb = Courant then
                  ListeSequence.Items.Add(IntToStr(Deb))
                else
                  ListeSequence.Items.Add(IntToStr(Deb) + '..' + IntToStr(Courant));
                Deb := Fin;
              end;
            end;
            Courant := Fin;
            Next;
          end;
        finally
          if Deb = Courant then
            ListeSequence.Items.Add(IntToStr(Deb))
          else
            ListeSequence.Items.Add(IntToStr(Deb) + '..' + IntToStr(Courant));
     
          EnableControls;
        end;
      end;
      QEntete.Active := False;
      if ListeSequence.Items.Count > 0 then
        ListeSequence.Visible := True;
    end;
    Le code et les variables sont suffisamment clairs pour éviter de rajouter des commentaires...
    En passant, j'ai évité les appels trop nombreux à FieldByName('Numeros') en passant par une variable, car cela accélère le traitement.
    Philippe.

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    @SergioMaster avait parfaitement compris ce que je voulais dire.
    chouette, sauf que , c'est le principe inverse de ce qui était demandé
    j'ai bien expliqué qu'il s'agissait d'une recherche de "trous"


    J'ai repris le principe de la méthode donnée par @SergioMaster pour l'adapter à des recherches de séquences.
    Le code et les variables sont suffisamment clairs pour éviter de rajouter des commentaires...
    c'est ce que je pensais aussi , et je ne pensais pas que mon code aurait été utilisé tel quel !
    je voyais déjà plutôt une requête genre
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID_CLIENT FROM LOCALITE ORDER BY LOCALITE,ID_CLIENT
    nota : plutôt intrigante cette table étonnant que la localité ne soit pas plutôt incluse dans le fichier client




    En passant, j'ai évité les appels trop nombreux à FieldByName('Numeros') en passant par une variable, car cela accélère le traitement.
    nul n'est parfait et , j'ai regardé la date de cette archive 1999 , autrement dit le siècle dernier .
    @ phillipe Tu es sur qu'il y a une grosse différence de temps de traitement ?
    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

  16. #16
    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
    bonjour,
    sergio: pourquoi le distinct dans la roquet? normalement numéro doit être unique
    en plus, je crois que Frédéric Brouard à déjà crée une procédure stocké pour sql server qui fais la recherche des trous, si mémoire est bon
    dans tout les cas, tu as pris ta procédure de l'autre siècle et tu la mis tel quel, hhhhhhh
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  17. #17
    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
    Citation Envoyé par popo Voir le message
    A moins d'un script SQL, il n'est pas possible d'obtenir ce résultat surtout si les données sont dans la même tâble.

    La requête suivante te permettra de lister les localité et les client rattachés (par ordre croissant)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Localité, Id_Client FROM Localité ORDER BY Localité, Id_Client

    Ensuite, avec une simple iétration du peux faire le traitement que tu veux. Exemple avant la boucle tu initialise une variable temporaire avec une chaine vide et une variable dans laquelle tu inscrit la localité. Puisque c'est trié par localité tu peut tester si ta valeur temporaire est différente de la localité courante et ainsi tu sais que tu as changé de localité. Pour chaque localité trouvé tu liste les id des clients et à la fin tu la formate comme tu veux.

    PS : Un conseil, ne nomme pas un champ avec le même nom que la table et surtout EVITE LES CARACTERES ACCENTUES.

    je préfère cette solution, mais en la faison dans un boucle sur le nombre de localité,
    par example localité paris, on va parcourir tout les ligne si les qui sesuive de paris en va continuer , si il non, on va sauter les ligne jusqu'à trouver la localité paris (je sais, j’explique mal)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  18. #18
    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
    chouette, sauf que , c'est le principe inverse de ce qui était demandé
    j'ai bien expliqué qu'il s'agissait d'une recherche de "trous"
    J'avais bien compris, le code que j'ai écrit hier soir doit être raffiné par @NABIL74.
    Citation Envoyé par SergioMaster Voir le message
    nota : plutôt intrigante cette table étonnant que la localité ne soit pas plutôt incluse dans le fichier client
    Base de données construite au fur et à mesure, par ajout de verrues, AMHA...

    Citation Envoyé par SergioMaster Voir le message
    @ phillipe Tu es sur qu'il y a une grosse différence de temps de traitement ?
    Sur un millier de lignes, le gain peut paraitre léger, mais sur des volumes importants, il devient significatif. Il suffit de tracer un peu le code sous-jacent pour le voir(appel à FindField, etc). Sur le même principe, il vaut mieux stocker le Field dans une variable TField ou descendant plutôt que d'appeler x fois FieldByName. L'idéal étant de remplacer ce code procédural par une requête SQL, mais avec paradox...
    Citation Envoyé par edam Voir le message
    en plus, je crois que Frédéric Brouard à déjà crée une procédure stocké pour sql server qui fais la recherche des trous, si mémoire est bon
    dans tout les cas, tu as pris ta procédure de l'autre siècle et tu la mis tel quel, hhhhhhh
    Ben oui, pour un SGDB dont la dernière version date de l'autre siècle, on emploie une méthode aussi ancienne..
    Philippe.

  19. #19
    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,

    Citation Envoyé par edam Voir le message
    bonjour,
    sergio: pourquoi le distinct dans la roquet? normalement numéro doit être unique
    en plus, je crois que Frédéric Brouard à déjà crée une procédure stocké pour sql server qui fais la recherche des trous, si mémoire est bon
    dans tout les cas, tu as pris ta procédure de l'autre siècle et tu la mis tel quel, hhhhhhh
    @ edam: tu n'as pas bien lu ce que Serge m'as dit m'as avant de me filer cette procédure, il m'a dit que c'était une ancienne procédure (depuis 1999).ça date du siècle dernier .

    Citation Envoyé par Ph. B.
    :FieldByName('Numero'), cela concerne une table selon vous ? :
    J'ai pensé que Serge avait une Table temporaire sur laquelle il fait le traitement.


    @ Ph. B.: merci pour l'adaptation de la procédure de Serge! Chouette ,elle fonctionne .

    J'ai reconstruit les Tables pour éviter la redondance dans la base.
    Table: Clients: Id_Client, Nom_Client,Localité,...

    il me reste qu'à modeler cette procédure afin d'avoir mon objectif initial qui est de grouper les "Id_Clients" de chaque localité. tout ça dans la même procédure (je veux les afficher dans un Dbgrid) .
    Grâce à l'aide d'un ami, j'ai une requête qui détecte si y a un interval entre les id mais ça consomme des ressources et du temps aussi!

    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
    Select (e1.Id_Client) as DEBUT, 
    (Select min (f1.Id_Client) 
    from Clients f1
     
    Left Outer Join Clients  f2 On (f1.Id_Client = f2.Id_Client - 1) 
    Left Outer Join Clients  f3 On ((f1.Id_Client-1)  = (f3.Id_Client) )
    Where (f2.Id_Client is null) and (f3.Id_Client not null) 
    and (e1.Id_Client < f1.Id_Client) ) as FIN 
     
    From Clients e1
     
    Left Outer Join Clients e2 On e1.Id_Client - 1 = e2.Id_Client 
    Left Outer Join Clients e3 On (e1.Id_Client) = (e3.Id_Client - 1) 
    Where (e2.Id_Client is null) and (e3.Id_Client is not null) 
     
    Union 
     
    Select g1.Id_Client as DEBUT, g3.Id_Client as FIN 
    from Clients g1 
    Left Outer Join Clients g2 On (g1.Id_Client = g2.Id_Client - 1) 
    Left Outer join Clients g3 on (g1.Id_Client - 1 = g3.Id_Client) 
    Where (g2.Id_Client is null) and (g3.Id_Client is null)
    peut-être optimisée!
    +A

    Nabil

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par edam Voir le message
    bonjour,
    sergio: pourquoi le distinct dans la roquet? normalement numéro doit être unique
    en plus, je crois que Frédéric Brouard à déjà crée une procédure stocké pour sql server qui fais la recherche des trous, si mémoire est bon
    dans tout les cas, tu as pris ta procédure de l'autre siècle et tu la mis tel quel, hhhhhhh
    bien sur j'ai mis la procedure tel quelle , il n'était pas question pour moi d'écrire de code .
    Quant au distinct , il y avait une raison , le numéro n'etait pas forcément unique (la clé étant composée , à l'époque d'une Année,Numéro et Type) si mes souvenirs sont encore justes
    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

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, 19h43
  2. SQL Problème requête SELECT
    Par Seth_75 dans le forum Développement
    Réponses: 2
    Dernier message: 30/03/2009, 16h02
  3. Problème requête SELECT ORACLE
    Par vizlebiz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2008, 17h20
  4. Problème Requête SELECT sur champ texte
    Par arnaud_verlaine dans le forum WinDev
    Réponses: 5
    Dernier message: 02/10/2007, 22h19
  5. [SQL] Problème requête SELECT
    Par dolf13 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 05/07/2006, 00h54

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