Anmelden

View Full Version : Querys in SQL wandeln und setsppfp



Seiten : [1] 2

dholtmann
14-11-18, 10:57
Hallo zusammen,

ich möchte gern die alten Querys mit Hilfe einer Programms in SQL Befehle umbauen.
So weit so gut, wenn da nicht die verschiedenen Outputs wären.

Bisher geh ich wie folgt vor:

1. Bibliotheksliste holen
2. In Schleife die DSPOBJD aller Querys holen
3. RTVQMQRY pro Query
4. mit SQL die Überflüssigen Zeilen löschen (alles mit SRCSEQ <
(select min(srcseq) from xy where upper(srcdta) like '%SELECT' )

Damit habe ich alle Selects.

Nun fiel mir auf, dass sämtliche Output Angaben fehlen.
Ich bin dann bei meiner Suche auf Folgendes gestoßen:


QryObj = Qrslvsp(X'1911' :%trimr(file): %trimr(library): x'0000') ;
QryPointer = setsppfp(QryObj);
QryPointer = setsppo(QryPointer:260);
MemCpy(%Addr(Output):QryPointer:%size(Output));


Leider brach das bei setsppfp schon mit MCH6801 ab, da meine QSECURITY bei 40 liegt.

Hat von Euch jemand einen Lösungsvorschlag?
Gibt es eine Alternative zu setsppfp?

Bin für jede Hilfe dankbar!

mfG

Fuerchau
14-11-18, 11:23
Etwas aufwändiger per DMPOBJ und Auswertung des Spools.

Pikachu
14-11-18, 11:53
Vorsicht mit RTVQMQRY ALWQRYDFN(*YES oder *ONLY).
Der setzt die "Art der Verknüpfung" nicht (immer) richtig um.
Zumindest bis V5R4 wird immer ein "inner join" draus.

dholtmann
14-11-18, 13:57
Danke euch Beiden!

Das von Pikachu muss ich noch prüfen.

Ansonsten hab ich das Problem jetzt tatsächlich mit nem dmpobj umgangen:

DMPOBJ OBJ(LIB/PGM) OBJTYPE(*QRYDFN)

CPYSPLF FILE(QPSRVDMP) TOFILE(QTEMP/SPOOLPF) CTLCHAR(*FCFC)


with Dump as ( select row_number() over() rw , substr(info, 89, 32) info
from qtemp/spoolpf),
Stern as (
select rw
from dump
where info like '%*%')
select substr(info, locate('*CHANGE', info) -38, 10) Fil,
substr(info, locate('*CHANGE', info) -26, 10) Lib,
substr(info, locate('*CHANGE', info) -14, 10) Mbr,
substr(info, locate('*CHANGE', info) -2, 1) Typ
from (
select d2.info concat d1.info concat d3.info info
from dump d1
join stern on d1.rw = stern.rw
join dump d2 on d1.rw-1 = d2.rw
join dump d3 on d1.rw+1 = d3.rw
) a where substr(info, 40) like '%*CHANGE%'
fetch first row only

Jetzt nur noch anhand der Infos den SQL vervollständigen.

Fuerchau
14-11-18, 16:36
Im Query wird die Art der Verknüpfung ja über eine Auswahl 1/2/3 geregelt.
Diese drückt sich leider nicht im SQL aus, da die Beziehung durch RTV nicht per Join sondern im Where aufgelöst wird. Und dies ist dann leider immer ein Inner Join!
In diesem Fall ist leider eine manuelle Nachbearbeitung erforderlich.

sven70
22-02-21, 11:38
Servus,
ich greife mal dieses alte Thema auf.
Gibt es mittlerweile eine komfortable Möglichkeit aus den alten Qry ein SQL zu generieren?
Gruß
Sven

RobertMack
22-02-21, 11:44
Klar,

http://newsolutions.de/forum-systemi-as400-i5-iseries/members/449-B-Hauser buchen. Dann gibt's Schulung PLUS performante SQLs on-the-job.

camouflage
22-02-21, 13:05
Robert, tztzzz ...
... so sehr ich es auch Birgitta gönnen mag.

Versuch's mal so:
RTVQMQRY QMQRY(myLib/myQuery) SRCFILE(myLib/mySource*) ALWQRYDFN(*YES)
*z.B. QSQLSRC

RobertMack
22-02-21, 13:12
Aber Karl...

wir wissen doch, dass die Qualität von Ergebnissen außerhalb der Komfortzone des Entwicklers liegt.

;-)

Fuerchau
22-02-21, 16:29
Wie bereits oben beschrieben, liefert der RTVQMQRY ausschließlich das SQL.
Die fehlenden Output-Infos gibts weiterhin nur mit den oben genannten Hilfsmitteln.

Zu beachten ist lediglich, dass der erstellte Query übrigens immer einen Inner join produziert, da die Joinbeziehung in der Where-Klausel steht.
Die Art der Beziehung (1, 2, 3) aus dem QRYDFN bekommt man leider nur per WRKQRY.