Entwickler-Ecke

Datenbanken - Die Spalte einer Tabelle leeren nicht löschen


Arne Danikowski - Mi 06.02.08 13:48
Titel: Die Spalte einer Tabelle leeren nicht löschen
Ich bastle hier schon einige Zeit herum, komme aber nicht weiter.
Ich habe eine DBase Tabelle (jp.dbf). Diese enthält die Spalte "MARKER".
Diese Spalte enhält entweder nichts ist also leer oder ein "X". Soll dazu dienen mehrere Datensätze marlieren zu können
nun möchte ich über einen Button alle Markierungen wieder aufheben.

Ich dachte am einfachsten wäre es, die Spalte "MARKER" einfach zu leeren.
Es schein aber gar nicht so einfach zu sein :)

das habe ich bisher ausprobiert:


Delphi-Quelltext
1:
dm.Table1.Database.Execute('UPDATE jp.dbf SET MARKER = NULL WHERE Kategorie = :X;');                    


Ich bekomme allerdings eine Fehlermeldung:

"Ungültiger Feldname"

Das Datenbankfeld heißt aber so

jemand ne Idee? Oder habe ich eine andere Möglichkeit?


Xong - Mi 06.02.08 13:58

Und "Kategorie" existiert auch?

Ich kenne DBase nicht. Was bedeutet ":X"?

Gibt es keinen Datentyp Bool bzw. Boolean?


Xentar - Mi 06.02.08 14:03


Delphi-Quelltext
1:
UPDATE jp.dbf SET MARKER = NULL                    


Damit wird bei ALLEN zeilen der Marker auf NULL gesetzt.


Arne Danikowski - Mi 06.02.08 14:07

OK da hatte ich noch einen Fehler:


Delphi-Quelltext
1:
dm.Table1.Database.Execute('UPDATE jp.dbf SET MARKER = NULL WHERE MARKER = :X;');                    


X ist der Feldinhalt der Datensätze

Jetzt bekomme ich die Fehlermeldung:

"Parameter in Abfragestring nicht gesetzt"


zuma - Mi 06.02.08 14:17

lass mal das : weg und setz dafür das X in Hochkomma (evtl. funzt auch X ohne Hochkomma)

:X heisst, das die Zugriffskomponente mit dem (zuvor angegebenen) Parameter zur laufzeit das
:X durch den angegebenen Parameter ersetzt, deine Fehlermeldung sagt, das du den Parameter aber nicht gesetzt hast


Arne Danikowski - Mi 06.02.08 14:38

Danke für die Hilfe habe es mit

Delphi-Quelltext
1:
2:
3:
4:
dm.table1.Edit;
dm.Table1.Database.Execute('UPDATE jp.dbf SET MARKER = NULL');
dm.table1.post;
dm.table1.Refresh;



hinbekommen.


zuma - Mi 06.02.08 14:59

das klappt sicher auch, aber wie schon erwähnt wurde, setzt du ALLE Datensätze damit auf NULL. Ist manchmal nicht unbedingt performant
(bsp.
einer von 10000 Datensätze ist auf X, durch das weglassen der where-Bedingung muss die DB nun 10000 Datensätze updaten, statt nur dem einen).
Wenn die Performance aber nur eine untergeordnete Rolle bei dir spielt, ist das nicht so wichtig


Arne Danikowski - Mi 06.02.08 15:18

Ne eigentlich spielt das keine Rolle, sind aber schon so 2000 Datensätze
nur bekomme ich das mit dem Where nicht hin, da bekomm ich immer weider eine Fehlermeldung


Miri - Mi 06.02.08 15:30


Delphi-Quelltext
1:
dm.Table1.Database.Execute('UPDATE jp.dbf SET MARKER = NULL WHERE MARKER = ''X''');                    


Schon mal so versucht?!


Arne Danikowski - Mi 06.02.08 15:34

Manchmal sieht man den Walt vor lauten Bäumen nicht

<delphi>
dm.Table1.Database.Execute('UPDATE jp.dbf SET MARKER = NULL WHERE MARKER = 'X'');
</delphi>

Da hatte ich immer zwei Hochkommas vergessen

mit

<delphi>
dm.Table1.Database.Execute('UPDATE jp.dbf SET MARKER = NULL WHERE MARKER = 'X'');
</delphi>

klappt es nun vielen dank


Arne Danikowski - Mi 06.02.08 15:39

Wenn wir schon dabei sind, gibt es eine Möglichkeit, eine Zeile in einem Grid farblich zu verändern?
also nicht die ganze Spalte nur einen bestimmten Datensatz?
Ich stelle mir das so vor:

Über die rechte Maustaste öffne ich ein Popupmenü und kann damit den aktiven Datensatz markieren, das ganze
geht einfach über eine dbcheckbox. Der Datensatz bekommt nun den Feldinhalt X unter der Kategorie MARKER
Wäre nun aber schön, wenn der Datensatz in einer anderen Farbe dargestellt wird.


Xentar - Mi 06.02.08 15:40

Alternativ auch:

Delphi-Quelltext
1:
dm.Table1.Database.Execute('UPDATE jp.dbf SET MARKER = NULL WHERE MARKER = ' + QuotedStr('X'));