Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N (https://www.delphipraxis.net/182587-firedac-erkennt-boolean-schreibt-jedoch-t-f-anstelle-von-j-n.html)

Neutral General 4. Nov 2014 13:02

AW: FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N
 
Wir haben in der Datenbank ein CHAR(1) für Boolean und benutzen dann halt Feld.AsString := 'J'/'N' um die Werte zu setzen. Ggf. eine kleine Helper-Funktion schreiben die true/false in J/N umwandelt und umgekehrt.

Uwe Raabe 4. Nov 2014 13:13

AW: FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N
 
Zitat:

Zitat von Neutral General (Beitrag 1278656)
Ggf. eine kleine Helper-Funktion schreiben die true/false in J/N umwandelt und umgekehrt.

Die ist ja, wie DeddyH in Post #6 schon schrieb, dank des DisplayText-Properties nicht notwendig.

Neutral General 4. Nov 2014 13:37

AW: FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N
 
Ich glaube ehrlich gesagt dass ihr mit eurem Display-Kram auf der falschen Spur seid.
Wir speichern hier auch J/N in der Datenbank. Was dann dem User angezeigt wird ist nochmal eine ganz andere Geschichte.

Und die Helper Funktionen sollen sein damit sowas geht:

Delphi-Quellcode:
Feld.AsString := BoolToJN(x > 3);

statt
Delphi-Quellcode:
if x > 3 then
  Feld.AsString := 'J'
else
  Feld.AsString := 'N';
Es sei denn wir reden alle komplett aneinander vorbei :/

MichaelT 5. Nov 2014 08:34

AW: FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N
 
Eher einfach. J/N in einem CHAR(1) Feld ist kein Boolean. So einfach ist. Die Interpretation passiert in der Applikation und nicht auf der DB. Woher soll FireDAC wissen was ein Boolean sein soll, wenn es noch nicht mal die DB weiß. Damit ist 'die' Defintion nicht da.

Morden ist es Ja/Nein, Yes/No, YES/NO, y/n, j/n, J/Nein, */o usw... in sämtliche andere Sprachen ist es auch anders. Es gibt eben nicht nur Deutsch ....

Wenn man das soll will dann kann man getrost einen Trigger machen und T/F abfangen. (eine Notlösung).

Entweder man schlieft den Wert durch und kümmert sich um die Enumeration selber oder eben man bildet den Boolean als SmallInt auf der DB in der Domäne, denn FireDAC bildet True oder False an sich auf 0 oder 1 ab. Das ist eh schon die beste Annährung an die Realität in anderen DBs.

Die Notlösung das über DB-Komponenten zu schleifen im Falle von Firebird hilft mal nicht viel. Die ist einfach falsch. Es handelt sich um eine konkrete Interpretation einer Domäne in der DB als CHAR(1) mit 2 Werten auf der Anwendungsebene. M/W ist auch nicht boolean sondern ein Applikationsdomäne.

Wer eine Interpretationsschicht will braucht eine Interpretationsschicht. Das kann ein ORM sein, einfach Funktionen, ein Schema dazwischen, Bidnings oder eben Überbau unterhalb des Comp Layers.

Obwohl FireDAC im SQL als Macro eher flexibel ist, gefällt mir persönlich der Zugang über den Weg nur sehr bedingt. Das ist sehr nützlich, würde aber einen Basisdatentyp so nicht als Sonderfall behandeln wollen.



Zitat:

Zitat von Neutral General (Beitrag 1278661)
Ich glaube ehrlich gesagt dass ihr mit eurem Display-Kram auf der falschen Spur seid.
Wir speichern hier auch J/N in der Datenbank. Was dann dem User angezeigt wird ist nochmal eine ganz andere Geschichte.



Und die Helper Funktionen sollen sein damit sowas geht:

Delphi-Quellcode:
Feld.AsString := BoolToJN(x > 3);

statt
Delphi-Quellcode:
if x > 3 then
  Feld.AsString := 'J'
else
  Feld.AsString := 'N';
Es sei denn wir reden alle komplett aneinander vorbei :/


EgonHugeist 5. Nov 2014 10:09

AW: FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N
 
Hallo,

ich habe mal mit Zeos7.2 vom SVN-Repo Tests mit FireBird-3.0-Beta gemacht. FB3 unterstützt BOOLEAN Felder.. Wäre vielleicht eine Option?
Alles andere ist tatsächlich improvisiert und entspricht, wie mehrfach angedeutet, keinem SQL-Standart. Ich persönlich, würde daher dem FireDac Verhalten 100% Recht geben und einfach mit Calculated-Fields arbeiten.. Morgen fällt dir in deinem Projekt ein anderer Switch ein, der auch schnell mit 'T/F','J/N','0/1' zu lösen wäre und dann würde dich das Darstellen von Wahr/Falsch o. True/False für dieses Feld(TBooleanField) nur stören...

Gruß Michael

user0815 5. Nov 2014 11:13

AW: FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N
 
Ich würde immer noch den Kram auf Integer umswitchen:

Code:
CREATE TABLE TEST (
  NR INTEGER NOT NULL,
  WERT INTEGER DEFAULT 0,,
 CONSTRAINT PK_TEST PRIMARY KEY (NR)
);
Delphi-Quellcode:
const
  BooleanToInteger : Array[Boolean] of Integer = (0, 1); // 0=False, <> 0 somit True

...
        SQL.Add('INSERT INTO TEST');
        SQL.Add('(NR, WERT)');
        SQL.Add('VALUES');
        SQL.Add('(:NR, :WERT);');
        ParamCheck := True;
        ParamByName('NR').AsInteger := 1;
        ParamByName('WERT').AsInteger := BooleanToInteger[True];
      
var
  OK : Boolean;
begin
...
  OK := FieldByName('WERT').AsInteger <> 0;
Abfrage & Anzeige

Code:
SELECT NR,
       CASE WERT
            WHEN 0 then 'False'
            WHEN 1 then 'True'
            ELSE 'Unknown'
       end AS WERT
FROM Test;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 Uhr.
Seite 3 von 3     123   

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