Hi, ich möchte aus einem Formular ein anderes Formular per button aufrufen. Wenn ich im VBA das Formular als Ziel angebe, öffnet sich, verständlicherweise das Formular aber als extra Reiter.
Bin da weder mit DoCmd.OpenForm noch mit DoCmd.BrowseTo zum Ziel gekommen.
Wie spreche ich also die einzelnen Elemente der Navigation an?
Ich nutze Access 2016
Thx
Hallo,
versteh nicht..
Wenn sich Formulare als "Reiter" öffnen, liegt das an Einstellungen in den Access-Optionen.
Allenfalls kann ein Formular als Popup eingestellt werden, wodurch es sich außerhalb des Access-Fensters öffnet.
das war nicht gemeint :)
also:
Ich habe ein Navigationsformular, in dem verschiedene Formulare als Navigationselemente vorhanden sind. Z.B. "allg. Übersicht", "Kunden" und "Produkte".
in der Übersicht sind die letzten Verkäufe aufgeführt. Dort möchte ich von z.b. dem jüngsten Einkauf per Button direkt auf den Kunden springen. Hier öffnet sich leider das Formular "Kunden" separat und eben nicht das Navigationselement "Kunden". Letzteres ist aber gewünscht.
Konnte ich es jetzt klar machen?
Hallo nimora,
Dein im Naviformular angezeigtes Form "Kunden" ist ein UFo desgleichen.
Wenn Du aber das Form "Kunden" per DoCmd.OpenForm öffnest wird es
als HFo neben dem Navi-Form geöffnet.
Um auf das (schon offene) Form zu zugreifen musst Du nur den Focus
darauf setzen und auf den gewünschten Datensatz positionieren.
hth
gruss ekkehard
Danke Beaker,
das mit dem Datensatz klapp natürlich, aber wie lege ich denn den Focus auf das UFo? Wie spreche ich das an. Das ist ja als normales Formular angelegt, bekommt das dann intern einen anderen Namen als UFo?
Hallo nimora,
Weiss ich ehrlich gesagt im Moment auch nicht, da ich das nicht verwende.
Habe hier jetzt auch keine DB, mit der ich das mal eben testen könnte.
Bin morgen wieder zu Hause, dann schau ich mal.
Du könntest bis dahin mal versuchen, ob es eine Forms-Auflistung des
Naviforms gibt.
DeinNaviFom.Forms("Kunden")
gruss ekkehard
Hallo,
Zitat von: nimora am Mai 11, 2016, 17:19:04
Bin da weder mit DoCmd.OpenForm noch mit DoCmd.BrowseTo zum Ziel gekommen.
die BrowseTo-Methode dürfte in Verbindung mit einem Navigationsformular die richtige Wahl sein.
Zeige doch bitte deinen diesbezüglichen Versuch und erkläre bzw. beschreibe die dabei verwendeten Komponenten.
PS:
Der Phantasiecode von Ekkehard ist da eher nicht zielführend.
wenn DoCmd.BrowseTo der Weg ist, schnalle ich den wohl nicht.
Die Doku gibt folgendes an:
DoCmd.BrowseTo ObjectType:=acBrowseToForm, _
ObjectName:="EventDS", _
PathToSubformControl:="Main.NavigationSubform", _
WhereCondition:="", _
Page:="", _
DataMode:=acFormEdit
Ich scheitere aber an der Zuordnung. Ich bekomme einen Fehler 6045
Die WechselnZu-Maktoaktion erfordert ein gültiges Pfad-Argument. Ein gültiges Pfad-Argument hat folgende Form:
Hauptformular1.Unterformular1>Formular1.Unterformular1
Ist das Hauptformular1 dann jetzt die Bezeichnung des gesamten Navigationselements? und das Unterformular1 ist dann was? Ich schnelle die Struktur da nicht. In der Navigation ist der Button, wenn ich den auswähle habe ich in den Einstellungen einen Namen "NavigationButton13". Spielt das dabei eine Rolle? Ich finde nicht heraus, was Hauptfrom1, Unterform1 und Form1 ist.
Entsprechend kann ich deinen Wunsch, Maggie nicht erfüllen. Ich wüsste nicht, was ich schreiben soll.
Wärt ihr noch mal so nett und würdet mich ein wenig erhellen?
Hallo Maggie,
ZitatDer Phantasiecode von Ekkehard ist da eher nicht zielführend.
Wie gesagt ich verwende dieses Naviform nicht, und habe mich deshalb
auch noch nicht mit zugehörigen Eigenschaften/Methoden beschäftigt.
War ein Schuss ins Blaue.
gruss ekkehard
@nimora:
Du musst schon die bei dir gültigen Namen verwenden.
Wie heißen dein Navigationsformular und wie das Navigationsunterformular?
Hallo nimora,
ObjectName (i.B. EventDS) ist das Formular, das Du sehen willst
(eingebettet in das UFo-Control).
Main ist der Name des NaviForms.
NavigationSubform ist das UFo-Control, in dem das o.a. Form ein-
gebettet ist.
gruss ekkehard
P.S. getestet
@MaggieMay - Danke
genau darüber bin ich nicht ganz sicher.
das Nav heißt frmNavigation, darin enthalten sind dann verschiedene andere Formulare. Nun bin ich nicht sicher, ob die dann im vba auch ihre Originalnamen behalten oder nicht. eines heißt z.b. frmKunden und das soll in der Navigation per Button geöffnet werden.
Und insgesamt kann ich nicht zuordnen, wie das hier gemeint ist:
DoCmd.BrowseTo ObjectType:=acBrowseToForm, _
ObjectName:="EventDS", _
PathToSubformControl:="Main.NavigationSubform", _
WhereCondition:="", _
Page:="", _
DataMode:=acFormEdit
und hier:
Hauptformular1.Unterformular1>Formular1.Unterformular1
Die Fehlermeldung und die Doku bringe ich da nicht zusammen.
Was ist der Path, was ist ObjectName und Main.NavigationSubform. und wie gesagt, wie passt dann die Fehlermeldung mit "Hauptform1", "Unerform1" usw. da rein.
thx
@Beaker: thx
ZitatObjectName (i.B. EventDS) ist das Formular, das Du sehen willst
(eingebettet in das UFo-Control).
Main ist der Name des NaviForms.
das verstehe ich.
ZitatNavigationSubform ist das UFo-Control, in dem das o.a. Form ein-
gebettet ist.
verstehe ich leider nicht. ist damit der Name des Buttons gemeint?
Hallo nimora,
Nein, das Control unter dem Button. (Buttonleiste oben)
Wenn du (in der Entwurfsansicht) auf den Button klickst, bekommt
der doch einen farbigen Rahmen. Wenn du nun in den Bereich darunter
klickst, (solltest) Du einen gleichfarbigen Rahmen um das dargestellte
Formular sehen; - DAS ist das UFo-Control, in den das Formular
eingebettet ist. Dessen Namen (F4) musst du in den Code schreiben.
gruss ekkehard
ZitatWenn du nun in den Bereich darunter
klickst, (solltest) Du einen gleichfarbigen Rahmen um das dargestellte
Formular sehen; - DAS ist das UFo-Control, in den das Formular
eingebettet ist. Dessen Namen (F4) musst du in den Code schreiben.
gruss ekkehard
Das lautet "Navigationsunterformular" aber das ist bei allen UFo's gleich. Überall steht das.
EDIT:
so, wie folgt hat es geklappt:
DoCmd.BrowseTo ObjectType:=acBrowseToForm, _
ObjectName:="frmKunden", _
PathToSubformControl:="frmNavigation.Navigationsunterformular", _
DataMode:=acFormEditLetzte Fragen fürs Verständnis: ist das normal, dass da überall Navigationsunterformular steht? Kann das zu Problemen führen und sollte das geändert werden?
Besten Dank für euer aller Mühe.
Jetzt kann ich ins lange WE gehen. Euch wünsche ich dasselbige.
VG
Hallo nimora,
Zitatist das normal, dass da überall Navigationsunterformular steht? Kann das zu Problemen führen und sollte das geändert werden?
Ja, wie es aussieht gibt es nur ein "UFo"-Control, in dem die verschiedenen
Forms angezeigt wird.
Welches Form das ist wird in der Eigenschaft "Name des Navigationsziels"
des zugehörigen Reiterbuttons gesteuert. Im Code ist das der Parameter
"ObjectName".
gruss ekkehard
P.S. Wenn das so weiter geht, werde ich noch Spezialist für dieses
bescheuerte NaviForm ;)
Hi,
Zitat von: nimora am Mai 13, 2016, 17:27:07
ist das normal, dass da überall Navigationsunterformular steht?
Ja, natürlich, denn es gibt ja nur
ein Unterformular-Steuerelement, in das die diversen Formulare beim Wechsel der Navigations-Buttons geladen werden.
Und genau das ist ja auch der Haken bei diesem Navigationsformular, dass die Unterformulare beim Wechsel der Register jeweils geschlossen und neu geöffnet werden. Ein herkömmliches Register-Steuerelement (als Alternative zum Navigations-Formular) kann man ebenso, aber auch je nach Bedarf differenzierter einsetzen und nutzen.
Besten Dank.
Die Umsetzung in einem Register ginge auch, scheint mir auch schneller zu laufen, dennoch wäre auch hier wieder die Frage, wie man da per Button in einem Register auf einen bestimmten! Datensatz in einem anderen Register kommt.
also im code: Me!Register.Value = 1
wie oder wo kommt das da rein? Unter welchem Stichwort finde ich in der Doku da was?
Ich weiß jetzt nicht was du mit dem Code im Sinn hast, aber ich kann dir sagen, wie du auf einen bestimmten Datensatz springen kannst,
bspw. so:
Me.Recordset.FindFirst "feldname=" & feldwert
Oder, von einem Ufo ins andere:
Me.Parent.uf2.Form.Recordset.Findfirst "feldname=" & feldwert
Danke.
hmm, ich meine:
Register A mit Button 1 soll gedrückt werden und damit in Register B einen im VBA des Button 1 definierten Datensatz aufrufen.
Darum ging es in dem ganzen Beitrag, nur hattest du ja nun den Tip gegeben, dass dies auch in einem Register umsetzbar wäre.
Hast du denn Fragen zu meinem Vorschlag, ist noch irgend etwas unklar?
Oder was genau meinst du hiermit:
ZitatRegister A mit Button 1 soll gedrückt werden und damit in Register B einen im VBA des Button 1 definierten Datensatz aufrufen.
Ich habe deinen Vorschlag nicht als Antwort auf die letzte Frage verstanden, sondern als Antwort auf die ursprüngliche Frage in diesem Beitrag. Außerdem hattest du ja geschrieben, dass dir nicht klar ist, was ich mit dem Code im Sinn habe. Deinen Code bekomme ich da sowohl praktisch als auch gedanklich nicht eingearbeitet. Vielleicht reden wir aber auch aneinander vorbei.
Also wir sind jetzt beide bei der Variante mit dem Register-Steuerelement - ok?
Dann kannst du auf Knopfdruck von A nach B springen und dort einen bestimmten Datensatz anspringen,
bspw. so:
Private Sub cmd_1_Click()
Me.RegCtl = 1
Me.Parent.uf2.Form.Recordset FindFirst "ID=" & Me.ID
End Sub
Das ist natürlich Phantasiecode, weil ich nicht weiß wie dein Registersteuerelement und deine Unterformulare heißen, und ob auf Register A überhaupt ein Unterformular liegt und auf welchen Datensatz du springen willst, d.h. welches Datenfeld im Kriterium anzusprechen ist und woher der Wert dazu kommt.
Vielleicht kannst du ja etwas damit anfangen.
habe es leider nicht geschafft, es zurechtzubasteln.
Ich habe folgende Formulare:
frmVerkaeufe
frmKunden
frmRegister.
In Register1 in frmRegister liegt das Formular frmVerkaeufe (frmVerkäufe basiert auf einer Abfrage). Somit ist ja frmVerkaeufe das Ufo?!? In den Eigenschaften steht für das Ufo frmVerkaeufe im Register1 als Name "Verkaeufe_Kunden".
Der Button innerhalb dieses Forms/Ufo´s soll nun auf Register2 verweisen, in dem sich das Form/Ufo frmKunden befindet. In den Eigenschaften ist dieses "Kunden" genannt. Und hier soll der entsprechende Kunde ausgewählt werden.
Ich kann leider aus deinem Code das uf2 und das Form nicht zuordnen, was was ist. Es gibt ja zwei Ufo's, "Verkaeufe_Kunden" und "Kunden". und Me.RegCtl = 1 sagt mir leider auch nichts. Ist das das Registerelement? Bei mir hieße das ja me.RegisterStr0 = 1. Das funktioniert war direkt aus dem Register1 aber nicht aus dem Ufo.
:'(
EDIT:
habe nun hier https://dbwiki.net/wiki/Access_Bedienungsanleitung:_Bezug_auf_Formular/Unterformular (https://dbwiki.net/wiki/Access_Bedienungsanleitung:_Bezug_auf_Formular/Unterformular) ein wenig was gefunden, sodasss ich zumindest aus dem entsprechenden Ufo in das andere Register komme.
Me.Parent.Parent!RegisterStr0.Value = 1 funzt also.
bei
Me.Parent.Kunden.Form.Recordset FindFirst "ID=" & Me.ID
gibts schon beim kompilieren einen syntaxfehler und er spring auf den code "ID="
die ID ist vorhanden, ich kann sie mir per debug.print ausgeben lassen.
und bei:
Me.Parent.Kunden.RegisterStr0.Recordset.FindFirst "ID=" & Me.ID
kommt: Objekt unterstützt diese Eigenschaft oder Methode nicht.
wo mache ich noch einen fehler?
DAnke
Hallo nimora,
Das Register-Control ist kein Teil des "Pfades" zum UFo; - dessen Name
wird hier nicht benötigt.
Wenn der Button in einem UFo liegt, dann ist:
Me = das Formular im UFo-Control (farbiger Rahmen um das Form)
.Parent = das HFo, in deinem Fall "frmRegister"
Me.Parent.Kunden.Form.Recordset FindFirst "ID=" & Me.ID
Ist aber im Prinzip schon richtig, unter der Voraussetzung, dass
"Kunden" der Name des UFo-Controls auf der zweiten (anzusteuernden)
Registerkarte ist.
"ID" muss natürlich auch deinen Feldnamen (Tabelle/Form) entsprechen.
gruss ekkehard
Hi,
Zitat
Me.Parent.Parent!RegisterStr0.Value = 1
funzt also.
das lässt darauf schließen, dass es sich um ein
Unterformular im Unterformular handelt. Du solltest also dein Beschreibung dahingehend noch einmal überarbeiten.
@Beaker
ZitatIst aber im Prinzip schon richtig, unter der Voraussetzung, dass
"Kunden" der Name des UFo-Controls auf der zweiten (anzusteuernden)
Registerkarte ist.
"ID" muss natürlich auch deinen Feldnamen (Tabelle/Form) entsprechen.
das ist alles erfüllt, dennoch gibt es sofort einen Syntaxfehler und die Markierung legt sich auf '"ID="'. Ich kann mir ID auch per debug.print ausgeben.daher war/bin ich da ratlos.
EDIT: es fehlt ein Punkt zw. Recordset und FindFist - natürlich ::)
Damit funzt es.
@Maggie:
hier hapert es wohl wieder am Verständnis für die einzelnen Bestandteile und wir hatten die Diskussion ja schon mal, dass wenn man die Bezeichnung nicht exakt kennt, auch die Suche oder Beschreibung abweichen kann.
Dass es ein Ufo im Ufo ist konnte ich nur raten, da alle anderen Varianten nicht funktioniert haben. Mir ist aber nicht bekannt, dass oder ob ein Registersteuerelement in einem Formular schon ein Ufo ist und demnach das sich auf einem Register befindliche Formular ein Ufo im Ufo ist. Ich habe es oben beschrieben wie es ist, nur scheinbar im falschen Fachjargon. Bitte entschuldige.
Für die Nachwelt:
Aufruf über Navigation (eine Möglichkeit):
DoCmd.BrowseTo ObjectType:=acBrowseToForm, _
ObjectName:="frmKunden", _
PathToSubformControl:="frmNavigation.Navigationsunterformular", _
DataMode:=acFormEdit
Aufruf über Registersteuerlement:
Me.Parent!RegisterStr0.Value = 1
Me.Parent.Kunden.Form.Recordset.FindFirst "ID=" & Me.IDBesten Dank für alle Hilfen
ZitatDass es ein Ufo im Ufo ist konnte ich nur raten
Sorry, aber das muss man doch sehen, wenn man sich den Formularentwurf anschaut. ???
Ein Registersteuerelement an sich ist kein Unterformular, sonder ein ganz "normales" Steuerelement. Bei einem Register im Register ist immer ein Unterformular im Spiel, weil sich das anders nicht einfügen lässt.