Extraer contenido de un campo de 2 miembros con una llave

Todo lo relacionado con REXX en este ambiente.
italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Extraer contenido de un campo de 2 miembros con una llave

Mensaje por italo_pm » 31 Mar 2015, 16:00

Buen dia a todos,

soy primerizo con esto del rexx, tengo un problema con un rexx, el objetivo es que desde 2 miembros me de un resultado mediante una llave....

he logrado la extracion de algunos datos de los campos de mi interes, pero aun no logro que me de como resultado todos los datos.

tengo 2 miembros:

WIAX8 : en este miembro tengo la informacion de la aplicacion (nombre,responsables,area,criticidad,descripcion app y jobs), bajo la columna RESPONS estan los nombres de los responsables de la aplicacion y bajo la columna AREA tengo el nombre del Area a que le pertenece la aplicacion...

el otro miembro es

CMAREA: en este miembro tengo la informacion del Area... el nombre y el nombre del responsable y su celular...

practicamente lo que hago es que desde el miembro de la aplicacion WIAX8 interrogue al miembro CMAREA y en base al nombre del Area me de el nombre del responsable de Area (miembro CMAREA) y luego lo agrego a los responsables de la aplicacion (miembro WIAX8)

lo que he conseguido es que me todos los nombres de los responsables de la aplicacion (WIAX8) (y aqui empieza el error) y solo me da el ultimo responsable de area (miembro CMAREA) cuando este tiene 3 responsable de area distintos... y necesito que me muestre todos...

para que me entiendan este es el contenido del miembro WIAX8:

Código: Seleccionar todo

Command ===>
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
****** ******************************************************* Top of Data ************
000001 VFY APP      RESPONS                    AREA            CRITICA   CELL
000002 VFY WIAX8    name surname               AUTO.TEST       NO
000003 VFY WIAX8    name surname.              AUTO.TEST       NO
000004 VFY WIAX8    name.surname@dominio.com   AUTO.TEST       NO
000005 VFY WIAX8    name1.surname1@dominio.com  AUTO.TEST      NO
000006 VFY WIAX8    name2.surname2@dominio.com  AUTO.TEST      NO
000007 VFY WIAX8    name1 surname1             AUTO.TEST       NO
000008 VFY WIAX8    name2 surname2             AUTO.TEST       NO
000009 VFY WIAX8    name3 surname3             AUTO.TEST       NO
000010 VFY= CAMPO FISSO
000011
000012 ========================================================================
000013 Description : APP WIAX8
000014 ======================================================================
000015 ***********************************************************************
000016 JOBNAME* *DESCRIPTION JOB         *                *CLASS* *RC**RESTART*
000017 ************************************************************************
000018 WIAX8PPR   START APP                                   K    00   JOB
000019 WIAX8P20   exec script unzipp files ftp                           NO
000020 WIAX8P25   exec script to ftp log file                            NO
este el contenido del miembro CMAREA :

Código: Seleccionar todo

Command ===>
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7
****** ******************************************************* Top of Data **
000001 Area                 CM                             Cell
000002 ------------------   --------------------------     ----------
000003 AUTO.TEST            cmarea.respons1.1              1111111111
000004 AUTO.TEST            cmarea.respons1.2              2222222222
000005 AUTO.TEST            cmarea.respons1.3              3333333333
000006 DWH.TEST             cmarea.respons2.1              4444444444
000007 DWH.TEST             cmarea.respons2.2              5555555555
000008 DWH.TEST             cmarea.respons2.3              6666666666
000009 COMMER.TEST          cmarea.respons3.1              7777777777
000010 COMMER.TEST          cmarea.respons3.2              8888888888
000011 COMMER.TEST          cmarea.respons3.3              9999999999
000012 HR.TEST              cmarea.respons4.1              0000000000
000013 HR.TEST              cmarea.respons4.2              1111111111
000014 HR.TEST              cmarea.respons4.3              2222222222
000015 OPERATIONS.TEST      cmarea.respons5.1              3333333333
000016 OPERATIONS.TEST      cmarea.respons5.2              4444444444
000017 OPERATIONS.TEST      cmarea.respons5.3              5555555555
000018 MIGRATION.TEST       cmarea.respons6.1              6666666666
000019 MIGRATION.TEST       cmarea.respons6.2              7777777777
000020 MIGRATION.TEST       cmarea.respons6.3              8888888888

este es el resultado FILEOUT de la rexx:

Código: Seleccionar todo

 BROWSE    Z99.Z99TEST0.REXXTEST.FILEOUT.WIAX8
 Command ===>
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
*********************************************************** Top of Data ********
VFY WIAX8    name surname
cmarea.respons1.3
VFY WIAX8    name surname.
cmarea.respons1.3
VFY WIAX8    name.surname@dominio.com
cmarea.respons1.3
VFY WIAX8    name1.surname1@dominio.com
cmarea.respons1.3
VFY WIAX8    name2.surname2@dominio.com
cmarea.respons1.3
VFY WIAX8    name1 surname1
cmarea.respons1.3
VFY WIAX8    name2 surname2
cmarea.respons1.3
VFY WIAX8    name3 surname3
cmarea.respons1.3
VFY= CAMPO FISSO
========================================================================
Description : APP WIAX8
======================================================================
***********************************************************************
JOBNAME* *DESCRIPTION JOB         *
************************************************************************
WIAX8PPR   START APP
WIAX8P20   exec script unzipp files ftp
WIAX8P25   exec script to ftp log file
WIAX8P30   exec script .sh on server INFORMATIC
WIAX8TSX   END APP
************************************************************************
********************************************************** Bottom of Data ******
el contenido de la columna RESPONS puede superar su longitud y por eso en la rexx hice que buscara "AREA" y luego disminuya de 1 byte para que los datos sean enteros y no le falte nada (ver los email)...

como se puede ver solo me da el ultimo responsable del area (cmarea.respons1.3) y no los otros 2 anteriores.... y aparte de eso, solo necesito que se repita una vez el responsable de area y no todas las veces...


