Einzelnen Beitrag anzeigen

raller09

Registriert seit: 7. Nov 2005
38 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Rückgabe eines Wertes aus anderer Zeile, wenn aktueller Wert = null

  Alt 10. Apr 2013, 14:47
Datenbank: Interbase • Version: XE • Zugriff über: isql
Hi,

brauche mal eure Hilfe:

Ich möchte für Ausdrucke und an vielen Stellen im Programm für die Anzeige folgende Funktion umsetzen:
Wenn bei der übergebenen Sprache keine Daten (kein DS oder Feld-Wert ist null oder Leer-String) vorhanden sind, dann Lese die Daten aus der Standard-Sprache (im Beispiel 1) nach.
Da der Zugriff über viele Stellen im SourceCode erfolgt, wollte ich die Rückgabe des Übersetzten Text über die Datenbank lösen. Hierdurch müssten nich alle Stellen im Programm geändert werden.


Folgende Struktur (Beispiel) ist gegeben:
Code:
Tabelle BRANCHEN
ID               Integer (PKey)
(je nach Tabelle weitere Daten-Felder)

Tabelle SPRACHEN
SPRACHID         Integer (PKey)

Tabelle SPRACHEN_SPRACHE
SPRACHID         Integer (PKey)
BEZEICHNUNG      VarChar(100)

Tabelle BRANCHEN_SPRACHE
ID               Integer (PKey)
SPRACHID         Integer (PKey)
BEZEICHNUNG      VarChar(100)
MEMOTEXT         BLOB SUB_TYPE TEXT
Daten:
Code:
Branchen:      Sprachen:      Sprachen_Sprache:
ID             ID             ID | SPRACHID | BEZEICHNUNG
-----------     -----------     -----------------------------------------
 1               1               1 |        2 | Englisch
 2               2               2 |        2 | Deutsch
 3               3               3 |        2 | Französisch

Branchen_Sprache:
ID | SPRACHID | Bezeichnung                              | MemoText
--------------------------------------------------------------------------------
 1 |        1 | Computer programming activities          | aaaaaaaaaaa
 1 |        2 | Programmierungstätigkeiten               | 
 1 |        3 | (null)                                   | (null)
 2 |        1 | Computer consultancy activities          | (null)
 3 |        1 | Computer facilities management activities | (null)
Die Standard-Sprache (1. Englisch) ist in der Datenbank über einen
Generator "Standard_SprachID"
festgelegt.


Aktuelle Abfragen sind folgendermaßen aufgebaut:

SQL-Code:
Select bs.BEZEICHNUNG
from BRANCHEN b
left outer join BRANCHEN_SPRACHE bs on b.ID = bs.ID and b.SPRACHID = 3;
Diese liefern für die ausgewählte Sprache den entsprechenden Text;


Ich habe mir zuerst eine "stored procedure" geschrieben, die den Tabellen-Name, Feld-Namen und die Sprache übergeben bekommt und dafür den entsprechenden Text zurückgibt.
Aber auch mit dieser müsste ich den gesammten SourceCode überarbeiten.


Danach wollte ich das mittels "computed by" Feldern in der jeweiligen Sprach-Tabelle umsetzen:

Das scheitert aber an (bis jetzt) 2 Problemen:

1. Interbase kommt mit einem "case when" in der "computed by" Bedingung nicht zurecht, siehe QN: 110482
2. Ich hab es nur für Firebird gefunden, das BLOB-Felder in "computed by" nicht erlaubt sind. Bin nicht Sicher wie es für Interbase ist.


Daher hab ich mir eine "View" erstellt:
SQL-Code:
create view BRANCHEN_SPRACHE_MITDEF ( ID,
                                      SPRACHID,
                                      BEZEICHNUNG,
                                      MEMOTEXT) as
Select rss.ID,
       rss.SPRACHID,
       coalesce( NullIf( rss.BEZEICHNUNG , ''), sbs.BEZEICHNUNG),
       coalesce( case RTrim( cast( rss.MEMOTEXT as varchar(10))) when 'then null else bs.MEMOTEXT end, sbs.MEMOTEXT)
from BRANCHEN_SPRACHE bs
left outer join BRANCHEN_SPRACHE sbs on sbs.ID = bs.ID and sbs.SPRACHID = gen_ID( Standard_SprachID, 0);
Diese liefert mir schon fast das richtige Ergebnis.

Ein Problem ist aber noch vorhanden:
Wenn Daten für eine Sprache abgefragt werden, für die in der Sprach-Tabelle noch gar kein Eintrag vorhanden ist, dann wird bei einem join nich die Standard-Sprache ausgegeben.
Der Aufruf von
SQL-Code:
Select b.ID, bsmd.BEZEICHNUNG, bsmd.MEMOTEXT
from BRANCHEN b
left outer join BRANCHEN_SPRACHE_MITDEF bsmd on bsmd.ID = b.ID and bsmd.SPRACHID = 3
where b.ID = :ID;
liefert für
ID = 1 -> englische Bezeichnung (wie gewünscht)
ID = 2 -> (null) für die Bezeichnungen (das ist nicht so gewünscht)
Wenn ich ein
Insert into BRANCHEN_SPRACHE (ID, SPRACHID) (2, 3); mache, liefert der oben angeführte Sql-Befehl die Bezeichnung der Standard-Sprache.

Wie kann ich auch ohne den Insert die Daten der Standard-Sprache zurückgeben?

Geändert von raller09 (10. Apr 2013 um 17:26 Uhr)
  Mit Zitat antworten Zitat