viernes, 2 de diciembre de 2016

HOST - cómo tener un emulador HOST

Os dejo el siguiente link (http://www.hercules-390.eu/) en donde se explica como descargar y configurar un PC como emulador de HOST System/370, ESA/390 y z/Architecture Emulator.


miércoles, 2 de noviembre de 2016

Cobol: Utilizar cursor en un programa

En ocasiones tenemos que utilizar cursores en los programas cobol. Así que en esta entrada aprenderemos a declarar y utilizar los cursores en un programa cobol.

La declaración de un cursor no es más que definir una SELECT a una tabla. Dicha consulta puede devolvernos 0, 1 o más filas; todo depende de si existe en la tabla alguna/s fila/s que cumpla/n o no la cláusula WHERE definida.

Lo primero de todo es definir el cursor en la WORKING-STORAGE SECTION del programa cobol tal y como se indica a continuación:

          EXEC SQL
             DECLARE CURSOR CUR_TABLA FOR
              SELECT CAMPO1,
                         CAMPO2,
                         CAMPO3,
                         CAMPO4,
                         CAMPO5
                FROM TABLA1
               WHERE CAMPO1 = :TABLA1.CAMPO1
                   AND CAMPO2 > :TABLA1.CAMPO2
               ORDER BY CAMPO1, CAMPO2
          END-EXEC

También declararemos un switch:

          01 SW-FIN-CURSOR.
              05 SI-FIN-CURSOR             PIC X(01) VALUE 'S'.
              05 NO-FIN-CURSOR            PIC X(01) VALUE 'N'.

Hay tres operaciones básicas que podemos hacer con un cursor:
  • Apertura del cursor: OPEN <Nombre_del_cursor>
  • Lectura del cursor: FETCH <Nombre_del_cursor>
  • Cierre del cursor: CLOSE <Nombre_del_cursor>

En el programa existirán 3 párrafos que realizarán dichas operaciones:

     APERTURA-CURSOR.

         SET NO-FIN-CURSOR TO TRUE
         MOVE ENT-CAMPO1   TO CAMPO1 OF TABLA1
         MOVE ENT-CAMPO2   TO CAMPO2 OF TABLA1

           EXEC SQL
              OPEN CUR_TABLA
           END-EXEC.

         IF SQLCODE NOT EQUAL ZEROES
             PERFORM FIN-ERR-DB2
         END-IF.

     LECTURA-CURSOR.

           EXEC SQL
              FETCH CUR_TABLA
                 INTO :TABLA.CAMPO1,
                            :TABLA.CAMPO2,
                            :TABLA.CAMPO3,
                            :TABLA.CAMPO4,
                            :TABLA.CAMPO5
           END-EXEC.

         EVALUATE SQLCODE
             WHEN ZEROES
                  CONTINUE
             WHEN +100
                  SET SI-FIN-CURSOR TO TRUE
             WHEN OTHER
                  PERFORM FIN-ERR-DB2
         END-EVALUATE.

     CIERRE-CURSOR.

           EXEC SQL
              CLOSE CUR_TABLA
           END-EXEC.

         IF SQLCODE NOT EQUAL ZEROES
             PERFORM FIN-ERR-DB2
         END-IF.

Nota: ENT-CAMPO1 y ENT-CAMPO2 serán dos variables previamente declaradas en el programa cobol y tienen que ser del mismo tipo que las variables CAMPO1 y CAMPO2 de la tabla TABLA1. Ambas variables deberán contener algún valor válido (espacios o 'CAD' si son alfanuméricos, ceros o 59 si son numéricos, ect).  También se podría haber asignado valores dichos valores directamente sin la utilización de variables auxiliares.

Cuando se realice el PROCESO en el programa cobol, tendremos algo como lo siguiente:

          PERFORM APERTURA-CURSOR
          PERFORM LECTURA-CURSOR

          PERFORM TRATAMIENTO-CURSOR
               UNTIL SI-FIN-CURSOR

          PERFORM CIERRE-CURSOR

En el párrafo TRATAMIENTO-CURSOR se ejecutará el código que se tenga que ejecutar con el objetivo de tratar la información leída del cursor y por último se ejecutará una lectura del cursor. Es decir, tendríamos algo como lo siguiente:

     TRATAMIENTO-CURSOR.

          <<Sentencias>>
          PERFORM LECTURA-CURSOR.

Esto ha sido todo, espero que te haya servido de ayuda.

viernes, 7 de octubre de 2016

viernes, 2 de septiembre de 2016

Jcl: Comprimir una librería

Podemos comprimir una librería de la siguiente manera:

1) Ir a la opción 3.4 del ISPF.