esta es la rexx (REXXTEST) :

Código: Seleccionar todo

Command ===>
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
****** ******************************************************* Top of Data ************
000001 /* REXX */
000002 SAY 'start REXX'
000003 address tso "execio * diskr CMAREA  (stem CMAREA. finis" /*read FILE*/
000004 if rc>0 then exit 12
000005 array. =''
000006 do in=1 to CMAREA.0
000007    area =strip(substr(CMAREA.in,1,20))
000008    nome =strip(substr(CMAREA.in,22,30))
000009    array.area = nome
000010 End
000011 address tso "execio * diskr FILEINP (stem FILEINP. finis" /*read FILE*/
000012 if rc>0 then exit 12
000013   riga  =translate(FILEINP.1) /* translate */
000014   aa = pos('AREA',riga)  /* find first position field AREA*/
000015   aa = aa - 1
000016   ou=0
000017   do in=2 to FILEINP.0
000018      rr = substr(FILEINP.in,1,aa)
000019   /* --------------------------------- */
000020      area = word(substr(fileinp.in,aa+1),1)
000021   /* --------------------------------- */
000022      ll=length(rr)
000023      lt=length(FILEINP.in)
000024      if substr(rr,ll,1) <>'' then do
000025         rt = FILEINP.in
000026         cc=0
000027         do ix=ll to lt
000028            if substr(rt,ix,1) = '' then  do
000029               rr = substr(FILEINP.in,1,ix)
000030               ixx=ix+1
000031               area = word(substr(fileinp.in,ixx),1)
000032               leave
000033            end
000034            cc=cc+1
000035         end
000036      end
000037      ou=ou+1
000038      area =STRIP(area)
000039   /* FILEOUT.ou = left(area,20,' ') left(array.area,30' ') rr */
000040   /* FILEOUT.ou = left(array.area,30' ') rr */
000041      FILEOUT.ou = rr
000042      SAY FILEOUT.ou
000043      ou = ou + 1
000044      FILEOUT.ou = left(array.area,30,' ')
000045      SAY FILEOUT.ou
000046   end
000047   FILEOUT.0=ou
000048 address tso "execio * diskw FILEOUT (STEM FILEOUT. FINIS"  /*write OUT*/
000049 if rc>0 then exit 12
000050 say ' - FILEINP reads : 'FILEINP.0
000051  say ' - CMAREA  reads : 'CMAREA.0
000052 say ' - writes 'ou' reks'
000053 SAY 'End REXX'
000054 exit
****** ****************************************************** Bottom of Data **********
alguna idea??

el objetivo es extraer el/los nombre de los RESPONS del miembro (WIAX8) y el/los nombre del CM del CMAREA en base al contenido del CMAREA para luego mandarles un email cuando el job va en abend, claro que para eso se necesita mas cosas... como reemplazar los nombre y apellidos con un "." , remplazar masivamente los nombres y apellidos etc etc etc pero por el momento la idea seria extraerlos...

gracias a quienes puedan sugerirme como proceder...

salu2.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 01 Abr 2015, 10:54

Hola italo,
No me ha quedado muy claro lo que quieres obtener.
No está claro como es el formato de la información en los ficheros.
Y tu código REXX es algo farragoso.

Pero creo que tu principal problema es que no hay un segundo bucle DO dentro del primero para poder recorrer todas las líneas de CMARE,
por cada una de las líneas de FILEINP. Esto de los dos bucles es poco eficaz cuando los ficheros son muy grandes. En estos casos se ordenan los ficheros por los mismos campos en cada uno y se utilizan algoritmos que aprovechan el que estén ordenados y que solo necesitan recorrer una vez cada registro de los ficheros.

Como en tu caso los ficheros son pequeños, y hasta que tengas más experiencia programando, podrás obviar el tema del rendimiento.

Te dejo un ejemplo de REXX que puede aportar claridad al código y que seguro podrás corregirle imperfecciones y adaptarlo a tus necesidades.

NOTA: Én REXX exite la instrucción TRACE, que te podrá dar mucha información sobre como está funcionando el programa.

Un saludo

Código: Seleccionar todo

/* REXX VICENTE */                                                      
"EXECIO * DISKR CMAREA (STEM CMAREA. FINIS)"                            
"EXECIO * DISKR FILEINP (STEM FILEINP. FINIS)"                          
                                                                        
fileinp.1 = TRANSLATE(fileinp.1)     /* Cambia a Mayusculas           */
aa = POS('AREA',fileinp.1)           /* Posicion de area en FILEIMP   */
cm = POS('CM',cmarea.1)              /* Posicion de respons en CMAREA */
                                                                        
DO i = 2 TO fileinp.0                   /* Para cada linea de FILEIMP */
   app = LEFT(fileinp.i,10)                 /* Aplicacion en FILEIMP  */
   respons = SUBSTR(fileinp.i,14,aa-14)     /* Responsable en FILEIMP */
   area = SUBSTR(fileinp,14,15)             /* Area en FILEIMP        */
                                                                        
   app = STRIP(app)                  /* Quito espacio en los extremos */
   area = STRIP(area)                /* Quito espacio en los extremos */
   respons = STRIP(respons)          /* Quito espacio en los extremos */
                                                                        
   SAY app respons area                           /* Datos de FILEIMP */
                                                                        
   DO j = 3 TO cmarea.0     /* Busco en CMAREA a partir de la linea 3 */
      IF area = STRIP(LEFT(cmarea.j,20)) THEN DO     /* area = cmarea */
         SAY responsable = SUBSTR(cmarea.j,cm,25)                       
      END                                                               
   END                                                                  
END                                                                     
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 01 Abr 2015, 16:55

gracias Vicente, pues es exactamente lo que deseaba hacer,

cambie 3 cosas en tu rexx:

Código: Seleccionar todo

/* REXX */
"EXECIO * DISKR CMAREA (STEM CMAREA. FINIS)"
"EXECIO * DISKR FILEINP (STEM FILEINP. FINIS)"

