Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit DBCheckBox (https://www.delphipraxis.net/45864-problem-mit-dbcheckbox.html)

spoona 13. Mai 2005 10:27

Datenbank: Interbase • Version: 6.0 • Zugriff über: Interbase

Problem mit DBCheckBox
 
Hallo,

ich muss leider das Problem mit den DBCheckboxen wieder aufgreifen. Es wurde hier schon einige Male angesprochen, aber nie wirklich ein konkrete Loesung gepostet.
Also ich verwende ne DBCheckbox. In der DB habe ich sie als Datentyp Varchar(1) deklariert.
ValueChecked/UnChecked habe ich mit 'T'/'F' belegt. Bei Anlage eines neuen Datensatzes steht in der DB noch kein Wert drin--klar(Ohne Defaultwert). Jetzt sind alle Checkboxen leider grau und mit einem Haeckchen versehen.Das will ich aber nicht!!!! Sie sollen bei Neuanlage alle leer bzw. weiss ohne Haeckchen sein,ohne dass ich jeden anklicken muss. Habe auch schon probiert nen defaultwert in der DB anzugeben,aber das funktioniert auch nicht. Ich dachte vielleicht soetwas :

ValueChecked -- 'T';
ValueUnchecked -- 'F;Null'

Aber das geht auch nicht :pale:
Was ist denn sonst der Zustand fuer ein leeres Datenbankfeld?

Vielen Dank fuer Eure Hilfe
Gruss Spoona

joachimd 13. Mai 2005 10:53

Re: Problem mit DBCheckBox
 
Zitat:

Zitat von spoona
Bei Anlage eines neuen Datensatzes steht in der DB noch kein Wert drin--klar(Ohne Defaultwert). Jetzt sind alle Checkboxen leider grau und mit einem Haeckchen versehen.Das will ich aber nicht!!!!

Warum nicht? Das ist genau der Zustand in Deiner DB. Du solltest vielleicht TQuery/TTable.AAfterInsert entsprechend behandeln und dort die Felder vorbelegen (die DB-Controls nehmen dann automatisch den richtigen Zustand an):

Delphi-Quellcode:
procedure TForm1.AdsTable1AfterInsert(DataSet: TDataSet);
var
  i:integer;
begin
  for i:=0 to Dataset.FieldCount-1 do
    if Dataset.Fields[i].IsNull
      then begin
        //Beispiel
        if (DataSet.Fields[i].DataType is ftBoolean)
          then Dataset.Fields[i].AsBoolean:=False;
      end;
end;

Stevie 13. Mai 2005 11:26

Re: Problem mit DBCheckBox
 
Hallo,


OnNewRecord ist das richtige Event für sowas.

MfG
Stevie

spoona 16. Mai 2005 08:52

Re: Problem mit DBCheckBox
 
Hallo,

danke fuer die Antworten. So etwas kann man schon machen, aber ich dachte es ginge wesentlich einfacher, wenn man fuer ValueUnchecked: 0 und Null angeben koennte.
Ok, dann werde ich es mit dem OnNewRecordEvent machen. Aber noch ne Frage zum Code :
Zitat:

if (DataSet.Fields[i].DataType is ftBoolean)
Wie kann ich in der Datenbank selber den Typ Boolean festlegen? Gibt es da nen Trick?
Ich habe keinen Typ Boolean in der datenbank oder heisst der nur anders? Oder muss ich mir ne Domaene definieren? Damit habe ich noch nicht so bewusst gearbeitet.

Vielen DAnk fuer Eure Hilfe

Gruss Spoona

marabu 16. Mai 2005 09:14

Re: Problem mit DBCheckBox
 
Hi Spoona,

bei deinem Checkbox-Problem musst du überlegen, ob du es als Problem des user interface auffassen willst oder doch lieber als Teil des Datenbankentwurfs. In der Datenbank kannst du es z.B. so angehen:

SQL-Code:
CREATE DOMAIN "BIT" AS SMALLINT;
CREATE DOMAIN "SYSKEY" AS DECIMAL(18, 0);
CREATE DOMAIN "VCHAR70" AS VARCHAR(70) CHARACTER SET ISO8859_1 COLLATE DE_DE;

CREATE TABLE "PER"
(
  "ID"  "SYSKEY" NOT NULL,
  "DELETED"  "BIT" DEFAULT 0 NOT NULL,
  "NACHNAME"  "VCHAR70" NOT NULL COLLATE DE_DE,
  "VORNAMEN"  "VCHAR70" NOT NULL COLLATE DE_DE,
CONSTRAINT "PK_PER" PRIMARY KEY ("ID")
);
Grüße vom marabu

spoona 16. Mai 2005 10:11

Re: Problem mit DBCheckBox
 
Hallo,
also danke fuer den CODE! Aber leider bingt der mich nicht wirklich weiter....
Ich gebe zwar nen Defaultwert an, aber dieser wird ignoriert, bzw. wird nicht als Defaultwert geschrieben. Naja ich denke es ist dann eher ein UserInterface Problem.
Wenn ich mit dem von "joachimd" zur Verfuegung gestellten CODE arbeiten will,
Zitat:

...
if (DataSet.Fields[i].DataType is ftBoolean)
...
bleibt immer noch das Problem mit dem Vergleich auf Boolean. Kann natuerlich auf ftSMALLINT pruefen, aber waere trotzdem interessant zu wissen, wie ich auf Boolean testen kann. Naja bei den Eigenschaften vom Table kann ich unter "FieldDefs" meine Felder mit anderen Datentypen belegen, hier auch ftBoolean. Aber leider kann ich den hier festgelegten Wet nicht abfragen. Er nimmt immer den Wert aus der Datenbank, also ftSmallInt. Naja irgendwie finde ich, dass Delphi hier Verbesserungen vonehmen sollte. Finde das ganze bisl umstaendlich. Wenn es wenigstens mit dem Defaultwert funktionieren wuerde. Aber der ist nicht wirklcih sichtbar in der Datenbank,so dass sich die DBChechBoxen dementsprechend verhalten.
Naja vielleicht weiss noch jemand rat.

Danke Gruss Spoona

kiar 16. Mai 2005 10:27

Re: Problem mit DBCheckBox
 
Hallo Spoona,


Der Marabu hat dir schon den richtigen Weg gezeigt, mit der Erzeugung einer neuer Domain.
SQL-Code:
CREATE DOMAIN BOOLEAN AS SMALLINT DEFAULT 0 CHECK (VALUES BETWEEN 0 AND 1)
Jetzt hast du einen Neuen Datentyp welcher nur zwei Werte speichern kann.
Mit diesem kannst du jetzt deine Tabelle ausstatten. z.B. so:
SQL-Code:

CREATE TABELLE Test ( test BOOLEAN)
raik

spoona 16. Mai 2005 11:48

Re: Problem mit DBCheckBox
 
Hallo,

ja das ist ja alles richtig und das habe ich auch erstanden.
Ich habe damit nen neuen Datentyp. Aber wenn ich im Quelcode nach dem Datentyp frage, bekomme ich SMALLINT und nicht boolean heraus. Vielleicht mache ich ja auch eine falsche Abfrage?:
Delphi-Quellcode:
if (DataSet.Fields[i].DataType = ftBoolean)//Datatype zeigt hier aber ftSMALLINT an
und weiterhin ist das Problem, dass der Defaultwert nicht in die DB geschrieben wird!

Vielen Dank fuer Hilfe

Gruss Spoona


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz