PDA

View Full Version : Bibliotheksnamen Variable im Query einbauen?



DEVJO
04-03-03, 07:52
Moinsen,

ich hab da mal ´ne Frage: Ich habe gehört,
das man Bibliotheksnamen in einem Query auch als Variable übergeben kann.
Stimmt das und wenn ja, wie? Da wir viele Kunden haben, mit verschiedenen Datenbibliotheken, müssen wir die Querys immer anpassen, was bei bei 2-3 ja noch kein Aufwand ist, aber bei fast 100?!
Schönen Dank im Voraus.

hs
04-03-03, 08:01
so sieht das CL aus:

PGM PARM(&BIBLIOTHEK)
DCL VAR(&BIBLIOTHEK) TYPE(*CHAR) LEN(10)
RUNQRY QRY(QRYBIB/MEINEQRY) +
QRYFILE((&BIBLIOTHEK/DATEI))
ENDPGM

Aufruf des CL-Programms:

CALL MEINPROG 'MEINEBIB'

Gruß
HS

andigoering
04-03-03, 08:02
Helau!

Folgende Lösungen bieten sich an:

1. Beim Runqry die Datei (MIT BIBLIOTHEK) mitgeben.

2. Per OVRDBF vor dem RUNQRY die Datei(en) "umlenken".

Problem bei beiden Lösungen ist, daß man für jedes Query eine besondere Routine schreiben muß....

Grüße

Andreas Göring

BTW: Wer viel mit Query arbeitet sollte sich mal unseren **QueryOptimizer** ansehen: http://www.goering.de/deu/qopti.html
Hier ist ein CMD integriert, der den OVRDBF erheblich erleichtern kann.

[Dieser Beitrag wurde von andigoering am 04. März 2003 editiert.]

bateau
04-03-03, 09:50
Hallöchen!

Wie meine beiden Vorredner schon sagten ist das zwar möglich, das Query mittels RUNQRY und/oder OVRDBF flexibel auszuführen, was Du dir aber immer vor Augen halten solltest ist der Anpassungsaufwand:

Änderst Du das Query, so daß sich die Reihenfolge der Dateien ändert fällst Du auf die Nase, gleiches gilt wenn Du eine Datei hinzufügst oder entfernst.

Ich habe leidvolle Erfahrungen damit gemacht, wir sind mittlerweile dazu übergegangen, die meisten Queries auf QM-Query umzuschreiben, was den weiteren Vorteil bietet, daß man volle SQL-Syntax nutzen kann. Das erspart einem z.B. die Bildung des kartesischen Produktes bei Verknüpfung mit *ALL in Query/400 wenn die Schlüsselfelder mal von der Definition nicht zusammenpassen sollten (ist bei sauberem Design nicht der Fall, kommt aber in den besten Familien vor :-).

Grüße

Martin

Fuerchau
04-03-03, 15:59
Das ganze etwas variabler zu gestalten geht nur mit etwas Hilfe:

In diesem Beitrag: http://www.as400-forum.de/ubb/Forum1/HTML/000170.html

ist die Quelle eines MI-Programmes enthalten, dass die verwendeten Dateien eines Queries ausliest.
Diese Liste kann dann in einem CLP bearbeitet werden, so dass alle Dateien über RTVOBJD ... RTNLIB(&LIB) und anschließendem OVRDBF umgeleitet werden können.
Die Dateien sollten natürlich in der aktuellen Bibliotheksliste zu finden sein, so dass, je nach Umgebung mit den entsprechenden Dateien gearbeitet werden kann.

K_Tippi
05-03-03, 05:50
Guten Morgen
Verschiedene Bibliotheken bedeutet doch auch normalerweise verschiedene Anwendungen.
also warum nicht mittels CL Programm die Bibliotheksliste temporär umstellen. und im QRY mit *lib/Datei arbeiten.

Ich mach das etwa so

/* * ERSETZEN DER BIBLITHEKSLISTE UND NACH PROGRAMMAUFRUF ** */
/* * WIEDER IN DEN ALTEN ZUSTAND SETZEN ** */
DCL VAR(&LIBL) TYPE(*CHAR) LEN(275)
DCL VAR(&LIBLALT) TYPE(*CHAR) LEN(289)
RTVJOBA USRLIBL(&LIBL)


dann CHGLIBL

dann

/* * HIER WIRD DIE ALTE BIBLIOTHEKSLISTE WIEDER EINGESETZT ** */
/* * MIT HILFE VON QCMDEXC ** */
CHGVAR %SST(&LIBLALT 1 8) VALUE('CHGLIBL ')
CHGVAR %SST(&LIBLALT 9 5) VALUE('LIBL(')
CHGVAR %SST(&LIBLALT 14 275) VALUE(&LIBL)
CHGVAR %SST(&LIBLALT 289 1) VALUE(')')
CALL PGM(QCMDEXC) PARM(&LIBLALT 289)

andigoering
05-03-03, 06:45
Guten Morgen "K_tippi"!

Das mit der LIBL ist ja eine prima Sache....

Jedoch: Bei Query erreichst Du damit NICHTS.

Sobald Du bei der Dateiauswahl Datenfreigabe drückst wird aus *LIBL die tatsächliche Bibliothek..

Es bleibt nur der Weg wie beschrieben....

Wer es komfotabler möchte dem sei der QueryOptimizer bei http://www.goering.de empfohlen.

Einen schönen Tag wünscht

Andreas Göring

Sven Schneider
06-03-03, 11:05
Hallo Andreas,

soweit ich das verstehe geht es nicht um die Dateinangaben im WRKQRY sondern um den Parameter QRYFile im RUNQRY, also z.B.

RUNQRY QRY(TESTQRY)
QRYFILE((*LIBL/TESTFILE))

Sven

alfredo
06-03-03, 11:35
So ein Zufall.
Ich habe vorgestern eine Lösung programmiert:

Mit RTVQMQRY SQL-Anweisungen ausgeben
Mit kleinem RPG Dateinamen auslesen und
String (File1)(File2)... an CL-Programm zurückgeben.
Dort RUNQRY QRYFILE(&QRYFILE) ausführen