fileinp.1 = TRANSLATE(fileinp.1)     /* Cambia a Mayusculas           */
aa = POS('AREA',fileinp.1)           /* Posicion de area en FILEIMP   */
cm = POS('CM',cmarea.1)              /* Posicion de respons en CMAREA */

DO i = 2 TO fileinp.0                   /* Para cada linea de FILEIMP */
   app = LEFT(fileinp.i,10)                 /* Aplicacion en FILEIMP  */
   respons = SUBSTR(fileinp.i,14,aa-14)     /* Responsable en FILEIMP */
/* area = SUBSTR(fileinp,14,15) */          /* Area en FILEIMP        */
   area = SUBSTR(fileinp.i,41,15)           /* Area en FILEIMP        */

   app = STRIP(app)                  /* Quito espacio en los extremos */
   area = STRIP(area)                /* Quito espacio en los extremos */
   respons = STRIP(respons)          /* Quito espacio en los extremos */

/* SAY app respons area */                        /* Datos de FILEIMP */
   SAY respons                                    /* Datos de FILEIMP */
   DO j = 3 TO cmarea.0     /* Busco en CMAREA a partir de la linea 3 */
      IF area = STRIP(LEFT(cmarea.j,20)) THEN DO     /* area = cmarea */
     /*  SAY responsable = SUBSTR(cmarea.j,cm,25) */
         say ' responsable cm : ' SUBSTR(cmarea.j,cm,25)
      END
   END
END    


aqui:

Código: Seleccionar todo

/* area = SUBSTR(fileinp,14,15) */          /* Area en FILEIMP        */
   area = SUBSTR(fileinp.i,41,15)           /* Area en FILEIMP        */
el nombre ara inicia desde la 41 (creo q fue un error de tecleo)


aqui:

Código: Seleccionar todo

/* SAY app respons area */                        /* Datos de FILEIMP */
   SAY respons                            /* Datos de FILEIMP */
use solo el campo respons, pero de igual manere me sirve tener ahi los datos.

y aqui:

Código: Seleccionar todo

     /*  SAY responsable = SUBSTR(cmarea.j,cm,25) */
         say ' responsable cm : ' SUBSTR(cmarea.j,cm,25)
con SAY responsable = SUBSTR(cmarea.j,cm,25) daba como resultado 0 , escribiendo entre ' ' sin el igual funciona correctamente.

este es el resultado:

Código: Seleccionar todo

 JobName  Jobid    Queue    DDName   StepName ProcStep ExecSys
 Z99RXSP1 JOB04173 OUTPUT   SYSTSPRT WIAX8    EXECREXX OSCM
 -------------------------------------------------------------
 ...+....10...+....20...+....30...+.!..40...+....50...+....60.
name surname
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
name surname.
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
name.surname.dominio.com
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
name1.surname1.dominio.com
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
name2.surname2.dominio.com
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
name1 surname1
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
name2 surname2
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
name3 surname3
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
SSO

===========================
APP WIAX8
===========================
***************************
CRIPTION JOB         *
***************************
ART APP
ec script unzipp files ftp
ec script to ftp log file
ec script .sh on server INF
D APP
***************************
READY
END
 ******************************
solo que en la parte inferior se pierden algunos caracteres....

el problema que la columna "respons" no siempre empieza en la columna 14 puede ser que empiece antes, como se puede hacer que funcione no empieza en el campo 14??

gracias Vicente, tomare ejemplo de tu codigo para hacer mas pruebas, te estoy muy agradecido.

salu2.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 01 Abr 2015, 19:02

edit: no puedo editar....

de que manera puedo hacer que no repitan los responsables de area??

Código: Seleccionar todo

 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
en el FILEOUT me servirian que los nombres de cmarea se repitan una sola vez...

el resultado final deberia ser:

Código: Seleccionar todo

name surname
name surname.
name.surname@dominio.com
name1.surname1@dominio.com
name2.surname2@dominio.com
name1 surname1
name2 surname2
name3 surname3
 responsable cm :  cmarea.respons1.1
 responsable cm :  cmarea.respons1.2
 responsable cm :  cmarea.respons1.3
alguna idea?

gracias nuevamente.

saludos

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 02 Abr 2015, 10:19

Hola Tim,
Estoy de acuerdo con tus correcciones a mis erratas. Era solo un ejemplo a modo de guía.
Aquí en España estamos de vacaciones hasta el próximo lunes, por lo que no podré hacer pruebas hasta entonces.
No obstante te hago los siguientes comentarios:
1) Dijiste
... la columna "respons" no siempre empieza en la columna 14 puede ser que empiece antes, como se puede hacer que funcione no empieza en el campo 14??
REXX tiene potentes instrucciones para manejo de cadenas de caracteres; tu ya conoces LEFT, RIGHT, LENGTH, SUBSTR, WORD y POS.
Pero una de mis favoritas por su gran potencia es PARSE VAR; estúdiala con atención en el manual de referencia de REXX.
Con PARSE podrás dividir cadenas de caracteres en trozos dependiendo de su contenido y no importando el lugar que ocupen los caracteres.
Por ejemplo:

frase = 'HOLA,BUENOS DIAS,HOY PARECE QUE - HARA BUEN TIEMPO'
PARSE VAR frase p1 ',' p2 ',' p3 . p4 '-' p5

hará que:
p1 = 'HOLA'
p2 = 'BUENOS DIAS'
P3 = 'HOY'
P4 = 'QUE'
p5 = 'HARA BUEN TIEMPO'

PARSE es mucho más potente de lo que hace en este ejemplo, estúdiala y utilízala para sacar información de las líneas de tus ficheros.

2) Dijiste: de que manera puedo hacer que no repitan los responsables de area??
Una vez más no me queda claro (debe ser que esta semana no es la mía) pero aventuraré algo.
Se me ocurre ir guardando en un array los responsables ya encontrados, que no estén previamente en el array y mostrarlos al final.
Se podría hacer dentro del IF de mi segundo bucle DO; algo así como:

Código: Seleccionar todo

