Public Function mit Formularname aus UnterUnterformular aufrufen

20/04/2009 - 09:02 von Detlef Eberlein | Report spam
Hallo,



ich möchte in mehreren Formularen die Änderungen von Werten verfolgen.

Folgende Code habe ich aus FAQ und NG zusammengebastelt:



Public Function ÄnderungWert(checkform As Form, DatensatzID)

Dim db As DAO.Database

Dim rs As DAO.Recordset

Dim strSQL As String

Dim ctl As Control



Set db = CurrentDb()

strSQL = "SELECT * FROM tblAudittrail"

Set rs = db.OpenRecordset(strSQL)



If Not checkform.NewRecord = True Then

For Each ctl In checkform.Controls

.

If ctl.OldValue <> ctl.Value Then

, Werte in Tabelle tblAudittrail schreiben

.

Wenn ich die Funktion von einem Hauptformular (z.B. frmPersonen) aufrufe

ÄnderungWert Forms(Me.Name), (Me.PersonenID)

geht das ohne Probleme.

Wenn ich sie von einem UnterUnterformular aufrufen will (HF = frmProjekt,
UFo = frmProjektQualifizierungSQQ, UnterUFo = frmProjekteAufgaben), bekomme
ich die Fehlermeldung "Typen unvertràglich". Gut, daß das mit Me. nicht
klappt, soweit klar, aber ich bekomme es nicht hin, den Formularnamen zu
übergeben.

ÄnderungWert
Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.Name,
Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.AufgabenID

bringt "Anwendungs- oder objektdefinierter Fehler"

ÄnderungWert
Forms(frmProjekt!frmProjektQualifizierungSQQ!frmProjekteAufgaben.Name),
(frmProjekt!frmProjektQualifizierungSQQ!frmProjekteAufgaben.ProjekteAufgabenID)
bringt "Objekt erforderlich"

ÄnderungWert
Forms(Eval("Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.Name")),
(Eval("Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.ProjekteAufgabenID"))
bringt Fehler "kann das Formular frmProjekteAufgaben nicht finden"

Auch das Zerlegen in Formularname/Steuerelementnamen (Me.Name,
Me.Parent.Name, Me.Parent.Parent.Name), getrennt zu übergeben und
zusammenzubasteln kriege ich nicht hin.



Kann mir jemand helfen?



WinXP, Access 2003

Danke

Detlef
 

Lesen sie die antworten

#1 Josef Poetzl
20/04/2009 - 09:39 | Warnen spam
Hallo!

Detlef Eberlein schrieb:
ich möchte in mehreren Formularen die Änderungen von Werten verfolgen.

Folgende Code habe ich aus FAQ und NG zusammengebastelt:
Public Function ÄnderungWert(checkform As Form, DatensatzID)


[...]

Bei DatensatzID würde ich noch den Datentyp angeben. Außerdem würde
ich ByVal statt ByRef verwenden, wenn der übergebene Wert nicht
geàndert werden soll.

Wenn ich die Funktion von einem Hauptformular (z.B. frmPersonen) aufrufe
ÄnderungWert Forms(Me.Name), (Me.PersonenID)
geht das ohne Probleme.



Warum gehst du über die Forms-Auflistung?
ÄnderungWert Me, Me.PersonenID

Anm.: Falls PersonenID kein Steuerelement ist, würde ich Me!PersonenID
schreiben.

Wenn ich sie von einem UnterUnterformular aufrufen will (HF = frmProjekt,
UFo = frmProjektQualifizierungSQQ, UnterUFo = frmProjekteAufgaben), bekomme
ich die Fehlermeldung "Typen unvertràglich". Gut, daß das mit Me. nicht
klappt, soweit klar, aber ich bekomme es nicht hin, den Formularnamen zu
übergeben.

ÄnderungWert
Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.Name,
Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.AufgabenID

bringt "Anwendungs- oder objektdefinierter Fehler"

ÄnderungWert
Forms(frmProjekt!frmProjektQualifizierungSQQ!frmProjekteAufgaben.Name),
(frmProjekt!frmProjektQualifizierungSQQ!frmProjekteAufgaben.ProjekteAufgabenID)
bringt "Objekt erforderlich"

ÄnderungWert
Forms(Eval("Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.Name")),
(Eval("Forms!frmProjekt.frmProjektQualifizierungSQQ.Form!frmProjekteAufgaben.Form.ProjekteAufgabenID"))
bringt Fehler "kann das Formular frmProjekteAufgaben nicht finden"

Auch das Zerlegen in Formularname/Steuerelementnamen (Me.Name,
Me.Parent.Name, Me.Parent.Parent.Name), getrennt zu übergeben und
zusammenzubasteln kriege ich nicht hin.



Zum Glück kannst du die Formular-Referenz übergeben und bist daher
unabhàngig von der Forms-Auflistung. (Referenz-Übergabe klappt immer -
egal ob Hauptformular oder UF-Formular.)

Code im Formular "frmProjekt"

Dim frmPA as Form_frmProjekteAufgaben
'Anm.: Dim frmPA as Form wàre late binding
set frmPA = Me.frmProjektQualifizierungSQQ.Form.frmProjekteAufgaben.Form
ÄnderungWert frmPA, frmPA!ProjekteAufgabenID

Tipp: Ich benenne die UF-Steuerelement nie nach den eingebetteten
Formularnamen. Damit ist für mich besser erkennbar, dass ich ein UF
anspreche. (Außerdem könnte sich das eingebettete Formular àndern. Der
UF-Steuerelementname bleibt aber meist unveràndert.)


Aber:
Ich würde in den einzelnen Unterformularen eine Prozedur einbauen, die
das erledigt, damit du nicht über mehrere Ebenen gehen musst. Das hat
dann den Vorteil, dass es dir im HF egal sein kann, welches
Unterformular im Unterformular frmProjektQualifizierungSQQ
angesprochen werden muss.

Prinzip:
Code im HF "frmProjekt":
Public Sub AenderungWertausfuehren()
ÄnderungWert Me, Me!ID
me.frmProjektQualifizierungSQQ.Form.AenderungWertausfuehren
end sub

Code in UF "frmProjektQualifizierungSQQ":
Public Sub AenderungWertausfuehren()
ÄnderungWert Me, Me!ID
me.frmProjekteAufgaben.Form.AenderungWertausfuehren
end sub

Code in UF "frmProjekteAufgaben":
Public Sub AenderungWertausfuehren()
ÄnderungWert Me, Me!ID
end sub

Damit würde ein einziger Aufruf von AenderungWertausfuehren() im HF
ausreichen, um in allen angegebenen Formularen die Prozedur
auszuführen. Außerdem musst du in diesem Fall die Änderungen in den
Prozeduren nur dort durchführen, wo Unterformulare entfernt bzw.
angefügt werden. Solange die /Schnittstelle/ bleibt, ist kein Code in
übergeordneten Formularen zu àndern.

Anm.: Code passt bestimmt nicht 1:1 zu deinem Aufbau, aber das Prinzip
ist hoffentlich erkennbar.


mfg
Josef

EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen