Nächster Datensatz

Hallo,

ich habe ein Unterformular in ein Formular eingebunden. Nun möchte über VB zum nächsten Datensatz des Unterformulares springen, obwohl nur das Hauptformular geöffnet ist.

Mit docmd.recordset , acnext komme ich nicht weiter. Obwohl das Unterformular ja im geöffneten Hauptformular sichtabr ist, bekomme ich die Fehlermeldung, dass das Unterformular nicht geöffnet ist.

Hilfe !

Hallo,

ich habe ein Unterformular in ein
Formular eingebunden. Nun möchte über VB
zum nächsten Datensatz des
Unterformulares springen, obwohl nur das
Hauptformular geöffnet ist.

Mit docmd.recordset , acnext komme ich
nicht weiter. Obwohl das Unterformular ja
im geöffneten Hauptformular sichtabr ist,
bekomme ich die Fehlermeldung, dass das
Unterformular nicht geöffnet ist.

Was ist jetzt geöffnet - nur das Hauptformular oder auch das Unterformular.

Ansonsten würde ich über den Recordsetclone des Unterformulars gehen, etwa so:

Dim RS As recordset, Frm as Form, UFrm as Form

Set Frm = Forms!MeinFormular
Set UFrm = Frm!MeinUnterformular.Form
Set RS = UFrm.Recordsetclone
RS.Movenext
UFrm.Bookmark = RS.Bookmark

Reinhard

Dim RS As recordset, Frm as Form, UFrm as
Form

Set Frm = Forms!MeinFormular
Set UFrm = Frm!MeinUnterformular.Form
Set RS = UFrm.Recordsetclone
RS.Movenext
UFrm.Bookmark = RS.Bookmark

Reinhard

Danke. Dieser Code funktioniert gut. Leider habe ich aber jetzt ein neues Problem. Ich benutze diesen Code in einer Loop. Wie springe also mit diesem Code aus dem ersten Datensatz in den nächsten Datensatz(dort wird ein Wert geändert) und dann weiter in den nächsten usw. Jetzt das Problem. Nachdem ich diese Procedure durchlaufen habe, kann ich die Datensätze,die ich durchlaufen habe nicht mehr bearbeiten. Sie werden zwar im Formular richtig angezeigt, können aber nicht verändert werden. Wo liegt das Problem ?

Wenn Du Daten per Programm ändern willst, machst du das besser in einem Recordset als in dem Formular, also z.B. in dem entsprechenden Recordsetclone oder einem separat geöffneten Recordset und aktualisierst hinterher das Formular. Etwa so:

Application.Echo False ' unerwünschtes Geflackere verhindern
Set RS = UFrm.Recordsetclone
RS.MoveFirst
Do While NOt RS.EOF 
 RS.Edit
 RS!MeinFeld = Wasauchimmer
 RS.Update
 RS.Movenext
Loop
Me!MeinUnterformular.Requery
Application.Echo True

Vorsicht mit der abgeschalteten Bildschirmanzeige von „Application.Echo False“ - das Debuggen funktioniert dann auch nur eingeschränkt! (Also am besten erst ganz zum Schluss einbauen).

Reinhard

Danke. Dieser Code funktioniert gut.
Leider habe ich aber jetzt ein neues
Problem. Ich benutze diesen Code in einer
Loop. Wie springe also mit diesem Code
aus dem ersten Datensatz in den nächsten
Datensatz(dort wird ein Wert geändert)
und dann weiter in den nächsten usw.
Jetzt das Problem. Nachdem ich diese
Procedure durchlaufen habe, kann ich die
Datensätze,die ich durchlaufen habe nicht
mehr bearbeiten. Sie werden zwar im
Formular richtig angezeigt, können aber
nicht verändert werden. Wo liegt das
Problem ?

Application.Echo False ’ unerwünschtes
Geflackere verhindern
Set RS = UFrm.Recordsetclone
RS.MoveFirst
Do While NOt RS.EOF
RS.Edit
RS!MeinFeld = Wasauchimmer
RS.Update
RS.Movenext
Loop
Me!MeinUnterformular.Requery
Application.Echo True

