PDA

View Full Version : RUNSQLSTM - Problem



Seiten : [1] 2

muadeep
31-08-06, 09:44
Hallo habe hier ein SQL welches als TXT in einer Source abgelegt ist:


insert into jrnanz/SOURCES1
SELECT 1 , 1 ,' A '|| WHFLDI||' '||
case when whfldd=0 then substr(digits(whfldb) , 3 , 3)
else ' '||digits(whfldd) end
||whfldt||
case when whfldp=0 then ' '
else substr(digits(WHFLDp) , 1 , 2) end
||' TEXT('||''''|| trim(left(WHFTXT , 28))||''''||')'
from jrnanz/fields

dieses wird dann aus einem CL mit dem Befehl RUNSQLSTM aufgerufen!


a) kann mir jemand sagen, was die "||" bedeuten und wie ich sie ersetzen kann/muß?
b) die Zeile mit TEXT('||.... ermittelt die Beschreibung (TEXT) des Feldes !!! -> wenn jetzt kein Text vorhanden ist, dann steht anschließend in der Source nur "TEXT('')". Wenn die Source mit CRTPFM umgewandelt wird, bekomme ich einen Fehler -> wie kann ich das umgehen

kuempi von stein
31-08-06, 09:48
...kann mir jemand sagen, was die "||" bedeuten und wie ich sie ersetzen kann/muß?...

Hello,

das müsste ein *CAT sein.
Stichwort Ersatzoperator.

k.

muadeep
31-08-06, 10:14
Hab's mal abgändert dann bekomme ich beim Ausführen mit RUNSQLSTM folgenden Fehler:


Satz *...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 FLGNR. Letzte Änderung
1 insert into jrnanz/SOURCES1
2 SELECT 1 , 1 ,' A ' *cat WHFLDI *cat ' ' *cat
3 case when whfldd=0 then substr(digits(whfldb) , 3 , 3)
4 else ' ' *cat digits(whfldd) end
5 *cat whfldt *cat
6 case when whfldp=0 then ' '
7 else substr(digits(WHFLDp) , 1 , 2) end
8 *cat ' TEXT('*cat '''' *cat trim(left(WHFTXT , 28)) *cat '''' *cat ')'
9 from jrnanz/fields
* * * * * E N D E D E R Q U E L L E * * * * *
SQL0104 30 2 Position 52 Token * ungültig. Gültige Token: , FROM INTO.
Nachrichtenzusammenfassung
Gesamt Info Warnung Fehler Wertigk. Beendigung
1 0 0 0 1 0
Fehler der Wertigkeitsstufe 30 in Quelle gefunden.

kuempi von stein
31-08-06, 10:34
ähmm...

nee nee, das geht wohl so nicht.
*CAT ist ja eigentlich nen CL-Operator.
Weil das so nicht geht, hat ja der Vorgänger eben || genommen.
Eventuell geht "concat" ??

Zum Thema RUNSQLSTM gibts hier im Forum reichlich Stoff!

k.

Sodele, habe noch mal etwas geblättert.
Statt || sollte concat gehen.
Aber warum lässt Du das nicht einfach so?
Dein Hauptptoblem scheint ja nur das leere "Text" zu sein?
Wie man das gebacken bekommt weiss ich nicht, da musst Du mal auf ne/n SQL-Profi warten...

k.

B.Hauser
31-08-06, 11:37
Hallo,

mit || kann es Probleme geben. In manchen Umgebungen müssen stattdessen zwei !! angegeben werden.
Solange es nur um SQL geht ist die sicherste Lösung ist, wie Kuempi sagt, concat statt der || zu verwenden. Das ist international und gibt keine Probleme.

Was Dein Problem mit dem Text angeht. Du darfst den Text nur ausgeben, wenn auch einer angegeben wurde, d.h. Du benötigst eine zusätzlich CASE-Anweisung:

Etwa so (nicht getestet, da ich z.Z. keinen Zugriff auf eine iSeries habe)


