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

Requêtes et SQL. Discussion :

Requête pour récupérer que les champs à "Vrai" [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut Requête pour récupérer que les champs à "Vrai"
    Bonjour,



    Suite à mon sujet ici : cliquer ici, mon problème ne serait pas foncièrement un problème de SQL pur (en tout cas, les SELECT case dans Access, je n'ai pas l'impression que l'on puisse le faire), mais un autre.

    Cela fait 1 semaine que je me triture la tête pour trouver la solution, en vain.

    Pour faire un petit résumé de mon besoin, j'ai à ma disposition, dans Access, une table Dossier, où j'ai des informations clients, avec un ID.
    Par rapport à ces dossiers, je dois vérifier s'il manque des pièces. Pour cela, j'ai créé une table "incomplet", qui n'est renseignée que si des pièces sont vraiment manquantes.

    Toutes ces informations sont saisies via des formulaires classiques d'ajout.

    Donc ma table Dossier est constituée comme suit :
    ID_Client
    InfoClient1
    InfoClient2

    Ma table Incomplet est constituée comme suit :
    ID_Client
    PieceA
    PieceB
    PieceC

    (Il y a environ une dizaine de pièces..)
    Ces champs "Piece" sont des booléens, qui sont soit vrai soit faux, car dans mon, formulaire de saisie, ce sont des cases à cocher, qui me permettent rapidement de pouvoir cocher les pièces manquantes.
    C'est juste une vérification, donc j'ai juste besoin de cocher ce qui manque.

    Au niveau d'une requête avecu ne jointure externe sur la table incomplet, j'ai donc des clients à qui il manque des pièces, mais ce n'est pas forcément les mêmes pièces qui manquent pour chaque client.

    Au niveau du résultat, en faisant une jointure sur l'ID_client, j'aurais donc un truc du genre (en admettant que que je n'ai que 3 pièces) :
    ID_Client;PieceA;PieceB;PieceC;
    1;Vrai;Faux;Faux
    2;Faux;Vrai;Faux
    3;Vrai;Vrai;Faux


    Au niveau du résultat que je voudrais obtenir, je ne voudrais avoir, par ID, que les pièces à Vrai, donc ceci :
    1;PieceA
    2;PieceB
    3;PieceA;PieceB

    Je n'arrive pas à comprend comment faire ma requête. Comme indiqué dans le sujet que j'avais déjà mis, il y a peut-être un souci de modélisation dans mes tables, mais j'ai essayé de trituré, je n'ai pas eu de résultat convaincant.

    Est-ce possible de faire ces choses-là par requête ? Faut-il que je passe par du VBA ?

    En vous remerciant par avance de vos réponses, Si vous avez des questions encore ou si je suis pas clair, n'hésitez pas.
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    Je crois qu'il faudra passer par du VBA.

    Si tu as besoin un coup de main, poste ta table Incomplet dans la db jointe (Access2000)
    Fichiers attachés Fichiers attachés
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Non, non je veux pas que tu me fasses mon boulot.

    Concernant le VBA, je m'en doutais mais j'espérais avec une solution "outil".

    Pou le VB, du coup, au niveau de l'idée, j'ai ça :
    1/ je fais une requete par pièce, avec l'ID du client, et je regarde si la valeur de la pièce est à vrai. Si c'est le cas, je l'insère dans une variable texte locale
    ex. (grossier):
    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
    Piece  = ""
    SQL = "select ID, PieceA WHERE pieceA = True"
    set rs = CurrentDb.OpenRecordset(SQL)
    rs.MoveFirst
    if not RS.eof then
         Piece = Piece  &  "PieceA,"
    end if
    rs.close
    SQL = "select ID, PieceB WHERE pieceB = True"
    set rs = CurrentDb.OpenRecordset(SQL)
    rs.MoveFirst
    if not RS.eof then
         Piece = Piece  & "PieceB,"
    end if
    rs.close
    SQL = "select ID, PieceB WHERE pieceC = True"
    set rs = CurrentDb.OpenRecordset(SQL)
    rs.MoveFirst
    if not RS.eof then
         Piece = Piece  & "PieceC,"
    end if
    rs.close
    Piece = left(Piece, len(Piece-1))   'pour enlever la dernière virgule
    2/ Dans la variable Piece, j'ai donc toutes les pièces qui sont susceptibles d'être à vrai. Avec cette variable je peux donc faire ma requête pour l'ID client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "Select ID," & Piece & " FROM Incomplet"
    Par ce biais, je n'aurai donc une ligne pour le client avec que les pièces manquantes.

    Après, pour boucler sur plusieurs clients, je vais voir comment faire, mais ça serait dans le même ordre d'idée.
    Le seul truc qui m'embête est que je sois obligé de faire plusieurs recordset à la suite.

    Sachant que dans ma table incomplet, j'ai 15 cases à cocher, ça fait du coup 15 recordset...

    Mais en soi, Claude, est-ce dans ce sens que tu voulais que je parte ?

    (Attention le code écrit ci-dessous est vraiment du vrac, c'est pour donner l'ordre d'idée que j'avais...je l'ai pas du tout testé).
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    J’aurais fait comme ceci :
    - j’ai cru comprendre que tu disposais déjà d’une table «Incomplet » avec l’ID client et 15 colonnes OUI/NON, PieceA, B, …, O ;
    - à cette table, j’aurais ajouté une colonne « Manque » pour instruire la suite des noms des colonnes qui sont à True ;
    - on crée un recordset de la table et on lit les enregistrements l’un après l’autre ;
    - pour chaque enregistrement, on lance une boucle pour scanner les 15 colonnes ;
    N.B idée pour la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim i As Integer
      For i = 65 To 79
        Debug.Print "Piece" & Chr(i)
      Next i
    - chaque fois que la valeur de la colonne est True, on concatène son nom dans la colonne « Manque ».
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  5. #5
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Effectivement, ma table "Incomplet" a déjà tous ces champs : ID, PieceA,PieceB, PieceC,PieceD,etc...

    - à cette table, j’aurais ajouté une colonne « Manque » pour instruire la suite des noms des colonnes qui sont à True ;
    Par contre, ça je comprend pas ce que tu veux faire : mes champs PieceA,PieceB, etc... sont déjà des boolean (true/False) : pourquoi rajouter une colonne Manque ? Comment renseigner ce champ ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  6. #6
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Dans ton 1er billet, tu veux pour chaque ID client quelque chose comme ceci :


    Je te propose d'ajouter (une fois pour toutes) une colonne à ta table pour qu'on puisse y inscrire ce résultat, en lançant une procédure.


    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
    Option Compare Database
    Option Explicit
     
     
    Public Sub MajManque()
      Dim rst As Recordset
      Dim i As Integer
      Set rst = CurrentDb.OpenRecordset("Incomplet")
      Do While Not rst.EOF
        'Réinitialiser la colonne Manque
        rst.Edit
        rst("Manque") = ""
        For i = 65 To 79
          If rst("Piece" & Chr(i)) = True Then
              rst("Manque") = rst("Manque") & "Piece" & Chr(i) & " ; "
          End If
        Next i
        'Mention Néant éventuelle
        If Len(rst("Manque")) = 0 Then rst("Manque") = "Néant ; "
        'Supprimer le dernier point-virgule
        rst("Manque") = Left(rst("Manque"), Len(rst("Manque")) - 3)
        rst.Update
        rst.MoveNext
      Loop
      rst.Close
      Set rst = Nothing
      DoCmd.OpenTable "Incomplet"
    End Sub
    Fichiers attachés Fichiers attachés
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  7. #7
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Bonjour Claude,


    Je te remercie pour ces éclaircissements, et je trouve génial ta méthode Je vais m'appuyer dessus pour mon besoin

    Merci beaucoup !
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

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

Discussions similaires

  1. Requête pour récupérer que les champs à "Vrai"
    Par illight dans le forum Langage SQL
    Réponses: 12
    Dernier message: 06/10/2016, 16h19
  2. Réponses: 2
    Dernier message: 03/11/2010, 16h18
  3. Logiciel pour récupérer que les mails dans une page web
    Par mouss4rs dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 24/07/2010, 14h41
  4. [MySQL] Requête pour récupérer toutes les valeurs d'un tableau
    Par djoumusic dans le forum PHP & Base de données
    Réponses: 40
    Dernier message: 24/08/2008, 22h11

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