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 :

Obtenir tous les champs possibles pour un même champs à partir d'une requête


Sujet :

Requêtes et SQL.

  1. #1
    Membre averti
    Homme Profil pro
    administrateur
    Inscrit en
    Juin 2020
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Algérie

    Informations professionnelles :
    Activité : administrateur

    Informations forums :
    Inscription : Juin 2020
    Messages : 37
    Par défaut Obtenir tous les champs possibles pour un même champs à partir d'une requête
    Bonjour,
    J’ai une fonction dans module et une requête afin d’obtenir tous les champs possibles pour un même champ
    et ça fonctionne très bien.
    Malheureusement ça fonctionne pas avec une requête de sélection !!!!

    voici le module:
    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
    Public Function ConcatAnt(ByVal strDesignation As String) As String
           Dim db1 As DAO.Database, rs1 As DAO.Recordset
        Dim strSql As String, s1 As String
        Dim strQuery As String
     
        strQuery = "R_Avant_DFacts"
        Set db1 = CurrentDb
        strSql = "SELECT DISTINCT Ant FROM " & strQuery & " WHERE Designation ='" & strDesignation & "' ORDER BY Ant"
        Set rs1 = db1.OpenRecordset(strSql)
        If rs1.RecordCount = 0 Then GoTo Exit_0
        rs1.MoveLast
        rs1.MoveFirst
        s1 = ""
        While Not rs1.EOF
            If Nz(rs1!Ant) <> "" Then
                s1 = s1 & Nz(rs1!Ant) & ", "
            End If
            rs1.MoveNext
        Wend
    Exit_0:
        ConcatAnt = s1
        Exit Function
     
    End Function

    la requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT R_Avant_DFacts.Designation, concatAnt([Designation]) AS Resultat
    FROM R_Avant_DFacts
    GROUP BY R_Avant_DFacts.Designation, concatAnt([Designation]);

    la requête de sélection :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_Clients.NClient, T_Factures.NFacture, T_Clients.Nom, T_Factures.Date, T_Det_Facts.Designation, T_Det_Facts.Quantite, (" ( " & [Date] & " - " & [Quantite] & " ) ") AS Ant
    FROM T_Produits INNER JOIN ((T_Clients INNER JOIN T_Factures ON T_Clients.NClient = T_Factures.NumClient) INNER JOIN (T_Det_Facts INNER JOIN R_Prds_NFact ON T_Det_Facts.Designation = R_Prds_NFact.Designation) ON T_Factures.NFacture = T_Det_Facts.NumFact) ON T_Produits.Produit = T_Det_Facts.Designation
    WHERE (((T_Clients.NClient)=[Formulaires]![F_Clients]![T_Factures sous-formulaire].[Formulaire]![NumClient]) AND ((T_Factures.Date)<[Formulaires]![F_Clients]![T_Factures sous-formulaire].[Formulaire]![Date]));


    Une solution?
    merci

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 359
    Par défaut
    Bonjour,

    Il me semble que dans la fonction ConcatAnt il y a un ", " qui traîne et qu'il faut enlever le dernier. Une façon de faire:
    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
    Public Function ConcatAnt(ByVal strDesignation As String) As String
        Dim db1 As DAO.Database, rs1 As DAO.Recordset
        Dim strSql As String, s1 As String
        Set db1 = CurrentDb
        strSql = "SELECT DISTINCT Ant FROM R_Avant_DFacts WHERE Designation ='" & strDesignation & "' ORDER BY Ant"
        Set rs1 = db1.OpenRecordset(strSql)
        If rs1.RecordCount > 0 Then
            rs1.MoveLast
            rs1.MoveFirst
            s1 = ""
            While Not rs1.EOF
                If Nz(rs1!Ant) <> "" Then
                    s1 = s1 & rs1!Ant & ", "
                End If
                rs1.MoveNext
            Wend
            ConcatAnt = Left(s1, Len(s1) - 2)       '--- enlève le dernier ", "
        Else
            ConcatAnt = ""
        End If
    End Function
    Cordialement.

  3. #3
    Membre averti
    Homme Profil pro
    administrateur
    Inscrit en
    Juin 2020
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Algérie

    Informations professionnelles :
    Activité : administrateur

    Informations forums :
    Inscription : Juin 2020
    Messages : 37
    Par défaut Bonjour
    Nom : Capture d’écran 2025-02-17 170311.png
