Rolf B: ASP + Access Datenbank + UPDATE COLUMN IF COLUMN IS NULL ELSE ...

Beitrag lesen

Hallo supernewb,

das stimmt so nicht. Du würdest in diesem Fall Beauftragung 3 überschreiben, auch wenn es gefüllt ist.

Mir war bisher die Verwendung deiner Felder nicht klar. Jetzt schon - und du erlebst hier die typischen Effekte einer unvollständigen DB-Normalisierung: Wenn es für einen Satz ein Attribut mehrfach gibt, gehört das eigentlich in eine separate Tabelle ausgelagert. Pseudo-Arrays in Form von "Dings1, Dings2, "Dings3" führen zu den hier auftretenden Problemen. Ob Du das tun willst, ist natürlich Deine Entscheidung.

Eine naheliegende, aber potenziell gefährliche Lösung wäre, dass Du vor den Updates einen SELECT machst und dann schaust, welches der 3 Felder NULL ist. Passend dazu updatest Du dann das richtige Feld. ABER: Das geht nur, wenn Du der einzige User bist ODER Access Zugriff über Transaktionen mit Isolationsstufe SERIALIZABLE unterstützt. Wenn Du jetzt nicht weißt, wovon ich rede, dann lass die Finger davon :). Denn wenn Du nicht genau weißt, was Du tust, führt diese Lösung im Multiuser-Betrieb zu Datenfehlern.

Zwei umständlichere, aber zuverlässigere Lösung könnten so aussehen:

  1. Verwende den RecordsAffected Zähler

Ich weiß nicht ob Du von ACCESS diesen Zähler bekommst. Normalerweise meldet Dir eine SQL-Datenbank nach einem UPDATE, wieviele Zeilen aktualisiert wurden. Schau mal, ob dein MM_EditCmd Objekt eine Eigenschaft RecordsAffected hat.

Wenn das größer als 0 ist, brauchst Du die restlichen Updates nicht mehr auszuführen. Auf diese Weise werden 1-3 Updates gemacht. Durch einen vorherigen SELECT kannst Du die Anzahl der Updates reduzieren, weil Du dann weißt, mit welchem Update du anfangen musst; und wenn alle Felder voll sind, brauchst Du gar nicht mehr zu updaten.

Wenn es RecordsAffected nicht gibt:

  1. Führe die Updates geschickt aus

Du kannst die Updates so formulieren, und zwar genau in dieser Reihenfolge:

"UPDATE Mitarbeiter SET Beauftragung3=? WHERE ID= " & strID & " AND Beauftragung3 IS NULL AND Beauftragung2 IS NOT NULL"
"UPDATE Mitarbeiter SET Beauftragung2=? WHERE ID= " & strID & " AND Beauftragung2 IS NULL AND Beauftragung IS NOT NULL"
"UPDATE Mitarbeiter SET Beauftragung=? WHERE ID= " & strID & " AND Beauftragung IS NULL"

Sind alle 3 Beauftragungsfelder NULL, führt nur das letzte Update zu einer DB-Änderung Ist Beauftragung gefüllt, aber Beauftragung2+3 NULL, wird Beauftragung2 geschrieben. Sind Beauftragung und Beauftragung2 gefüllt, aber Beauftragung3 ist NULL, wird Beauftragung3 geschrieben. Sind alle gefüllt, wird nichts geschrieben. Nachteil: Es werden immer 3 Updates gemacht.

Das sieht alles umständlich aus, aber das ist angesichts einer potenziellen Multiuser-Umgebung und einer denormalisierten DB nicht vermeidbar.

Rolf

--
sumpsi - posui - clusi