LO Base: Problem mit boolean-Feldern einer PostgreSQL Datenbank

Hallo,

Ich habe eine PostgreSQL Datenbank (DB) auf einem Server angelegt und möchte LO Base als Frontend dafür verwenden.

Die Verbindung zur DB funktioniert, ich kann in LO Base die vorhandenen Daten sehen und manipulieren (über "Tabellen").

Das Problem sind nun die boolean-Felder. Sie werden in LO korrekt als Checkbox angezeigt, das Häkchen ist korrekt gesetzt, wenn in der entsprechenden Spalte TRUE (= "t") steht.

Wenn ich aber das Häkchen in LO entferne und den Datensatz speicher, und ich dann außerhalb von LO ein SELECT auf die Spalte mache, bekomme ich dort einen leeren String (oder NULL?) anstelle des FALSE oder "f". Es scheint, dass LO bei nicht gesetztem Häkchen den Wert NULL anstelle von FALSE speichert. In PostgreSQL wird für den Datentyp boolean neben TRUE und FALSE noch NULL verwendet, was "unbekannt" bedeutet.

Was kann ich machen, damit LO mir FALSE speichert, wenn das Häkchen nicht gesetzt ist?

LO 4.2.8.2 linux PostgreSQL 9.4

Mit bestem Gruß Ulrich