2) Aparece una pantalla en la que pondríamos la librería en cuestión. Pulsamos INTRO.

3) Tras pulsar nos situamos en una pantalla en la que aparece algo como:

     ----------------------------------------------------
                <<librería-indicada>>
    ***********End of Data Set list***********

4) Estando ahí (en lo indicado en el punto 3), sólo tenemos que poner Z al lado del nombre de la librería. Pulsamos INTRO y ya tendríamos la librería comprimida.

Hasta aquí todo muy fácil pero podemos enfrentarnos al hecho de comprimir una librería en la que no podemos hacer esto debido a que si lo hacemos aparece un mensaje de error que nos dice lo siguiente: Data set in use. Pues bien, llegados a este punto, ¿qué haríamos? Muy fácil, ejecutar el siguiente jcl:

//XXXXXXXX JOB (20,000),'COMPRIMI',NOTIFY=XXXXXX,                 
//             CLASS=T,MSGCLASS=X                                 
//************** COMPRIMIR LIBRERIA *************************
//COMPRIM EXEC PGM=IEBCOPY,REGION=1024K
//SYSPRINT DD  SYSOUT=*                          
//I        DD  DISP=SHR,DSN=EJEM.LIBR.COMP  
//SYSUT3   DD  SPACE=(CYL,(2,1))     
//SYSUT4   DD  SPACE=(CYL,(2,1))     
//SYSIN    DD  *                                       
     COPY OUTDD=I,INDD=I                              

En el DSN pondríamos la librería a comprimir. En nuestro ejemplo,  sería la librería EJEM.LIBR.COMPR

Si ejecutamos dicho jcl, terminaría correctamente y comprimiría la librería en cuestión.

viernes, 5 de agosto de 2016

Cobol: Utilizar cursor for update en un programa

En ocasiones tenemos que utilizar cursores en los programas cobol. En una entrada anterior ya vimos cómo se definían los cursores y cómo se manejaban (pinchar aquí para ver dicha entrada). 

También existen los cursores FOR UPDATE. Estos cursores se utilizan cuando queremos seleccionar una serie de filas de una tabla y modificar la información contenida en dichas filas. Así que en esta entrada aprenderemos a declarar y utilizar los cursores for update en un programa cobol.

La declaración de un cursor no es más que definir una SELECT a una tabla. Dicha consulta puede devolvernos 0, 1 o más filas; todo depende de si existe en la tabla alguna/s fila/s que cumpla/n o no la cláusula WHERE definida.

Lo primero de todo es definir el cursor en la WORKING-STORAGE SECTION del programa cobol tal y como se indica a continuación:

          EXEC SQL
             DECLARE CURSOR CUR_TABLA FOR
              SELECT CAMPO1,
                         CAMPO2,
                         CAMPO3,
                         CAMPO4
                FROM TABLA1
               WHERE CAMPO1 = :TABLA1.CAMPO1
               FOR UPDATE OF CAMPO2CAMPO3, CAMPO4
          END-EXEC

También declararemos el mismo switch de la entrada anterior, es decir:

          01 SW-FIN-CURSOR.
              05 SI-FIN-CURSOR             PIC X(01) VALUE 'S'.
              05 NO-FIN-CURSOR            PIC X(01) VALUE 'N'.

Se mantienen las tres operaciones básicas que vimos en la anterior entrada:
  • Apertura del cursor: OPEN <Nombre_del_cursor>
  • Lectura del cursor: FETCH <Nombre_del_cursor>
  • Cierre del cursor: CLOSE <Nombre_del_cursor>
En el programa existirán los 3 mismos párrafos vistos en la anterior entrada (APERTURA-CURSOR, LECTURA-CURSOR, CIERRE-CURSOR). Se incluirá un párrafo más para realizar la actualización de la información:

     ACTUALIZACION-CURSOR.

         EXEC SQL
              UPDATE TABLA1
                      SET CAMPO2 = :UPD-CAMPO2,
                              CAMPO3 = :UPD-CAMPO3,
                              CAMPO3 = :UPD-CAMPO4
                 WHERE CURRENT OF CUR_TABLA
           END-EXEC.

         IF SQLCODE NOT EQUAL ZEROES
             PERFORM FIN-ERR-DB2
         END-IF.

