PDA

Vollständige Version anzeigen : Abfrageausführungsende feststellen


gentry205
06.06.2003, 20:32
Hallo,

weiß jemand, wie man feststellen kann, wann die Abfrage, auf der ein Formular basiert, vollständig ausgeführt ist oder wie man die Ausführung des VBA-Codes für eine bestimmte Zeit unterbrechen kann.
Ich benötige dies, da ich, nachdem die Abfrage eines Formulars ausgeführt wurde, zu einem bestimmten Datensatz mit der Methode gotoRecord springen möchte. Das funktioniert auch super, solange die Datenmenge 1000 Datensätze nicht überschreitet. Sind mehr Datensätze vorhanden, dann wird die Abfrage zu langsam ausgeführt und im VBA-Code tritt ein Fehler auf.

Gruß und Danke schon mal im Voraus
Marek

Nouba
06.06.2003, 23:41
ich kann weder die Abfrage noch den verwendeten Kode sehen. Bei OnCurrent der Form sollten die Daten eingelesen sein?

Wie wird der DS identifiziert, den Du anzeigen willst?

Fiddler
07.06.2003, 08:00
Vielleicht versch. Attribute Indizieren, aber nicht zu viele, dann dürfte es schneller gehen

gentry205
07.06.2003, 08:57
Hallo Nouba,

nachfolgend der Code um den entsprechenden Datensatz in der Anzeige des Formmulars zu identifizieren, damit du verstehst was ich eigentlich will.

Public Sub gotoKunde(gpartNr As Long)
Dim datensatzNr As Integer
Dim statusList As Recordset
Dim zaehler As Long

Me.Requery
Set statusList = Me.RecordsetClone
statusList.MoveFirst
For zaehler = 1 To statusList.RecordCount
If (statusList.Fields("GpartNr") >= gpartNr) Then
datensatzNr = zaehler
Exit For
End If
datensaetze = Me.Recordset.RecordCount
statusList.MoveNext
Next zaehler
DoCmd.GoToRecord acDataForm, "F_FM_ÜbersichtKundenstatus", acGoTo, datensatzNr
statusList.Close
Set statusList = Nothing
End Sub


Gruß
Marek

gentry205
07.06.2003, 09:05
nach ein kleiner Fehler im Code
datensaetze = Me.Recordset.RecordCount
gehört da nicht hin.

Nouba
07.06.2003, 09:35
Hallo Marek,

ich verstehe es so, dass im Recordset(Clone) der Form nach der ersten GpartNr die größer oder gleich ist als der gleichnamige Parameter der Prozedur. Versuche dann mal Folgendes
Sub gotoKunde(gpartNr As Long)
Dim datensatzNr As Integer

With Me.RecordsetClone
.FindFirst "GpartNr >= " & gpartNr
If Not .NoMatch Then
DoCmd.GoToRecord acDataForm, "F_FM_ÜbersichtKundenstatus", acGoTo, .Fields("GpartNr")
End If
End With
End Sub
Im OnCurrent Event der Form könnte eine Boolean Variable einmalig gesetzt werden, um festzustellen, ob die Daten komplett eingelesen wurden. Der Wert dieser Variablen könnte die Ausführung von <i>gotoKunde</i> steuern.
If boolGeladen Then gotoKunde lngVar
Bei welchem Ereignis rufst Du die Prozedur auf?

gentry205
07.06.2003, 09:43
Hallo Nouba,

die Methode wird aus einem anderen Formular heraus aufgerufen. Dieses andere Formular dient dazu Änderungen an den im ersten Formular angezeigten Datensätzen vorzunehmen. Nach der Änderungen im zweiten Formular soll die Änderung im ersten Formular auch angezeigt werden, was ein Requery im ersten Formular notwendig macht.

Ich werde mal versuchen das OnCurrent Ereignis zu benutzen um festzustellen, ob alle Datensätze geladen sind.

Gruß
Marek

Nouba
07.06.2003, 10:14
irgendwie war ich bei meiner Antwort abgedriftet. Mein GoToRecord kann so nicht funktionieren.

So sollte es eher funktionieren. <i>Me!txtGpartNr</i> ist ein fiktives Stextsteuerelement und könnte von einer Variablen ersetzt werden. Wäre ein Gleichheitszeichen als Operator im Kriterium nicht angebrachter oder willst Du später weitersuchen?
With Forms("F_FM_ÜbersichtKundenstatus")
.RecordsetClone.FindFirst "GpartNr >= " & Me!txtGpartNr
If Not .RecordsetClone.NoMatch Then
.Bookmark = .RecordsetClone.Bookmark
End If
End With

mit einem Filter macht >= meines Erachtens mehr Sinn, falls mehrere DS in die Auswahl sollen.
With Forms("F_FM_ÜbersichtKundenstatus")
.Filter = "GpartNr >= " & Me!txtGpartNr
.FilterOn = True
End With

gentry205
07.06.2003, 10:15
Hallo Nouba,

habe mir eben im Debug-Modus mal die Abfolge der einzelnen Methodenaufrufe angesehen und dabei festgestellt, dass es nichts nützt das OnCurrent-Ereignis abzufragen. Die von mir geschriebene Methode wird nach dem Aufruf von Me.Requery unterbrochen, dann auf das OnCurrent-Ereignis reagiert und erst danach wird meine Methode fortgesetzt.

Irgendwie komischt ist das ganze schon, wie kann der Code weiter ausgeführt werden, wenn das Recordset noch nicht vollständig zur Verfügung steht? Wenn ich von einem Java-Programm aus auf eine Oracle-Datenbank zugreife, bekomme ich auch kein halbes Resultset (RecordSet) als Ergebnis der Abfrage zurück.

Gruß
Marek

P.S. wunder dich nicht über die Verwendung des Wortes Methode anstatt Prozedure. Ich programmiere sonst den ganzen Tag nur in Java.

gentry205
07.06.2003, 10:23
Hallo Nouba,

es soll nur ein bestimmter Datensatz angesprochen werden. Zu Hintergrund des ganzen Theaters: Ich kann mir die Kunden nach bestimmten Kriterien anzeigen lassen, z.B. alle Kunden mit dem Status 'Mahnung' ändere ich jetzt den Status eines Kunden von 'Mahnung' nach z.B. 'keine fälligen Forderungen' dann fällt dieser aus der Liste heraus und der Focus muss dann auf den vorher nachfolgenden Kunden gesetzt werden.


Erstmal vielen Dank für deine Bemühungen. Ich muss jetzt leider weg. Schaue später nochmal rein.

Gruß
Marek

gentry205
07.06.2003, 10:28
mit dem letzten Code den du gepostet hast läufts. Hat mir keine Ruhe gelassen, da habe ich's noch mal getestet.

Vielen Dank für deine Hilfe. Jetzt kann ich auch das Wochenende genießen.

Wünsche dir ein schöne WE
Gruß
Marek