r = 0
.
.
DO i = 2 ....
.
.
   DO j= ...
      IF area = ....
      responsable = SUBSTR(....
      DO k = 1 TO r
         guardar = 'SI'
         IF responsable = array.k THEN DO
            guardar = 'NO'
            k = r
         END
      END
      IF guardar = 'SI' THEN DO
         r = r + 1
         array.r = responsable
      END           
   END
END
Con esto nos metemos ya en cosas algo complicadas, así es que tómalo como una idea mejorable y escrita con prisas, pues ahora he de desconectarme.
Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 07 Abr 2015, 02:53

gracias Visente por tu respuesta, he logrado gestionar cuando hay mas de un area distinta y mas de un cmarea, he logrado "gestionar" los campos cuando la posicion es variable osea cuando cambia la columna, pero tengo aun varios problemas, debe ser porque no estoy familiarizado al uso del rexx.... practicamente por cada responsable de aplicacio que encuetro se repiten los cmarea.... es decir, si en la aplicacion tengo 2 responsables y 2 cmarea me da como resultado:

responsable app 1 --- cmarea 1
responsable app 1 --- cmarea 2

responsable app 2 --- cmarea 1
responsable app 2 --- cmarea 2

osea, no entiendo como hacer que no se repitan o extraer duplicados...

el resultado final deberia ser:

responsable app 1
responsable app 2
cmarea 1
cmarea 2

solo eso.... no logro entender como hacerlo...

tampoco se como aplicar una "llave" de extracion... ya que las lineas donde debo buscar los responsables y cmarea son solo las que inician de columna de 1 a 3 con VFY y no en todo el member...

otra cosa, no encuentro el modo de "decirle" al rexx que debe buscar solo en un "seccion/bloque" de lineas, osea desde donde empieza una determinada "palabra" hasta la "palabra" que se donde acaba dicho bloque/seccion de lineas...

como ves , estoy un poco perdido.

gracias por tu tiempo y disponibilidad.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 07 Abr 2015, 04:51

Hola Italo,
Te estás enfrentando a las dificultades de manejar información no estructurada, sea cual sea el lenguaje de programación que utilices.

Dijiste:
"no entiendo como hacer que no se repitan o extraer duplicados"

Me remito a mi post anterior

Dijiste:
"solo las que inician de columna de 1 a 3 con VFY y no en todo el member..."

Varias opciones:
1) ¿Que tal si condicionas las busqueda solo a las líneas cuyos tres primeros caracteres son VFY?
Es decir a aquellas tales que LEFT(fileinp.i,3) = 'VFY'
2) ¿Y si, en una primera pasada analizas todas las líneas de fileinp y te quedas, en un nuevo array, solo las que te interesan?
k = 0
DO i=1 TO ...
IF LEFT(fileinp.i,3) = 'VFY' THEN DO
k = k + 1
newfileinp.i = fileinp.k /* o a parte de fileinp.i */
END
END
3) Editas el fichero y utilizas la potencia de las instrucciones del editor para crear uno nuevo más manejable


Dijiste:
no encuentro el modo de "decirle" al rexx que debe buscar solo en un "seccion/bloque" de lineas, osea desde donde empieza una determinada "palabra" hasta la "palabra" que se donde acaba dicho bloque/seccion de lineas...

Opciones:
1) El bucle de arriba, puedes añadir un par de IF

Código: Seleccionar todo

k = 0
guardar = 'NO'
DO i=1 TO ...
   IF SUBSTR(fileinp.i) = 'palabra1' THEN DO
       guardar = 'SI'
   END
   IF SUBSTR(fileinp.i) = 'palabra2' THEN DO
       guardar = 'NO'
       i = fileinp.0 + 1         /* termina el bucle DO */
   END
   IF LEFT(fileinp.i,3) = 'VFY' & guardar = 'SI' THEN DO
       k = k + 1
       newfileinp.i = fileinp.k   /* o a parte de fileinp.i */
   END
END
2) ¿Qué tal editar el fichero y adaptarlo antes ?


Esto se complica y debo hacer ejercicios de imaginación, pues aún no tengo claros tu datos de entrada ni el REXX que has escrito.

Como reflexión general:
Hay veces que los datos de entrada están tan desectructurados o desordenados que no es posible escribir un programa sencillo para tratarlos.
Un problema complicado se puede resolver descomponiéndolo en problemas más simples.
En estos casos puede ser bueno realizar tratamientos previos de los ficheros de entrada, mediante SORT, EDIT, un sencillo REXX o las herramientas que consideres más oportunas.
La implementación de la solución podría ser un proceso batch con los pasos de JCL que sean necesarios, uno por cada problema simple, en el que hemos descompuesto nuestro problema inicial.

Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 09 Abr 2015, 01:34

Vicente, gracias nuevamente por la respuesta, he logrado obtener el resultado deseado... bueno por el momento los nombres sea de los repsonsables y cmarea.....

te copia la rexx.... la escribi de una manera un poco a mi nivel, aun no conosco los standars asi que por favor perdona algunos errores , estaba haciendo prueba tras prueba y la verdad esta un poco "espartana" ...

Código: Seleccionar todo


/* rexx */
say 'inizio rexx'
parse arg vari
say vari
address tso "execio * diskr cmarea  (stem cmarea. finis"        /*legge file*/
if rc>0 then exit 12
array. =''
nn= 0
st= 3
areaold =strip(substr(cmarea.st,1,20))
do in=st to cmarea.0
   area =strip(substr(cmarea.in,1,20))
   nome =strip(substr(cmarea.in,22,30))
   if area = areaold then nn=nn+1
   else nn = 1
   array.area.nn = nome
   array.area.0  = nn
   areaold=area
end
/******************************************************************************/
address tso "execio * diskr fileinp (stem fileinp. finis"         /*legge file*/
if rc>0 then exit 12
   riga  =translate(SUBSTR(fileinp.1,14))           /* rende maiuscola la riga*/
  aa = pos('AREA',riga)       /* trova la posizione del campo area nella riga */
  aa = aa - 1            /* imposto l'area -1 byte per creare 1 spazio fisso  */
  ou=0                                                    /* output x FILEOUT */
  area=''
  do in=2 to fileinp.0                         /* inizio lettura dalla riga 2 */
     areaold2= area
