[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Crashkurs Serviceprogramme und Prototypes

    Hallo liebes Forum,

    ich habe bisher immer meine RPG Programme mit 14 kompiliert.
    Da ich mir einen „sauberen“ Programmstil aneignen möchte hätte ich da folgende Frage:
    Wir definieren das meiste was Unterroutinen angeht immer wieder im Programm selber und verwenden dh. sehr selten (selbergeschriebene) Prozeduren bzw. Service Programme.
    Kann mir jemand an folgenden Beispiel von Michael Catalani erklären welche Programme wie ich zu wandeln habe und einen kleinen Crashkurs geben?
    Code:
    Teildatei  Art         Text                                          
    JOBLOG_P    RPGLE       JOBLOG SERVICE PROGRAMM PROTOTYPES            
    JOBLOG_R    RPGLE       JOBLOG SERVICE PROGRAMM TESTAUFRUF    
    JOBLOG_S    RPGLE       JOBLOG SERVICE PROGRAMM SERVICE PROGRAMM
    Programm: JOBLOG_P
    Code:
     *************************************************************************** 
     ** J O B L O G    P R O T O T Y P E S                                       
     ***************************************************************************  
     /if defined( JOBLOG_P )                                                      
     /eof                                                                         
     /endif                                                                       
                                                                                 
     /define JOBLOG_P                                                             
                                                                                 
    D Qp0zLprintf     PR            10I 0 ExtProc( 'Qp0zLprintf' )                
    D  szOutputStg                    *   Value Options( *String )                
                                                                                 
    D JobLog_Write    PR            10i 0                                         
    D   JobLogInfo               65535a   Varying  Const


    Program: JOBLOG_S
    Code:
     ************************************************************************** 
     *  J O B L O G    S E R V I C E    P R O G R A M                           
     *  JobLog_Write - Writes a joblog entry.                                   
     *                 example:  JobLog_Write( 'Write this data' );             
     ************************************************************************** 
    H NoMain                                                                    
     /copy QRPGLESRC/TARSRC,JobLog_p                                            
                                                                               
    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
    Program: JOBLOG_S
    Code:
    H DftActGrp( *No ) ActGrp( *NEW ) BndDir( 'CF' ))                     
                                                                         
     /copy QRPGLESRC/TARSRC,JobLog_p                                      
                                                                         
     /free                                                                
      JobLog_Write( 'Program Called At ' + %char( %TimeStamp ));          
      *inlr = *on;



    Dank im Voraus

    TARKI

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    Registriert seit
    Apr 2012
    Beiträge
    360
    Hallo Bender,
    mit welchen Parametern erstelle ich die Quelldatei QRPGLEH? CRTSRCPF(?)

    Danke

    Tarki

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    crtsrcpf qrpgleh 112

    Ich schreibe normalerweise erst die Prototypen für die exportierten Procedures und dann habe ich ein kleines Fummeltool, das mir aus diesen Prototypen einen Rahmen für das SRVPGM generiert mit Dummy Implementierung für die Procedures, den Compile Anweisungen und was man sonst noch darin immer drin haben will (das sind dann oft Anpassungen für Projekte). Das Teil ist ebenfalls Open Source (GENFRAME), kann aber nur ein Subset dessen, was alles geht und ist auch schon ein wenig angegraut...

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Apr 2012
    Beiträge
    360
    Hallo Dieter,

    ich hätte wie beschrieben mir eine Quelldatei QRPGLEH erstellt.
    Die Sourcen reinkopiert.
    Code:
     Teildatei  Art         Text                                      
    JOBLOG_P    RPGLE       JOBLOG SERVICE PROGRAMM PROTOTYPES        
    JOBLOG_S    RPGLE       JOBLOG SERVICE PROGRAMM SERVICE PROGRAMM
    Anschließend hätte ich deine Umwandlungsanweisung abgesetzt.
    Code:
    CRTRPGMOD MODULE(JOBLOG_S) 
    SRCFILE(TSTSRC/QRPGLEH) 
    DBGVIEW(*SOURCE)
    Aber ich bekomme das nicht kompeliert.

    Darf ich in den H Bestimmungen kein NoMain angeben.
    Wieso wandelt er das eine Modul so oft?

    lg

    TARKI
    Angehängte Dateien Angehängte Dateien

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von tarkusch Beitrag anzeigen
    Die Sourcen reinkopiert.
    ... kopieren ist was anderes...

    Dieter:
    Code:
    D*B    CRTRPGMOD JOBLOG_S
    D*B+     DBGVIEW(*SOURCE)
    D*B    CRTSRVPGM(JOBLOG_S)
    D*B+     ACTGRP(*CALLER)
    D*B+     EXPORT(*ALL)
    Tarkusch:
    Code:
    D*B    CRTRPGMOD JOBLOG_S
    D*B+     DBGVIEW(*SOURCE)
    D*B+  CRTSRVPGM(JOBLOG_S)
    D*B+     ACTGRP(*CALLER)
    D*B+     EXPORT(*ALL)
    Wenn man das jetzt an den Preprozessor gibt (entweder call crtcpp parm(...) oder mit command create, dann werden die commands aus der Quellle geparsed (D*B kennzeichnet den Anfang einer beliebigen CL Anweisung, folgende D*B+ werden mit angehängt; erneutes D*B ist der nächste command.

    Außerdem hast Du in der QRPGLEH offenkundig die Quelle des Programms nochmal stehen, da muss der Prototyp hin - das löst bei Dir einen Zyklus von Copy aus (auch aus diesem Grund macht man in Copy Strecken das /if not defined cnstruct rein, das mehrfach kopieren verhindert.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •