Diskusion über das verhalten einer persist-Funktion

Yaslaw

alter Rempler
Moderator
Ich habe eine VBA-MsAccess-Funktion persist() geschrieben um einfach Einzelne Datensätze in eine Tabelle zu schreiben.
http://wiki.yaslaw.info/dokuwiki/doku.php/vba/access/functions/persist

Dabei wird analog zu INSERT ... ON DUPLICATE UPDATE verfahren.
Sprich, es wird auf den Primary-Key geprüft um festzustellen, ob der Record hinzugefügt oder geändert werden muss. Soweit ist auch alles klar.

Bei AutoInkrement-PrimaryKeys weiss ich nun nicht genau, wie das Verhalten umgesetzt werden soll, wenn zwar eine ID mitgegeben wird, diese jedoch nicht exisitiert. Da das Feld ein AUtoInkrement ist, kann die ID nicht gesetzt werden.

Hier ein Beispiel aus meinem ImmadiateWindow (Direktfenster)
printRs() macht nix anderes, als die Tabelle ins Direktfenster zu schreiben
Visual Basic:
'persist ohne ID: Ein neuer Datensatz wird angelegt
persist "T_TXT", "[TXT]='ABC'"
printrs "T_TXT"
| ID | TXT |
|----|-----|
| 1  | ABC |

'Die ID 1 existiert bereits, ergo wird ein Update durchgeführt
persist "T_TXT", "ID=1, [TXT]='DEF'"
printrs "T_TXT"
| ID | TXT |
|----|-----|
| 1  | DEF |

'Jetzt versuche ich die ID 234 hinzuzufügen. Diese gibt es nicht. Da es einAuto Inkrementfeld ist, wird die ID 2 erstellt
'--> Genau dieses Verhalten ist der Mittelpunkt der Diskusion <--
persist "T_TXT", "ID=234, [TXT]='XYZ'"
printrs "T_TXT"
| ID | TXT |
|----|-----|
| 1  | DEF |
| 2  | XYZ |

Also, meine Frage. Wie würdet ihr den Fall handeln. So wie im Moment, einfach ein neuen Datensatz erstellen und die eingegebene ID ignorieren oder eine Fehlermeldung ausgeben?
 

ComFreek

Mod | @comfreek
Moderator
Hallo yaslaw,

wann würde ein potentieller Nutzer deiner persist-Funktion eine ID mitgeben?
Zwei Möglichkeiten:

1.) Wenn er einen Datensatz aktualisieren will.
2.) Wenn er Datensätze aus einer anderen Quelle importiert und diese bereits eine ID haben.

Bei dem Anwendungsfall 1 ist eine Fehlermeldung wünschenswert. Bei 2 allerdings nicht bzw. hierbei soll ein neuer Datensatz mit einer festen ID in der Tat eingefügt werden.

Als Nutzer einer Funktion namens "persist" würde ich mir allerdings vorstellen, dass diese die Daten immer persistent speichert - egal ob die ID noch nicht existiert. Vielleicht kannst du einen weiteren dritten optionalen Parameter einfügen, der das Verhalten kontrolliert.
 

Yaslaw

alter Rempler
Moderator
Aktualisieren geht ja bereits - ohne Fehler. Die Funktion prüft on der PK vorhanden ist. Wenn ja, wird aktuallisiert.

Dein 2ter Fall ist eh nix für einen autoinkrementen PK.

Das Problem mit dem weiteren Parameter ist, dass ich nicht gerne Parameters aufzwinge für wenige Sonderfälle. Die Funktion arbeitet mir ParamArray weshalb ich leider keinen Optionalen Parameter amEnde anfügen kann:
Visual Basic:
Public Function persist( _
    ByVal iTableName As String, _
    ParamArray iExpressions() As Variant _
) As Variant

Aber du hast eigentlich recht. Für den ungeklärten Fall gibts eigentlich keine Sinnvolle Anwendung
 

ComFreek

Mod | @comfreek
Moderator
Alternativ statt einer zwei Funktionen nehmen:
SQL:
-- Nur zum Aktualisieren
persistUpdate
-- Immer die Änderungen oder die neuen Datensätze übernehmen
persistAlways