Hay ocasiones en las que tenemos que leer directamente de entornos Mainframe ficheros DB2, conocemos la estructura de esos ficheros y necesitamos leerlos vía FTP. Para ello tenemos que tener en cuenta la transformación EBCDIC (Extended Binary Coded Decimal Interchange Code ) a ASCII (American Standard Code for Information Interchange), esta transformación requiere las siguientes equivalencias entre formatos:
- Decimales empaquetados: PD5. -> S370FPD5.
- Enteros binarios: IB5. -> S370FIB5.
- Caracter: 5. ->EBCDIC5.
- Numérico con 0: Z5. -> S370FZDU5.
De modo que para leer el fichero del Mainframe haremos:
filename test1 ftp "'ACA.ACANAME.FECHA'" HOST='MVS' USER='SASXXX' PAS='XXX'
s370v RCMD='site rdw' lrecl=xx;
data one;
infile test1;
input @1 name ebcdic20.
@21 addrebcdic20.
@41 city ebcdic10.
@51 stebcdic2.
@54 zip s370PD5.
@60 comments :$ebcdic200.;
run;
Necesitaremos saber la longitud del registro y por supuesto conocer la estructura del fichero que vamos a leer, con esto hacemos la transformación para mover información entre plataformas. Por otro lado tenemos el filename FTP. Le pasamos el nombre del fichero a leer, el host donde se encuentra alocado ese fichero con la opción RCMD=’site rdw’ indicamos que tenemos el descriptor de registro, el RDW (Record Descriptor Word) con S370v indicamos que el formato es EBCDIC y en lrecl debemos poner la longitud de registro. En este punto desconozco como hacer funcionar la opción EOR (end of record) para encontrar el final del registro.Espero que este "extraño" truco os sea de utilidad. Hace años si alguien hubiera colgado algo así en la red a mi me hubiera ahorrado mucho trabajo y por eso me he decidido a ponerlo. Un saludo y nos vemos después de las merecidas vacaciones que me voy a tomar el próximo mes. Por supuesto, si alguien tiene dudas o un trabajo que me permita jugar más tiempo con mis hijos rvaquerizo@analisisydecision.es
Añado una macro que me ha venido bien para detectar cuando ha cambiado la versión de un fichero GDG. Cada vez que cargo el fichero guardo la versión en una tabla de control, si la versión no coincide con la que devuelve la macro debo cargarlo por ser nuevo. Es para ficheros de una única versión, sino habría que ordenar y contar desde 0.
La macro:
%macro obtenerVersionHOST(mFichero);
%global vDSNHost;
filename ftplist ftp » ls cd=’..’ lsfile=»&mfichero.*»
user=»%sysget(batchusr)» pass=»%sysget(batchpwd)»
host=»10.63.3.1″;
data _null_;
length DSNx 128;
infile ftplist missover pad;
input DSNx128.;
call symput(«vDSNHost»,substr(DSNx,length(DSNx)-7,8)); * Guarda la versión del fichero actual;
put DSNx;
leftDSN=substr(DSNx,1,length(«&mfichero»));
put leftDSN;
put «&mfichero»;
if «&mfichero»=leftDSN; * Por si se crearán ficheros con la misma raiz;
run;
%mend obtenerVersionHOST;
Hola
Existe alguna forma de enviar un archivo EBCDIC de host en formato ASCII a un windows mediante connect direct?