-
Logging beim CRTBNDRPG
Hallo!
Nachdem wir viele Entwickler im Hause haben, wurde die Idee geboren, daß bei jedem Compilieren eines Programmes (ILERPG bzw. CLLE) oder einer Tabelle (CRTPF, CRTLF) ein Log geschrieben wird.
Ein anderer Ansatz wäre zu gucken, welches Objekt wann von wem in einer Entwicklungs-Bibliothek erstellt wurde, allerdings braucht ein DSPOBJD in ein Outfile über eine grosse Bibliothek ewig lange.
Habe bis jetzt noch keine Möglichkeit gefunden auf irgendeiner Art mich in die Compilierungsbefehle zu hängen - vielleicht ist das aber auch ein falscher Einsatz.
Hat jemand vielleicht eine andere Idee?
-
... es wäre wohl hilfreich, wenn Du erst das Problem definierst, welches ihr lösen wollt, bevor Du darüber nachdenkst/nachfragst, welche Lösung was taugt...
D*B
-
Eine Möglichkeit (von mehreren) wäre zB das Ganze über das Auditjournal zu machen.
-
Zitat von rischer
... allerdings braucht ein DSPOBJD in ein Outfile über eine grosse Bibliothek ewig lange.
Aber nur beim ersten Mal nach langer Zeit ...
-
Ich denke API ist schneller wie DSPOBJD.
QUSLOBJ müsste es glaube sein.
Gruß
Ronald
-
Wenn ich mich nicht irre, dann hatte ich das mal mit foglenden Programm umgesetzt..
DDS
PHP-Code:
* SatzFormat
R GROBJDP1
* Felder
OBJNAME 10 TEXT('Objekt Name ')
OBJLIB 10 TEXT('Objekt Lib ')
OBJTYPE 10 TEXT('Objekt Type ')
OBJTYPE1 10 TEXT('Objekt Type erweitert ')
OBJTEXT 50 TEXT('Beschreibung ')
OBJEIGNER 10 TEXT('ObjektEigner ')
OBJDOMAIN 2 TEXT('*U = User *S = System ')
CRTDATE 8S 0 TEXT('Erstellt Datum ')
CRTTIME 6S 0 TEXT('Erstellt Zeit ')
CHGDATE 8S 0 TEXT('Geändert Datum ')
CHGTIME 6S 0 TEXT('Geändert Zeit ')
SRCFILE 10 TEXT('Source File ')
SRCLIB 10 TEXT('Source Lib ')
SRCMBR 10 TEXT('Source Menber ')
SRCUPDT 13 TEXT('Source File Update ')
CRTUSER 10 TEXT('Erstellt von ')
CRTSYSTEM 8 TEXT('Erstellt System ')
SYSLEVEL 9 TEXT('System Version ')
USEDATE 8S 0 TEXT('Last Use Datum ')
USETIME 6S 0 TEXT('Last Use Time ')
USEDAYS 6S 0 TEXT('Days used ')
CURRCD 10S 0 TEXT('Anzahl Sätze ')
DELRCD 10S 0 TEXT('Gelöschte Sätze ')
FILESIZE 10S 0 TEXT('File Größe ')
RPG
PHP-Code:
* ************************************************************************
* Programm erstellen mit:
* CRTRPGMOD MODULE(MyLib/DSPOBJLST) SRCFILE(MyLib/QRPGLESRC)
* CRTPGM PGM(MyLib/DSPOBJLST) BNDSRVPGM(MyLib/#USRSPAPI)
* ************************************************************************
h bnddir('QC2LE')
fgrobjdp uf a e disk
D* UserSpace für Obj-Info's
D UserOK S 1A
D UserSpace S 20A INZ('QUSLOBJ QTEMP ')
D UsrSpcExtA S 10A INZ('PROD')
D UsrSpcText S 50A INZ('Objekt Infos ')
D LstFormat S 8A INZ('OBJL0700')
D Obj_Lib s 20A
D ObjType s 10A Inz('*ALL')
D I_O_Err s *
D
D* UserSpace für ILLE-Info's
D UserOK1 S 1A
D UserSpace1 S 20A INZ('QBNLPGMI QTEMP ')
D UsrSpcExtA1 S 10A INZ('PROD')
D UsrSpcText1 S 50A INZ('ILLE Infos')
D LstFormat1 S 8A INZ('PGML0100')
D
D* Für File-Infos
D Mbrd0200_Size S 4b 0
D LstFormat2 S 8A INZ('MBRD0200')
d Obj_Lib2 s 20a
D MbrName S 10A inz('*FIRST ')
D OvrProc S 1A inz('0')
D NbrEntries s 10U 0
D Count s 10U 0
D
D InputFormat s 10a Inz('*DTS' )
D OutPutFormat s 10a Inz('*YYMD' )
d Obj_Lib1 s 20a
d Bibliothek s 10a
D MBRD0200 ds
D CurRecNbr 141 144B 0
D DelRecNbr 145 148B 0
D DataSize 149 152B 0
d nix 261 266
D
D PGML0100 ds
d xSourceFile 41 50
d xSourceLib 51 60
d xSourceMember 61 70
d xSourceFileUp 94 106
d
D OBJL0700 ds
D ObjektName 1 10
D ObjektLib 11 20
D ObjektType 21 30
D ObjektTyp1 32 41
D ObjektText 42 91
D ObjektEigner 113 122
D ObjektDomain 123 124
D Erstellt 125 132
d Geaendert 133 140
d SourceFile 173 182
d SourceLib 183 192
d SourceMember 193 202
d SourceFileUp 203 215
d CreateUser 216 225
d CreateSystem 226 233
d SystemLevel 234 242
d LastUse 533 540
d UsedDays 549 552b 0
d
* Prototype Lists
D/COPY QRPGLESRC,FUSPCP
D System pr 10i 0 extproc('system')
D * value options(*string)
D
D Get_Date pr 8s 0
D 8 Time-Stamp
D Get_Time pr 6s 0
D 8 Time-Stamp
c Eval UserOK = CrtUsrSpc(UserSpace :
c UsrSpcExtA :
c UsrSpcText )
c Eval UserOK1 = CrtUsrSpc(UserSpace1 :
c UsrSpcExtA1 :
c UsrSpcText1 )
c
c Eval Obj_Lib = '*ALL ' +
c Bibliothek
c Call 'QUSLOBJ'
c Parm UserSpace
c Parm LstFormat
c Parm Obj_Lib
c Parm ObjType
c Parm I_O_Err
c
c
c Eval NbrEntries = GetNumEnt(UserSpace)
c
c For Count = 1 to NbrEntries
c Eval OBJL0700 = GetSpcEnt(UserSpace : Count)
c
c If ObjektType = '*PGM' and
c (ObjektTyp1 = 'RPGLE' or
c ObjektTyp1 = 'CLLE' or
c ObjektTyp1 = 'CLE')
c ExSr Get_ILLE_Src
c EndIf
c ExSr Ausgabe
c EndFor
c
c Eval UserOK = DltUsrSpc(UserSpace)
c Eval UserOK1 = DltUsrSpc(UserSpace1)
c
c Eval *InLr = *On
c Get_File_Info BegSr
c*
c Eval Mbrd0200_Size = %Size( MBRD0200 )
c Eval Obj_Lib2 = ObjektName + ObjektLib
c Call (e) 'QUSRMBRD'
c Parm MBRD0200
c Parm Mbrd0200_Size
c Parm LstFormat2
c Parm Obj_Lib2
c Parm MbrName
c Parm OvrProc
c Parm I_O_Err
c
c If not %Error
c Eval CurRcd = CurRecNbr
c Eval DelRcd = DelRecNbr
c Eval FileSize = DataSize
c EndIf
c*
c EndSr
c Get_ILLE_Src BegSr
c*
c Eval Obj_Lib1 = ObjektName + ObjektLib
c Call (e) 'QBNLPGMI'
c Parm UserSpace1
c Parm LstFormat1
c Parm Obj_Lib1
c Parm I_O_Err
c
c If not %Error
c Eval PGML0100 = GetSpcEnt(UserSpace1 : 1)
c Eval SourceFile = xSourceFile
c Eval SourceLib = xSourceLib
c Eval SourceMember = xSourceMember
c Eval SourceFileUp = xSourceFileUp
c EndIf
c*
c EndSr
c Ausgabe BegSr
c*
c Clear grobjdp1
c
c Eval objname = ObjektName
c Eval objlib = ObjektLib
c Eval objtype = ObjektType
c Eval objtype1 = ObjektTyp1
c Eval objtext = ObjektText
c Eval objeigner = ObjektEigner
c Eval objdomain = ObjektDomain
c Eval crtdate = Get_Date(Erstellt )
c Eval crttime = Get_Time(Erstellt )
c Eval chgdate = Get_Date(Geaendert)
c Eval chgtime = Get_Time(Geaendert)
c Eval srcfile = SourceFile
c Eval srclib = SourceLib
c Eval srcmbr = SourceMember
c Eval srcupdt = SourceFileUp
c Eval crtuser = CreateUser
c Eval crtsystem = CreateSystem
c Eval syslevel = SystemLevel
c If UsedDays > 0
c Eval usedate = Get_Date(LastUse )
c Eval usetime = Get_Time(LastUse )
c EndIf
c Eval usedays = UsedDays
c If ObjektType = '*FILE' and
c (ObjektTyp1 = 'PF' or
c ObjektTyp1 = 'LF')
c ExSr Get_File_Info
c EndIf
c
c Write grobjdp1
c*
c EndSr
c *InzSr BegSr
c*
c *Entry Plist
c Parm Bibliothek
c*
c EndSr
P Get_Date b
d pi 8s 0
d Input_Time_S 8
d
d ds
d Datum_Zeit 17a
d Datum 1 8s 0
d Uhr 9 14s 0
C Call (e) 'QWCCVTDT'
C Parm InputFormat
C Parm Input_Time_S
C Parm OutputFormat
c Parm Datum_Zeit
c Parm I_O_Err
c
c If not %Error
c Return Datum
c Else
c Return 0
c EndIf
c
p Get_Date e
P Get_Time b
d pi 6s 0
d Input_Time_S 8
d
d ds
d Datum_Zeit 17a
d Datum 1 8s 0
d Uhr 9 14s 0
C Call (e) 'QWCCVTDT'
C Parm InputFormat
C Parm Input_Time_S
C Parm OutputFormat
c Parm Datum_Zeit
c Parm I_O_Err
c
c If not %Error
c Return Uhr
c Else
c Return 0
c EndIf
c
p Get_Time e
CMD
PHP-Code:
cmd 'Sammeln Objekt-Informationen'
parm bibi +
type(*name) +
dft(*USRLIBL) +
spcval((*ALLUSR) (*USRLIBL) (*LIBL)) +
min(0) +
max(3) +
prompt('Bibliothek')
Programm dürfe so ca. 10-12 Jahr alt sein.
Einfachmal testen und anpassen.
Gruß
Ronald
Nachrag:
#USRSPAPI
PHP-Code:
* ************************************************************************
* Service - PGM erstellen mit:
* CRTRPGMOD MODULE(MyLib/#USRSPAPI) SRCFILE(MyLib/QRPGLESRC)
* CRTSRVPGM SRVPGM(MyLib/#USRSPAPI) EXPORT(*ALL)
* ************************************************************************
*
**************************************************************************
*
* Program Name: FunctUsp
* Program Title: User Space Function Procedures
* Author:
* Origin Date: 1/23/1998
* Revisions:
*
**************************************************************************
H NOMAIN
* Prototype Lists
D/COPY QRPGLESRC,FUSPCp
* Generic Error Structure
D/COPY dipsrvpgm/QRPGLESRC,QUSEC
* User Space Generic Structure
D/COPY dipsrvpgm/QRPGLESRC,QUSGEN
D DS_Error DS
D Bytpv 1 4b 0 inz(100)
D Bytav 5 8b 0 inz(0)
D MSgid 9 15
D Resvd 16 16
D Exdta 17 256
D Exdta52 17 67
**************************************************************************
*
* Procedure Name: CrtUsrSpc
*
**************************************************************************
P CrtUsrSpc B EXPORT
D CrtUsrSpc PI 1A
D UsrSpcName 20A VALUE
D UsrSpcExtA 10A VALUE
D UsrSpcText 50A VALUE
* Local Variables
* User Space API Fields
D SpaceName S 20A
D SpaceSize S 9B 0 INZ(8388608)
D SpaceInit S 1A INZ(x'00')
D SpaceExtA S 10A
D SpaceAut S 10A INZ('*ALL')
D SpaceText S 50A
D SpaceRepl S 10A INZ('*YES')
D SpaceDom S 10A INZ('*USER')
* Set error code structure to use basic feedback
C***** EVAL QUSBPRV = 16
* Set up imported variables
C EVAL SpaceName = UsrSpcName
C EVAL SpaceExtA = UsrSpcExtA
C EVAL SpaceText = UsrSpcText
C CALL 'QUSCRTUS'
C PARM SpaceName
C PARM SpaceExtA
C PARM SpaceSize
C PARM SpaceInit
C PARM SpaceAut
C PARM SpaceText
C PARM SpaceRepl
C PARM DS_Error
C PARM SpaceDom
C SELECT
C WHEN Bytav = 0
C RETURN 'Y'
C WHEN Bytav <> 0
C Bytav DSPLY 'OS400'
C MSgid DSPLY 'OS400'
C Exdta52 DSPLY 'OS400'
C RETURN 'N'
C ENDSL
P CrtUsrSpc E
**************************************************************************
*
* Procedure Name: GetUsrSpcP
*
**************************************************************************
P GetUsrSpcP B EXPORT
D GetUsrSpcP PI *
D UsrSpcName 20A VALUE
D SpaceName S 20A
D SpacePoint S *
* Set error code structure to use basic feedback
C EVAL QUSBPRV = 16
* Set up imported variables
C EVAL SpaceName = UsrSpcName
* Get the pointer for the user space
C CALL 'QUSPTRUS'
C PARM SpaceName
C PARM SpacePoint
C PARM QUSEC
C RETURN SpacePoint
P GetUsrSpcP E
**************************************************************************
*
* Procedure Name: GetNumEnt
*
**************************************************************************
P GetNumEnt B EXPORT
D GetNumEnt PI 9B 0
D UsrSpcName 20A VALUE
* Local Variables
D UsrSpcPntr S *
D BigField S 32767A BASED(UsrSpcPntr)
* Get the pointer for the user space
C EVAL UsrSpcPntr = GetUsrSpcP(UsrSpcName)
* Move the based on pointer to
C MOVEL BigField QUSH0100
* Return number of list entries
C RETURN QUSNBRLE
P GetNumEnt E
**************************************************************************
*
* Procedure Name: GetSpcEnt
*
**************************************************************************
P GetSpcEnt B EXPORT
D GetSpcEnt PI 32767A
D UsrSpcName 20A VALUE
D EntNumber 9B 0 VALUE
* Local Variables
D UsrSpcPntr S *
D ListPointr S *
D BigField S 32767A BASED(ListPointr)
D BigFldOut S 32767A
* Get the pointer for the user space
C EVAL UsrSpcPntr = GetUsrSpcP(UsrSpcName)
* Move the based on pointer to get header information
C EVAL ListPointr = UsrSpcPntr
C MOVEL BigField QUSH0100
* Check to see if entry requested is <= user space number entries
* If not, return a blank field
C IF EntNumber > QUSNBRLE
C EVAL BigFldOut = *BLANKS
C RETURN BigFldOut
C ENDIF
* Return specific list entry
C EVAL EntNumber = EntNumber - 1
C EVAL ListPointr = ListPointr + QUSOLD +
C (QUSSEE * EntNumber)
C EVAL BigFldOut = %SUBST(BigField:1:QUSSEE)
C RETURN BigFldOut
P GetSpcEnt E
**************************************************************************
*
* Procedure Name: DltUsrSpc
*
**************************************************************************
P DltUsrSpc B EXPORT
D DltUsrSpc PI 1A
D UsrSpcName 20A VALUE
* Local Variables
* User Space API Fields
D SpaceName S 20A
* Set error code structure to use basic feedback
C EVAL QUSBPRV = 16
* Set up imported variables
C EVAL SpaceName = UsrSpcName
C CALL 'QUSDLTUS'
C PARM SpaceName
C PARM QUSEC
C SELECT
C WHEN QUSBAVL = 0
C RETURN 'Y'
C WHEN QUSBAVL <> 0
C RETURN 'N'
C ENDSL
P DltUsrSpc E
-
Was glaubst du wohl, wie DSPOBJD an seine Daten kommt?
Das API von dir verwendet dürfte da nicht so viel schneller sein.
Die Alternative wäre eher, die CRT-Befehle für Public/PGMR zu sperren und z.B. D*B's Compiler-Aufrufe unter Owner laufen zu lassen.
a) flexiblere Erstellmöglichkeiten
b) Anpassbar bzgl. Logging-Funktionen
c) APP-User-Integration durch Ersteller quasi automatisch
Ggf. kann man ähnliches auch vom RDi aus verwenden.
-
Es geht auch mit SQL
SELECT * FROM TABLE (QSYS2.OBJECT_STATISTICS('MYLIB','*ALL') ) AS X
Quelle: https://www.ibm.com/developerworks/c...ase%20of%20use
Herzliche Grüße
Rainer
-
Naja,
ich hatte da noch in Erinnerung, das die eigene Lösung über API schneller war....
... kann mich aber auch täuschen. Aber einen Grund wir es geha haben, das ich mir die Arbeit gemacht habe...
Gruß
Ronald
-
Meisten liegt es an den Selektionsmöglichkeiten, dass man API's verwendet.
Zusätzlich braucht man keine Datei und kann in RPGLE direkt damit arbeiten.
-
wir wandeln, wie viele andere auch, nicht mit 14/15/26 ... sondern mit einem PDM Kürzel.
Das Pgm erkennt was gewandelt werden soll und mach es, punkt.
Bei uns werden dabei u.a. History Einträge in ein PF Protokolliert: Wer hat wann, warum, was, ... gewandelt.
Da würde ich ansetzen.
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Wir wandeln die Sourcen auch mit einem selbst gestrickten Tool um.
Für die Historie jedoch verwenden wir ein Versionsverwaltungstool wie SVN, GIT oder Merqurial.
Dies ist auch gleich kombinierbar mit anderen Plattformen und Sprachen .Net, Java, PHP, (ja sogar Android), usw.
Und wenn man irgendwann einmal auch noch etwas mehr will kann es mit ein paar Klicks z.B. in ein Ticket- oder Projektmanagement Tool integrieren ... und noch vieles mehr.
lg Andreas
Similar Threads
-
By MGJ79 in forum NEWSboard Programmierung
Antworten: 11
Letzter Beitrag: 12-11-14, 11:26
-
By malzusrex in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 23-04-03, 17:15
-
By Gimli in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 04-04-03, 12:15
-
By sho1 in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 31-01-02, 15:08
-
By Markus in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 31-01-01, 13:51
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks