PDA

Vollständige Version anzeigen : Formular bei bestimmtem DS öffnen, die 1001.


Silvie31
28.10.2011, 17:37
Hallo liebe Leute,

Wie man ja wirklich ÜBERALL nachlesen kann, kann man mit DoCmd.OpenForm "ZuÖffnendesformular", , , "KriteriumID = " & Me!KriteriumID ein Formular öffnen und dabei zu einen bestimmten DS springen.
ABER: Bei dieser Funktion, wird das zu öffnende Formular ja gefiltert. Deswegen suche ich eine Lösung, mit der man an einen bestimmten DS springen kann, ohne das Formular wirklich zu filtern. Man könnte dann zum gewünschten DS springen und sich von dort aus, auch den vorherigen bzw. den nächsten DS anschauen (navigieren). Also quasi ein GoToRecord, aber halt für ein anderes Formular....?!?

Hat da jemand eine Idee? Ich steh irgendwie aufm Schlauch.


Vielen lieben Dank schonmal.

X Silvie

ebs17
28.10.2011, 18:10
Beim OpenForm nimmst Du nicht das Kriterium, sondern OpenArgs als Argument. Das wird dann im Formular ausgewertet:
DoCmd.OpenForm "ZuÖffnendesformular", , , , , , Me!KriteriumID

'###############################################

Private Sub Form_Open()
If Not IsNull(Me.OpenArgs) Then
Me.RecordsetClone.FindFirst "Id = " & CLng(Me.OpenArgs)
Me.Bookmark = Me.RecordsetClone.Bookmark
End If
End Sub

Silvie31
29.10.2011, 15:54
Hallo Eberhard,

Hab grade mal deinen Vorschlag umgesetzt, leider habe ich irgendwo nen Fehler:
Das Formular lässt sich jetzt nicht mehr öffnen: "...Deklaration der Prozedur entspricht nicht der Beschreibung eines Ereignisses..."
Wenn ich den Code über "Eigenschaften" eintrage, beginnt er die Prozedur mit Private Sub Form_Open(Cancel As Integer). Dann öffnet sich zwar das Formular aber immer im ersten DS. OpenArgs wird also ignoriert. Mache ich es ohne (Cancel As Integer) öffnet er mir das Formular nicht mehr.

Vielleicht hab ich Dir etwas wichtiges vorenthalten, deswegen kurz zum Hintergrund:
frm1: Veranstaltungen
frm2: Locations
--> In frm2 gibt es ein EndlosUfo mit allen Veranstaltungen der jeweiligen Location. Neben jeder Veranstaltung gibt es einen Button, mit dem man zur entsprechenden Veranstaltung in frm1 springen soll.

Hoffe du hast wirder eine deiner gewaltigen Ferndiagnosen für mich... :)
Vielen Dank schonmal.

LG Silvie

ebs17
29.10.2011, 16:39
Das "Cancel As Integer" gehört natürlich dazu, das wird beim Anlegen der Ereignisprozedur automatisch erzeugt, ich habe es nur noch nie an der Stelle verwendet und daher nicht in Erinnerung, wenn ich ein paar Zeilen so hinschreibe.

OpenArgs wirkt auf das Hauptformular, dieses wird ja mit der OpenForm-Anweisung geöffnet.
Bei Vorhandensein HFo und UFo ist zu beachten, dass ein UFo vor dem HFo geladen wird. Daher könnte eine Information aus dem HFo-Openargs an das UFo weitergeleitet und dort umgesetzt werden (nach Prüfung, ob es im Moment dieses bestimmte UFo im HFo gibt).
Und obige Methode prüft noch nicht, ob das FindFirst erfolgreich ist. Wenn ein NoMatch-Fall eintreten kann, muss er auch berücksichtigt werden (dann landet der Datensatzzeiger automatisch auf dem ersten Datensatz).

Silvie31
29.10.2011, 17:27
Hi Eberhard,

Das war ja mal wieder ein ganz dummer Fehler: Mein zu öffnendes Formular war schon geöffnet! Beim Klick auf den Button wechselt er dann lediglich dass Fenster. Wenn ich das Formular schließe und erneut probiere, klappt es einwandfrei. Super!

Trotzdem nochmal eine Nachfrage: Es wäre natürlich auch nicht schlecht, wenn das ganze auch beim bereits geöffneten Formular klappt. Folgende Situation: Beide Formulare sind geöffnet, beim Klick auf den Button in Formular 2 soll er dann in das "zu öffnende" Formular 1 wechseln und dort zum entsprechenden Datensatz springen. Kann ich das auch irgendwie mit OpenArgs bewerkstelligen? Habs schon mit "Load" und "GetFocus" versucht...leider ohne Erfolg.