Concat Case When Length(Trim(Left(WHFTXT, 28) <> 0
Then ' TEXT(' concat
'''' concat trim(left(WHFTXT , 28)) concat ''''
concat ')'
End



Birgitta

muadeep
31-08-06, 11:50
ok, danke schön

jetzt wär da noch das Problem dass die Source so erstellt wird:


A MANDANT_ID 09B TEXT('')

und dass ich dann beim umwandeln mit CRTPF immer eine Fehlermeldung bekommen!

kuempi von stein
31-08-06, 12:02
Hello again,

das leere Textfeld könnte man vermutlich mit
concat trim(left(WHFTXT , 27)) concat ' ' concat '''' concat ')' umgehen. Weiss gerade nicht, ob die Syntax korrekt ist, aber du hängst einfach grundsätzlich noch ne Leerstelle hinten ran, wenn Du verstehst was ich meine...


Und die genaue Fehlermeldung wäre interassant, falls es nicht geht.

In diesem Sinne...

k.

Noch ein kleiner Nachtrag:
Die Lösung von Birgitta würde ich bevorzugen so grundsätzlich.
Ob man ein *Blank überhaupt mit concat ranbekommt, weiss ich nicht, im Zweifelsfalle eben irgendein doofes Zeichen nehmen (Punkt?)...

Und noch ne Frage: was wird das eigentlich?
Sieht mir nach Journal und DSPFFD usw. aus....
So eine Art Ablage in ne File was an Infos aus dem Journal kommt?

muadeep
31-08-06, 13:24
Hier mal die Fehlermeldung mit dem Eingebauten Statment
(hoffe es ist so richtig!)


Satz *...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 FLGNR. Letzte Änderung
1 insert into jrnanz/SOURCES1
2 SELECT 1 , 1 ,' A '|| WHFLDI||' '||
3 case when whfldd=0 then substr(digits(whfldb) , 3 , 3)
4 else ' '||digits(whfldd) end
5 ||whfldt||
6 case when whfldp=0 then ' '
7 else substr(digits(WHFLDp) , 1 , 2) end
8 ||' TEXT('||''''|| trim(left(WHFTXT , 28))||''''||')'
9 Concat Case When Length(Trim(Left(WHFTXT, 28) <> 0
10 Then ' TEXT(' concat
11 '''' concat trim(left(WHFTXT , 28)) concat ''''
12 concat ')' end
13 from jrnanz/fields
* * * * * E N D E D E R Q U E L L E * * * * *
SQL0104 30 9 Position 51 Token <> ungültig. Gültige Token: ).
Nachrichtenzusammenfassung
Gesamt Info Warnung Fehler Wertigk. Beendigung
1 0 0 0 1 0
Fehler der Wertigkeitsstufe 30 in Quelle gefunden.

JobLog:
Befehl RUNSQLSTM fehlgeschlagen.
Fehler bei Ausführung des Verarbeitungsbefehls; Einzelheiten enthält das Jobprotokoll.


Sieht mir nach Journal und DSPFFD usw. aus....
-> stimmt genau
(es handelt sich um ext. Pgm(e). welche in einer bestimmten Bibl. arbeiten, dort ist ein Journal auf an, und ich wollte mal genauern sehen, was da denn so alles (je Datei) gemacht wird)

kuempi von stein
31-08-06, 15:21
Also mit der "Fehlermeldung" kann ich nix anfangen. Ist mehr nen Fall für Brigitta oder so...

Hier mal ein "manueller" Ablauf um ein Journal auszuwerten...

DSPJRN JRN(Journalname)
FROMTIME(220805 150000)
TOTIME(220805 160000)
OUTPUT(*OUTFILE)
OUTFILE(QTEMP/TYPE1)
ENTDTALEN(*CALC)

Dann Datei erstellen JRNTYP1 in QTEMP

*
A R QJORDJE
*
A JOENTL 5P 0 COLHDG('EINTRAGSLÄNGE')
A JOSEQN 10P 0 COLHDG('FOLGENUMMER')
A JOCODE 1A COLHDG('JOURNALCODE')
A JOENTT 2A COLHDG('EINTRAGSART')
A JODATE 6A COLHDG('DATUM')
A JOTIME 6P 0 COLHDG('UHRZEIT')
A JOJOB 10A COLHDG('JOBNAME')
A JOUSER 10A COLHDG('BENUTZERNAME')
A JONBR 6P 0 COLHDG('JOBNUMMER')
A JOPGM 10A COLHDG('PROGRAMMNAME')
A JOOBJ 10A COLHDG('OBJEKTNAME')
A JOLIB 10A COLHDG('OBJEKTBIBLIOTHEK')
A JOMBR 10A COLHDG('TEILDATEINAME')
A JOCTRR 10P 0 COLHDG('GEÄNDERTE ANZAHL OD.')
A JOFLAG 1A COLHDG('MARKIERUNG: 1 ODER 0')
A JOCCID 10P 0 COLHDG('COMMIT-ZYKLUS-ID')
A JOINCDAT 1A COLHDG('UNVOLLST.')
A JOMINESD 1A COLHDG('MINIM. ESD')
A JORES 18A COLHDG('NICHT VERWENDET')
A JOESD 2000H COLHDG('INHALT')
A*

Dann..

CPYF FROMFILE(QTEMP/TYPE1)
TOFILE(QTEMP/JRNTYP1)
MBROPT(*REPLACE)
FMTOPT(*MAP)

Dann Datei erstellen JRNTMP1 wie JRNTYP1 aber statt JOESD die Felder der
betreffenden echten Datei anhängen.

Dann...

CPYF FROMFILE(QTEMP/JRNTYP1)
TOFILE(QTEMP/JRNTMP1)
MBROPT(*REPLACE)
FMTOPT(*NOCHK)


Fertig! Auswerten mit z.B. SQL...


Ich hoffe Du kommst klar damit.

kuempi

B.Hauser
31-08-06, 16:38
Hallo,

warum hast Du die Text-Angabe doppelt codiert?

Das korrekte Statement müsste so aussehen:

insert into jrnanz/SOURCES1
SELECT 1 , 1 ,' A ' concat WHFLDI concat ' ' concat
case when whfldd=0 then substr(digits(whfldb) , 3 , 3)
else ' 'concat digits(whfldd) end
concat whfldt concat
case when whfldp=0 then ' '
else substr(digits(WHFLDp) , 1 , 2) end
concat
Case When Length(Trim(Left(WHFTXT, 28) <> 0
Then ' TEXT(' concat
'''' concat trim(left(WHFTXT , 28)) concat ''''
concat ')' end
from jrnanz/fields

Übrigens mit der skalaren Funktion Space(Zahl) kann man eine beliebige Anzahl *Blanks generieren: z.B. bei Space(5) werden 5 aufeinanderfolgende Blanks generiert.


Birgitta