Extreme Veteran
Beiträge: 573
| 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 |