/******************************************************************************/
 IF LEFT(fileinp.in,3) = 'VFY' THEN DO                   /* solo VFY da 1 a 3 */
     if substr(fileinp.IN,1,4) = 'VFY=' then iterate          /* exclude VFY= */
/******************************************************************************/
     riga  =translate(SUBSTR(fileinp.IN,14))        /* rende maiuscola la riga*/
     rr = substr(RIGA,1,aa)      /* posizione del responsabile (area -1 byte) */
     area = word(substr(riga,aa+1),1)                    /* trovo valore area */
     ll=length(rr)                                  /* lunghezza responsabile */
     lt=length(riga)                                        /* lunghezza riga */
     if substr(rr,ll,1) <>'' then do
        rt = RIGA
        cc=0
        do ix=ll to lt
           if substr(rt,ix,1) = '' then  do
              rr = substr(riga,1,ix)
              ixx=ix+1
              area = word(substr(riga,ixx),1)
              leave
           end
           cc=cc+1
        end
     end
     if area = areaold2 & areaold2 <> '' then do
        ou=ou+1
        fileout.ou = rr                              /* responsabile app */
        fileout.0=ou
say ' - responsabile  : '  rr
     end
     else do
        xfine= array.area.0
        if datatype(xfine)<>'NUM' then xfine=0
/***********/
        if xfine<>0 then do
          do x1=1 to xfine
             nome = array.area.x1
             nome =strip(nome)
             ou=ou+1
             fileout.ou =  nome                                  /* cm area */
             fileout.0=ou
say ' - cmarea        : ' nome
          end
        end
/***********/
        ou=ou+1
        fileout.ou = rr                                   /* responsabile app */
        fileout.0=ou
say ' - responsabile  : '  rr
     end
  end
/******************************************************************************/
 end
/******************************************************************************/
address tso "execio * diskw fileout (stem fileout. finis" /*scrive out*/
if rc>0 then exit 12
say ' - fileinp letti : 'fileinp.0
say ' - cmarea  letti : 'cmarea.0
say ' - scritti 'ou' reks'
say 'fine rexx'
exit
esta es el sysout de la rexx:

Código: Seleccionar todo

inizio rexx

 - cmarea        :  CMAREA.AUTO.TEST.1
 - cmarea        :  CMAREA.AUTO.TEST.2
 - cmarea        :  CMAREA.AUTO.TEST.3
 - responsabile  :  NAME SURNAME
 - responsabile  :  NAME SURNAME.
 - responsabile  :  NAME.SURNAME.DOMINIO.COM
 - responsabile  :  NAME1.SURNAME1.DOMINIO.COM
 - cmarea        :  CMAREA.HR.TEST.1
 - cmarea        :  CMAREA.HR.TEST.2
 - cmarea        :  CMAREA.HR.TEST.3
 - responsabile  :  NAME2.SURNAME2.DOMINIO.COM
 - responsabile  :  NAME1 SURNAME1
 - cmarea        :  CMAREA.DWH.TEST.1
 - cmarea        :  CMAREA.DWH.TEST.2
 - cmarea        :  CMAREA.DWH.TEST.3
 - responsabile  :  NAME2 SURNAME2
 - responsabile  :  NAME3 SURNAME3
 - responsabile  :  NAME4 SURNAME4
  - responsabile  :  NAME5 SURNAME5
 - fileinp letti : 29
 - cmarea  letti : 35
 - scritti 19 reks
fine rexx
READY
END 
y este es el FILEOUT

Código: Seleccionar todo

CMAREA.AUTO.TEST.1          
CMAREA.AUTO.TEST.2          
CMAREA.AUTO.TEST.3          
NAME SURNAME                
NAME SURNAME.               
NAME.SURNAME@DOMINIO.COM    
NAME1.SURNAME1@DOMINIO.COM  
CMAREA.HR.TEST.1            
CMAREA.HR.TEST.2            
CMAREA.HR.TEST.3            
NAME2.SURNAME2@DOMINIO.COM  
NAME1 SURNAME1              
CMAREA.DWH.TEST.1           
CMAREA.DWH.TEST.2           
CMAREA.DWH.TEST.3           
NAME2 SURNAME2              
NAME3 SURNAME3              
NAME4 SURNAME4              
NAME5 SURNAME5              
bueno, ese es el resultado que deseaba... ahora el primer problema es q no logro ordenarlos ... es decir me sirven todos los CMAREA al final y no al inicio... estoy bastante confundido luego de tanto prueba hehehehehe....

ahora, tengo otro problema... bueno con la rexx... hice un sort para extraer solo el nombre de un job (desde le miembro WIAX8) con su descripcion (campos fijos) funciona correctamente con parametros en el jcl... pero con la rexx no tengo idea de como hacer leer el parametro que le paso...

este es el miembro WIAX8:

Código: Seleccionar todo

VFY APP      RESPONS                    AREA            CRITICA   CELL          
VFY WIAX8    name surname               AUTO.TEST       NO                      
VFY WIAX8    name surname.              AUTO.TEST       NO                      
VFY WIAX8    name.surname@dominio.com   AUTO.TEST       NO                      
VFY WIAX8    name1.surname1@dominio.com  AUTO.TEST      NO                      
VFY WIAX8    name2.surname2@dominio.com  HR.TEST        NO                      
VFY WIAX8    name1 surname1             HR.TEST         NO                      
VFY WIAX8    name2 surname2             DWH.TEST        NO                      
VFY WIAX8    name3 surname3             DWH.TEST        NO                      
VFY WIAX8    name4 surname4                             NO                      
VFY WIAX8    name5 surname5                             NO                      
VFY= CAMPO FISSO                                                                
                                                                                
