Formulare in Access verknüpfen

Hallo,

Ich habe folgendes Problem in Access:
Ich habe in Access mehrere Formulare, die über „Weiter“-Buttons miteinander verknüpft sind. Die Formulare basieren alle auf einer Tabelle in einer MS-SQL-Server Datenbank. Mit dem ersten Formular möchte ich einen neuen Datensatz bestehend aus: Name Vorname und ID in die Tabelle eingeben. Wennn ich im ersten Formular auf den weiter-Button klicke soll das zweite Formular auch auf genau diesem Datensatz mit der gleichen ID basieren.

Der VBA Code für meinen Weiter Button sieht so aus:
stLinkCriteria = „[id]=“ & Me![id]
DoCmd.OpenForm Formular2, , , stLinkCriteria

Leider funktioniert das ganze recht unzuverlässig, d.h manchmal zeigt das zweite Formular den gewünschten Datensatz an, ab und zu springt es aber auf den ersten Datensatz in der Tabelle. Bei Formularen, die auf Access Tabellen basieren funktioniert es aber einwandfrei.

Vielen Dank für Eure Antworten,
yuna

Hallo,

statt der Link-Kriterien könntest Du alternativ mit

Me!Feld_mit_ID_Nummer.SetFocus
DoCmd.FindRecord ID_Nummer

den gewünschten Datensatz im „BeimÖffnen“-Event suchen und anzeigen.

ujk

Danke für den Tipp,

Ich habe nun folgenden Code im Formular2

Private Sub Form_Open(Cancel As Integer)
Forms!Formular1!id.SetFocus
DoCmd.FindRecord id
End Sub

Laut Debugger stimmt das noch nicht so.

Hallo,

tut mir leid, ganz vergessen: Für die Übergabe der id von einem Formular zum anderen brauchst Du (zumindest ist das ein Weg) eine globale Variable. Modul öffnen oder neu anlegen und eintragen

Public intID As Integer

Ich vermute einmal Integer trifft zu.

Dann kanst Du vor Schließen von Formular0, von wo Du nach Formular1 wechselst, die id einlesen:

intID = Forms!Formular0!id

und den Code beim Öffnen von Formular1 anpassen:

DoCmd.FindRecord intID

Ich hoffe, das hilft weiter.

ujk

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,
Vielen Dank für Dein Hilfe. Das Ganze sieht jetzt so aus:

Code im Formular1:
Private Sub bntweiter_Click()
Me!id.SetFocus
intid = Me!id
DoCmd.OpenForm „Formular2“
End Sub

Code im Formular2:
Private Sub Form_Open(Cancel As Integer)
DoCmd.FindRecord intaid
End Sub

code in Modul1:
Public intid as integer

Der Debugger bringt die Fehlermeldung:
Ein Makro das einer eigenschaft des aktuellen Felds zugeordnet ist, konnte wegen eines Fehlers in einem Argument der SuchenDatensatz Aktion (findRecord) nicht ausgeführt werden.

Mfg,
yuna

Hallo,

Hallo,
Vielen Dank für Dein Hilfe. Das Ganze sieht jetzt so aus:

Code im Formular1:
Private Sub bntweiter_Click()
Me!id.SetFocus

Focus setzen brauchst Du hier nicht, schadet aber auch nicht.

Code im Formular2:
Private Sub Form_Open(Cancel As Integer)
DoCmd.FindRecord intaid
End Sub

Schreibfehler? Und hier ist das Setzen des Fokus notwendig!

Me!id.SetFocus

Wenn Formular1 geöffnet bleibt, kommst Du auch ohne globale Variable aus:

Code im Formular2:
Private Sub Form_Open(Cancel As Integer)
Me!id.SetFocus
DoCmd.FindRecord Formular1![id]

ujk

Hallo, yuna!

Leider funktioniert das ganze recht unzuverlässig, d.h
manchmal zeigt das zweite Formular den gewünschten Datensatz
an, ab und zu springt es aber auf den ersten Datensatz in der
Tabelle. Bei Formularen, die auf Access Tabellen basieren
funktioniert es aber einwandfrei.

Versuch’s noch mal mit diesem Code. Du musst dann aber sicherstellen, dass die Speichern-Aktion auch in der SQL-Server-Datenbank stattgefunden hat (z. B. falls irgendwas mit Transaktionen läuft, die noch nicht abgeschlossen sind). Access ist, was das angeht, ziemlich „tolerant“ und damit transaktionsfehleranfällig, und speichert den Datensatz sofort. Damit ist er im Folgeformular schon vorhanden.

Bei einer verknüpften Server-Tabelle könnte der Zugriff über Dein Link-Kriterium hin und wieder schon erfolgen, bevor der Server sein Commit (also das Speichern) ausgeführt hat.

Aber abgesehen davon: Verwende doch ein Formular ggf. mit einem Registersteuerelement, bei dem Du ggf. auch nur das jeweils aktuelle Registerblatt sichtbar schaltest. Dann sollten diese Probleme nicht auftreten.

Gruß, Manfred

@ ujk,
Danke, der Code funktioniert jetzt.
Leider ist das eigentliche Problem noch nicht behoben.
Wenn ich z.B einen neuen Datensatz eingebe und diesen speichere wird diesem Datensatz automatisch eine ID zugewiesen. Damit die Verknüpfung der Formulare funktioniert sollte diese ID die aktuelle ID des Formulars sein, bzw. Me!Id sollte den Wert der gerade zugewiesenen ID haben. Genau dies funktioniert nicht richtig. Wenn ich das Programm schrittweise mit dem Debugger durchlaufen lasse wird Me!Id manchmal die akuelle ID zugewiesen machmal bleibt der Wert aber auch auf der ID des vorletzten Datensatzes stehen. Ich denke das Problem liegt irgendwo anders.

@Manfred:
„Bei einer verknüpften Server-Tabelle könnte der Zugriff über Dein Link-Kriterium hin und wieder schon erfolgen, bevor der Server sein Commit (also das Speichern) ausgeführt hat.“

Wenn ich den Datensatz in dem Access Formular speichere, steht er auch sofort in der MS-SQL Server Tabelle drin. Müsste es dann nicht gehen?

Mfg,
yuna

Hallo,

mein letzter Versuch :wink:

füge ganz zu Beginn der Prozedur im Startformular

DoCmd.RunCommand acCmdSaveRecord

ein.

ujk

Hallo ujk,

das habe ich auch schon probiert.
Trotzdem Vielen Dank für Deine Tips

Mfg,
Yuna