Hallo Max,

bevor du ganz verzweifelst, zur Klarstellung hier auch noch ein paar Anmerkungen von mir:


  1. Das was du suchst, sind "Serviceprogramme". Das sind quasi ausgelagerte Funktionen. Das heißt, du kannst den Funktionen lange Namen geben und kannst sie in Ausdrücken verwenden:
    z.B.: betrag = berechneNettowert(bruttobetrag)
  2. Serviceprogramme sind super. Die Programmierung unterscheidet sich kaum von "normalen" RPGLE-Programmen. Aber das Kompilieren hat IBM uns ziemlich schwer gemacht. Das Kompilieren ist die eigentliche "Kunst" bei Serviceprogrammen. Das kannst du auf Dauer nicht manuell machen. Da musst du dir ein passendes Compilierscript (z.B. in CL) basteln.
  3. In der free format Syntax fangen Serviceprogramme mit der Control Option "Nomain" an. Meistens gibt man noch ein paar weitere Parameter mit, wie z.B. das Datumsformat usw.Dann kommt der eigentliche Programmcode. Hier ein Beispiel:
  4. Code:
    ctl-opt nomain;
    dcl-proc isZiffer export;
       dcl-pi *n ind;
          zeichen char(1) const;
       end-pi;
    if %scan(zeichen:'0123456789') > 0;
       return *on;
    else;
       return *off;
    endif;
    end-proc;
  5. Wichtig ist in dem Beispiel das Schlüsselwort "export". Es besagt, dass die Funktion "isZiffer" von dem Serviceprogramm nach außen gegeben wird. Andere Programme, die Zugriff auf das Serviceprogramm haben, können die Funktion "isZiffer" also benutzen. Wenn das Schlüsselwort export fehlt, kann die Funktion nur innerhalb des Serviceprogramms benutzt werden.
  6. Das Kompilieren von Serviceprogrammen erfolgt bei uns in 2 Schritten:
    Zuerst wird mit CRTRPGMOD aus dem Source ein Modul erstellt. Danach wird aus dem Modul mit dem Befehl CRTSRVPGM ein Programmobjekt vom Typ *SRVPGM erstellt.
  7. Damit ist dein Serviceprogramm fertig. Aber was jetzt noch fehlt, ist das Verfügbarmachen des Serviceprogramms für andere Programme. Dazu müssen die anderen Programme dein Serviceprogramm bei ihrem Kompiliervorgang einbinden. Wir machen das so, dass wir Serviceprogramme bei der Kompilierung in ein sogenannntes Binderverzeichnis eintragen. Geht mit CRTBNDDIR bzw. dann mit ADDBNDDIRE. Das Bindervezeichnis geben wir unseren normalen Programmen bei jedem Kompiliervorgang mit.
  8. Jetzt hast du aber noch das Problem, dass deine normalen Programme wissen müssen, wie die Parameterschnittstelle deiner Funktion aussieht. Dazu musst du in deinem normalen Programm einen sogenannten Prototype eintragen. Für die Funktion oben sieht das dann ungefährt so aus:
    Code:
      
    dcl-pr isZiffer ind;
       zeichen char(1) const;
    end-pr;
    Solche Prototypes packt man sich üblicherweise in COPY-Strecken und bindet sie dann in seinen Code ein.

Es ist leider sehr aufwändig, alles im Detail zu beschreiben. Aber vielleicht hilft dir dieses Grundgerüst schon mal weiter. (Wahrscheinlich habe ich auch noch die Hälfte vergessen :-) )

Dieter