Zu deinem NoMatch Hinweis: Ich glaube dass kann per Definition nicht der Fall sein. Im Endlosformular werden ja nur bestehende DS angezeigt. Ein NoMatch kann also nicht sein....Oder doch? :)

X Silvie

ebs17
29.10.2011, 17:42
Im Endlosformular werden ja nur bestehende DS angezeigt.
Das ist logisch. Man könnte aber eine ID vorgeben, die es dort nicht gibt.
Beide Formulare sind geöffnet ...
Dann sollte man zuerst prüfen, ob das Zielformular geöffnet ist. Wenn nein, dann wie beschrieben mit OpenForm verfahren. Wenn ja, kann man direkt den Fokus auf den gewünschten Datensatz legen:
<strike>Me</strike>.RecordsetClone.FindFirst "Id = " & WunschID

Forms!Zielformular.RecordsetClone.FindFirst "Id = " & WunschID
' ...

Silvie31
29.10.2011, 18:57
Hi Eberhard,

Die Prüfung ob das Formular geöffnet ist, habe ich hinbekommen. Wenn es NICHT geöffnet ist, funktioniert es auch. Den zweiten Teil verstehe ich aber nicht so ganz. Irgendwie komm ich da mit den IDs durcheinander. Und warum eigentlich zweimal FindFirst? Kannst du mir das noch mal erklären?

Im Button steht:Private Sub btnOpenEvent_Click()
If CurrentProject.AllForms("frmEvent").IsLoaded = False Then
DoCmd.OpenForm "frmEvent", , , , , , Me!CongressID_F
Else
RecordsetClone.FindFirst "CongressID_F = " & CongressID 'Das kann ja nicht klappen...
Forms!frmEvent.RecordsetClone.FindFirst "CongressID = " & Me!CongressID_F
End If
End Sub
Im zu öffnenden Formular steht:
Private Sub Form_Open(Cancel As Integer)
If Not IsNull(Me.OpenArgs) Then
Me.RecordsetClone.FindFirst "EventID = " & CLng(Me.OpenArgs)
Me.Bookmark = Me.RecordsetClone.Bookmark
End If
End Sub

Sorry dass du mir alles haarklein vorkauen musst.....Ich tu mein bestes und bin echt dankbar für deine Geduld.
LG Silvie

EDIT: Haha, Mit den IDs komm ich zwar immer noch durcheinander, aber ich glaube ich hab den Hinweis jetzt erst verstanden.
Du willst mir nur bildlich zeigen, dass ich Me. ersetzen soll durch Forms!namedesformulars.
Sorry! :)

ebs17
29.10.2011, 19:05
Das kann ja nicht klappen...
Genau. Ich wollte nur darstellen, dass der Formularbezug von Me (von innen) auf Forms!frmEvent (von außen) zu ändern ist.
Ich hätte wohl die ganze Zeile streichen müssen. (Die Restzeile ist Unsinn.)

Silvie31
29.10.2011, 19:36
Mühsam ernährt sich das Eichhörnchen... :)
Aber es hat den Winter überstanden und ist sehr zufrieden:
Private Sub btnOpenEvent_Click()
If CurrentProject.AllForms("frmEvent").IsLoaded = False Then
DoCmd.OpenForm "frmEvent", , , , , , Me!CongressID_F
Else
Forms!frmEvent.RecordsetClone.FindFirst "EventID = " & Me.EventID_F '1
Forms!frmEvent.Bookmark = Forms!frmEvent.RecordsetClone.Bookmark '2
Forms!frmEvent.SetFocus '3
End If
End Sub
' 1 Erstellt mir ein "Klon" des Datensatzes in meiner Zieltabelle, bei dem die ID mit der ID des UFo's übereinstimmt. :)
' 2 Springt im Zielformular zum Datensatz des Klons
' 3 Bringt mich ins bereits geöffnete Zielformular

Der SetFocus Befehl hatte mir noch gefehlt. Dachte Bookmark springt zu einem Datensatz und zeigt mir diesen auch gleich an. Bin fast verzweifelt.

Drei Stunden später ist also auch dieser Beitrag erledigt. :)

LG und wirklich nochmal vielen lieben Dank,
Silvie

(Es klappt zwar, aber wenn hier doch irgendwas nicht ganz stimmt, lass ich mir gerne weiterhelfen. Vielleicht geht's ja auch effizienter.)