[]
Nombre de membres 1 membre
Connectés : ( personne )
 

La Charte du Forum - La Charte du Forum

Forum - Forum
Problèmes Access des débutants - Problèmes Access des débutants


clos par 3Stone le 14/02/2014 : 14:23  Sujet n° 706  appel de procédure

le 08/01/2014 : 00:43
par chrpelt

Anonyme

visiteur

Existe t il un moyen d'exécuter un appel de procédure par une indirection, l'équivalent s'il existe de "DoCmd.RunMacro" mais avec un nom de procédure/fonction en paramètre ?
------------------
Je cherche à exploiter un formulaire présentant un choix d'états (cases à cocher)
A partir des choix utilisateurs, je dois lancer les procédures de mise à jour des tables sous jacentes aux états.
Je souhaite éviter une solution basée sur un select case et voudrait exploiter une table contenant "Nom du controle" "procédure de mise à jour" mais je récupère alors le nom de la procédure (une chaîne de caractère) que je voudrais transformer en appel de procédure

Merci de votre réponse
 sujet clos  Haut

[]   

Réponse n° 1
--------
le 08/01/2014 : 04:44
par 3Stone

3Stone

Administrateur

Bonjour,
 
Citation :

un appel de procédure par une indirection

 
Tu parles d'une procédure VBA ?
Si oui, en réalité, on appelle la fonction ou la Sub qui s'y trouve...
mais, une "indirection" ?  qu'est-ce ?
 
Citation :

Je cherche à exploiter un formulaire présentant un choix d'états (cases à cocher)
A partir des choix utilisateurs, je dois lancer les procédures de mise à jour des tables sous jacentes aux états.

 
Tu as un formulaire qui permet de choisir un ou des états... et cela doit déclencher une mise à jour des tables ?
En quoi consistent ces mises à jour ?
Ne me dit pas que tu fait exécuter des calculs dans les tables comme si tu utilisais Excel ?
 
Citation :

Je souhaite éviter une solution basée sur un select case et voudrait exploiter une table contenant "Nom du controle" "procédure de mise à jour" mais je récupère alors le nom de la procédure (une chaîne de caractère) que je voudrais transformer en appel de procédure

 
Pas clair du tout cette explication... et je n'ai pas la moindre idée de ce que tu tentes de faire.
Une description plus claire et/ou un exemple serait le bienvenu.

Cordialement,
Pierre(3stone)
  clos par 3Stone le 14/02/2014 : 14:23  Haut
Réponse n° 2
--------
le 09/01/2014 : 01:15
par chrpelt

Anonyme

visiteur
Bonsoir Pierre,
Et tout d'abord en ce début d'année meilleurs voeux pour 3stone et merci pour le temps pris à me répondre.

 Citation :Tu parles d'une procédure VBA ?
Si oui, en réalité, on appelle la fonction ou la Sub qui s'y trouve...
mais, une "indirection" ?  qu'est-ce ?

 
Effectivement je parle bien d'une procédure VBA.
Naturellement dans une procédure l'appel se fait directement avec le nom de la procédure :

Sub Myproc ()
Myproc1 param1, ...., param n
End Sub


Mon souhait est de faire un appel, si c'est possible, qui soit similaire à ce qui est autorisé pour une macro avec "docmd.RunMacro MacroName"


Function F14090108()
F14090105 "macrotest"
End Function

Function F14090105(strMacro As String)
DoCmd.RunMacro strMacro
End Function

donc :

Sub Myproc (byval strProcName as string)
'appel de ma fonction avec strProcName au lieu de MyProc1

End Sub


l'indirection correspondant à l'utilisation d'une variable au lieu du nom de la fonction.


 Citation :Tu as un formulaire qui permet de choisir un ou des états... et cela doit déclencher une mise à jour des tables ?
En quoi consistent ces mises à jour ?
Ne me dit pas que tu fait exécuter des calculs dans les tables comme si tu utilisais Excel ?

 
Non, je ne te dis pas que j'utilise Access comme excel .... smile
Je vais essayer d'être clair.
Je réalise actuellement un outil permettant d'effectuer des contrôles de cohérence sur une GPAO développée sous Access.

Pour cela dans mon appli j'ai (pour des raisons d'ergonomie) rassemblé la liste des contrôles que je souhaite réaliser dans un ensemble de case à cocher.
Le principe étant de cocher un sous ensemble de contrôles et sur validation, de réaliser ces contrôles.
Le processus :
Import des tables de la GPAO concernées par les contrôles de validation, réalisation des contrôles, constitution d'une table temporaire servant à l'édition de l'état,
puis export du rapport en pdf, et envoi par mail aux personnes concernées pour action et correction.

