© serviceprofessionalgmbh

Dieses zentrale Programm wird für diverse Funktionen mit PO-Dateien benutzt. Die Durchführung der verschiedenen Aktionen erfolgt über ISPF-Services. Diese sind in vielen Bereichen besser und schneller als ihre Entsprechungen im TSO. So kann ein Mitglied nur dann per TSO-DELETE-Befehl gelöscht werden, wenn TSO die PO-Datei zum Löschzeitpunkt exklusiv zuweisen kann (DELETE alloziert die Datei mit OLD, auch wenn nur ein Member gelöscht werden soll). Dies ist bei stark frequentierten Dateien oft nicht möglich.


DATEI = "SPGMBH.TEST.DATA"
mbr_list = PDS$E(DATEI,"MBRLST")        /* Wortkette von Membernamen */
mbr_list = PDS$E(DATEI,"MBRLST","AB*")  /* Wortkette von Membernamen beginnend mit AB */




/* REXX * PDS$E ******************************************************
*                                                                    *
*  Funktion: Diverse Funktionen mit PO-Dateien und Mitgliedern       *
*  Parms...: 1. Name der PO-Datei                                    *
*            2. Funktion                                             *
*               BROWSE = Anzeigen via BROWSE                         *
*               COPY   = Kopieren MBR1 nach MBR2                     *
*               MOVE   = uebertragen MBR1 nach MBR2                  *
*               EDIT   = Editieren                                   *
*               DEL    = Loeschen MBR1                               *
*               MBRLST = Mitgliederliste als Wortkette               *
*               VIEW   = Anzeigen via VIEW                           *
*            3. Mbr1 (optional)                                      *
*            4. Mbr2 (optional)                                      *
*            5. Name der PO-Datei COPY/MOVE wenn nicht PARM1 (opt.)  *
*                                                                    *
*********************************************************************/

parse source . PGMTYP PUAKTCMD .
if PGMTYP = "FUNCTION" then arg DSN1,FUNKTION,MBR1,MBR2,DSN2,DUMMY
else                        arg DSN1 FUNKTION MBR1 MBR2 DSN2 .
address ispexec
"control errors return"
"vget (TRACE) shared"
if wordpos(TRACE,"ON ALL YES") > 0 ! ,
   wordpos(PUAKTCMD,TRACE)  > 0 then trace ?r
DMY = msg("OFF")

HPROG_START:
      PUAKTRC  = 0
      PUAKTERG = ""
      select
         when FUNKTION = "BROWSE" then call braus_vjuh_edit "BROWSE"
         when FUNKTION = "EDIT"   then call braus_vjuh_edit "EDIT"
         when FUNKTION = "VIEW"   then call braus_vjuh_edit "VIEW"
         when FUNKTION = "COPY"   then call copy_move "COPY"
         when FUNKTION = "MOVE"   then call copy_move "MOVE"
         when FUNKTION = "DEL"    then call loeschen
         when FUNKTION = "MBRLST" then call memberlist
         otherwise PUAKTRC = 12
      end
HPROG_ENDE:

PULSTCMD = PUAKTCMD
PULSTRC  = PUAKTRC
PULSTERG = PUAKTERG
"vput (PULSTERG PULSTRC PULSTCMD PUAKTERG PUAKTRC PUAKTCMD)"

if PGMTYP = "COMMAND" then exit PUAKTRC
else return PUAKTERG

/*********************************************************************
* Allgemeine Subroutinen                                             *
*********************************************************************/

braus_vjuh_edit:
      /***************************************************************
      * Memberanzeige oder Dateianzeige mit Browse                   *
      ***************************************************************/
      arg ANZEIGE_TYP .
      if MBR1 <> "" then DSN1 = DSN1"("MBR1")"
      "control display save"
      interpret '"'ANZEIGE_TYP "dataset('&DSN1'"')"'
      PUAKTRC = RC
      "control display restore"
return

copy_move:
      /***************************************************************
      * Kopieren/uebertragen MBR1 nach MBR2 in DSN1 (oder DSN2)      *
      ***************************************************************/
      arg FUNKTION .
      if strip(DSN2) = "" then DSN2 = DSN1
      if strip(MBR2) = "" then MBR2 = MBR1
      if DSN1 = DSN2 & MBR1 = MBR2 then return
      "lminit dataid(DID1) dataset('&DSN1') enq(shrw) org(po)"
      "lminit dataid(DID2) dataset('&DSN2') enq(shrw) org(po)"
      "lmcopy fromid(&DID1) frommem(&MBR1)",
          "todataid(&DID2) tomem(&MBR2) replace"
      "lmfree dataid(&DID1)"
      "lmfree dataid(&DID2)"
      if FUNKTION = "MOVE" then call loeschen
return

loeschen:
      /***************************************************************
      * Delete Member aus PO-Datei                                   *
      ***************************************************************/
      "lminit dataid(DID) dataset('&DSN1') enq(shrw)"
      "lmopen dataid(&DID) option(output) org(po)"
      "lmmdel dataid(&DID) member(&MBR1)"
       PUAKTRC = RC
      "lmclose dataid(&DID)"
      "lmfree dataid(&DID)"
return

memberlist:
      /***************************************************************
      * Ermitteln Memberliste                                        *
      ***************************************************************/
      if pos('*',mbr1) = 0 then mbr1 = strip(left(mbr1'*',8))
      "lminit dataid(did) dataset('&DSN1') enq(shr) org(po)"
      "lmopen dataid(&DID) option(input)"
      PUAKTRC = RC
      "lmmlist dataid(&DID) option(list) member(MBR) pattern(&mbr1)"
      do while RC = 0
         PUAKTERG = PUAKTERG strip(MBR)
         "lmmlist dataid(&DID) option(list) member(MBR) pattern(&mbr1)"
      end
      "lmclose dataid(&DID)"
      "lmfree dataid(&DID)"
return
zurück zu REXX mit Dialog Manager