AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireDAC erkennt Boolean schreibt jedoch T/F anstelle von J/N
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Kostas · begonnen am 3. Nov 2014 · letzter Beitrag vom 5. Nov 2014
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#21

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

  Alt 4. Nov 2014, 13:02
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#22

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

  Alt 4. Nov 2014, 13:13
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#23

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

  Alt 4. Nov 2014, 13:37
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:

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 :/
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#24

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

  Alt 5. Nov 2014, 08:34
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.



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:

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 :/
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#25

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

  Alt 5. Nov 2014, 10:09
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

Geändert von EgonHugeist ( 5. Nov 2014 um 10:10 Uhr) Grund: typo
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#26

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

  Alt 5. Nov 2014, 11:13
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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