Concaténer 3 champs

NAIMA804 Messages postés 9 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour
pouvez m'aider svp
j'ai une table TB_Lots qui comprend 3 champs NUM_AO, SOUMISSIONNAIRE, Lot
cette table et en relation avec la table AO et soumissionnaire
chaque soumissionnaire peut participer à plusieurs AO et sur plusieurs Lots (lot est un champ numérique)
j'ai crée une requête comprenant ses trois champs avec des conditions bien sur
ce que je cherche c'est de créer une requête qui dépond de ma 1ere requête où je peux concaténer les numéros des lots de chaque soumissionnaire et pour chaque NUM_AO
exemple
NUM_AO soumissionnaire lot
AO 001/2019 XXXXXX 1,2,9..............
AO 001/2019 YYYYYY 9,10,56,................
AO 001/2019 ZZZZZZ 7,9,10,62.....................
AO 009/2019 JJJJJJ 1,2,3,4...
AO 009/2019 XXXXX 1,6,.....
ainsi de suite
j'espère que j'ai bien expliqué
Merci

3 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, cela peut se faire, via une formule VBA. es-tu prêt à utiliser cette technique?
    peux-tu partager le code SQL de ta requête?
    0
  2. NAIMA804 Messages postés 9 Statut Membre
     
    Bonjour
    merci pour ta réponse
    le travail que j'ai fait pour essayer de trouver une solution c'est de fusionner le champ "NUM_AO" avec "SOUMISSIONNAIRE" sous le nom du champ "SOUM" qui me donne la forme suivante "001/2019-xxxxx" par une requête "REQ-RECUP"
    et j'ai créé le module, voila le code

    Public Function RecupLots(NOM As String) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les projet du partcipant
    'chr(34) correspond a des guillemets pour encadrer le texte
    SQL = "SELECT Lot FROM REQ_RECUP WHERE SOUM=" & _
    Chr(34) & NOM & Chr(34)
    Set res = CurrentDb.OpenRecordset(SQL)
    'Concatene les différents enregistrement
    While Not res.EOF
    RecupLots = RecupLots & res.Fields(0).Value & ", "
    res.MoveNext
    Wend
    'Enleve le dernier ;
    RecupLots = Left(RecupLots, Len(RecupLots) - 1)
    'libere la mémoire
    Set res = Nothing
    End Function

    et j'ai crée ma requête :
    SELECT DISTINCT REQ_RECUP.SOUM, RecupLots(SOUM) AS Lot, REQ_RECUP.NUM_AO, REQ_RECUP.SOUMISSIONNAIRE
    FROM REQ_RECUP
    GROUP BY REQ_RECUP.SOUM, RecupLots(SOUM), REQ_RECUP.NUM_AO, REQ_RECUP.SOUMISSIONNAIRE
    HAVING (((REQ_RECUP.SOUM) Is Not Null));
    ça fonctionne mais je ne suis pas satisfaite par ce travail, je le trouve trop long
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que l'approche est bonne.
      je ne vois pas bien l'utilité de la requête intermédiaire, tu pourrais travailler directement sur la table.
      par ailleurs, au lieu d'avoir le texte de la requête SQL dans la fonction RecupLots, tu pourrais avoir une fonction générique, qui recevrait le texte de la requête comme paramètre.
      SELECT NUM_AO, SOUMISSIONNAIRE, 
      Recupp("SELECT Lot FROM TB_Lots WHERE SOUMISSIONNAIRE = '" & SOUMISSIONNAIRE & "' "
            & " AND NUM_AO = " & NUM_AO ) AS Lot
      FROM TB_Lots
      GROUP BY NUM_AO, SOUMISSIONNAIRE
      0
  3. NAIMA804 Messages postés 9 Statut Membre
     
    le fait de ne pas travailler sur la table directement car le groupement des lots se fait par soumissionnaire et non pas par AO et c'est mon but
    pour le code que tu m'a donné, si j'ai bien compris je dois créer une requête sql contenant ton code mais il me demande e définir recupp

    merci pour l'importance que tu donnes à mon problème car je suis vraiment coincée
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pensais que le groupement des lots se faisait par soumissionnaire et par AO, pas par soumissionnaire.
      nous devons beaucoup deviner: tu ne donnes que peu d'informations: tu ne nous montres pas la requête REQ_RECUP, et tu nous montres, dans ton exemple, ce que tu veux obtenir, sans donner les données que tu as.
      la fonction recupp est une simplification de la fonction recupLots, exemple:
      Function recupp(sqlsource As String) As String
      Dim rs As DAO.Recordset, val As String, champ
      Set rs = CurrentDb.OpenRecordset(sqlsource)
      recupp = ""
      Do While Not rs.EOF
          champ = rs.Fields(0)
          If Not IsNull(champ) Then
              val = champ
              If konrecuppkat <> "" Then
                  recupp = recupp + ","
              End If
              recupp = recupp + val
          End If
          rs.MoveNext
      Loop
      End Function

      tu as fait 90% du travail, plus qu'à un légèrement simplifier, aucune raison de te sentir coincé.
      0