Hallo Ulrich,
oh jaaa, an dem knabbere ich auch gerade. Ich muss immer doppelt den Status eines Booleschen Feldes setzen, damit es stimmt. Eine eindeutige 'Binäre' Situtation würde mir hier helfen. Ich hoffe, jemand weiss da eine Lösung ('Richtung Robert gucke*, hehe)

glg,
fred

Ulrich Goebel schrieb:

Hallo,

Ich habe eine PostgreSQL Datenbank (DB) auf einem Server angelegt und
möchte LO Base als Frontend dafür verwenden.

Die Verbindung zur DB funktioniert, ich kann in LO Base die vorhandenen
Daten sehen und manipulieren (über "Tabellen").

Das Problem sind nun die boolean-Felder. Sie werden in LO korrekt als
Checkbox angezeigt, das Häkchen ist korrekt gesetzt, wenn in der
entsprechenden Spalte TRUE (= "t") steht.

Wenn ich aber das Häkchen in LO entferne und den Datensatz speicher, und
ich dann außerhalb von LO ein SELECT auf die Spalte mache, bekomme ich
dort einen leeren String (oder NULL?) anstelle des FALSE oder "f". Es
scheint, dass LO bei nicht gesetztem Häkchen den Wert NULL anstelle von
FALSE speichert. In PostgreSQL wird für den Datentyp boolean neben TRUE
und FALSE noch NULL verwendet, was "unbekannt" bedeutet.

Was kann ich machen, damit LO mir FALSE speichert, wenn das Häkchen
nicht gesetzt ist?

LO 4.2.8.2 linux PostgreSQL 9.4

Mit bestem Gruß Ulrich

Hi,
wenn ich mich recht erinnere, hab ich via SQL alle Werte von t auf true
und von f auf false geändert. Sorry, ist schon ne Weile her :slight_smile:

Hallo Ulrich,

Das Problem sind nun die boolean-Felder. Sie werden in LO korrekt
als Checkbox angezeigt, das Häkchen ist korrekt gesetzt, wenn in
der entsprechenden Spalte TRUE (= "t") steht.

Wenn ich aber das Häkchen in LO entferne und den Datensatz
speicher, und ich dann außerhalb von LO ein SELECT auf die Spalte
mache, bekomme ich dort einen leeren String (oder NULL?) anstelle
des FALSE oder "f". Es scheint, dass LO bei nicht gesetztem Häkchen
den Wert NULL anstelle von FALSE speichert. In PostgreSQL wird für
den Datentyp boolean neben TRUE und FALSE noch NULL verwendet, was
"unbekannt" bedeutet.

Ich habe das gerade mit den Version LO 4.4.5.2 und 4.2.2.1 getestet.
In eine Postgrestabelle ein Boolean-Feld eingebaut, einmal keinen
Eintrag gemacht, einmal ein Häkchen gesetzt einmal ein Häkchen gelöscht.

Das Feld stellt bei fehlendem Eintrag einen Querstrich dar (steht für
NULL). Mit einem Haken wird TRUE dargestellt. Ganz leer bleibt das
Feld, wenn FALSE gespeichert wird.

Stelle ich in Extras → SQL die Abfrage, so ergibt das ein leeres Feld
ohne Inhalt, ein Feld mit 't' und ein Feld mit 'f'.

Mein System: OpenSUSE 13.2 64bit rpm Linux.

Was kann ich machen, damit LO mir FALSE speichert, wenn das Häkchen
nicht gesetzt ist?

LO 4.2.8.2 linux PostgreSQL 9.4

Warum hast Du die 4.2.8.2 noch installiert? Vermutlich die Version,
die Deine Distribution unterstützt?

Versuche es einmal mit der Version direkt von LibreOffice. Die kannst
Du in der Regel parallel installieren.

Gruß

Robert

Hallo Manfred,

oh jaaa, an dem knabbere ich auch gerade. Ich muss immer doppelt
den Status eines Booleschen Feldes setzen, damit es stimmt. Eine
eindeutige 'Binäre' Situtation würde mir hier helfen. Ich hoffe,
jemand weiss da eine Lösung ('Richtung Robert gucke*, hehe)

Eigentlich sollte das mit dem Setzen eines Defaultwertes möglich sein:

ALTER TABLE "Tabellenname" ALTER "Boolscherfeldname" SET DEFAULT FALSE;

Damit sollte das Abspeichern eines leeren Feldes unmöglich sein.
Allerdings habe ich gerade einmal in Base getestet: Kommando wird
übernommen, aber Funktion ist nicht gewährleistet. Warum das so ist
kann ich nicht sagen. Ich arbeite sonst nicht mit PostgreSQL. Aus
anderen Datenbanken kenne ich das so, dass eben beim Abspeichern eines
leeren Feldes stattdessen der Defaultwert genommen wird. Wenn ich
explizit über SQL das Feld auch noch als NUT NULL definiere, so wird
das Verhalten von PostgreSQL offensichtlich: Es kommt eine
Fehlermeldung, dass eine leere Eingabe versucht wird. Die sollte aber
eigentlich mit dem Default-Wert überschrieben werden.

Bleibt nur die Möglichkeit, innerhalb von Formularen zu arbeiten und
für das Markierfeld "Dreifacher Status" → "Nein" auszuwählen.

Gruß

Robert

Danke für die Hinweise. Inzwischen habe ich eine Lösung gefunden - allerdings auf der DB-Ebene: Dort habe ich einen Trigger eingerichtet, der beim INSERT und UPDATE den Wert prüft und im Falle von "unbekannt" auf "false" setzt. Diesen Hinweis incl. PostgreSQL-Code habe ich auf der deutschen PostgreSQL-Mailingliste von Andreas Kretschmer bekommen; auch hier vielen Dank dafür!

create table bla(id int, b bool);

create or replace function set_false() returns trigger as
$$begin new.b := false; return new; end;$$language plpgsql;

create trigger trg1 before insert or update on bla for each row
when (new.b is null) execute procedure set_false();

insert into bla values (1, true);
insert into bla values (2, null);
insert into bla values (3, false);

select * from bla;
  id | b

Vielen Dank Ulrich,
ich denke, das lässt sich auch sehr leicht auf Benutzer von MySQL übertragen.

glg,
fred

Danke f�r die Hinweise. Inzwischen habe ich eine L�sung gefunden -
allerdings auf der DB-Ebene: Dort habe ich einen Trigger eingerichtet, der
beim INSERT und UPDATE den Wert pr�ft und im Falle von "unbekannt" auf
"false" setzt. Diesen Hinweis incl. PostgreSQL-Code habe ich auf der
deutschen PostgreSQL-Mailingliste von Andreas Kretschmer bekommen; auch
hier vielen Dank daf�r!

create table bla(id int, b bool);

create or replace function set_false() returns trigger as $$begin new.b :=
false; return new; end;$$language plpgsql;

create trigger trg1 before insert or update on bla for each row when (new.b
is null) execute procedure set_false();

insert into bla values (1, true); insert into bla values (2, null); insert
into bla values (3, false);

select * from bla; id | b ----+--- 1 | t 2 | f 3 | f (3 rows)

Hallo,

Ich habe eine PostgreSQL Datenbank (DB) auf einem Server angelegt und
m�chte LO Base als Frontend daf�r verwenden.

Die Verbindung zur DB funktioniert, ich kann in LO Base die vorhandenen
Daten sehen und manipulieren (�ber "Tabellen").

Das Problem sind nun die boolean-Felder. Sie werden in LO korrekt als
Checkbox angezeigt, das H�kchen ist korrekt gesetzt, wenn in der
entsprechenden Spalte TRUE (= "t") steht.

Wenn ich aber das H�kchen in LO entferne und den Datensatz speicher, und
ich dann au�erhalb von LO ein SELECT auf die Spalte mache, bekomme ich
dort einen leeren String (oder NULL?) anstelle des FALSE oder "f". Es
scheint, dass LO bei nicht gesetztem H�kchen den Wert NULL anstelle von
FALSE speichert. In PostgreSQL wird f�r den Datentyp boolean neben TRUE
und FALSE noch NULL verwendet, was "unbekannt" bedeutet.

Was kann ich machen, damit LO mir FALSE speichert, wenn das H�kchen nicht
gesetzt ist?

LO 4.2.8.2 linux PostgreSQL 9.4

Mit bestem Gru� Ulrich

- --

Hallo *,

Eigentlich sollte das mit dem Setzen eines Defaultwertes möglich
sein:

ALTER TABLE "Tabellenname" ALTER "Boolscherfeldname" SET DEFAULT
FALSE;

Mir ist jetzt klar geworden, warum das nicht greift: Die
Standardeinstellung eines boolschen Feldes ist bereits ein leeres
Feld, das aber 'FALSE' entspricht. Setze ich dieses Feld bewusst auf
NULL, so wird ein entsprechender INSERT-Befehl von Base losgeschickt,
in dem eben NULL für das Feld weitergegeben wird.
- -----------------
Beispiel:
INSERT INTO "Tabelle" ("Ware","Preis","Kaufen") VALUES ('Kaffee',
8.79,NULL);
Das wird als Befehl abgesetzt, wenn das Feld "Kaufen" ein boolsches
Feld ist, weil eben die Checkbox "Kaufen" geändert wurde (von FALSE
auf NULL).
Die Checkbox gibt so immer wieder einen Inhalt weiter.
- -----------------
Anders ist das, wenn ich z.B. ein Zahlenfeld mit einem Defaultwert
vorbelege. Das leere Zahlenfeld wird bei der INSERT-Anweisung nicht
erwähnt, da es keinen Inhalt hat. Nur wenn das Feld nicht erwähnt wird
greift die Zuweisung des Defaultwertes der Datenbank.
- -----------------
Beispiel:
INSERT INTO "Tabelle" ("Ware","Preis") VALUES ('Kaffee', 8.79);
Dieser Befehl enthält das Feld "Kaufen" nicht. Jetzt wird
gegebenenfalls der Default-Wert der Tabelle für das Feld "Kaufen"
hinzugefügt. Es könnte also ohne weiteres von der Datenbank in dem
Feld "Kaufen" automatisch z.B. eine '1' eingefügt werden.
Ein Zahlenfeld oder ein Textfeld sind standardmäßig erst einmal leer.
Wird dort also keine Eingabe gemacht, so fehlen die Felder beim
INSERT-Befehl.

Gruß

Robert