1 membre
Connectés : ( personne )
- La Charte du Forum - Forum - Problèmes Access des débutants
Sujet n° 706 |
appel de procédure |
le 08/01/2014 : 00:43 par chrpelt
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 |
|
|
Réponse n° 1 -------- le 08/01/2014 : 04:44 par 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) |
|
|
Réponse n° 2 -------- le 09/01/2014 : 01:15 par chrpelt
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 .... 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
|
|
|
Réponse n° 3 -------- le 13/01/2014 : 15:17 par 3Stone
Administrateur
|
Bonjour,
Pas facile à mâcher cette explication
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) |
|
|
Réponse n° 4 -------- le 14/01/2014 : 21:56 par chrpelt
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 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 '______________________________________________________________________________ |
|
|
sujet actif
sujet clos
Important!
Nouveau message -
Rectifier message
Clôturer sujet
Remonter
|