Publicité
+ Répondre à la discussion
Page 1 sur 3 123 DernièreDernière
Affichage des résultats 1 à 20 sur 58
  1. #1
    Membre éprouvé
    Homme Profil pro NABIL
    Enseignant
    Inscrit en
    août 2008
    Messages
    506
    Détails du profil
    Informations personnelles :
    Nom : Homme NABIL
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 506
    Points : 452
    Points
    452

    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 Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    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 329
    Points : 3 994
    Points
    3 994

    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 éprouvé
    Homme Profil pro NABIL
    Enseignant
    Inscrit en
    août 2008
    Messages
    506
    Détails du profil
    Informations personnelles :
    Nom : Homme NABIL
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 506
    Points : 452
    Points
    452

    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 :
    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
    Membre Expert Avatar de popo
    Homme Profil pro Jérémy
    Analyste programmeur Delphi / C#
    Inscrit en
    mars 2005
    Messages
    806
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérémy
    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 : 806
    Points : 1 048
    Points
    1 048

    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 :
    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 éprouvé
    Homme Profil pro NABIL
    Enseignant
    Inscrit en
    août 2008
    Messages
    506
    Détails du profil
    Informations personnelles :
    Nom : Homme NABIL
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 506
    Points : 452
    Points
    452

    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 Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    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 329
    Points : 3 994
    Points
    3 994

    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 éprouvé
    Homme Profil pro NABIL
    Enseignant
    Inscrit en
    août 2008
    Messages
    506
    Détails du profil
    Informations personnelles :
    Nom : Homme NABIL
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 506
    Points : 452
    Points
    452

    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 Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    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 329
    Points : 3 994
    Points
    3 994

    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 Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 431
    Points : 10 648
    Points
    10 648
    Billets dans le blog
    1

    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 ^^
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  10. #10
    Membre éprouvé
    Homme Profil pro NABIL
    Enseignant
    Inscrit en
    août 2008
    Messages
    506
    Détails du profil
    Informations personnelles :
    Nom : Homme NABIL
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 506
    Points : 452
    Points
    452

    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 :
    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 Expert Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    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 527
    Points : 1 024
    Points
    1 024

    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 :
    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 Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 431
    Points : 10 648
    Points
    10 648
    Billets dans le blog
    1

    Par défaut

    Code :
    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  13. #13
    Membre éprouvé
    Homme Profil pro NABIL
    Enseignant
    Inscrit en
    août 2008
    Messages
    506
    Détails du profil
    Informations personnelles :
    Nom : Homme NABIL
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 506
    Points : 452
    Points
    452

    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 :
    WHERE ANNEE="'+CodeSaison.Text+'"'
    Par 'Localite'.


    a+

    Nabil

  14. #14
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    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 329
    Points : 3 994
    Points
    3 994

    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 :
    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 Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 431
    Points : 10 648
    Points
    10 648
    Billets dans le blog
    1

    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 :
    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 ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  16. #16
    Membre Expert Avatar de edam
    Homme Profil pro said
    Développeur Delphi/c++/Omnis
    Inscrit en
    décembre 2003
    Messages
    1 813
    Détails du profil
    Informations personnelles :
    Nom : Homme said
    Localisation : Maroc

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

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 813
    Points : 2 384
    Points
    2 384

    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 Expert Avatar de edam
    Homme Profil pro said
    Développeur Delphi/c++/Omnis
    Inscrit en
    décembre 2003
    Messages
    1 813
    Détails du profil
    Informations personnelles :
    Nom : Homme said
    Localisation : Maroc

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

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 813
    Points : 2 384
    Points
    2 384

    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 :
    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 Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    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 329
    Points : 3 994
    Points
    3 994

    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 éprouvé
    Homme Profil pro NABIL
    Enseignant
    Inscrit en
    août 2008
    Messages
    506
    Détails du profil
    Informations personnelles :
    Nom : Homme NABIL
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 506
    Points : 452
    Points
    452

    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 :
    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 Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 431
    Points : 10 648
    Points
    10 648
    Billets dans le blog
    1

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •