Rätsel des Tages

Hallo liebe Leser,

ich entwickle in Access 97 und stehe vor einem Rätsel:

Es wird ein Recordset erstellt und in einer Schleife für jedes Recordset geprüft, ob ein Wert vorhanden ist.
Gibt es ihn, passiert nichts weiter.
Gibt es den Wert nicht, wird in einer Tabelle ein neuer Datensatz hinzugefügt bzw. upgedated.
Die Schleife wird ca. 1500 mal durchlaufen.

Jetzt kommt`s:

Access gibt mir keinerlei Fehlermeldung aus, aber anscheinend passiert nichts. Der Taskmanager gibt „keine Rückmeldung“ aus.
Ich habe daraufhin vor das Loop der Schleife `ne MsgBox gestellt und die Routine läuft einwandfrei. Nehme ich die MsgBox wieder raus, geht wieder nix.

Komischerweise ist beim Probieren die Routine ein einzigesmal auch ohne MsgBox durchgegeangen…

Wer hat mir einen Tipp, was hier abgeht ?

Grüße Markus

Poste mal den Code (am besten mit

-Tags formatiert), dann kann man mehr sagen...

Ansonsten: Pack das ganze mal in eine Transaktion und setz nach jedem Update ein explizites CommitTrans ab.

Gruß aus dem Norden
Reinhard Kraasch (http://www.kraasch.de - Access Tipps & Tricks)

Hallo Reinhard

momentan sieht es so aus:

Die Tabelle, in die geschrieben bzw. die upgedated wird, liegt im Backend auf dem Rechner neben mir.

Zum Testen habe ich diese Tabelle lokal angelegt und innerhalb von ca. 3 Minuten lief der Code durch. Also dachte ich, daß es an der Lage der Tabelle liegt, daß es vorher ewig dauerte. Nach ein paar Tests mit der lokalen Tabelle hat sich aber auch hier die gleiche Warterei eingestellt… ???

Die Schleife funktioniert (Do Until rs.EOF…Loop) genauso wie der Code, nur mit der Performance stimmt irgendwas nicht.

Hast Du ein Beispiel für eine Transaktion?

Gruß Markus

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

Jetzt kenn ich deinen Code immer noch nicht (speziell auch nicht, welches Datenmodell du verwendest!), sonst hätte ich dir schon ein passendes Beispiel angegeben.

Ansonsten: Schau halt mal in der Hilfe unter BeginTrans, CommitTrans usw. nach…

Gruß aus dem Norden
Reinhard Kraasch (http://www.kraasch.de - Access Tipps & Tricks)

Schönen Guten Morgen,

Das ist der Code,der folgendes bewirkt:

  • Aus 3 Abschlußdaten das aktuellste ermitteln
  • Für jeden Bewerber wird geprüft, ob der Wert bereits existiert
  • Wenn nicht, wird der Wert erzeugt und eingetragen (rs4 BOF and EOF, Insert)
  • Wenn ja, wird der Wert nochmal erzeugt und upgedatet(Else, Update)
  • Die Select-Anweisungen beziehen sich auf verknüpfte Tabellen einer mysqlDB

Dim conn As New ADODB.Connection
conn.Open „Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\datenbank\test.mdb;“
Dim rs_bewerber_id As New ADODB.Recordset
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim rs3 As New ADODB.Recordset
Dim rs4 As New ADODB.Recordset
Dim t_bewerber_id_neu
Dim datum_erst
Dim datum_zweit
Dim datum_pro
Dim datum_erst_diff
Dim datum_zweit_diff
Dim datum_pro_diff
Dim aktuell As Date
Dim aktuell2

rs_bewerber_id.Open „SELECT t_bewerber_id FROM t_bewerber“, ActiveConnection:=conn, CursorType:=adOpenKeyset

Do Until rs_bewerber_id.EOF

t_bewerber_id_neu = rs_bewerber_id!t_bewerber_id

rs4.Open "SELECT * FROM tblbewerber_status_global1 WHERE t_bewerber_id = " & t_bewerber_id_neu, ActiveConnection:=conn, CursorType:=adOpenKeyset

If rs4.BOF And rs4.EOF Then 'Wert noch nicht vorhanden

rs4.Close
Set rs4 = Nothing

'erster Datumswert

rs.Open „SELECT t_erststudium.t_erst_ende FROM t_bewerber INNER JOIN t_erststudium ON t_bewerber.t_bewerber_id = t_erststudium.t_erststudium_id WHERE (((t_bewerber.t_bewerber_id)=“ & t_bewerber_id_neu & „))“, ActiveConnection:=conn, CursorType:=adOpenStatic

If IsNull(rs!t_erst_ende) Then
datum_erst = „1.1.1980“
Else
datum_erst = rs!t_erst_ende
datum_erst_diff = DateDiff(„d“, datum_erst, Now()) 'Datumsdifferenz zum jetzigen Datum in Tagen
End If
rs.Close
Set rs = Nothing

'zweiter Datumswert

rs2.Open „SELECT t_bewerber.t_bewerber_id, t_zweitstudium.t_zwo_ende FROM t_bewerber INNER JOIN
t_zweitstudium ON t_bewerber.t_bewerber_id = t_zweitstudium.t_zweitstudium_id WHERE (((t_bewerber.t_bewerber_id)=“ & t_bewerber_id_neu & „))“, ActiveConnection:=conn, CursorType:=adOpenStatic

If rs2.EOF And rs2.BOF Then
datum_zweit = „“
Else
datum_zweit = rs2!t_zwo_ende
datum_zweit_diff = DateDiff(„d“, datum_zweit, Now())
End If

rs2.Close
Set rs2 = Nothing

'dritter Datumswert

rs3.Open „SELECT t_bewerber.t_bewerber_id, t_pro.t_pende FROM t_bewerber INNER JOIN t_pro ON t_bewerber.t_bewerber_id = t_pro.t_pro_id WHERE (((t_bewerber.t_bewerber_id)=“ & t_bewerber_id_neu & „))“, ActiveConnection:=conn, CursorType:=adOpenStatic

If rs3.EOF And rs3.BOF Then
datum_pro = „“
Else
datum_pro = rs3!t_pende
datum_pro_diff = DateDiff(„d“, datum_pro, Now())
End If

rs3.Close
Set rs3 = Nothing

'niedrigste Datumsdifferenz bestimmen

If datum_zweit = „“ And datum_pro = „“ Then
aktuell = datum_erst
ElseIf datum_zweit „“ And datum_pro = „“ Then
If datum_erst_diff „“ Then
If datum_erst_diff „“ And datum_pro „“ Then
If datum_erst_diff „“ And datum_pro = „“ Then
If datum_erst_diff „“ Then
If datum_erst_diff „“ And datum_pro „“ Then
If datum_erst_diff

Probier mal folgendes:

Do Until rs\_bewerber\_id.EOF
 conn.Begintrans

 ' usw. usw.
 If ...

 ' usw. usw.

 conn.Execute "Update tblbewerber\_status\_global1 Set datum\_frei\_ab =" & aktuell2 & \_
 " Where t\_bewerber\_id =" & t\_bewerber\_id\_neu
 end if
 conn.CommitTrans
 rs\_bewerber\_id.MoveNext
Loop

Gruß aus dem Norden
Reinhard Kraasch (http://www.kraasch.de - Access Tipps & Tricks)

Hallo Reinhard,

puh.
Bevor ich Deinen Vorschlag gelesen hab, habe ich noch was anderes probiert. Und zwar lag die Tabelle, in die der Datensatz eingefügt wird bzw. das Update läuft, im Backend auf einem anderen Rechner. Ich habe die Tabelle zu mir auf den Rechner gelegt und es hat geklappt.

Gerade habe ich Deine Idee umgesetzt und es tut idealerweise auch dann, wenn die Tabelle nicht lokal liegt. Allerdings braucht das Ganze immer noch ca.15 min (lokal ca.3).

Vielen Dank und hoffentlich hält`s…

Grüße aus dem sonnigen Süden

Markus

Nun ja, lokal ist vermutlich immer schneller - aber dein Code ist ja nun auch nicht gerade auf Schnelligkeit optimiert - ich würde versuchen, das ganze in einer Abfrage zu machen.

Gruß aus dem Norden
Reinhard Kraasch (http://www.kraasch.de - Access Tipps & Tricks)

Hallo Reinhard,

bei uns ist halt wichtig, alle Datensätze zu durchlaufen, damit außer der Neuanlegung auch etwaige Veränderungen an den bestehenden Datensätzen upgedated werden können.

Wenn Du dennoch einen Vorschlag zur Codeoptimierung hast, würden wir uns natürlich über eine Nachricht freuen.

Liebe Grüße

Markus

Na, auch in einer Abfrage kann man ja dafür sorgen, dass alle Datensätze behandelt werden - für eine konkrete Problemlösung durchblicke ich allerdings deinen Code zu wenig (auch mangels Formatierung ;=) - nur im Ansatz: Ich würde die Datumsberechnung in eine separate Funktion packen - die man dann in der Abfrage verwenden kann.

Darüber hinaus müsste man sich vielleicht auch fragen, ob es wirklich so genial ist, Erststudium und Zweitstudium in separaten Tabellen zu verwalten. Aber ich kenne ja deine Anwendung nicht…

Gruß aus dem Norden
Reinhard Kraasch (http://www.kraasch.de - Access Tipps & Tricks)

Hallo Reinhard,

das Design der mysqldb müssen wir halt übernehmen.
Noch `ne Frage: Wo würde der Unterschied liegen, wenn wir die Datumsberechnung als Funktion hätten, sie aber trotzdem genauso häufig aufrufen müssten wie bei ‚harter‘ Codierung ?

Gruß

Markus

Ja, da hast du schon recht - mit der Funktion kommt wohl nicht so viel dabei heraus…

Ein Optimierungsansatz wäre, die JOINs anders aufzubauen, ein anderer, die Recordsets nicht jedesmal neu zu öffnen, sondern sich darin mit Find zu bewegen.

Und wieso ist das eine mySQL-Datenbank? Du verwendest doch den Jet-Provider!?!

Gruß aus dem Norden
Reinhard Kraasch (http://www.kraasch.de - Access Tipps & Tricks)