Pour faire le lien avec ma recherche, je souhaite établir une table de travail qui a pour champs :
-le nom du contrôle case à cocher,
-la procédure qui effectue les contrôles de cohérence,
-le nom de l'état utilisé pour l'édition.
de façon à n'avoir qu'une seule procédure de génération dans une base "outils" incluse en référence dans ma base qui elle comprend les procédures de contrôles, les états, les tables importées et de travail.
Cette procédure de génération serait donc (strCtrlName étant le nom de la case à cocher)

Sub ProcGen (strCtrlName)

'récupération des paramètres propres au contrôle
lireTbTravail (strCtrlName,strProcName,strReportName)
'appel de ma fonction avec strProcName au lieu de MyProc1
????
'Génération de l'état
DoCmd.OutputTo acOutputReport, strReportName, vFormat, strOutPutFile
'...
'historisation des rapports etc ...
'....
' et pour finir envoi du mail
EnvoyerMail (
strOutPutFile,.....)
End  sub

Cordialement
  clos par 3Stone le 14/02/2014 : 14:23  Haut
Réponse n° 3
--------
le 13/01/2014 : 15:17
par 3Stone

3Stone

Administrateur

Bonjour,

Pas facile à mâcher cette explication wink

Mais, je pense comprendre que tu cherches à utiliser des valeurs contenues dans des variables pour faire références à un objet.

Pour cela, essaies d'utiliser les parenthèses dans l'expression.
Donc, au lieu d'écrire :
 
Code :
 forms!MonFormulaire!MonControle
 tu écris :
 
Code :
forms(varForm)(vatControle)
 
Cordialement,
Pierre (3stone)
  clos par 3Stone le 14/02/2014 : 14:23  Haut
Réponse n° 4
--------
le 14/01/2014 : 21:56
par chrpelt

Anonyme

visiteur
Bonsoir Pierre
merci de ta réponse, j'ai continué à chercher en parallèle  et j'ai trouvé quelque chose qui semble correspondre à ce que je cherche (application.run).
 Mais... je ne sais pas du tout ce qu'il y a derrière et les implications éventuelles sur les performances (à suivre ...) comme disait une BD smile
En tout état de cause voici un code qui devrait fonctionner (il fonctionne dans mon environnement .
cordialement
merci encore de ta disponibilité

'________________________________________________________________________________________

Public Sub ListeRef(ByRef bok As Boolean, Optional ByRef tbTemp As Variant,Optional i As Integer)

'Liste les références enregistrées sous le menu "outils - références"
Dim accref As Access.Reference

On Error GoTo GestErr

For Each accref In Application.References
    With accref
        If (.IsBroken = False) Then
            If IsMissing(tbTemp) Then
                Debug.Print .Name, .Guid, .FullPath
            Else
                tbTemp(i, 0) = "Name"
                tbTemp(i, 1) = .Name
                tbTemp(i, 2) = "Guid"
                tbTemp(i, 3) = .Guid
                tbTemp(i, 4) = "FullPath"
                tbTemp(i, 5) = .FullPath
                i = i + 1
            End If
        Else
            Debug.Print .Guid
        End If
    End With
Next accref

Exit_Sub:
Exit Sub

GestErr:
Select Case err.Number
Case Else
    Resume Exit_Sub
End Select
End Sub
'______________________________________________________________________________

Function F1401101451(ByRef strNomProc As String)
Dim bPass As Boolean
Dim bok As Boolean

On Error GoTo GestErr
bPass = True
bok = True

Application.Run strNomProc, bok    

Exit_function:
F1401101451 = bPass
Exit Function

GestErr:
Select Case Err.Number
Case Else
    MsgBox ("erreur n°:" & Err.Number & vbCrLf & Err.Description)
    bPass = False
    Resume Exit_function
End Select
End Function
'______________________________________________________________________________

Function TestAppel()
Dim bPass As Boolean
Dim bok As Boolean
Dim strNomProc As String

On Error GoTo GestErr
bPass = True

bok = F1401101451("listeref")

Exit_function:
TestAppel = bPass And bok
Exit Function

GestErr:
Select Case Err.Number
Case Else
    MsgBox ("erreur n°:" & Err.Number & vbCrLf & Err.Description)
    bPass = False
    Resume Exit_function
End Select
End Function
'______________________________________________________________________________
Ecrire à chrpelt   clos par 3Stone le 14/02/2014 : 14:23  Haut
actif sujet actif   clos sujet clos   Important! Important!   Nouveau Nouveau message   -   Rectifier Rectifier message   Clôturer Clôturer sujet   Remonter Remonter
[]
Catégories de discussion  Forum 



Haut