========================================================================        
Description : APP WIAX8                                                         
======================================================================          
***********************************************************************         
JOBNAME* *DESCRIPTION JOB         *                *CLASS* *RC**RESTART*        
************************************************************************        
WIAX8PPR   WIAX8PPR                        WIAX8PPRMATIC    00   JOB            
WIAX8P05   WIAX8P05 exec script unzipp fileWIAX8P05MATIC          NO            
WIAX8P10   WIAX8P10 exec script to ftp log WIAX8P10MATIC          NO            
WIAX8P15   WIAX8P15 exec script .sh on servWIAX8P15MATIC          NO            
WIAX8P20   WIAX8P20 exec script .sh on servWIAX8P20MATIC          NO            
WIAX8P25   WIAX8P25 exec script .sh on servWIAX8P25MATIC          NO            
WIAX8P30   WIAX8P30 exec script .sh on servWIAX8P30MATIC          NO            
WIAX8P35   WIAX8P35 exec script .sh on servWIAX8P35MATIC          NO            
WIAX8TSX   WIAX8TSX                        WIAX8TSXMATIC    00   JOB            
este el el sort

Código: Seleccionar todo

//Z99PPSOR  JOB  CLASS=0,MSGCLASS=8,NOTIFY=&SYSUID                      
//********************************************************************* 
//LIBTOSEQ PROC                                                         
//********************************************************************* 
//DELE01   EXEC PGM=RASDELET                                            
//SYSPRINT DD  SYSOUT=*                                                 
//SYSIN    DD  *                                                        
  DELETE DSNAME=Z99.Z99PPSOR.SORTPP01.SORTOUT.WIAX8                     
//*-----------------------------------------------------------          
//********************************************************************* 
// SET SJOB='WIAX8P30'                                                  
//********************************************************************* 
//SORTPP01  EXEC  PGM=SORT,PARM='JP1"&SJOB"'                            
//SYSOUT    DD SYSOUT=*                                                 
//SORTIN    DD DSN=EU28735.SCRIPT.TEXT(&MBR),DISP=SHR                   
//SORTOUT   DD DSN=Z99.Z99PPSOR.SORTPP01.SORTOUT.&MBR,                  
//            DISP=(NEW,CATLG,DELETE),                                  
//            DCB=(RECFM=FB,LRECL=080,BLKSIZE=0),                       
//            UNIT=SYSDA,SPACE=(CYL,(5,10),RLSE)                        
//SYSIN    DD  *                                                        
  OPTION COPY                                                           
  INCLUDE COND=(01,08,CH,EQ,JP1)                                        
  OUTREC FIELDS=(01,51)                                                 
  END                                                                   
//ABEND001 EXEC PGM=RASABEND,COND=(0,EQ,SORTPP01),PARM='4001'           
//********************************************************************* 
//         PEND                                                         
//*******************************************************************   
//WIAX8    EXEC LIBTOSEQ,MBR=WIAX8                                      
//*                                                                     
funciona , el resultado es :

WIAX8P30 WIAX8P30 exec script .sh on servWIAX8P30

el problema se me da, al momento de quererlo hacer con la rexx.. (lenguaje rexx)

como parametro de exec hago:

Código: Seleccionar todo

//EXECREXX EXEC PGM=IKJEFT01,PARM='REPPSORT &PARM1',REGION=0M
y

Código: Seleccionar todo

//WIAX8    EXEC LIBTOSEQ,PARM1=WIAX8P15,MBR=WIAX8
en la rexx

Código: Seleccionar todo

parse arg PARM1
 say parm1
con el say logro ver el valor del parametro en el jcl...

pero me bloque ahi y no se como continuar...

practicamente me serviria donde encuentro el PARM1 (nombre del job) (PARM1=WIAX8P15) de columna 1 a 10 que cree el FILEOUT esa linea desde la 1 hasta la 51... bueno lo que hace el sort...

alguna idea?...

gracias nuevamente por tu ayuda y tiempo...

Italo.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 09 Abr 2015, 08:34

Hola italo:
A continuación te doy algunos ejemplos de REXX que te pueden ayudar a hacer lo que necesitas (lo cual no me queda muy claro)

Ejemplo 1:
Código REEX para acceder y leer/escribir el miembro de una librería, teniendo en cuenta que:
el nombre del miembro está en la variable member y el nombre de la librería es el valor de la variable llamada librería.
Estas instrucciones no necesitan escribir DDs en el JCL.

Código: Seleccionar todo

"FREE FILE("member")"                              
"ALLOC FILE(MIEMBRO) DSNAME('"libreria"("member")')"
"EXECIO DISKR * DISKR MIEMBRO (STEM ..... "
En general en un REXX, con la sentencia ADDRESS podrás utilizar cualquier mandato TSO, ISPF, EDITOR, etc.
En este ejemplo por defecto es ADDRESS TSO

Ejemplo 2:
Ejecución en batch de un REXX con pase de parámetros. Esto lo haces pero te doy otro modo.
Efectivamente, lo parámetros se leen con la instruccion: PARSE ARG

Código: Seleccionar todo

//REXCONFJ EXEC PGM=IKJEFT01,DYNAMNBR=30,REGION=4096K 
//SYSEXEC DD DSN=VICENTE.LIBRERIA.JCL,DISP=SHR        
//* aquí las DD que se necesiten
//SYSTSPRT DD SYSOUT=B,LRECL=200                      
//SYSTSIN DD *                                        
 %REXPRUE parametros-fijos                                              
/*


Ejemplo 3:
Uso del SORT desde entro de un REXX, ejecutado en batch.
En este caso el JCL deberá describir todas las DDs que necesiten, tanto el REXX como el SORT.
SYS1.SICELINK debe estar en STEPLIB .

Código: Seleccionar todo

'DROPBUF'                    
"CALL 'SYS1.SICELINK(SORT)'"
Ejemplo 3:
REXX que llama al SORT pero que, al no tener JCL con las DDs que necesita el SORT, hace alloc previo.

Código: Seleccionar todo

/* REXX  ejemplo de uso de SORT. Entrada VSAM y salida secuencial*/    
sortin  = "'WORKP.ENTRADA'"                                             
sortout = "'WORKP.REXPRU1.VICENTE.SORTOUT'"                            
sysout  = "'WORKP.REXPRU1.VICENTE.SYSOUT'"                             
sysin   = "'WORKP.REXPRU1.VICENTE.SYSIN'"                              
                                                                       
