Entwickler-Ecke

Datenbanken - Access Ja/Nein Feld


EEK - Do 22.03.07 14:58
Titel: Access Ja/Nein Feld
Hallo,

ich habe eine Access Datenbank erstellt, in der ich ein Ja/Nein Feld habe. Ich meinem Programm habe ich eine CheckBox und beim drücken auf den Button soll jetzt in die DB geschrieben werden ob in der CheckBox das Häkchen gesetzt ist oder nicht.
Ich habe jetzt schon alles möglich versucht, doch ich bekomme es bis jetzt nicht hin. Ich habe auch schon die Forums suche benutzt und habe einen Beitrag gefunden in dem steht das man sowas mit

Delphi-Quelltext
1:
FieldByName('Abfrage').AsBoolean := Checkbox1.Checked;                    

macht. Jedoch wenn ich es versuche dann bricht mir das Programm mit der Fehlermeldung "ADOQuery1:Das Feld 'Abfrage' wurde nicht gefunden" ab.


ene - Do 22.03.07 15:04

Hi,

vielleicht liegts ja an Access, denn Access -1 = True; 0 = False und Delphi 0 = False; 1 = True. Und wenn ich deinen Quelltext und die Fehlermeldung so lese, dann fehlt mir ein e.


EEK - Do 22.03.07 15:25

An dem fehlenden "e" lag es nicht, das war nur ein Fehler beim abschreiben :oops: Ja das in Access -1 = true und 0 = false ist wusste ich schon, nur wie ich es dann mache damit es funktioniert weiß ich leider trotzdem nicht. Trotzdem danke für die Antwort.


ene - Do 22.03.07 15:29

Ich vermute es nur mal, wobei die Fehlermeldung eigentlich eindeutig ist und der gezeigte Code eindeutig zu wenig ;)


Delphi-Quelltext
1:
FieldByName('Abfrage'):= StrToInt(BoolToStr(Checkbox1.Checked, True));                    


Dann sollten zumindest die Werte stimmen.


EEK - Do 22.03.07 15:52

user profile iconene hat folgendes geschrieben:
wobei die Fehlermeldung eigentlich eindeutig ist

Für dich vielleicht :D aber ich hatte mit Datenbanken bis jetzt kaum was zu tun. Aber falls du damit gemeint hast das die Namen der DB oder Tabelle nicht stimmen, daran kann es nicht liegen. Ich häng mal ein Bild von der DB mit an, vielleicht bringt es ja was.

Besonder viel Quellcode kann ich dir nicht zeigen weil ich bis jetzt nur ein Testprogramm geschrieben habe um die Verbindung zu testen und in dem Programm ist nur eine CheckBox und ein Button.

Bisher war das Einzige was ich in eine Datenbank schreiben musste ein String, das hab ich immer so gemacht.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
ADOQuery1.Close;
ADOQuery1.SQL.Clear();

ADOQuery1.SQL.Add('INSERT INTO Reparieren ([Linie], [SAPNummer])');
ADOQuery1.SQL.Add('VALUES(');
ADOQuery1.SQL.Add('"'+Linie+'",');
ADOQuery1.SQL.Add('"'+SapNummer+ '");');
ADOQuery1.ExecSQL;

Das ich es bei dem Ja/Nein Feld nicht so machen kann weil hier ein String übergeben wird ist mir schon klar. Deshalb hab ich hier im Forum gesucht und hab das

Delphi-Quelltext
1:
2:
  
FieldByName('Abfrage').AsBoolean := Checkbox1.Checked;

gefunden. Aber eben nur diese Zeile und nicht was ich noch machen muss damit es funktioniert.
Bis jetzt hab ich schon alles Mögliche probiert

Delphi-Quelltext
1:
2:
3:
ADOQuery1.SQL.Add('INSERT INTO DBTest ([Abfrage])');
ADOQuery1.FieldByName('Abfrage').AsBoolean := Checkbox1.Checked;
ADOQuery1.ExecSQL;


Delphi-Quelltext
1:
2:
3:
ADOQuery1.SQL.Add('INSERT INTO DBTest');
ADOQuery1.FieldByName('Abfrage').AsBoolean := Checkbox1.Checked;
ADOQuery1.ExecSQL;

