Neuling-Anfrage: Tabellen datensatzweise abarbeiten
PeterDoering
Gesendet: 10.05.22 16:14
Betreff: RE: Neuling-Anfrage: Tabellen datensatzweise abarbeiten



Extreme Veteran

Beiträge: 532
50025
Hallo,

Justitiar - 10.05.22 08:43
Mir geht es meist allerdings darum, die bei einem Tabellendurchlauf abgefragten Werte nicht direkt in eine Tabelle zu schreiben, sondern sie zunächst einer programminternen Variable zuzuweisen und einem mehr oder minder komplexen Weiterverarbitungsprozess zu unterziehen, bevor sie dann am Ende der Anwendung in dieser oder einer anderen Tabelle landen.

Noch sind wir bei SQL.

[...] Felder

FamName String
Vorname String
GebDat Date

und unbelegten Feldern

PKN-TEMP String und
PKN String

Es soll nun beim datensatzweisen Durchlauf eine PKN aus dem Geburtstadtum im Format JJJJMMTT + Anfangsbuchstabe des Familiennamens + einem in einen dreistelligen String mit führenden Nullen aus einer laufenden Nummer gebildet werden, wobei bei der Ermittluing der laufenden Nummer nur die Fälle mit gleichen Geburtsdatum und gleichem Anfangsbuchstaben des Familiennnamens gezählt werden (dazu dient das Feld PKN-TEMP). Die so gebildete PKN wird dann in das Feld PKN eingetragen und am Ende wird das Feld PKN-TEMP (das ja nicht mehr benötigt wird) gelöscht.

Ich denke, dass das mit dem von Dir genannten Typ Recordset vielleicht doch eher geht, als mit einer SQL-Abfrage.

Grundsätzlich gilt, dass man Aktualisierungsabfragen statt Recordsets verwenden sollte, wenn es möglich ist. Deinem Beispiel ist wegen der laufenden Nummer nicht möglich, denn die müsste in einer Unterabfrage ermittelt werden, eine Eigenheit von Jet(ACE)-SQL, die die Kombination von Aktions- und Unterabfragen nicht zulässt.

Per Recordset wäre folgender Ansatz möglich:

Dim Db As DAO.Database
Dim Rst As DAO.Recordset
Dim strSQL As String

Set Db = CurrentDb
strSQL = "SELECT ID, PKN, FamName, GebDat FROM DeineTabelle;"
Set Rst = Db.OpenRecordset(strSQL, dbOpenDynaset)
Do While Not Rst.EOF
Rst.Edit
Rst.Fields("PKN").Value = _
Format(Rst.Fields("[GebDat]").Value, "yyyymmdd") & _
Left(Rst.Fields("FamName").Value, 1) & _
Format(DCount("*", "DeineTabelle", _
"ID < " & Rst.Fields("ID").Value & _
" AND LEFT(FamName,1)='" & Left(Rst.Fields("FamName").Value, 1) & "'" & _
" AND GebDat=" & Format(Rst.Fields("GebDat").Value, "\#YYYY\-MM\-DD\#")) + 1, "000")
Rst.Update
Rst.MoveNext
Loop
Rst.Close
Set Rst = Nothing
Set Db = Nothing

Das Beispiel setzt voraus, dass es einen numerischen Primärschlüssel namens ID gibt, typischerweise als Autowert deklariert.

Die Einrückungen werden von der Forums-SW leider weggetrimmt, deshalb ist der Code nicht so einfach lesbar, aber, wenn du DeineTabelle durch den echten Tabellennamen ersetzt, sollte das Beispiel funktionieren.

-----
Gruss - Peter
Top of the page Bottom of the page