... ich würde da folgendes machen:
1.
Die Prototypen in eine eigene Quelldatei QRPGLEH, damit die Teildateien von Prototyp und implementierendem Programm gleich heißen können (ein Suffix klaut einem mindestens eine Stelle von lediglich 10 => schlecht für Lesbarkeit.
2. Den Exportnamen mit dem Modulnamen prefixen, damit alle Exportnamen eindeutig sind und bei Importen unmittelbar sichtbar ist, woher sie kommen.
QRPGLEH.JOBLOG_S
Code:
 *************************************************************************** 
 ** J O B L O G    P R O T O T Y P E S                                       
 ***************************************************************************  
 /if defined( QRPGLEH_JOBLOG_P )                                                      
 /eof                                                                         
 /endif                                                                       
                                                                             
 /define QRPGLEH_JOBLOG_P                                                             
                                                                             
D Qp0zLprintf     PR            10I 0 ExtProc( 'Qp0zLprintf' )                
D  szOutputStg                    *   Value Options( *String )                
                                                                             
D JobLog_Write    PR            10I 0 ExtProc( 'JOBLOG_S_JobLogWrite' )                                         
D   JobLogInfo               65535a   Varying  Const
3.
im "Serviceprogramm" ändert sich dann der Verweis auf die Copy Strecke und ich bette die Umwandlungs Anweisungen als special comment ein:

QRPGLESRC.JOBLOG_S
Code:
 ************************************************************************** 
H NoMain                                                                    
D*B    CRTRPGMOD JOBLOG_S
D*B+     DBGVIEW(*SOURCE)
D*B    CRTSRVPGM(JOBLOG_S)
D*B+     ACTGRP(*CALLER)
D*B+     EXPORT(*ALL)
 /copy QRPGLEH,JobLog_S                                            
                                                                           
P JobLog_Write    B                   Export                                
D JobLog_Write    PI            10i 0                                       
D  JobLogInfo                65535a   Varying Const                         
D*                                                                          
D  LogData        S          65535a   Varying                               
D  ErrorCode      S             10i 0                                       
D*                                                                          
 /FREE                                                                      
   LogData = JobLogInfo + x'25';                                            
   ErrorCode = Qp0zLprintf( LogData );                                      
                                                                           
   return ErrorCode;                                                        
                                                                           
 /END-FREE                                                                  
P                 E
Wobei ich in der Regel (wenn es keinen positiven Grund für Abweichung davon gibt) aus einem Modul ein Serviceprogramm mache und da alles reinkommt, was auf gemeinsamen Daten operiert. Ich bevorzuge EXPORT(*ALL) statt Binder Language, da muss man halt ab und an abhängige Komponenten neu binden, gewinnt aber deutlich an Sicherheit (=> vergleichbar: ich verwende nicht LVLCHK *NO bei Dateien)

Im Programm sieht das dann so aus:
Code:
D*B CRTRPGMOD JOBLOG_P                
D*B+       DBGVIEW(*SOURCE)             
D*B+       REPLACE(*YES)                
D*B CRTPGM JOBLOG_P                   
D*B+       ACTGRP(JOBLOG_P)           
D*B+       MODULE(JOBLOG_P)
D*B+       BNDSRVPGM(JOBLOG_S)                                                                    
 /copy QRPGLEH,JOBLOG_S                                      
                                                                     
 /free                                                                
  JobLog_Write( 'Program Called At ' + %char( %TimeStamp ));          
  *inlr = *on;
Activation Group heißt bei mir in der Regel (s.o.) so wie das Programm, Binding directories verwende ich nicht (bei mir ist alles self containing, ein verfummeltes Binding Directory schlägt bei mir nicht Monate später mit Problemen bei nicht betroffenen Programmen auf - ich hasse Pandorras Büchse).
Alle Compiles mache ich mit einem Open Source Tool vom lieben D*B (als PDM Option mit SBMJOB und Jobname = Teildateiname vernagelt; dann ersetzt C2 bei mir die 14)
Alle Module bleiben auf der Büchse, dann kann man sich über DSPMOD die Importe und Exporte in ein Repository ausgeben lassen und alle Crossreferenzen sofort erkennen!

D*B