Nota: UPD-CAMPO2, UPD-CAMPO3 y UPD-CAMPO4 serán variables previamente declaradas en el programa cobol. Tienen que ser del mismo tipo que los campos CAMPO2, CAMPO3 y CAMPO4 de la tabla TABLA1. Las mencionadas variables deberán contener algún valor válido (espacios o 'CAD' si son alfanuméricos, ceros o 59 si son numéricos, ect).
De este modo no tendríamos que indicarle al UPDATE la clave del registro a actualizar, pues actualizaría el registro recuperado por el FETCH.

Cuando se realice el PROCESO en el programa cobol, tendremos algo como lo siguiente:

          PERFORM APERTURA-CURSOR
          PERFORM LECTURA-CURSOR

          PERFORM TRATAMIENTO-CURSOR
               UNTIL SI-FIN-CURSOR

          PERFORM CIERRE-CURSOR

En el párrafo TRATAMIENTO-CURSOR se ejecutará el código que se tenga que ejecutar con el objetivo de tratar la información leída del cursor y por último se ejecutará una lectura del cursor. Es decir, tendríamos algo como lo siguiente:

     TRATAMIENTO-CURSOR.

          <<Sentencias>>
          PERFORM ACTUALIZACION-CURSOR
          PERFORM LECTURA-CURSOR.

Esto ha sido todo, espero que te haya servido de ayuda.

jueves, 2 de junio de 2016

Jcl: Cómo realizar búsquedas

Imagínate que quieres hacer una búsqueda masiva de algún elemento o mensaje en todos los programas cobol que hay en producción e incluso en las cadenas o copys de producción. Pues es tan fácil como lanzar (o submitir) en desarrollo el siguiente jcl:

//SEARCH EXEC PGM=ISRSUPC,PARM(SRCHCMP,'ANYC')
//NEWDD  DD DSN=LIBRERIA1,DISP=SHR
//               DD DSN=LIBRERIA2,DISP=SHR
//               DD DSN=LIBRERIA3,DISP=SHR
//OUTDD   DD SYSOUT=(X)
//SYSIN    DD *
   SRCHFOR 'CADENA-A-BUSCAR'