Vorsicht mit der abgeschalteten
Bildschirmanzeige von „Application.Echo
False“ - das Debuggen funktioniert dann
auch nur eingeschränkt! (Also am besten
erst ganz zum Schluss einbauen).

Reinhard

Auch dieser Code ist nicht übel. Aber auch damit habe ich mein Problem nicht in den Griff bekommen. Hier ist mein eigentliches Problem :

Ich habe ein Unterformular mit einem Datumsfeld. Wenn ich dieses Datumsfeld ändere möchte ich automatisch in den nächsten Datensatz springen, und das Datumsfeld von diesem Datensatz um eine gewisse Differenz verändern. Danach möchte ich weiter in den nächsten Datensatz springen und auch das Datumsfeld um diese Differenz verändern. Dies möchte ich solange machen, bis ein Abbruchkriterium erfüllt wird. Wie kann ich das machen ?

SO sieht es aus !

Hier ist mein
eigentliches Problem :

Ich habe ein Unterformular mit einem
Datumsfeld. Wenn ich dieses Datumsfeld
ändere möchte ich automatisch in den
nächsten Datensatz springen, und das
Datumsfeld von diesem Datensatz um eine
gewisse Differenz verändern. Danach
möchte ich weiter in den nächsten
Datensatz springen und auch das
Datumsfeld um diese Differenz verändern.
Dies möchte ich solange machen, bis ein
Abbruchkriterium erfüllt wird. Wie kann
ich das machen ?

Ach du meine Güte - soll das jetzt ein Programmierkurs werden? Nun gut, versuch’s mal hiermit (das ist die After-Update-Ereignisprozedur des betreffenden Felds im UNTERFORMULAR!):

Private Sub MeinFeld\_AfterUpdate
 Dim RS As Recordset
 Set RS = Me.Recordsetclone
 RS.Bookmark = Me.Bookmark ' akt. Position
 RS.MoveNext ' nächster DS
 Do While NOt RS.EOF And Not (MeineBedingung)
 RS.Edit
 RS!MeinFeld = DateAdd("d",MeineDifferenz,RS!MeinFeld)
 RS.Update
 RS.Movenext
 Loop
End Sub

Reinhard

Private Sub MeinFeld_AfterUpdate
Dim RS As Recordset
Set RS = Me.Recordsetclone
RS.Bookmark = Me.Bookmark ’ akt.
Position
RS.MoveNext ’ nächster DS
Do While NOt RS.EOF And Not
(MeineBedingung)
RS.Edit
RS!MeinFeld =
DateAdd(„d“,MeineDifferenz,RS!MeinFeld)
RS.Update
RS.Movenext
Loop

End Sub

Tja, leider kann nach einem Durchlauf die veränderten Datensätze nicht mehr bearbeiten. Es kommt die Fehlermeldung :! Kein aktueller Datensatz ! Was kann man da machen ?

Tja, leider kann nach einem Durchlauf die
veränderten Datensätze nicht mehr
bearbeiten. Es kommt die Fehlermeldung :!
Kein aktueller Datensatz ! Was kann man
da machen ?

Nach dem Durchlauf bist du vermutlich am EOF - dann musst du halt den Recordset wieder neu positionieren (z.B. mit MoveFirst an den Anfang oder mit FindFirst auf einen bestimmten DS).

Darüber hinaus musst du vermutlich auch noch das Unterformular neu aufbauen (mit Requery). Problematisch wird es immer, wenn derartige Bearbeitungen gegen das Sperrverhalten des Formulars bzw. Unterformulars verstossen bzw. wenn auch noch an anderer Stelle Änderungen gemacht werden. Das (Unter-)Formular sollte daher auf optimistisches Sperrverhalten („keine Sperren“) eingestellt sein und Sperrfehler sollten abgefangen werden.

Reinhard

Danke. Jetzt läuft es so wie ich es haben möchte !