usw.
Ich hab auch schon bei Google gesucht, aber auch nix brauchbares gefunden.


ene - Do 22.03.07 16:12

Versuchs mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
ADOQuery1.Close;
ADOQuery1.SQL.Clear();

ADOQuery1.SQL.Add('INSERT INTO DBTest (Abfrage) VALUES ('+ CheckBox1.Checked +')';
ADOQuery1.ExecSQL;


Die eckigen Klammern brauchst du nur, wenn du Sonder-/Leerzeichen im Namen hast (was man tunlichst unterlassen sollte) und du hast deine Abfrage gar nicht richtig geschrieben.


EEK - Do 22.03.07 16:26

user profile iconene hat folgendes geschrieben:



Delphi-Quelltext
1:
2:
3:
4:
5:
ADOQuery1.Close;
ADOQuery1.SQL.Clear();

ADOQuery1.SQL.Add('INSERT INTO DBTest (Abfrage) VALUES ('+ CheckBox1.Checked +')';
ADOQuery1.ExecSQL;

Nein funktioniert leider auch nicht: Inkompatible Typen: 'string' und 'Boolean'
user profile iconene hat folgendes geschrieben:

Die eckigen Klammern brauchst du nur, wenn du Sonder-/Leerzeichen im Namen hast (was man tunlichst unterlassen sollte)

Ja weiß ich schon, hab das aus einem alten Programm kopiert, frag mich nicht warum ich es damals so geschrieben habe.
user profile iconene hat folgendes geschrieben:

und du hast deine Abfrage gar nicht richtig geschrieben.

Wie meinst du das?

Auf alle fälle danke für deine hilfe.


ene - Do 22.03.07 16:32

Und so?


Delphi-Quelltext
1:
ADOQuery1.SQL.Add('INSERT INTO DBTest (Abfrage) VALUES ('+ BoolToStr(CheckBox1.Checked) +')';                    


Lass dir mal deinen SQL-String ausgeben, der entspricht dann nicht der Norm.


iKilledKenny - Do 22.03.07 16:33

So müsste das gehen:


Delphi-Quelltext
1:
2:
3:
4:
AdoCommand.ParamCheck := True;
AdoCommand.CommandText := 'INSERT INTO DBTest (Abfrage) VALUES (:Param1)';
AdoCommand.Parameters.ParamByName ('Param1').Value := CheckBox.Checked;
AdoCommand.Execute;


Wobei AdoCommand ein TAdoCommand ist, mit einer gültigen Connection.

Grüße


EEK - Do 22.03.07 16:48

user profile iconene hat folgendes geschrieben:
Und so?

Delphi-Quelltext
1:
ADOQuery1.SQL.Add('INSERT INTO DBTest (Abfrage) VALUES ('+ BoolToStr(CheckBox1.Checked) +')';                    



Mal abgesehen davon das bei dir eine Klammer gefehlt hat :wink: :D funktioniert es jetzt.
Vielen dank.
user profile iconiKilledKenny hat folgendes geschrieben:
So müsste das gehen:


Delphi-Quelltext
1:
2:
3:
4:
AdoCommand.ParamCheck := True;
AdoCommand.CommandText := 'INSERT INTO DBTest (Abfrage) VALUES (:Param1)';
AdoCommand.Parameters.ParamByName ('Param1').Value := CheckBox.Checked;
AdoCommand.Execute;


Wobei AdoCommand ein TAdoCommand ist, mit einer gültigen Connection.

Grüße

Hab ich jetzt nicht ausprobiert. Aber trotzdem auch danke an dich.
Gruß EEK


UGrohne - Do 22.03.07 16:57

An Deinem SQL-Statement hat man sehr schön den Denkfehler gesehen, den Du gemacht hattest. Dieses FieldByName bezieht sich auf Felder in einer Abfrage, also Select. Damit kannst Du Feldwerte in der Ergebnismenge abfragen. Was Du aber machen wolltest ist, einen Parameter übergeben und das machst Du über Parameter wie von user profile iconiKilledKenny gezeigt.


boje-a - Mo 09.04.07 07:49

würde für TCheckBox TDBCheckBox verwenden