PDA

View Full Version : QUERY aktualisieren



Seiten : [1] 2 3 4

peter.kinne
24-06-09, 12:19
Hallo zusammen,

durch eine umfangreiche Datenbankänderung müssen wir ca. 2000 Queries aktualiseren.

Mit der Hand ist das sehr mühsam und auch fast unmüglich. Query aufrufen, Auswahl 2 und dann speichern......

Gibt es einen Weg (API) oder so, um das maschinell zu machen?

Danke für jeden schnellen Tipp,

Peter Kinne

Fuerchau
24-06-09, 12:21
Das tut mir wirklich leid, das muss IBM vergessen haben (wer ändert denn auch die Datenbasis der Queries gleich massenweise :))

peter.kinne
24-06-09, 12:24
Hallo Baldur,

vielen Dank für den "guten" Hinweis.
Aber es kann doch nicht sein, dass die
IBM mal "irgendwas" vergisst. Die doch
nicht....:confused:

Pikachu
24-06-09, 12:38
Es können bis zu 30 Querys mit Auswahl 2 gleichzeitig ausgewählt und dann einzeln bearbeitet werden. Das ist vielleicht etwas schneller als jede einzeln nacheinander auszuwählen und zu bearbeiten.

Edefauler
24-06-09, 12:39
Ein bisschen ketzerischer Vorschlag: ...bringt ein chgpf oder ovrdbf mit lvlchk *no nichts?

Fuerchau
24-06-09, 13:04
LVLCHK(*NO) funktioniert nur, wenn neue Felder am Ende dazugekommen sind und sich keine Formate (Längen, Dezimalausprägung) geändert haben.

BenderD
24-06-09, 14:41
.. gehd net, gibdsnet, gehdschlechd, gibdsmanchmal.
da kommt man wohl nur mit MI dran.

D*B


Hallo zusammen,

durch eine umfangreiche Datenbankänderung müssen wir ca. 2000 Queries aktualiseren.

Mit der Hand ist das sehr mühsam und auch fast unmüglich. Query aufrufen, Auswahl 2 und dann speichern......

Gibt es einen Weg (API) oder so, um das maschinell zu machen?

Danke für jeden schnellen Tipp,

Peter Kinne

Fuerchau
24-06-09, 16:14
Nun jein.
Es gab da mal ein MI-Programm zum Auslesen der verwendeten Dateien.
Da die interne Query-Struktur nicht dokumentiert ist, kann man sicherlich mal mit DMPSYSOBJ ein QRYDFN analysieren.

Irgendwo stehen die Formatebenen-ID's rum, die dann nur ersetzt werden müssen.
Allerdings: siehe LVLCHK

Michael Steibert
25-06-09, 09:46
Nun jein.
Es gab da mal ein MI-Programm zum Auslesen der verwendeten Dateien.
Da die interne Query-Struktur nicht dokumentiert ist, kann man sicherlich mal mit DMPSYSOBJ ein QRYDFN analysieren.

Irgendwo stehen die Formatebenen-ID's rum, die dann nur ersetzt werden müssen.
Allerdings: siehe LVLCHK

Für den Update *QRYDFN füge ich ein RPG-PGM an. Das Thema gabs schon mal. Die genannten Einschräkungen für den Austausch der FormatLevel-ID müssen beachtet werden.
M.Steibert