"ALLOC FILE(SORTIN) DSNAME("sortin") SHR" ,                            
                                                                       
/* ALLOC de la salida del SORT  */                                     
"DELETE ("sortout") PURGE"                                             
"FREE FILE(SORTOUT)"                                                   
"ALLOC FILE(SORTOUT) DSNAME("sortout") " ,                             
    "BLKSIZE(5000) LRECL(50) RECFM(F,B) NEW KEEP SPACE(1,1) CYLINDERS" 
                                                                       
/* ALLOC de SYSOUT del SORT  */                                        
"DELETE ("sysout") PURGE"                                              
"FREE FILE(SYSOUT)"                                                    
"ALLOC FILE(SYSOUT) DSNAME("sysout") " ,                               
    "BLKSIZE(300) LRECL(300) RECFM(F,B) NEW KEEP SPACE(1,1) CYLINDERS" 
                                                                       
/* Creación del fichero de parametros del SORT */                      
"DELETE ("sysin") PURGE"                                               
"FREE FILE(SYSIN)"                                                     
"ALLOC FILE(SYSIN) DSNAME("sysin") " ,                                 
       "BLKSIZE(80) LRECL(80) RECFM(F) NEW SPACE(1,1) TRACKS"
"DROPBUF"                                                    
PUSH " SORT FIELDS=(1,10,CH,A)"                              
"EXECIO 1 DISKW SYSIN"                                       
"DROPBUF"                                                    
"EXECIO 0 DISKW SYSIN (FINIS"                                
'DROPBUF'                                                    
"CALL 'SYS1.SICELINK(SORT)'"                                 
'DROPBUF'                                                    
"EXECIO 1 DISKR SORTOUT (FINIS STEM VAR."                    
LINEA = VAR.1                                                
SAY "LINEA LEIDA: " LINEA                 
Sigo pensando que tu solución podría ser un JCL batch, con varios pasos.
Espero que los ejemplos de arriba te ayuden a aumentar tus posiblidades en tu REXX-
Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 13 Abr 2015, 04:14

hola Vicente, gracias por tu respuesta y tu ayuda, sobre el sort al final si
bien funcionaba en el jcl preferi y logre hacerlo con un codigo de rexx... bueno
sera sencillo para ti pero para mi fue un logro al momento que me funcione
hehehehehehehe... practicamente me servio el contenido de la linea (columna 1 a
51) en la cual encontraba el parametro que le pasaba... (d columna 1 a 9) el
nombre de un job y luego me copia la linea y lo ponia en un fileout... esta
linea sera el tituto del email automatico que estoy creando para q sea enviado
desde mainframe... (luego t describo que deseo hacer) sin duda como me
recomiendas usare un batch jcl..

bueno este es el codigo para escribir la linea cuando encuentra el parametro que
le paso....

Código: Seleccionar todo

                                                                          
                                                                                
/* rexx */                                                                      
say 'inizio rexx'                                                               
   parse arg PARM1                                                              
say 'parm da jcl :' parm1                                                       
/******************************************************************************/
address tso "execio * diskr fileinp (stem fileinp. finis"         /*legge file*/
if rc>0 then exit 12                                                            
out = 0                                                                         
do in=0 to fileinp.0                                                            
    IF substr(fileinp.in,1,9) = PARM1 THEN DO                                   
      jobname = substr(fileinp.in,1,51)                                         
      out=out+1                                                                 
      filxoggm.out = 'SUBJECT: 'jobname                                         
      filxoggm.0   = out                                                        
      say ' - nome out :' 'SUBJECT:' jobname                                    
    end                                                                         
end                                                                             
/******************************************************************************/
address tso "execio * diskw filxoggm (stem filxoggm. finis" /*scrive out*/      
if rc>0 then exit 12                                                            
say ' ****************************** '                                          
say ' - nome out :' 'SUBJECT:' jobname                                          
say 'fine rexx'                                                                 
exit                                                                            


al final concadene 'SUBJECT:' con el resultado para obtener el file de output
que lo paso al momento de mandar el email...

otra cosa , sobre la rexx anterior que necesitaba y realize para eacribir los
responsables y cmarea de la aplicacion al final me cree 2 output...

- en uno puse solo los responsables de la aplicacion
- y en otro solo los cmarea (cliente manager)

de esta manera si en algun futuro cambian en q orden manda los email pues ya
tengo los output creados...

bueno, te explico lo que deseo hacer, debo de enviar en automatico desde
mainframe , lo podra hacer con en SUB de un job o con un Panel, el email debe de
tener las siguiente caracteristicas:

en un miembro tengo la informacion de la aplicacion es decir:

- nombre de la aplicacion
- nombre de los responsables de la aplicacion (comlumna respons)
- nombre de los jefes de area. (columna cmarea)
- nombre de los jobs con su descripcion (columna de 1 a 9 fija)
- el flow de la aplicacion
- nombre special resource
- notas para los schedelur
- notas para los operadores.
- sucesores y predecesores...
- si crea output para imprimir...

en el email automatico que debo de generar debera tener la siguente informacon:

campo TO: los responsables de la aplicacion (RESPONS) FILEOUT RESPONS
campo TO: los jefes de area (CMAREA) FILEOUT CMAREA
campo FROM: email fija
campo CC: email fija
campo CCn: email fija
campo SUBJECT: aqui le paso el fileout que creo con la rexx con el nombre del
job + su descriptcion
campo DATA: informacion fija (el job xxxxx esta en abend, etc etc etc) usare el
lenguaje MIME text/htlm para "formatiar" el texto

ya tengo casi todo, solo me faltaria algunas cosas....

he visto que la rexx puede creare sequenziales o miembros con lineas que le doy
fijas... es decir con el "queue" para escribir... tienes algun ejemplo???
xfavor..

otra cosa... de que manera puedo agregar a un file input una linea??