/*

Cabe destacar el área del NEWDD: ahí irán todas las librerías de producción que contengan programas cobol, copys, cadenas,... en las que queramos realizar la búsqueda. Cabe destacar que en función del cliente para el que estemos trabajando estas librerías serán distintas de un sitio a otro. Es decir, si estamos en un cliente X la librería de las cadenas se llamará de una forma pero en un cliente Y se llamará de otra forma. Y con el resto de las librerías pasa exactamente lo mismo. Por lo tanto, en función del cliente en el que estés, las librerías que pongas aquí variarán.

Otra cosa importante es el SRCHFOR porque a continuación pondrás entre comillas aquello que quieras buscar en las librerías indicadas en el NEWDD.

De manera que sólo tendrías que hacer un SUB, es decir, submitir o lanzar dicha cadena en desarrollo para saber qué elementos utilizan dicha cadena que quieras buscar.

viernes, 6 de mayo de 2016

viernes, 1 de abril de 2016

Jcl: Generar un fichero para exportar a EXCEL

En ocasiones tenemos que generar por jcl un fichero para exportar posteriormente a Excel.

Podemos hacer dos cosas:

1º) Generar el fichero sin cabecera
2º) Generar el fichero con cabecera

Optar por el primer punto es lo más fácil porque sólo tendríamos que preparar un programa que generase un fichero de salida cuya copy o estructura sería algo como lo siguiente:

     01 W-REG-SALIDA.
          05 W-CAMPO1         PIC X(10).
          05 W-FILLER1          PIC X(01) VALUE ';'.
          05 W-CAMPO2         PIC X(10).
          05 W-FILLER2          PIC X(01) VALUE ';'.
           :
           :
          05 W-CAMPO9         PIC X(10).
          05 W-FILLER9          PIC X(01) VALUE ';'.

Cuando se ejecutase el programa en cuestión tendríamos un fichero del tipo:

     CAMPO1;CAMPO2;.....;CAMPO9;

De manera que podríamos descargar dicho fichero como un txt, y pasarlo a Excel de una vez que lo tuviéramos descargado en el equipo como txt.

Aunque optar por la segunda opción no significa mayor dificultad ni complejidad  pero sí habría que tener en cuenta alguna cosa. Veamos este caso en profundidad.

En este caso también tenemos que tener un programa que genere un fichero de salida con una estructura similar a la que acabamos de ver para la primera opción. Pero en este caso tenemos que tener en cuenta la longitud del fichero, y ¿por qué? Muy fácil, la respuesta está en relación al fichero que generemos con la cabecera. Es decir, tras ejecutar el programa que genere el fichero de salida con la estructura antes vista (contiene los datos separados por puntos y coma) se ejecutará el siguiente paso:

//PASOCAB     EXEC PGM=SORT
//SORTIN    DD *
//SORTOUT DD DSN=<<FICHERO-CABECERA>>,
//                DISP=(,CATLG,DELETE)
//                SPACE=(TKK,(10,1),RLSE),
//                DCB=(RECFM=FB,LRECL=621,BLKSIZE=27945)
//SYSOUT   DD SYSOUT=*
//SYSIN      DD *
   SORT FIELDS=COPY
   OUTREC FIELDS=(C'NOMB-COL1;',C'NOMB-COL2;',...C'NOMB-COLN;')



En el paso de SORT que acabamos de ver se genera un fichero con la cabecera que posteriormente tendrá la Excel. Cabe destacar lo siguiente: en el OUTREC FIELDS tenemos que, para incluir una nueva cabecera para encabezar una determinada columna, se debe poner

             C'NOMBRE-CABECERA;'

Y aquí viene lo importante: te tienes que fijar con qué longitud se genera este fichero. La longitud con la que se genere este fichero te la tienes que apuntar. Si has leído con atención, el fichero de salida generado en el programa ejecutado con anterioridad al paso antes mostrado debe tener la misma longitud que el fichero de cabecera generado en el paso de SORT que acabamos de ver.

Llegados a este punto tenemos dos ficheros:

  • Fichero de datos: generado por programa en el que tenemos la información requerida separada por puntos y comas, teniendo algo como lo siguiente CAMPO1;CAMPO2;.....;CAMPO9;
  • Fichero de cabecera: generado mediante un paso de SORT (ver el paso de SORT incluido), teniendo algo como lo siguiente CAB1;...;CAB9;

Lo último que tenemos que hacer es unir ambos ficheros en uno solo mediante un paso de SORT como el siguiente:


//PASOFEX     EXEC PGM=SORT
//SORTIN    DD DSN=<<FICHERO-CABECERA>>,DISP=SHR
//                 DD DSN=<<FICHERO-DATOS>>,DISP=SHR
//SORTOUT DD DSN=<<FICHERO-EXPORTAR-EXCEL>>,
//                 DISP=(,CATLG,DELETE)
//                 SPACE=(TKK,(10,1),RLSE),
//                 DCB=(RECFM=FB,LRECL=621,BLKSIZE=27945)
//SYSOUT   DD SYSOUT=*
//SYSIN      DD *
   SORT FIELDS=COPY

El resultado es un fichero en el que la primera línea es la cabecera (CAB1;...;CAB9;) y el resto de filas son los datos (CAMPO1;...;CAMPO9;). En este punto podríamos descargar el fichero resultante como un txt, y pasarlo a Excel de una vez que lo tuviéramos descargado en el equipo como txt.

En lugar de separar cada uno de los campos con el símbolo ; también existe otra variante que consiste en separar los campos mediante tabuladores. Para realizar esto tendríamos que definir el símbolo tabulador (X'05') de manera que en el programa cobol que generase el correspondiente fichero de datos tendríamos que tener una estructura como la siguiente:

     01 W-REG-SALIDA.
          05 W-CAMPO1         PIC X(10).
          05 W-FILLER1          PIC X(01) VALUE X'05'.
          05 W-CAMPO2         PIC X(10).
          05 W-FILLER2          PIC X(01) VALUE X'05'.
           :
           :
          05 W-CAMPO9         PIC X(10).

          05 W-FILLER9          PIC X(01) VALUE X'05'.

Esto ha sido todo por hoy. Espero que os haya resultado de utilidad.

viernes, 19 de febrero de 2016

Jcl: Condiciones de ejecución

En los pasos de los jcl's se puede poner condiciones para que dichos pasos se ejecuten o no se ejecuten. Tal como: COND=(0,NE) o COND=(4,LT)

Comencemos con el siguiente ejemplo de condición: COND=(0,NE)

El tema de las condiciones siempre ha sido mi eterna lucha: ¿qué condición pongo para que se ejecute el siguiente paso? En ocasiones he puesto una condición y no he conseguido que funcionase en la manera que quería. 

Tras poner la correspondiente cara de asombro, he tenido que cambiar la condición hasta que funcionase de la manera correcta. El poner la condición correcta era una cuestión de prueba y error....hasta hoy, día en el que he descubierto lo siguiente: la condición que pongas NO se tiene que cumplir para que el paso en cuestión se ejecute. Fíjate que lo he puesto en rojo porque es la idea principal para poner la condición correcta y, por tanto, el paso en cuestión se ejecute. Vamos a ver una serie de ejemplos en los que se cumpla esta idea.

Imagínate la típica cadena cuyo primer paso es el borrado de ficheros de trabajo o ficheros temporales. Un paso de ese tipo suele terminar con la sentencia SET MAXCC=0. Partiendo de la idea principal, ¿adivinas qué condición habría que poner al siguiente paso para que éste se ejecute?

¿Lo sabes? Tic, tac, tic, tac...va pasando el tiempo...Habría que poner lo siguiente: COND=(0,NE)

Es decir, supongamos que en un jcl hay dos pasos: el PASO1 que es el de borrado, el cual termina con la mencionada sentencia de SET MAXCC=0, y el paso PASO2 cuya condición es COND=(0,NE). ¿Por qué en este caso ponemos dicha condición? Muy sencillo. En el paso PASO1 estamos poniendo la sentencia SET MAXCC=0, lo que supone obligar a dicho paso que termine con código 0. Si queremos que el siguiente paso se ejecute debemos de poner la condición COND=(0,NE), que, si la interpretamos, significa NOT EQUAL 0. Y, ¿0 es distinto de 0? Nooooo, entonces se ejecuta el paso.

Ahora pasamos a otro ejemplo: cuando ejecutamos un paso de descarga de una tabla (También conocido como UNLOAD). Al ejecutarse dicho paso podemos obtener un fichero con datos o un fichero vacío (esto es muy típico cuando la SELECT ejecutada en el paso de descarga tiene cláusula WHERE y en la tabla que se está intentando descargar no existe ninguna fila que cumpla las condiciones del WHERE). Esto supone que podemos obtener dos posibles códigos: 0 si el fichero obtenido en la descarga contiene información o 4 si el fichero de descarga está vacío.

Llegados a este punto tenemos lo siguiente: el paso de UNLOAD puede devolver 0 si se ha descargado información (hemos obtenido un fichero con datos) o 4 si no se ha descargado información (hemos obtenido un fichero vacío). Teniendo en cuenta esto tenemos que preguntarnos con respecto al siguiente paso cuando éste ejecuta, por ejemplo, un programa que recibe en la entrada el fichero (con o sin datos) generado en la descarga de la tabla. Nos lo tenemos que preguntar porque nos puede interesar que sólo se ejecute si el código de retorno del paso de UNLOAD es 0 o que se ejecute indistintamente de que dicho código sea 0 ó 4. Si sólo queremos que se ejecute cuando el código de retorno del paso de UNLOAD sea 0 tenemos que poner la siguiente condición: COND=(0,NE). Imagino que recordarás el por qué (porque 0 no es igual a 0 y la condición no se cumple, como la condición no se cumple entonces se ejecuta el paso). Si queremos que se ejecute indistintamente de que el código de retorno del paso de UNLOAD sea 0 ó 4  tenemos que poner la siguiente condición: COND=(4,GT). GT es Greater Than (mayor que). Dado que ni 0 ni 4 son mayores que 4, no se cumpliría la condición y se ejecutaría el paso en cuestión. Sin embargo, las condiciones usadas en los pasos que se ejecutan a continuación de un paso de descarga tienen una particularidad: son la excepción que confirman la regla. ¿Por qué? Por que a pesar de lo que se acaba de explicar para los pasos ejecutados tras un paso de descarga (usar COND=(0,NE) o COND=(4,GT)) podemos usar también la siguiente condición: COND=(4,LT). Si usamos dicha condición en un paso que se ejecute después de un paso de UNLOAD tenemos que dicho paso se ejecutará con independencia del código devuelto por el paso de descarga. 

Hemos aprendido cuál es la regla general (jamás debes olvidarla) y cómo se aplica en diferentes casos así como las excepciones (que se dan cuando se ha ejecutado un paso de UNLOAD).


viernes, 5 de febrero de 2016

Humor - Modelo Cliente-Servidor

Si queréis un buen ejemplo para comprender totalmente qué es el modelo cliente-servidor, espero que la siguiente imagen os ayude.


viernes, 22 de enero de 2016

xpediter online

Lo primero de todo para poder pasar el xpediter con programas online es saber si dicho se programa se ha ejecutado. Y ¿cómo se sabe? pues muy fácil. Debemos ejecutar el siguiente comando en CICS:

                    CEMT S PROG(NOMB-PROG)

Siendo NOMB-PROG el nombre del programa online que queremos pasar por xpediter.

Tras ejecutar dicho comando debe aparecer en pantalla un mensaje en el que se indica el número de veces que se ha ejecutado el programa online.

Si no aparece eso es que todavía no se ha ejecutado. Y si no aparece....pues ya sabes, ejecuta dicho programa al menos una vez y así ya aparecería.

Llegados a este punto en el que ya aparece lo anterior, sólo tendríamos que ejecutar el siguiente comando: XPED NOMB-PROG (o XPE NOMB-PROG).

De una vez que se ha ejecutado dicho comando aparece una pantalla con el código del programa.

Lo primero de todo es poner un punto de ruptura (poner una B en la línea que queramos).

¿Ahora qué hacemos? Pulsamos PF3 tantas veces hasta que aparezca la pantalla principal. En esta pantalla se elegiría la opción 1 (1 - SESSION CONTROL). Aparece otra pantalla de la que se elegiría la opción 6 - TRAP SUMMARY. Aparece otra pantalla, de la cual, lo más importante es la primera fila, esa primera fila en la que hemos de indicar el nombre del programa bajo la columna PROGRAM. Acuérdate que dicho nombre debe coincidir con el que venga en el campo MODULE. En esa misma fila, y bajo la columna TRAP ABEND, debemos dejar el valor YES (y si no está puesto lo ponemos nosotros).

Pulsamos PF3 tantas veces como sea necesario hasta que volvamos a la pantalla principal. De una vez que estamos en la pantalla principal elegimos la opción 2 (2 - DEBUGGING FACILITIES) y aparece otra pantalla en la que elegimos la opción L - SOURCE LISTING. Tras elegir esa opción estamos en la pantalla del código del programa en la que tenemos el punto de ruptura.

Ya estamos preparados para lanzar el programa online y pasar el xpediter, así que lanzamos el programa. De una vez que está lanzado tenemos que ir al xpediter. Vamos a él y pulsamos PF9.

Ya tenemos la transacción parada y el programa online listo para ejecutarlo por xpediter. A partir de aquí sería igual que cuando empleamos el xpediter para el batch, me refiero a que es igual en lo siguiente:


1) Si das PF9 estarías ejecutando línea a línea.
2) Si das PF12 irías al final del programa y lo finalizarías. A menos que no 
    hubieras puesto previamente un punto de ruptura, en cuyo caso iría a
    dicho punto de ruptura.
3) ¿Cómo se pone un punto de ruptura? Poniendo una B en aquella línea a la
    que queremos ir directamente.
4) Si ponemos SS al inicio de una línea y otra vez SS varias líneas después lo
    que haríamos sería que esas líneas de código no se ejecutarían.
5) Si estamos en un determinado punto del programa y queremos ir varias 
    líneas hacia atrás, ¿cómo se hace? Poniendo GT al inicio de la línea a la 
    que queramos retroceder.

Cuando acabamos de utilizar el xpediter en el online tenemos que hacer lo siguiente: pulsar PF3 tantas veces como sea necesario hasta que aparezca la pantalla en la que pregunta por finalizar sesión.

Tanto en END SESSION como en DUMP OPTION ponemos YES. Pulsamos intro y nos hemos salido del xpediter volviendo de nuevo al CICS. Aparece mensaje de confirmación.

Pues esto es el xpediter para online. Espero que te haya servido de ayuda, si tienes alguna duda no dudes en preguntar.

viernes, 8 de enero de 2016

Humor - Lo que cada uno entiende en un proyecto


Esto es un ejemplo de lo que cada uno entiende, a lo largo de un proyecto, de lo que realmente necesitaba el usuario.