h datfmt(*ISO)
* to compile
*
D*B CRTSQLRPGI UPDQRYF
D*B+ COMMIT(*NONE)
D*B+ OBJTYPE(*MODULE)
D*B+ DATFMT(*ISO)
D*B+ DBGVIEW(*SOURCE)
D*B CRTPGM UPDQRYF
D*B+ BNDDIR(QC2LE)
D*B+ ACTGRP(UPDQRYF)
*--- Prototypes Export ----------------------------------------
D UPDQRYF PR EXTPGM('UPDQRYF')
d QueryName 10A const
d QueryLib 10A const
*-------------------------------------------------------------------
* Resolve System Pointer
D rslvsp Pr * ProcPtr ExtProc( 'rslvsp' )
D ObjTyp 2a Value
D ObjNam * Value Options( *String )
D ObjLib * Value Options( *String )
D AutReq 2a Value
*-------------------------------------------------------------------
* set Space Pointer from Systempointer
D setsppfp Pr * ExtProc( 'setsppfp' )
D Object * Value ProcPtr
*
*-------------------------------------------------------------------
* set Spacepointer offset
D setsppo Pr * ExtProc( 'setsppo' )
D SpcPtr * Value
D Offset 10i 0 Value
*-------------------------------------------------------------------
* copy memory from address to address
D MemCpy Pr * ExtProc( 'memcpy' )
D pOutMem * Value
D pInpMem * Value
D iMemSiz 10u 0 Value
*-------------------------------------------------------------------
* Send program message
D SendSysMsg PR EXTPGM('QMHSNDPM')
D Message_ID 7A CONST
D Message_File 20A CONST
D Message_Data 512 CONST
D Length 10I 0 CONST
D Message_Type 10A CONST
D Message_Q 10A CONST
D Pgm_Stack 10I 0 CONST
D Message_Key LIKE(QMHSNDPM_MSGKEY)
D* Message Error
D Msg_Error LIKE(QMHSNDPM_MSGERR)
**
dGetFileDescription...
d pr extpgm('QDBRTVFD')
d Receiver 1 options(*varsize)
d LenReceiver 10i 0 const
d QualFileName 20
d Format 8 const
d QualFileName 20 const
d RcdFmtName 10 const
d OvrPrc 1 const
d System 10 const
d FmtType 10 const
d ApiError likeds(ApiError)
**
D ApiError DS qualified
D BytesProvided 10i 0 Inz( %Size( ApiError ))
D BytesAvailable 10i 0 Inz
D MsgID 7a
D 1a
D MsgData 256a
*
DQMHSNDPM_MSGKEY s 4A
DQMHSNDPM_MSGERR DS
D PROVID 1 4B 0
D AVAIL 5 8B 0
D RTNMSG 9 15
D RSVR 16 16
D RTNDTA 17 256
* extract from
* /COPY QSYSINC/QRPGLESRC,QDBRTVFD
DQDBQ41 DS 256
* Header information
D QDBDFSEQ 81 93
* Level Identifier
*--- Prototypes Import ----------------------------------
*--- local Prototypes ----------------------------------
d posObjectspace pr
d get1stFormatID pr 13a
d infile 10a value
d inlib 10a value
d switchFormatID pr
d logout pr
*--- Constants and Types ----------------------------------
d TRUE c *ON
d FALSE c *OFF
*
d UPDQRYF PI
d QueryName 10A const
d QueryLib 10A const
*--- statefull Variables ----------------------------------
d curFormatID s 13A inz
d oldFormatID s 13A inz
**
**-- Query object (*qrydfn) program state
**
D pQryObject s * ProcPtr
D pQryTemplate s *
D QryTemplate s 32767a Based( pQryTemplate )
**
** object header
d objectType s 2a inz(x'1911')
**
** inputfile definition
**
D InpFilesHeader Ds inz qualified
D Totlen 10i 0
D 10i 0
D 10i 0
D 5i 0
D NbrFiles 5i 0
D InpFilesDetail Ds 80 inz qualified Dim( 32 )
D 5i 0 Overlay( InpFilesDetail: 1 )
D Name 10a Overlay( InpFilesDetail: 3 )
D 5i 0 Overlay( InpFilesDetail: 13 )
D Library 10a Overlay( InpFilesDetail: 15 )
D 5i 0 Overlay( InpFilesDetail: 25 )
D Member 10a Overlay( InpFilesDetail: 27 )
D 5i 0 Overlay( InpFilesDetail: 37 )
D Recordfmt 10a Overlay( InpFilesDetail: 39 )
D 5i 0 Overlay( InpFilesDetail: 49 )
D FileID 3a Overlay( InpFilesDetail: 51 )
D 5i 0 Overlay( InpFilesDetail: 55 )
D RecordID 13a Overlay( InpFilesDetail: 57 )
D 11a Overlay( InpFilesDetail: 70 )
*--- work Variables SQL ----------------------------------
d offset s 5i 0 inz
d posInputfiles s 5i 0 inz(46)
d offsetInputfiles...
d s 5i 0 inz
D i s 5i 0
/free
posObjectspace();
pQryTemplate = setsppo( pQryTemplate: posInputfiles );
MemCpy( %Addr( offsetInputfiles )
: pQryTemplate
: %Size( offsetInputfiles )
) ;
pQryTemplate = setsppo( pQryTemplate: offsetInputfiles );
MemCpy( %Addr( InpFilesHeader )
: pQryTemplate
: %Size( InpFilesHeader )
) ;
Offset = offsetInputfiles + %Size( InpFilesHeader ) ;
for i = 1 to InpFilesHeader.NbrFiles;
pQryTemplate = setsppo( pQryTemplate: Offset ) ;
MemCpy( %Addr( InpFilesDetail(i) )
: pQryTemplate
: %Size( InpFilesDetail )
) ;
switchFormatID();
offset = offset + %Size( InpFilesDetail );
endfor;
return;
/end-free
*-------------------------------------------------------------
P posObjectspace b
d posObjectspace pi
/free
pQryObject =
rslvsp( objectType
: %TrimR( QueryName )
: %TrimR( QueryLib )
: x'0000'
);
pQryTemplate = setsppfp( pQryObject );
return;
/end-free
P posObjectspace e
*-------------------------------------------------------------
p get1stFormatID b
d get1stFormatID pi 13a
d infile 10a value
d inlib 10a value
d FileLib ds
d File 10
d Lib 10
dOutfile s 20a inz
dFormatID s 13a inz
/free
Lib = inlib;
File = inFile;
ApiError.BytesProvided = 0;
monitor;
GetFileDescription(
QDBQ41
: %size(QDBQ41)
: Outfile
: 'FILD0200'
: FileLib
: '*FIRST'
: '0'
: '*LCL'
: '*EXT'
: ApiError
);
on-error;
return ' ';
endmon;
if ApiError.MsgID <> ' ';
Clear FormatID ;
else;
FormatID = QDBDFSEQ;
endif;
return FormatID ;
/end-free
p get1stFormatID e
*-------------------------------------------------------------
P switchFormatID b
d switchFormatID pi
/free
curFormatID
= get1stFormatID(
InpFilesDetail(i).Name
: InpFilesDetail(i).Library );
oldFormatID
= InpFilesDetail(i).RecordID;
if curFormatID <> *BLANK and curFormatID <> oldFormatID;
InpFilesDetail(i).RecordID = curFormatID;
MemCpy( pQryTemplate
: %Addr( InpFilesDetail(i) )
: %Size( InpFilesDetail )
) ;
logout();
endif;
return;
/end-free
P switchFormatID e
*-------------------------------------------------------------
P logout b
d logout pi
d message S 1024 inz
d Length s 10I 0 inz
/free
message = 'Recordlevel-ID changed from ' +
oldFormatID +
' to ' +
curFormatID +
' for file: ' +
%trim(InpFilesDetail(i).Library) + '/' +
%trim(InpFilesDetail(i).Name) +
' in QRYDFN: ' +
%trim(QueryLib) + '/' + %trim(QueryName)
;
Length = %len( %trim(message) );
SendSysMsg(
' '
: ' '
: message
: Length
: '*INFO '
: '*CTLBDY '
: 1
: QMHSNDPM_MSGKEY
: QMHSNDPM_MSGERR
);
return;
/end-free
P logout e
*-------------------------------------------------------------

