Wie können boolsche Daten aus MySQL im BCB bearbeitet werden?
-
Hallo,
in meiner MySQL DB habe ich eine Spalte mit boolschen Daten, die ich im BCB6 beackern möchte.
Die boolschen Einträge werden in MySQL im sogenannten "tinyint" Format gespeichert, was im BCB6 scheinbar dem Typ "ftSmallint" entspricht.Die Tabelle wird in einem DBGrid korrekt geladen. Leider erscheint meine boolsche Spalte, wie gesagt, im BCB nicht als Bool sondern als ftSmallint mit (0,1). Eine Umstellung in der Eigenschaft des DataSets bei FieldDefs für die betroffene Spalte auf ftBool bleibt wirkungslos.
Wie kann ich die Daten im BCB als bool ansprechen?
Wie geht man hier am besten vor?
-
du könntest z.B. nach dem Öffnen des Query folgendes tun (hier als Beispiel für die Formatierung von einem Floatfeld auf ein Numerisches Feld mit definierter Anzeige):
void __fastcall TForm7::IBQuery1AfterOpen(TDataSet *DataSet) { TNumericField *Field1 = dynamic_cast<TNumericField*>(DataSet->FieldByName("Umfang")); Field1->DisplayFormat = "###,###,##0.00"; }die Feldtypen stehen unter TField in der BCB-Hilfe
-
Hallo @Linnea, danke für Deinen Tipp
habe einen Analogversuch gestartet:
void __fastcall TForm1::ADODataSet2AfterOpen(TDataSet *DataSet){ TBooleanField *Field_bool = dynamic_cast<TBooleanField*>(DataSet->FieldByName("ColumnBool")); //Field_bool->DisplayValues = "Yes;No"; }Leider sind die Werte in meiner Spalte immer noch vom Typ ftSmallint und nicht ftBoolean.
Die Zeile mit dynamic_cast läuft, wenn ich auskommentiere (wahrscheinlich löscht dann der Compiler die Zeile), stürzt aber mit einer Exception ab, wenn ich die Kommentare entferne.Hast Du vielleich noch eine Idee? Welche Infos würdest Du noch benötigen?
-
Hallo,
komme hier nicht weiter und habe nochmals mit dem Code-Vorschlag von @Linnea experimentiert:... bool BoolArray[300]; int i = 0; .... ADODataSet2->First(); while (!ADODataSet2->Eof){ BoolArray[i] = dynamic_cast<TBooleanField*>(ADODataSet2->FieldByName("ColumnBool")); ADODataSet2->Next(); i++; }...Also, der dynamic_cast von @Linnea ist korrekt.
Im Test-Array werden entsprechend der Werte aus meiner MySQL-Tabelle (1,0) die Werte als true oder false eingetragen. In meinem DBGrid bleiben die Einträge leider bei 0 oder 1. 
Leider wird auch jeder Umwandlungsversuch/Zugriff als Boolean mit einer Exception bestraft (Feld 'ColumnBool' kann nicht als Typ Boolean angesprochen werden).Hängt das damit zusammen, dass in MySQL der Typ Boolean als Typ ftSmallint angelegt wird? Bei jeder Änderung unter BCB wird ja auch die Tabelle in MySQL aktualisiert. Wenn es dann kein Rückübersetzungsprogramm gibt, könnte das Probleme machen. Liege ich hier richtig?
Allerdings gibt es dieses Problem sicher schon länger? Und auch eine Lösung, oder?
Ich bitte um Eure Kommentierung. Danke.

-
Es sollte möglich sein, die OnGetText/OnSetText-Events des Fields benutzen, um die Ein- und Ausgabe nach Bedarf zu manipulieren.
-
Hallo @Jansen, erst mal Danke für Deinen Hinweis.
bin Deinem Rat gefolgt u habe die Ereignisse OnSetText, OnGetText ausprobiert.
Dazu habe ich die Spalten der MySQL-Tabelle als persistente Felder angelegt.Das Ganze sieht dann mit problematischer Spalte "ColumnBool" so aus:
//Unit.h .. TSmallintField *ADODataSet2ColumnBool; .. //Unit.cpp .. void __fastcall TForm1::ADODataSet2ColumnBoolGetText(TField *Sender, AnsiString &Text, bool DisplayText){ int Feldwert = Sender->AsInteger; //Sender == ColumnBool == Smallint if (Feldwert > 0) Text = "Yes"; //Feldwert == 1 else Text = "No"; //Feldwert == 0 } ..Okay, klappt, "Yes" bzw. "No" wird im DBGrid angezeigt. Das Ganze ist aber nach wie vor nur Pseudo-Bool. Überzeugend ist das aber noch nicht. Leider.
Deshalb nochmals für mich eine Verständnisfrage:
Eine Spalte, die in einer MySQL-DB als Tinyint (= BCB6 Smallint) formatiert ist und in der nur die Feldinhalte (0,1) vorkommen, kann ich mit BCB6 im DBGrid nicht direkt als Boolean ansprechen (da datensensitiv). Ist diese Aussage richtig?
Es ist nicht möglich z.B eine direkte Abfrage des DBGrid-Zellinhaltes, wie if (Feldwert == true) durchzuführen, es müßte dann heißen if (Feldwert ==1)? Ist das so korrekt?