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

  1. #1
    Nouveau membre du Club
    Access - Opérateur d'indirection dans un formulaire
    Bonjour,

    Je cherche à savoir comment règler un problème d'indirection sous Ms-Access
    Voici ma situation :
    - j'ai une table de service composée d'une vingtaine de records dont le nom individuel est composé d'une lettre et de deux chiffres : p.ex A21, S62, ....
    - j'ai une autre table composée chronologiquement (après indexation bien sûr) de toutes les opérations de la période considérée (environ entre 500 et 1.000 records selon l'année. Chaque record contient un champ référent à la table de service et une relation est établie entre les deux tables.
    - je dois présenter un rapport sur un formulaire (avec possibilité d'impression) une page indiquant pour tous les comptes 6 informations présentées horizontalement, par compte
    a- le numéro du compte
    b- le nom complet du compte (uniquement pour la version imprimée)
    c- la date de la première opération
    d- la situation du compte à cette première date
    e- la date de la dernière opération
    f- la situation du compte à cette dernière date
    et bien sûr en fin de page une totalisation des deux colonnes situation du compte.
    un inconvénient vient du fait que tous les comptes ne sont pas nécessairement utilisés pendant une années, mais que même les inutilisés doivent apparaître dans le rapport avec les 4 champs c,d,e,f à zéro

    Plusieurs tentatives d'état basées sur des requêtes ont échouées
    J'en suis donc revenu à une vieille méthode de programmation, l'indirection, afin d'éviter de copier 22 fois les mêmes instructions avec comme seule variation le numéro du compte.

    Je travaille donc dans un boucle For next classique dont voici l'exemple (la procédure complète se trouve dans un 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
    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
    Public Function getCommandBudget() As Variant
      Dim db As dao.Database
      Dim rs As dao.Recordset
      Set db = CurrentDb
     
      Dim sql, sql1, sql2, sql3, sql4, sql5 As String
      sql1 = "SELECT tbl_Journal.REF_CPT, tbl_Journal.DAT_OPERAT, tbl_Journal.MONTANT, tbl_Journal.RECETTE, Sum(IIf([recette]=1,[Montant],0)) AS TotalIN, Sum(IIf([recette]=2,[Montant],0)) AS TotalOUT, Ts_Comptes.NM_COMPLET, tbl_Journal.BUD_AVT, tbl_Journal.BUD_APR "
      sql2 = "FROM Ts_Comptes RIGHT JOIN tbl_Journal ON Ts_Comptes.NM_REDUIT = tbl_Journal.REF_CPT "
      sql3 = "GROUP BY tbl_Journal.REF_CPT, tbl_Journal.DAT_OPERAT, tbl_Journal.MONTANT, tbl_Journal.RECETTE, Ts_Comptes.NM_COMPLET, tbl_Journal.BUD_AVT, tbl_Journal.BUD_APR "
      sql5 = "ORDER BY tbl_Journal.REF_CPT, tbl_Journal.DAT_OPERAT;"
     
      Dim TabBud, CompteNum, NomOld, NomNew, NomDold, NomDnew As String
      Dim ii As Integer
      TabBud = "A21;B22;C23;D31;E32;F33;G34;H41;I42;J43;K44;L51;M52;N53;O54;P55;Q56;R61;S62;T91;U92;Z99"
      Dim NomReduit() As String
      NomReduit() = Split(TabBud, ";")
     
      For ii = LBound(NomReduit()) To UBound(NomReduit())
        CompteNum = NomReduit(ii)
        NomOld = "txt_" & CompteNum                  'INDIRECTION VARIABLE 1 date 1ère
        NomNew = NomOld & "1"                           'INDIRECTION VARIABLE 2 situation 1ère opération
        NomDold = "txt_Dat" & CompteNum            'INDIRECTION VARIABLE 3 date dernière opération
        NomDnew = "txt_Dat" & "1" & CompteNum  'INDIRECTION VARIABLE 4 situation dernière opération
        sql4 = "HAVING ((tbl_Journal.REF_CPT) = """ & CompteNum & """" & ") "   'défintion sous-chaîne sql personnalisée au numéro du compte
     
    '    MsgBox ii & vbCrLf & CompteNum & vbCrLf & NomOld & vbCrLf & NomNew & vbCrLf & NomDold & vbCrLf & NomDnew & vbCrLf & sql4
     
        sql = sql1 & sql2 & sql3 & sql4 & sql5      'concaténation instruction sql
    '    MsgBox sql
     
        Set rs = db.OpenRecordset(sql, dbOpenSnapshot)     'ouverture de la table sur base de l'instruction sql
        If Not rs.EOF() Then
          rs.MoveFirst                              'Utilisation des indirections ici
          me.{NomNew} = rs!bud_avt         'je veux charger "à l'écran" dans la bonne ligne la valeur obtenue   le symbole {} sont pour la valeur indirigée donc p.ex  il doit remplir le champ "txt_A211"
          me.{NomDnew} = rs!dat_operat  ' exemple champ destinataire = "txt_date1A21"
          rs.MoveLast
          me.{NomOld} = rs!bud_APR        'exemple champ destinataire = "txt_A21"
          me.{NomDolà = rs!dat_operat     'exemple champ destinataire = "txt_dateA21"
    '      MsgBox CompteNum & vbCrLf & NomOld & vbCrLf & NomDold
       Else
          MsgBox "Pas d'opération pour le compte" & CompteNum, vbInformation + vbOKOnly, "Calcul des soldes budgétaires"
        End If
      Next ii
     
      rs.Close
      Set rs = Nothing
      Set db = Nothing
     
    End Function

    L'emploi des {} est purement indicative et est d'ailleurs refusée par le compilateur Access comme erreur de syntaxe.

    Je joins une copie d'écran du formulaire destinataire à toute fin

    Une idée comment faire ?

    Merci d'avance.

    Guy

  2. #2
    Membre chevronné
    Bonjour,
    Il serait plus simple de vous répondre si vous déposiez un extrait (anonymisé) des tables de votre base de données (quelques enregistrements devraient suffire).
    Cordialement.

  3. #3
    Nouveau membre du Club
    Indirection
    Bonjour,

    merci pour la réponse,

    je vais faire cela asap, sans doute cette après-midi, vu qu'il me faudra un certain temps pour anonymiser les formulaires et tables

    Guy

  4. #4
    Membre chevronné
    Bonjour,
    A première vue, il ne faudrait que quelques lignes des tables tbl_Journal et Ts_Comptes pour élaborer la/les requêtes nécessaires pour votre rapportage. Pas besoin des formulaires et états: ils ne sont que mises en forme de requêtes.
    Cordialement.

  5. #5
    Nouveau membre du Club
    Indirection
    Bonjour Eric,

    Je suis finalement parvenu à une solution en matière d'indirection.
    Je joins la db spécialement écrite pour le testing (1 table et 1 formulaire)

    L'indirection obtenable ici fonctionne sur base du nom des champs d'une table:

    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
      Dim db As DAO.Database
      Dim rs As DAO.Recordset
      Set db = CurrentDb
      Set rs = db.OpenRecordset("tbl_Indirection")
      
      rs.MoveLast
      rs.AddNew
      
      Dim NomChamp As String, ii As Byte
      For ii = 1 To 5
        NomChamp = rs(ii).Name
        Select Case ii
        Case 1
          rs(NomChamp) = "Bonsoir"   'Champ texte court
        Case 2
          rs(NomChamp) = "Adieu jolie Candy"         'Champ texte long
        Case 3
          rs(NomChamp) = 312                              'Champ numérique ENTIER
        Case 4
          rs(NomChamp) = 5872.98                       'Champ numérique REEL
        Case 5
          rs(NomChamp) = Now()                          'Champ date
        End Select
    
        MsgBox "Champ " & ii & " = " & NomChamp & " = " & rs(NomChamp)
    
      Next
      rs.Update
      rs.close
      set rs = nothing
      set db = nothing


    Il me reste à trouver comment faire la même chose non plus pour des champs mais pour des variables classiques, à moins d'utiliser les tableaux/arrays.
    Si tu as une idée à ce sujet,

    Merci encore

    Guy


  6. #6
    Membre chevronné
    Bonjour,

    Personnellement je n'ai pas saisi votre problème "d'indirection". En attaché un petit exemple pour faire quelque chose qui ressemble à l'image que vous avez présentée dans votre message initial.

    Cordialement.

  7. #7
    Nouveau membre du Club
    Budget 01
    Bonjour,

    je viens enfin de dégager du temps pour analyser le fichier : en effet, c'est proche de ce que j'ai tenté de faire et je vais l'analyser de très près pour vérifier les adaptations et simplifications possibles dans mon applications.

    Je n'avais pas pensé à l'optique du form en affichage continu, étant resté sur la "vieille" méthode du rapport : cela m'ouvre en effet de nouveaux horizons.

    Merci beaucoup et bonne journée.

    Guy Lahou