Wenn der ERP-Lieferant nicht mitspielt, hast du trotzdem die Möglichkeit, dein Berechtigungskonzept zu realisieren.
Die Vorgehensweise von Dieter (und wie SAP es macht) ist die einzig Richtige und kann von keinem ERP-Anbieter "verboten" werden.

Am einfachsten ist es wirklich mit:

GRTOBJAUT OBJ(MYDTALIB) OBJTYPE(*LIB) USER(*PUBLIC) AUT(*EXCLUDE)
CHGOWNALL LIB(MYPGMLIB) NEWOWN(ERPMASTER) CUROWNAUT(*REVOKE)
CHGPGM PGM(MYPGMLIB/*ALL) USRPRF(*OWNER)

Für alle PF's, die einen "Fremd"-Zugriff benötigen, erstelle ich halt eine Lib mit speziellen LF's.
Das ganze am besten per CLP, so dass beim nächsten ERP-Release ein DLTLIB und anschließendes CALL vollkommen ausreicht, den Zustand wiederherzustellen.

Beispiel für CHGOWNALL:
Code:
  
CMD		PROMPT('Ändern OBJOWN LIB/*all')			   
PARM	   KWD(LIB) TYPE(*NAME) LEN(10) MIN(1) MAX(1) +   
			 EXPR(*YES) PROMPT('Bibliothek')			  
PARM	   KWD(NEWOWN) TYPE(*NAME) LEN(10) MIN(1) +	   
			 EXPR(*YES) PROMPT('Neuer Eigner')			
PARM	   KWD(CUROWNAUT) TYPE(*CHAR) LEN(10) +		   
			 RSTD(*YES) DFT(*REVOKE) SPCVAL((*REVOKE) +   
			 (*SAME)) EXPR(*YES) PROMPT('Aktuelle +	   
			 Eignerberechtigung')
CLP dazu:
Code:
  
			 PGM		PARM(&LIB &NEWOWN &CUROWNAUT)		 
															  
/* PARAMETER AUS KOMMANDO */								  
			 DCL		VAR(&LIB) TYPE(*CHAR) LEN(10)		 
			 DCL		VAR(&NEWOWN) TYPE(*CHAR) LEN(10)	  
			 DCL		VAR(&CUROWNAUT) TYPE(*CHAR) LEN(10)   
															  
/* VARIABLEN FÜR FEHLERAUSGANG */							 
			 DCL		VAR(&MSGID) TYPE(*CHAR) LEN(7)		
			 DCL		VAR(&MSGF) TYPE(*CHAR) LEN(10)		
			 DCL		VAR(&MSGL) TYPE(*CHAR) LEN(10)		
			 DCL		VAR(&MSGDTA) TYPE(*CHAR) LEN(512)	 
			 DCL		VAR(&MSGK) TYPE(*CHAR) LEN(4)		 
															  
/* TEMPORÄRE DATEI ERSTELLT */								
			 DCL		VAR(&CRTF) TYPE(*CHAR) LEN(1)		 
																	  
			 DCLF	   FILE(QADSPOBJ)								
																	  
			 MONMSG	 MSGID(CPF0000 CPF1907) EXEC(GOTO +			
						  CMDLBL(FEHLER))							 
																	  
/* ÜBERWACHUUNG SYSTEMANFRAGE 2 */									
			 SNDPGMMSG  MSG('/* */') TOPGMQ(*SAME) MSGTYPE(*RQS)	  
			 RCVMSG	 PGMQ(*SAME) MSGTYPE(*RQS) RMV(*NO) +		  
						  KEYVAR(&MSGK)							   
																	  
			 DSPOBJD	OBJ(&LIB/*ALL) OBJTYPE(*ALL) DETAIL(*BASIC) + 
						  OUTPUT(*OUTFILE) OUTFILE(QTEMP/CHGOBJALL) + 
						  OUTMBR(*FIRST *REPLACE)					 
			 CHGVAR	 VAR(&CRTF) VALUE('X')						 
																	  
																 
			 OVRDBF	 FILE(QADSPOBJ) TOFILE(QTEMP/CHGOBJALL)   
																 
SCHLEIFE:														
			 RCVF												
			 MONMSG	 MSGID(CPF0864) EXEC(GOTO CMDLBL(ENDE))   
																 
			 IF		 COND(&ODOBOW *NE &NEWOWN) THEN(DO)	   
			 CHGOBJOWN  OBJ(&ODLBNM/&ODOBNM) OBJTYPE(&ODOBTP) +  
						  NEWOWN(&NEWOWN) CUROWNAUT(&CUROWNAUT)  
			 ENDDO											   
																 
			 GOTO	   CMDLBL(SCHLEIFE)						 
																 
ENDE:															
			 IF		 COND(&CRTF *NE ' ') THEN(DO)			 
			 DLTF	   FILE(QTEMP/CHGOBJALL)					
			 MONMSG	 MSGID(CPF0000)							   
			 ENDDO												   
																	 
			 RMVMSG	 PGMQ(*SAME) MSGKEY(&MSGK) CLEAR(*BYKEY)	  
			 MONMSG	 MSGID(CPF0000)							   
																	 
			 RETURN												  
																	 
FEHLER:															  
			 RCVMSG	 PGMQ(*SAME) MSGTYPE(*EXCP) MSGDTA(&MSGDTA) + 
						  MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGL)   
																	 
			 RMVMSG	 PGMQ(*SAME) MSGKEY(&MSGK) CLEAR(*BYKEY)	  
			 MONMSG	 MSGID(CPF0000)							   
																	 
			 SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGL/&MSGF) +			
						 MSGDTA(&MSGDTA) TOPGMQ(*PRV) MSGTYPE(*ESCAPE) 
																	   
			ENDPGM