kitvb1
22-07-09, 22:17
...
Da die interne Query-Struktur nicht dokumentiert ist, kann man sicherlich mal mit DMPSYSOBJ ein QRYDFN analysieren.
zur Infos:
Breaking News!!
... ab v610 mit ptf SI34166, man kann DSPPGMREF mit *QRYDFN machen :D

Leider, ohne v610 geht es (meistens*) so:

DMPOBJ MyObj *qrydfn
CPYSPLF FILE(QPSRVDMP) TOFILE(QTEMP/MyFile) SPLNBR(*LAST)
...
In RPG:
...
D r_line ds
D type 12 20A
D file_r 22 31A
D lib_r 66 75
...
IF type = 'SYP 19 01';
whpnam = obj_r;
whtext = obj_d;
whfnam = file_r;
whlib = obj_l;
... blah blah blah
* Problem bei DMPOBJ ist nicht alle Queries gibt die Pointer Infos aus. Habe ein Service Request bei IBM aufgemacht und bekam diese Antwort (wie Baldur sagte).

Das Format einer DMPOBJ - Ausgabe für eine Query-Definition ist nicht öffentlich dokumentiert und es besteht auch keine Garantie darüber, dass sich dieses Format nicht ändern kann (durch PTFs, Releasewechsel, .... ) Ubersetzung: Es ist nicht unser Problem ;)

Übrigens, diese (komplette) Quelle (mit die ganze X-Ref Cross Reference Utility Quelle) wird demnächst (ca. ende September) als Open Source freigegeben. :)