Affichages : 78
Taille : 87,3 Ko

    ça fonctionne très bien avec le premier module quand:
    - j'enlève les critères sur les deux champs: NClient et Date;
    - je supprime la requête R_Prds_NFact

    !!!!

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 359
    Par défaut
    Pour vous donner quelques idées, un exemple sans passer par une concaténation.
    Bien cordialement.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre averti
    Homme Profil pro
    administrateur
    Inscrit en
    Juin 2020
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Algérie

    Informations professionnelles :
    Activité : administrateur

    Informations forums :
    Inscription : Juin 2020
    Messages : 37
    Par défaut bonoir
    A nouveau,

    https://drop.infini.fr/r/092YdZtVpd#...tz2ITsmB2Gb4M=

    - je veux avoir uniquement les anciens factures en fonction des produits facturés sur la dernière facture.

    Exemple.
    - sur le formulaire (F_Clients), la facture NFacture: 12, on trouve deux produits;

    - quand j'exécute la requéte (R_Avant_DFactS), j'obtiens les anciennes factures uniquement avec les mêmes produits sur la facture N 12 ( Date du système, c'est ce que je cherche, ça fonctionne très bien);

    - quand j'exécute la requête (Ants) pour avoir tous les champs (Ant) possible pour le même champs (Désignation), qui figurent sur la requête (R_Avant_DFactS), ça ne fonctionne pas.

    voila
    merci

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 359
    Par défaut
    Une piste: cela ne marche pas parce que l'on ne peut pas lancer la concaténation sur une requête paramétrée. Il faut que des valeurs soient inscrites à la place des critères. Il faut ainsi indiquer le n° du client en critère (par exemple: 3) et ne pas indiquer [Formulaires]![...].NumClient.
    Cordialement.

  7. #7
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 022
    Par défaut
    Pour ma part, ce site n'est pas joignable :
    (ma config : win 11, Firewall par defaut, Malwarebytes)
    https://drop.infini.fr/ est inaccessible.
    ERR_ADDRESS_UNREACHABLE
    "Always look at the bright side of life." Monty Python.

  8. #8
    Membre averti
    Homme Profil pro
    administrateur
    Inscrit en
    Juin 2020
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Algérie

    Informations professionnelles :
    Activité : administrateur

    Informations forums :
    Inscription : Juin 2020
    Messages : 37
    Par défaut bjr
    Merci beaucoup

  9. #9
    Membre averti
    Homme Profil pro
    administrateur
    Inscrit en
    Juin 2020
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Algérie

    Informations professionnelles :
    Activité : administrateur

    Informations forums :
    Inscription : Juin 2020
    Messages : 37
    Par défaut Bonjour
    Bonjour,
    j'utilise une requête de création de table et après on arrive à concaténer à partir de cette table. Une solution que j'ai trouver, n'empêche que j'ai toujours un autre soucis:
    Comment Avoir le résultat dans un ordre décroisant sur l'état, il s'agir de classer les résultats de la date la plus récente à la plus anciennes ?

    https://drop.infini.fr/r/t7ow1P_MkE#...1YgcLxjFCBOIc=

    Merci pour votre aide
    Fichiers attachés Fichiers attachés

  10. #10
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 359
    Par défaut
    Une façon de faire en ajoutant les données de façon bien triées dans la table T_Ants (par la requête R_T_Ants) et en modifiant la fonction ConcatAnts() pour qu'elle se limite au 3 premières données pour chaque produit.
    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
    Public Function ConcatAnt(ByVal strDesignation As String) As String
        Dim db1 As DAO.Database, rs1 As DAO.Recordset
        Dim strSql As String, s1 As String, k As Integer
        '--- les données dans la table T_Ants sont ajoutées bien triées par R_T_Ants
        Set db1 = CurrentDb
        strSql = "SELECT T_Ants.* FROM T_Ants WHERE Designation ='" & strDesignation & "'"
        Set rs1 = db1.OpenRecordset(strSql)
        s1 = ""
        k = 0
        If rs1.RecordCount > 0 Then
            rs1.MoveLast
            rs1.MoveFirst
            While Not rs1.EOF
                If Nz(rs1!Ant) <> "" Then
                    If k < 3 Then                       '--- pour ne prendre que les 3 derniers
                        s1 = s1 & Nz(rs1!Ant) & ", "
                        k = k + 1
                    End If
                End If
                rs1.MoveNext
            Wend
        End If
        If s1 <> "" Then
            s1 = Left(s1, Len(s1) - 2)                  '--- pour supprimer dernière virgule
        End If
        ConcatAnt = s1
    End Function
    Cordialement.
    Fichiers attachés Fichiers attachés

  11. #11
    Membre averti
    Homme Profil pro
    administrateur
    Inscrit en
    Juin 2020
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Algérie

    Informations professionnelles :
    Activité : administrateur

    Informations forums :
    Inscription : Juin 2020
    Messages : 37
    Par défaut Bonsoir
    Merci beaucoup pour votre aide,

    juste que ça ne fonctionne pas avec un nouveau enregistrement, (la première facture pour un nouveau client ou un produit jamais facturé pour un ancien client):

    pour un test:
    - Nouveau clients;
    - Ajouter un ou plusieurs produits.

    on aura rien sur l'état.

    ça fonctionne quand on enlève le critère sur le contrôle (date) de la requête (R_Avant_DFacts), sauf qu'on aura le résultat en double.

    Merci

  12. #12
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 359
    Par défaut
    Oui, il faut faire une jointure gauche (LEFT JOIN) dans la requête source R_Etat.

    Nom : R_Etat.png
Affichages : 28
Taille : 7,9 Ko
    Cordialement.

  13. #13
    Membre averti
    Homme Profil pro
    administrateur
    Inscrit en
    Juin 2020
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Algérie

    Informations professionnelles :
    Activité : administrateur

    Informations forums :
    Inscription : Juin 2020
    Messages : 37
    Par défaut bonjour
    Merci pour votre aide.
    ça marche très bien

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/08/2018, 16h47
  2. Réponses: 0
    Dernier message: 11/05/2011, 01h11
  3. [JGraphT] Obtenir tous les chemin possibles
    Par pmartin8 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 02/06/2006, 20h26
  4. Obtenir tous les champs d'un formulaire
    Par killprog dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/03/2006, 14h15
  5. Tous les champs SAUF dans une table.
    Par Yepazix dans le forum Bases de données
    Réponses: 1
    Dernier message: 28/08/2005, 17h01

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