Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Virtuelles Feld (https://www.delphipraxis.net/7263-virtuelles-feld.html)

theomega 7. Aug 2003 14:11


Virtuelles Feld
 
Hallo Leute
ich habe eine Tabelle mit einem feld "kontonr". Das ist ein varchar mit 4 Zeichen. Jetzt brauche ich ein zweites Feld, am besten Boolean (gibt es leider unter Firebird nicht also eine Integer mit 0/1), das wenn das erste Zeichen (immer eine Zahl) kleiner ist als 4 true ist und sonst false.
Natürlich kann ich das Feld bei jeder Änderung an der Datenbank neu berechnen, aber das ist ja ziemlich aufwendig. Wie kann ich in die Tabelle einfach ein "virtuelles Feld" einfügen, das wie oben angegeben, die Werte hat.

Datenbank ist Firebird
Kompos sind die Std. Interbase

Grüße
TO

MrSpock 7. Aug 2003 22:29

Re: Virtuelles Feld
 
Hallo theomega,

solche Felder nennen sich berechnete Felder, die über COMPUTED BY definiert werden können. Aber in deinem Fall, ist der Ausdruck beim COMPUTED BY sehr schwierig!?

Deshalb könntest du vielleicht ein normales Feld (z.B. isGroesser) nehmen und es wie folgst setzen:

SQL-Code:
UPDATE tabTest
SET isGroesser=0
Damit werden alle Felder auf "False gesetzt" und anschließend:

SQL-Code:
UPDATE tabTest
SET isGroesser=1
WHERE CAST(substr(erstesFeld, 1, 1) AS SMALLINT) > 4;
Wenn du es mit COMPUTED BY definieren willst, benötigst du eine STORED PROCEDURE oder eine UDF.

theomega 8. Aug 2003 09:37

Re: Virtuelles Feld
 
Inzwischen habe ich es zumindest so hinbekommen, das es direkt mit einem "WHere" ausgelesen wird. Das Problem ist, das Firebird kein substr kennt. Das muß man erst per UDF einbinden.

urs.liska 8. Aug 2003 15:26

Re: Virtuelles Feld
 
Du brauchst eigentlich kein substr, sondern kannst einfach mit den alphanumerischen größer/kleiner-Operatoren arbeiten.
Ich habe gerade keine geeignete Tabelle zum Test zur Verfügung, aber es sollte so funktionieren:
Dein "virtuelles Feld" soll dann true sein, wenn die Kontonummer größer als '0' ist und kleiner als '4'. Also ist es dann true,
SQL-Code:
if ((KONTONR > '0') and (KONTONR < '4'))
.
Ich denke auch, dass es nicht sehr aufwändig ist, das als festes Feld mit Triggern zu realisieren, also "Before insert" und "Before udate" etwa folgendes festzulegen:
SQL-Code:
if ((new.KONTONR > '0') and (new.KONTONR < '4'))
   then new.BOOLEAN = 1 else new.BOOLEAN = 0
Viel Erfolg
Urs

P.S.
Wenn Du schon Daten in der Tabelle hast, müsstest Du natürlich die bisherigen Datensätze mit einem Update anpassen (s. Nachricht von MrSpock)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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