Moin ihr Lieben,
ich brauche nochmal euere Hilfe.
Ausgangslage
Ich habe im Hauptformular formProdukte ein Register mit je einem Registertab für die Formulare ufoAlleKosten (Endlosformular, Register 1) und formKosten(Einzelformular, Register 2)
Im Endlosformular wird für jeden Datensatz ein Button "Details" angezeigt, der beim Drücken auf den entsprechenden Datensatz im anderen Registertab springen soll.
Problemstellung
Mit Forms!formProdukte!RegisterStr105.Pages(2).SetFocus kann ich das richtige Register öffnen, kann aber offenbar keine Variable übergeben.
Mit DoCmd.OpenForm "formKosten", , , "KostenID=" & Me!KostenID
öffnet sich zwar das Formular mit der richtigen ID, aber eben nicht im Register
Wie schaffe ich es beide Tugenden zu verbinden :) Tipps?
Zitat von: xoius am Mai 07, 2020, 13:14:09
Problemstellung
Mit Forms!formProdukte!RegisterStr105.Pages(2).SetFocus kann ich das richtige Register öffnen, kann aber offenbar keine Variable übergeben.
Welche Variable möchtest du wohin übergeben?
Ich möchte die Variable "KostenID" des Datensatzes aus dem Endlosformular "ufoAlleKosten" bei dem der Button geklickt wurde, an das Formular "formKosten" übergeben. Beide Formulare arbeiten mit der gleichen Tabelle tblKosten, die die Variable KostenID enthält.
@xoius
(Luftcode)
Private Sub DeinButton_Click()
Me.Parent.UFo2Control.Form.Recordset.FindFirst = _
"KostenID = " & Me.FeldMitKostenID
Me.Parent.RegisterStr105.Value = 2
End Sub
(Namen anpassen)
Vielen Dank Beaker,
leider funktioniert es noch nicht. Ich habe es so umgesetzt und bekomme eine Fehlermeldung "Methode oder Datenbankobjekt nicht gefunden"
Private Sub Befehl176_Click()
Me.formProdukte.formKosten.Form.Recordset.FindFirst = _
"KostenID = " & Me.KostenID
Me.formProdukte.RegisterStr105.Value = 2
End Sub
Nochmal zum Aufbau:
Ich habe das formProdukte.
Darin enthalten ist das Register RegisterStr105.
Auf Registerkarte 1 ist das Formular ufoAlleKosten eingebettet, indem die Variable KostenID aus der Tabelle tblKosten unsichtbar im Feld KostenID enthalten ist.
Auf Registerseite 2 ist das Formular formKosten eingebettet, was ebenfalls über eine Abfrage mit der tblKosten verbunden ist.
Zusatzfrage:
Wenn ich von einem ganz anderen Formular formODOverview mit dem Unterformular ufoAufgaben über einen Button ebenfalls direkt zu formProdukte/Register105/formKosten möchte, funktioniert das "Me" vermutlich nicht? Wie gehe ich da vor?
Hallo,
Me.PARENT.formKosten.Form.Recordset.FindFirst = _
Zitat von: xoius am Mai 08, 2020, 09:09:36
leider funktioniert es noch nicht. Ich habe es so umgesetzt und bekomme eine Fehlermeldung "Methode oder Datenbankobjekt nicht gefunden"
[...]
Zusatzfrage:
Wenn ich von einem ganz anderen Formular formODOverview mit dem Unterformular ufoAufgaben über einen Button ebenfalls direkt zu formProdukte/Register105/formKosten möchte, funktioniert das "Me" vermutlich nicht? Wie gehe ich da vor?
Parent ist eine Eigenschaft des Formulars, die ein evtl. vorhandenes Hauptformular zurückliefert. - Diese sollte in Beaker's Beispiel unverändert bleiben.
Ich würde im Hauptformular eine öffentliche Prozedur erstellen, die KostenId und Registerseite als Argumente erhält und dann die Positionierung auf den Datensazt erledigt (analog zum Beispiel). Die kannst du dann sowohl aus den Unterformularen als auch von sonstwo aufrufen.
Hallo,
ZitatIch würde im Hauptformular eine öffentliche Prozedur erstellen, die KostenId und Registerseite als Argumente erhält und dann die Positionierung auf den Datensazt erledigt (analog zum Beispiel). Die kannst du dann sowohl aus den Unterformularen als auch von sonstwo aufrufen.
War auch meine erste, eigentlich auch richtigere, Idee :-[
gruss ekkehard
Wirft leider immernoch den Fehler aus...Er sagt Anwendungs- oder Objektfehler...
Könnt ihr euren Alternativvorschlag bitte nochmal klarer machen? Ich lege eine öffentliche Prozedur an?
Also zum Beispiel:
Public Function fktKosten()
Me.Parent.formKosten.Form.Recordset.FindFirst = _
"KostenID = " & Me.KostenID
Me.Parent.RegisterStr105.Value = 2
End Function
Oder wie übergebe ich da die Parameter?
Hallo,
heißt der Name des UFO-Steuerelementes, das das Formular "formKosten" anzeigt, auch wirklich "formKosten"?
@xoius
ZitatIch lege eine öffentliche Prozedur an?
Wo? Im Formular (HFo oder UFo) oder in einem allgem. Modul?
Wenn im Formular, lese: http://www.donkarl.com?FAQ4.2 (http://www.donkarl.com?FAQ4.2)
In einem allgem. Modul musst du der Function eine Referenz auf das HFo
übergeben. Am besten auch gleich die ID.
'Aufruf im HFo
fktKosten(Me, Me.UFo1ControlName.Form.KostenID)
'Aufruf im UFo1
fktKosten(Me.Parent, Me.KostenID)
Public Function fktKosten(frm As Access.Form, lKostenID As Long)
With frm
.UFo2ControlName.Form.Recordset.FindFirst "KostenID = " & lKostenID
.RegisterStr105.Value = 2
End With
End Functiongruss ekkehard
Vielen Dank für eure lieben Tipps, aber ich stochere eher im Dunkeln und stelle mich dabei offennbar zu blöd an.
Folgendes habe ich umgesetzt:
HF beim Klicken
=fktKosten([Me];[Me].[formAufgaben].[Form].[KostenID])
Ufo beim Klicken
=fktKosten([Me].[Parent];[Me].[KostenID])
Public Function fktKosten(frm As Access.Form, lKostenID As Long)
With frm
.formKosten.Form.Recordset.FindFirst "KostenID = " & lKostenID
.RegisterStr105.Value = 2
End With
End Function
Die Procedure liegt im allgm. Modul.
Es kommt folgender Fehler: "...Objekt enthält das Automatisierungsobjekt Me nicht."
Vielleicht nochmal grafischer/klarer was ich vorhabe:
a.
Startpunkt
HF "formODOverview" mit "RegisterStr5" auf Seite 0 ist das UF "formAufgaben" (Endlosformular) (war mal eigenständig, deswegen heißt es nicht ufoAufgaben). Über den Button "Befehl176" soll es zum Ziel gehen.
Ziel
HF "formProdukte" mit "RegisterStr105" auf Seite 2 ist UF "formKosten" (war mal eigenständig, deswegen heißt es nicht ufoKosten)
b.
Startpunkt
HF "formProdukte" mit "RegisterStr105" auf Seite 1. Da ist das UF "ufoAlleKosten" (Endlosformular) mit Button "Befehl176" (heißt zufällig genauso)
Ziel
HF "formProdukte" mit "RegisterStr105" auf Seite 2 ist UF "formKosten" (war mal eigenständig, deswegen heißt es nicht ufo)
Hallo,
lad mal die DB hier hoch, datenreduziert, komprimiert/repariert und gezippt.
Dann können wir die Sache mal konkreter ansehen.
ZitatEs kommt folgender Fehler: "...Objekt enthält das Automatisierungsobjekt Me nicht."
Das liegt an den eckigen Klammern, - schmeiss die raus!
Die braucht man nur wenn in Objektnamen Sonderzeichen enthalten sind,
was man eh vermeiden sollte.
Hallo,
liegt eher daran:
ZitatDie Procedure liegt im allgm. Modul.
und dort ist die Referenz auf das aktuelle Formular (es gibt an dieser Stelle ja keines) unbekannt.
Hallo Franz,
Zitatund dort ist die Referenz auf das aktuelle Formular (es gibt an dieser Stelle ja keines) unbekannt.
Sehe in der Function keine Referenz auf das Form mit Me. Das Form wird
doch als Parameter (frm) übergeben und damit referenziert.
gruss ekkehard
Hallo,
ja sorry, habe überlesen, dass das in einem Ausdruck in der Klick-Eigenschaft des UFOs ("Ufo beim Klicken" ??) steht...
Trotzdem ist auch dort "ME" nicht verwendbar oder definiert..
Der Ausdruck sollte so lauten:
=fktKosten(.[Parent];[KostenID])
Hallo Franz,
Bist du sicher, dass das als Ausdruck im Steuerelementinhalt funzt?
Bei mir funzt es nur mit der kompletten Referenz
=FunctionsName([Formulare]![NameDesHFo]; ...
"..." weil das bei mir nur mit einem festen Wert funktioniert
weder deine Schreibweise noch diese beiden
=FunctionsName([Formulare]![NameHFo]; FeldnameImUFo)
=FunctionsName(([Formulare]![NameHFo];[Formulare]![NameHFo]![NameUFoControl]![Formular]![FeldNameImUFo])
bekomme ich zur Anzeige. Beim 1. Ausdruck erscheint #Typ!, beim 2. #Name?
Durch das Testen bin ich aber auch zu der Überzeugung gekommen,
dass es sehr nervig ist diese Function im Steuerelementinhalt aufzurufen.
Die sollte schon durch ein definiertes Ereignis ausgelöst werden, wie vom
TS gewünscht (Button).
gruss ekkehard
Hallo,
jain.. 8)
habe was vergessen:
=fktKosten([].[Parent];[KostenID])
Oh wow, ja das funktioniert. Viele Dank, dass ihr nicht lockergelassen habt!
Also innerhalb des Formulars formProdukte kann ich nun mit
=fktKosten([].[Parent];[KostenID])
wechseln,...
aber...
aus dem HFForum formODOverview komme ich leider noch nicht auf das Registerelement im anderen Formular formProdukte...
=fktKosten([];[].[formProdukte].[Form].[KostenID])
Ich habe verschiedenste Konstellationen ausprobiert. Meist kommt der Fehler, dass er das Formular formProdukte nicht kennt. Was mach ich denn nun noch verkehrt?
Hallo,
wie wäre es, wenn Du die DB mal hier hochlädst? komprimiert/repariert und gezippt. Sonst kommen wir nur beschwerlich weiter.
Hallo ihr Lieben,
es hat etwas gedauert die DB zu bereinigen.
Zur Erinnerung: Ich möchte aus dem Reiter PV Aufgaben in formODOverview nach formProdukte in den zweiten Reiter Kosten und dort die richtigen Kosten anzeigen lassen.
Hallo Christian,
Zitataus dem HFForum formODOverview komme ich leider noch nicht auf das Registerelement im anderen Formular formProdukte...
Wozu auch? Die beiden Forms haben doch inhaltlich gar nichts miteinander
zu tun. Bei welchem Control hast du die Function denn eingetragen?
ZitatMeist kommt der Fehler, dass er das Formular formProdukte nicht kennt
Na ja, das muss natürlich geöffnet sein, wenn du darauf zugreifen willst.
Die KostenID befindet sich aber zusätzl. in einem UFo des HFo "formProdukte", -
also sollte dann
=fktKosten([];[].[formProdukte].[Form].uctlAlleKosten.[KostenID])funzen. Vermutlich werden dabei aber immer oder zumindest meistens die
Kostendetails des 1. DS aus "ufoAlleKosten" angezeigt.
OT:
1. Gewöhne dir an den UFo-Controls ein anderes Prefix zu geben als dem
eingebetteten Form; uctl... o.ä. (s.o.)
2. Wie kann man mit so einem wirren Beziehungsfenster vernünftig arbeiten?
gruss ekkehard
Das funktioniert leider auch nicht. Aber ich möchte euch nicht länger mit einem offensichtlichen Designfehler von mir behelligen. Deswegen: Topic Closed und Danke für eure Tipps!
Puuh wie schnell man alles vergisst. 20 Jahre Pause mit Access, das ist wie ein Neustart.
Und ich stand heute vor dem gleichen Problem und hab eine simple Lösung (wenn auch wohl nicht fein programmiert) gefunden.
Ein Unterschied besteht zu meiner DB. Ich habe in allen Registerkarten ein ungebundenes Unterformular mit Namen sfmDetails. Erst wenn ich eine Registerkarte auswähle bzw. aktiviere weiße ich die Datenherkunft, den Namen des Unterformulares zu (= Zeile 4 des Codes). Diese Zeile wird für obiges Beispiel nicht benötigt. Evtl. kann man das dann noch weiter verkürzen.
zunächst speicher ich den aktuellen Datensatz
und lege mir den zu suchenden Wert in eine Variable
Dann gehe ich mit GoToControl zur 2. Registerkarte, weiße die Datenherkunft zu und setze den Focus auf das Unterformular. So weit hat das oben ja auch geklappt.
Dann gehe ich mit Docmd.GoToControl zu dem Feld (ID) in dem sich die zu suchenden Daten befinden.
Mit FindRecord und Angabe der Variablen (bei mir vid) springt er sofort zum richtigen Datensatz.
In der Beschreibung zur GoToControl Methode bei Access bin ich fündig geworden. So einfach :)
Der Unterschied ist hier, dass es genügt nur den Feldnamen anzugeben und nicht den vollständigen Pfad, was genau mit den og. Fehlermeldungen immer fehlschlägt.
DoCmd.Save
vid = Forms!Hauptformular!sfmDetails!ID.Value
DoCmd.GoToControl ("NAME der 2. Registerkarte")
Forms!Hauptformular!sfmDetails.SourceObject = "Ufrm_Name"
Forms!Hauptformular!sfmDetails.SetFocus
DoCmd.GoToControl ("ID")
DoCmd.FindRecord (vid)
Gruß Zicke
Hallo Zicke,
einen bereits geschlossenen uralten Thread zu kapern ist nicht die feine Art und bringt die Suchfunktion hier im Forum komplett durcheinander.
Mache bitte einen eigenen neuen Thread auf und wenn du dich auf diesen Thread beziehen möchtest, kannst du ja einen Link darauf hinzufügen.
Es wäre allerdings auch hilfreich, wenn du dann dort dein Problem genauer beschreiben würdest.
Hallo Zicke,
ich habe ein ähnliches Problem. Ist es möglich, dass du deine bessere Lösung einmal hochlädst? Gerne auch in einem neuen Thread oder wir schreiben über PN.
Gruß
Michael
Hallo Michael,
wenn du ein Problem hast, öffne einen eigenen Thread und beschreibe dort dein Anliegen. Wenn du dann noch eine Beispiel hochladen kannst, erhöht das deine Chancen für eine Hilfestellung enorm.
Gruß
Ulrich