osea, tengo el FILEINP con este contenido


nombre apellido 1
nombre apellido 2
nombre apellido 3
nombre apellido 4
nombre apellido 5

convertirlo en

nombre.apellido.1@dominio.com
nombre.apellido.2@dominio.com
nombre.apellido.3@dominio.com
nombre.apellido.4@dominio.com
nombre.apellido.5@dominio.com

osea quitarle los espacion " " y sostituirlos con un "." y agragarle @
dominio.com si esq no hay ninguno otro @dominio.com ya presente en la linea...

es que algunos responsables son externos al cliente (sociedades de consulting) y
ya tienen el email entero....

alguna idea?

gracias nuevamente... y disculpa tanta pregunta.. seguire haciendo las
pruebas...

salu2

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 14 Abr 2015, 07:38

hola Vicente, con varias pruebas logro hacer eso de los espacios " "

este es el codigo

Código: Seleccionar todo

address tso "execio * diskr CMAREAIN (stem CMAREAIN. finis" 
 if rc>0 then exit 12 
 CMAREAIN.1 = TRANSLATE(CMAREAIN.1) 
 domain = "§domain.com" 
 out = 0 
do in=1 to CMAREAIN.0 
      nincm = SPACE(CMAREAIN.in,1,'.')domain 
      out=out+1 
      CMAREAEM.out = nincm 
      CMAREAEM.0   = out 
      say ' - new string without space:' nincm 
end
asi logre de esto:

Código: Seleccionar todo

    abcd efgh 
      abcd efgh 
            abcd efgh ij 
        abcd efgh ij
a esto:

Código: Seleccionar todo

abcd.efgh§domain.com 
abcd.efgh§domain.com 
abcd.efgh.ij§domain.com 
abcd.efgh.ij§domain.com
que es justo lo que deseaba...

ahora solo me falta la parte de generar los email ...

creo q los comandos push y pull me puede ayudar...

practicamente esto:

Código: Seleccionar todo

abcd.efgh§domain.com 
abcd.efgh§domain.com 
abcd.efgh.ij§domain.com 
abcd.efgh.ij§domain.com
deberia convertirse con uso de parametros o por cada linea del fileout en:

Código: Seleccionar todo

RCPT TO:<abcd.efgh§domain.com> 
RCPT TO:<abcd.efgh§domain.com> 
RCPT TO:<abcd.efgh.ij§domain.com> 
RCPT TO:<abcd.efgh.ij§domain.com>

seguire provando, gracias por la ayuda.

salu2

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 15 Abr 2015, 11:58

Hola Italo,
Hoy no tengo tiempo para extenderme, así es que disculpa mi brevedad; mañana será mejor día.

Ejemplo para escribir LINEA.1 (la primera ocurrencia de la tabla LINEA.) en un fichero:
"EXECIO 1 DISKW FICHERO (STEM LINEA."

Ejemplo para escribir todas las ocurrencias de tabla LINEA. en un fichero:
"EXECIO * DISKW FICHERO (STEM LINEA."

Ejemplo para escribir el contenido de una variable en un fichero:
"DROPBUF"
PUSH variable
"EXECIO 1 DISKW FICHERO"

Ejemplo para escribir el contenido de varias variables, cada una en un registro del fichero, en un fichero:
"DROPBUF"
PUSH variable1
PUSH variable2
PUSH variable3
"EXECIO * DISKW FICHERO" o "EXECIO 3 DISKW FICHERO"
Cuidado que creo recordar que se graban en orden inverso a de las sentencias PUSH (LIFO)

Si tienes problemas para enviar el email, lo comentamos
Ahora he de desconectarme.

Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 20 Abr 2015, 18:45

hola Vicente, gracias nuevamente por la respuesta, bueno al parecer estaba bastante equivocado, pensado en usar los comandos push y pull, he resulto usando "valores" fijos, nose si es equivocado usarlo o declararlos al interno de la rexx... aqui dejo el codigo..

lo que necesitaba era quitar los espacios y agregar "RCPT TO:" y "TO:" me estaba haciendo bolas en como ponerlos en un solo fileout, pero luego pensandolo mejor decidi crear 2 fileout para enviar los email uno con "RCPT TO:" y el otro con "TO:"

nombre =

Código: Seleccionar todo

abc def       
    efg hij   
 klm nop qrs  
para fileout1

Código: Seleccionar todo

nambrerc = "RCPT TO:<"SPACE(nombre,1,'.')"@domain.com>"
fileout1.oucm =  nambrerc 
fileout1.0=oucm
resultado fileout1

Código: Seleccionar todo

RCPT TO:<abc.def@domain.com>    
RCPT TO:<efg.hij@domain.com>    
RCPT TO:<klm.nop.qrs@domain.com>
y

para fileout2

Código: Seleccionar todo

nombreto = "TO:"SPACE(nombre,1,'.')"@domain.com"
fileout2.oucm =  nombreto 
fileout2.0=oucm
resultado fileout2

Código: Seleccionar todo

TO:abc.def@domain.com      
TO:efg.hij@domain.com      
TO:klm.nop.qrs@domain.com  
de esta manera cada fileout lo paso a la proc para el envio del email...

ahora estoy probando eso de los panales ispf, necesito crear un panel donde debere escribir 2 parametros... seguire probando

salu2 y gracias de todo.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 21 Abr 2015, 05:30

Hola italo:
Me alegro de que hayas terminado resolviendo tu problema.
Respecto a lo de los paneles ISPF te podría proporcionar algún ejemplo, de los hechos or mi.
Pero mejor que sea en otro hilo.
Si creas uno nuevo y necesitas ayuda, allí nos "veremos"

Un saludo y hasta otra ocasión
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 21 Abr 2015, 06:52

hola Vicente, gracias, luego abrire un nuevo tema en esta seccion para exponerte mis dudas sobre los paneles..

ahora, se me ocurre preguntar otra cosa, de que manera puego guardar los fileout pero en lugar de secuenciales guardarlos como miembros de una libreria...???

gracias por tu disponibilidad.

salu2

Responder