PDA

View Full Version : SQL Denkanstoss gesucht



KingofKning
01-09-15, 16:16
Hallo *all,

steh im Wald und das Rehlein sagt Du zu mir....

CREATE FUNCTION /*Mail für RP-Trade 27.08.15 12:39*/
email3( PARARTNR dec(6), VERTRETER dec(3) ) RETURNS
VARCHAR(80) LANGUAGE SQL READS SQL DATA BEGIN
DECLARE RETURNVAL VARCHAR ( 80 ) NOT NULL DEFAULT ' ' ;
DECLARE work VARCHAR ( 100 ) NOT NULL DEFAULT ';' ;
FOR CSRC1 AS C1 CURSOR
FOR SELECT a4mail
FROM adr04pf
WHERE a4kto = PARARTNR and a4sts = 0
and a4fa = 1 and a4edua = 'A10'
DO SET work = ';' concat rtrim(a4mail) ;
END FOR ;
set returnval = ltrim(work) concat case
when vertreter = 953 then ',Ulrich@xxx;'
when vertreter = 914 then ',Georg@xxx;'
when vertreter = 922 then ',Martin@xxx;'
when vertreter = 961 then ',Michael@xxx;'
else ';' end;
RETURN LTRIM(RETURNVAL);
END

Habe nun das Problem das evtl. a4mail keine E-Mail Adresse zurückkommt. Dann ist der String nachher: ",Michael@xxx;" Wenn aber eine Adresse da ist sieht es so aus: "Adresse@xyz.de,Michael@xxx,"

Ich möchte aber das führende "," weg haben wenn der Kunde keine E-Mail Adresse hat.

Sprich wenn a4mail = leer dann "Michael@xx," ansonsten ",Michael@xxx;"

Hatte jetzt in der SQL-Referenz nachgesehen "DB2 Universal Database for iSeries SQL Programming Concepts" aber was ich suche ist quasi eine Auflistung welche Befehle es alles gibt dich ich dort benutzen kann.

Kann mir da einer mal sagen wo es lang geht.

GG

Fuerchau
01-09-15, 17:32
wie wärs mit:

Return strip(ltrim(returnval), leading, ',')

KingofKning
01-09-15, 18:45
Lass mich raten, das geht unter V5R4 noch nicht oder......

GG

Hatt jetzt nochmal probiert when vertreter = 1 and a4mail is not null then x
when vertreter = 1 then y

Nur steigt der beim ersten gefunden when aus und ignoriert den Rest..

Rehlein es wird dunkel ich bleib im Wald bei Dir........

GG

Pikachu
01-09-15, 19:43
Da gibts doch sicher auch ein IF als SQL-Anweisung ...

GruberWolfgang
01-09-15, 20:58
Was soll jetzt eigentlich der Delimiter zwischen den Mail-Adressen sein: ',' oder ';'. Ich nehme mal ';' an.
Probiers mal mit einer Änderung des FOR-Bodys:

DO
SET work = work || rtrim(a4mail) || ';';
END FOR;
vorher natürlich work mit '' initialisieren.
Beim abschließenden dranhängen der Verteter-EMail dann je Verterter ergänzen mit:
when vertreter = 952 then 'Ulrich@xxx;'

Dann sollte für einen Kunden sowohl keine Mailadresse, eine Maile-ADresse oder mehrere Mailadressen gehen.

B.Hauser
02-09-15, 07:00
Lass mich raten, das geht unter V5R4 noch nicht oder......


Return strip(ltrim(returnval), leading, ',')

Die Syntax ist eigentlich uralt und konnte schon in den 4er Releases eingesetzt werden.
Besser ist es allerdings statt STRIP die Funktion TRIM zu verwenden.
Das Beispiel entfernt das erste führende Komma.

RETURN TRIM(Leading ',' from LTRIM(RtnValue));

Aber wolltest Du nicht, sofern der Rückgabe-Wert leer ist, dass dann nur Michael@... drin steht?
Dann könntest Du vor dem Return noch eine Case oder If-Anweisung einbauen:


IF Coalesce(RETURNVAL, ' ') = ' ' THEN SET RETURNVALUE = 'Michael@...';
END IF;
RETURN TRIM(Leading ',' from LTRIM(RETURNVAL));

Warum nimmst Du die 4 Vertreter nicht direkt in die WHERE-Klausel auf, so dass auch nur diese 4 Vertreter ausgewählt werden?

KingofKning
02-09-15, 07:15
Was soll jetzt eigentlich der Delimiter zwischen den Mail-Adressen sein: ',' oder ';'. Ich nehme mal ';' an.
Probiers mal mit einer Änderung des FOR-Bodys:

DO
SET work = work || rtrim(a4mail) || ';';
END FOR;
vorher natürlich work mit '' initialisieren.
Beim abschließenden dranhängen der Verteter-EMail dann je Verterter ergänzen mit:
when vertreter = 952 then 'Ulrich@xxx;'

Dann sollte für einen Kunden sowohl keine Mailadresse, eine Maile-ADresse oder mehrere Mailadressen gehen.


Hallo,
dummerweise nimmt das Importprogramm das ";" als Trennzeichen deswegen muß ich das "," benutzen.

GG

KingofKning
02-09-15, 07:29
Hallo,
ich bekomme beim strip immer einen Syntaxfehler dachte deswegen das der unter V5R4 nicht geht.
Return strip(ltrim(returnval), leading, ',')

Nachrichten-ID . . . . : SQL0104


Nachricht . . . : Token STRIP ungültig. Gültige Token: (.

Ursache . . . . : Bei Token STRIP wurde ein Syntaxfehler entdeckt. Token

Laut Doku
>>-STRIP--(--string-expression--+-----------------------------------------+--)-><
'-,--+-BOTH-----+--+--------------------+-'
+-B--------+ '-,--strip-character-'
+-LEADING--+
+-L--------+
+-TRAILING-+
'-T--------'
sollte es doch passen.

BTW. der Vertreter wird ja mit übergeben und ist nicht Ergebnis der Suche.

Benutze jetzt das RETURN TRIM(Leading ',' from LTRIM(Returnval));

Danke für die Hilfe, jetzt ist das arme Rehlein wieder allein im Wald, aber so wie ich mich kenne werde ich es bald wieder besuchen.....

GG

Wobei wenn ich jetzt nochmal drüber nachdenke, hätte ich die Initalisierung mit den Vertretern an den Anfang stellen sollen. Tja, wenn man nur Rehlein zum diskutieren hat dauert es manchmal länger...