OS390-PO-Bibliotheken auf Windows/Unix übertragen (SourceFTP)

Das FTPSource- Tool überträgt eine komplette PO-Bibliothek (d.h. alle Member einer Bibliothek) per Ftp von OS390 auf einen Unix- oder Windows-Rechner.

Die PO-Bibliothek wird auf dem Zielrechner folgendermaßen abgelegt:

  • Für jede übertragene PO-Bibliothek wird ein Unterverzeichnis angelegt, dessen Name sich aus dem Namen der PO-Bibliothek und einem Timestamp zusammensetzt.
  • Im angegebenen Zielverzeichnis werden die Member als jeweils eine Datei mit einer vorgegebenen Namenserweiterung abgelegt.
//ABC100S JOB,'X4711,DWH/CP',CLASS=H,NOTIFY=&SYSUID,MSGCLASS=X
//*
//* SourceFTP
//* ... transfers a complete PO library to a unix or windows platform.
//* On the target platform a directory will be created containing one
//* file for each member of the PO library.
//*
//SAS      EXEC SAS
//SASAUTOSDDDSN=DWH.SAS.MACAUTOS,DIP=SHR
//FTPSCR  DDDSN=&&FTPSCR,DISP=(NEW,PASS,DELETE)
//SYSIN    DD *
  %RDSPOLib
  (  getFTPScript
   , libDSN    = ABC100.SASENTW.PGM
   , outDD     = ftpscr
   , ftpHost   = 111.42.33.204
   , ftpUid    = dwhuid
   , ftpPwd    = dwhpwd
   , extension = txt
  );
/*
//*
//* Transfer source members
//*
//FTP    EXECPGM=FTP,COND=(8,LT)
//INPUT  DDDSN=&&FTPSCR,DISP=(OLD,DELETE,DELETE)

Das Makro RDSPOLib:

/**
  * ... implements utilities to deal with PO libraries on OS390
  */
 %macro rdsPOLib
 (  method
  , libDSN    =
  , prefix    =
  , out       = rdsPOContent                        /* getContentDS */
  , ftphost   =                                     /* getFTPScript */
  , ftpuid    =
  , ftppwd    =
  , extension =
  , outDD     =
 );


   %local umn umName;
   %let umn = 11;
   %let umName = rdsPOLib;

   /**
    * ... create a SAS data set containing directory information of
    * the PO library
    */
   %if &method. = getContentDS %then %do;

     filename rds&umn.a '&libDSN.';
     filename rds&umn.b temp;

     ** Write directory to sequential file;
     proc source indd=rds&umn.a dirdd=rds&umn.b nodata noprint;
     run;

     filename rds&umn.a clear;

     ** Read directory, create content data set with ISPF statistics;
     data &out.;
       infile rds&umn.b;
       file print header=header;
       input member $8. ttr pib3. ind pib1. @;
       datalen = 2*mod(ind,32);
       if (datalen = 30) then do;
         input
           ver      pib1. mod      pib1. blank    pib2.
           ccreate  pib1. create   pd3.  cchanged pib1.
           changed  pd3.  hh       pk1.  mm       pk1.
           size     pib2. init     pib2. modl     pib2.
           userid   $8.
         ;
         yyyydddc = (ccreate * 100000) + 1900000 + create;
         jcreate  = datejul(yyyydddc);
         yyyydddx = (cchanged * 100000) + 1900000 + changed;
         jchange  = datejul(yyyydddx);
       end;

       ** Print the results;
       put @ 4 member $8.
           @15 jcreate yymmdd10.
           @27 jchange yymmdd10.
           @39 hh 2. ':' mm 2.
           @48 userid;

       %if %length(&prefix.) ne 0 %then %do;
         if member =: upcase ('&prefix.');
       %end;
     return;

     header:
       put @ 4 'NAME '
           @15 'CREATED'
           @27 'CHANGED'
           @39 'TIME'
           @48 ' ID ' /;
     run;

     filename rds&umn.b clear;

   %end; %* Method getContentDS;

   /**
    * ... writes an ftp script to transfer the PO library to unix or
    * windows
    */
   %else %if &method. = getFTPScript %then %do;

     %rdsPOLib
       (getContentDS, libDSN=&libDSN., prefix=&prefix., out=&out.);

     data _null_;
        set &out. end=done;
        file &outDD.;
        dirName =
          '&libDSN..'
          || translate (put(datetime(),datetime16.0), '-', ':');
        if _n_ = 1 then
          put '&ftphost.'
          / '&ftpuid.'
          / '&ftppwd.'
          / 'ascii'
          / 'mkdir ' dirName
          / 'cd ' dirName;
        put 'put '&libDSN.(' member +(-1) ')' ' member +(-1)
          '.&extension.';
        if done then put 'quit';
     run;

   %end; %* Method createFTPScript;

   /**
    * ... tests the complete functionality
    */
   %else %if &method. = testAll %then %do;
     %put;
     %put TEST: &umName.(testAll) ...;
     %put;
     %put TEST: Creating FTPScript (will test getContentDS implicitly);
     %put TEST: Expectation: Print generated ftp script to log;

     filename rds&umn.c temp;
     %rdsPOLib
     (  getFTPScript
      , libDSN    = &libDSN.
      , outDD     = rds&umn.c
      , ftpHost   = 10.0.0.1
      , ftpUid    = uid001
      , ftpPwd    = pwd001
      , extension = msc
     );
     data _null_;
       infile rds&umn.c;
       input line $80.;
       put 'TEST: ' line;
     run;
     filename rds&umn.c clear;

     %put;
     %put TEST: &umName.(testAll) passed;
     %put;
   %end;

 %mend; %* rdsPOLib;