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
    Exécuter une commande dans un sous-formulaire depuis le formulaire maître
    Bonjour à tous,

    Je m'arrache les cheveux (tant qu'il m'en reste) sur le problème suivant.
    J'ai un formulaire principal nommé "frm_LelExercice_2"
    Il se compose de 3 sous-formulaires nommés respectivement "frm_soldes_financiers", "frm_soldes_budgetaires" et "sfrm_Journal"

    Le 3ème sous-formulaire permet juste de présenter les 10 dernières opérations comptables enregistrées. Il ne pose aucun problème ici.

    Les 2 premiers sous-formulaires permettent, par l'intermédiaire d'un bouton de commande placé sur ceux-ci, de faire des totalisations comptables de comptes financiers pour l'un et de soldes_budgétaires sur l'autre. Ces totalisations travaillent au moyen de commandes sql personnalises selon les comptes dont le résultat doit être affiché.

    Quand je charge le formulaire principal, les deux sous-formulaires ne contiennent aucun résultat et il faut en commander l'exécution via un clic sur le bouton de commande de calcul.

    Comment puis-je, au load du formulaire principal de préférence, faire en sorte que les deux sous-formulaires de solde s'exécute sans devoir intervenir manuellement par la pression sur les boutons de calcul.

    Pour information, le SF-financier gère 6 comptes bancaires et le SF-budget en gère 21 le tout pour un bon millier d'opérations comptables par an

    J'ai testé la solution proposée par Microsoft (procédure publique dans le sous-formulaire contenant le code à exécuter : module de classe) mais tout se bloque dans le formulaire principal quand VB arrive sur l'instruction "Forms!frm_KelExercice_2![sql soldes financiers].form.GetCommand"

    [sql soldes financiers] est le nom dans le formulaire principal du sous-formulaire financier
    [sql soldes budgétaires] est le nom dans le formulaire principal du sous-formulaire budgétaire
    getCommandFIN est le nom de la fonction publique du module de classe financier
    getCommandBUD est le nom de la fonction publique du module de classe financier

    Merci de votre bonne assistance.

    Guy

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    Ce type d'évènement se fait sur le Sur Ouverture (Form_Open) du formulaire. Cependant si tu souhaites lancer tes procédures quand tu changes d'enregistrement il faut les placer Sur Activation (Form_Current).

    Il te suffit simplement des les appeler.

    Si elles sont dans un module standard utilise simplement leur nom et paramètre

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    getCommandFIN


    Si elles sont dans le module de classe du SF alors utilise cette syntaxe (dans la mesure où elles sont publique) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Me.NomSF.form.getCommandFIN
    'ou
    Call Me.NomSF.form.getCommandFIN


    2 conseils :
    Evite les espaces dans les noms d'objets (form,report,controle,table,colonne, requete...) , remplace les par des _ (underscore, 8 du clavier). ça t'évitera d'avoir à utiliser des [].
    Pour les syntaxes d'appels consulte le tuto et imprime le pense-bête :
    https://loufab.developpez.com/tutori...pelformulaire/
    http://loufab.developpez.com/tutorie...bleauappel.pdf

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Nouveau membre du Club
    Commandes à exécuter dans un sous-formulaire
    Bonjour,
    Merci pour la réponse du tac-au-tac

    Je vais en effet tester cela dès cette après-midi vu que mon figaro doit me réimplenter pas mal de paquets de cheveux....

    Pour les espaces, c'est écrivant le message que je me suis aperçu de leur existence dans le nom. Il n'est pas dans mes habitudes de laisser passer cela et en fait j'avais confondu la propriété Nom du sous-formulaire avec sa légende. Je corrige aussi bien sûr.

    Merci beaucoup

    Je tiens au courant dès la fin des tests. :
    Guy

  4. #4
    Nouveau membre du Club
    exécution d'une commande dans un sous-formulaire
    Bonsoir, bonsoir,

    voilà, j'ai testé et malheureusement cela coince.
    donc les deux procédures sont intégrées comme fonction publique dans des modules de classe de chaque sous-formulaire
    l'appel se fait dans le load du formulaire principal
    j'ai aussi modifié le nom des procédures pour éviter la confusion avec ce qui est dans le click du bouton présent sur chaque sous-formulaire et le module de classe

    nb: j'ai corrigé les noms des sous-formulaires comme sollicité avec 1000 bonnes raisons (même si j'ai gardé les crochets)
    donc mes appels sont :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      Call Me.[SQL_soldes_financiers].Form.getCommandFinance
      Call Me.[SQL_soldes_budgetaires].Form.getCommandBudget

    suivi d'un troisième pour le 3ème sous-formulaire mais comme dit avant, pas de problème avec lui

    A l'exécution j'obtiens l'erreur Microsoft VBA
    Erreur d'exécution "2465"; Erreur définie par l'application ou par l'objet.
    Actuellement, la gestion d'erreur n'est pas encore implémentée et je n'emploi pas l'instruction RAISE.

    les commandes figurant dans la procédure sont des extractions SQL de query dont voici un exemple :
    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
    Public Function getCommandFinance() 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.REFFIN, 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, tbl_Journal.FIN_AVT, tbl_Journal.FIN_APR "
      sql2 = "FROM Ts_Banques RIGHT JOIN tbl_Journal ON Ts_Banques.NM_REDUIT = tbl_Journal.REFFIN "
      sql3 = "GROUP BY tbl_Journal.REFFIN, tbl_Journal.DAT_OPERAT, tbl_Journal.MONTANT, tbl_Journal.RECETTE, tbl_Journal.FIN_AVT, tbl_Journal.FIN_APR "
      sql5 = "ORDER BY tbl_Journal.REFFIN, tbl_Journal.DAT_OPERAT;"
     
      sql4 = "HAVING (((tbl_Journal.REFFIN) = ""CP"")) "
      sql = sql1 & sql2 & sql3 & sql4 & sql5
      Set rs = db.OpenRecordset(sql, dbOpenSnapshot)
      If Not rs.EOF() Then
        rs.MoveFirst      'Récupère les soldes bancaires au début de l'exercice puis les inscrits dans le sous-formulaire
        Me.txt_CP1 = rs!fin_avt
        Me.txt_Dat1CP = rs!dat_operat
        rs.MoveLast    'Récupère les soldes bancaires en fin d'exercice puis les inscrits dans le sous-formulaire
        Me.txt_CP = rs!FIN_APR
        Me.txt_DatCP = rs!dat_operat
      End If
     
    '......
     
      rs.Close
      Set rs = Nothing
      Set db = Nothing
     
    End Function


    la boucle de la déclaration depuis sql4 sera répétée 5 fois de plus pour chaque compte bancaire puisqu'il y en a 6

    Ah, j'oubliais, il n'y a pas de raison de répéter les opérations de claculs des sous-formulaires car il s'agit en fait ici d'un formulaire "Tableau de bord", résumant en un seul écran toutes les informations essentielles pour les gestionnaires de l'asbl.

    Voilà voilà, désolé

    Guy.

  5. #5
    Rédacteur/Modérateur

    Bonjour,

    Il faudrait savoir sur quelle ligne se produit l'erreur. Peut-être créer un fichier minimal fonctionnel pour pouvoir l'analyser si tu n'arrives pas à trouver.

    Les crochets :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Call Me.[SQL_soldes_financiers].Form.getCommandFinance

    Les crochets sont utilisés quand le nom contient des caractères cabalistiques comme l'espace. Ici ce n'est pas le cas donc il est inutile de les employer.
    Si tu tapes Me. il te proposera le nom de tes SF. Utilise Me. et l'autocomplétion en général dés que que VBA te le propose (cf mon blog : http://blogaccess.free.fr/?p=192 ).

    Ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      Dim sql, sql1, sql2, sql3, sql4, sql5 As String
      sql1 = "SELECT tbl_Journal.REFFIN, 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, tbl_Journal.FIN_AVT, tbl_Journal.FIN_APR "
      sql2 = "FROM Ts_Banques RIGHT JOIN tbl_Journal ON Ts_Banques.NM_REDUIT = tbl_Journal.REFFIN "
      sql3 = "GROUP BY tbl_Journal.REFFIN, tbl_Journal.DAT_OPERAT, tbl_Journal.MONTANT, tbl_Journal.RECETTE, tbl_Journal.FIN_AVT, tbl_Journal.FIN_APR "
      sql5 = "ORDER BY tbl_Journal.REFFIN, tbl_Journal.DAT_OPERAT;"
     
      sql4 = "HAVING (((tbl_Journal.REFFIN) = ""CP"")) "
      sql = sql1 & sql2 & sql3 & sql4 & sql5
      Set rs = db.OpenRecordset(sql, dbOpenSnapshot)


    peut-être remplacé par cela :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      Dim sql As String
      sql = "SELECT tbl_Journal.REFFIN, 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, tbl_Journal.FIN_AVT, tbl_Journal.FIN_APR "
      sql = sql & " FROM Ts_Banques RIGHT JOIN tbl_Journal ON Ts_Banques.NM_REDUIT = tbl_Journal.REFFIN "
      sql = sql & " GROUP BY tbl_Journal.REFFIN, tbl_Journal.DAT_OPERAT, tbl_Journal.MONTANT, tbl_Journal.RECETTE, tbl_Journal.FIN_AVT, tbl_Journal.FIN_APR "
      sql = sql & " ORDER BY tbl_Journal.REFFIN, tbl_Journal.DAT_OPERAT;"
      sql = sql & " HAVING (((tbl_Journal.REFFIN) = ""CP"")) "
     
      Set rs = db.OpenRecordset(sql, dbOpenSnapshot)



    Quand tu utilises cette syntaxe :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
      Dim sql, sql1, sql2, sql3, sql4, sql5 As String


    Seul Sql5 est un String, tous les autres sont des Variant car ils sont pas typés.
    Si tu veux que tous soient String il te faut faire ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Dim sql As String, sql2 As String, sql3 As String, sql4 As String, sql5 As String


    Le err.raise permet de déclencher une erreur pas de les intercepter. Personnellement j'ai dû utiliser le raise une dizaine de fois depuis 1994.
    Par exemple si tu veux que la valeur 0 ou null provoque une erreur qui interrompe le programme comme ici (c'est un exemple bateau):
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
      If Not rs.EOF() Then
        rs.MoveFirst      'Récupère les soldes bancaires au début de l'exercice puis les inscrits dans le sous-formulaire
     
        If Nz(rs!fin_avt, 0) = 0 Then Err.Raise vbObjectError + 1, "getCommandeFinance", "Il n'y a pas de soldes bancaires de début d'exercice."
     
        Me.txt_CP1 = rs!fin_avt
    ...


    Ne répond pas avec citation ça surcharge inutilement la discussion.
    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  6. #6
    Nouveau membre du Club
    Commande à exécuter dans un sous-formulaire
    Bonjour,
    Un grand merci pour ta réponse du 26 que je ne découvre qu'aujourd'hui........

    Tu as parfaitement raison en ce qui concerne ma déclaration de variable, je suis tombé dans le vieux piège du dimensionnement "en ligne", je vais bien sûr corriger cela directement

    Je teste cette après-midi les corrections proposées et tiendrai au courant des événements.

    Bonne journée (et encore une fois merci)

    Guy.

  7. #7
    Nouveau membre du Club
    Commande dans un sous-formulaire
    Bonsoir,

    je reviens à la charge et après avoir fait tout, je crois complètement, je dois constater toujours le même problème de refus d'exécution de la commande publique :
    pour essayer de simplifier j'ai créé une nouvelle base de données sans table. Elle ne contient que 2 formulaires:
    - le formulaire Maître (et lanceur bien sûr)
    - le formulaire esclave : celui-ci contient un bouton de commande et un affichage spécial (effacement par click dans la photo)

    j'ai fait 2 versions des modules
    le 1er de classe voit la fonction publique être nommée "Exe_Ordre", celle de la version classique est nommé est "ex_ordre"
    un message avertit l'utilisateur que l'on a bien atteint le module
    et puis l'erreur habituelle réapparaît soit :
    "UTILISATION INCORRECTE DU MOT CLÉ ME". pour le module classique où j'atteint celui-ci (instruction : ex_ordre)
    "2465 - Erreur définie par l'application ou par l'objet : erreur sur la ligne de commande donc je n'atteint pas le module de classe (instruction : call me.sfrm_2.form.exe_ordre) (version sélectionnée dans le form load du formulaire maître
    "sfrm_2 est le nom du sous-formulaire dans le formulaire principal.
    Je suis complètement perdu car je ne comprends plus rien au système.
    Bien sûr je joins la DB litigieuse.



    Encore une fois désolé, je commence à voir le début de mon inexpérience.

    Guy.

  8. #8
    Membre expert
    Salut
    Vous devriez copier votre sub ex_ordre() dans le sform
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function ex_Ordre()
        MsgBox "Module CLASSIQUE atteint"
        lbl_Reponse.Visible = True
        img_Reponse.Visible = True
    End Function

    et dans le form
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Load()
        Call Me.sfrm_2.Form.ex_Ordre      'pour le module de classe
    End Sub

  9. #9
    Nouveau membre du Club
    Commandes à exécuter dans un sous-formulaire
    Hello,

    Très bonne journée à vous

    Cela fonctionne impeccablement, j'abandonne donc les modules pour votre excellente approche simplifiée et je vais coder maintenant les vrais formulaires comptables.

    Merci beaucoup,

    Guy Lahou

  10. #10
    Rédacteur/Modérateur

    j'avais raté le fait que les procédures n'était pas dans le module du SF.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie