Desarrollando en Cobol y Natural sobre Plataforma Mainframe

jueves, 1 de agosto de 2013

Compilador completo para objetos Cobol

A diferencia de otros lenguajes, en Cobol hay que reconocer que la función de compilación es un poco más compleja de lo que sería recomendable. Pero bueno, al fin y al cabo, es una tarea que sólo hay que preparar al principio, cuando configuramos nuestro entorno. Luego es sencillo lanzar la función una y otra vez.

El compilador de Cobol normalmente se compone de 3 partes: COMPILE, LINK y GO. Cuando preparemos nuestro JCL de compilación, tendremos que tener en cuenta que debemos proporcionar toda la información necesaria para que puedan completarse los 3 pasos.



Mostramos a continuación cómo sería un JCL con el que se podría realizar la compilación completa (COMPILE, LINK y GO) de un programa Cobol que no contenga accesos DB2 (más adelante, en otro post, indicaremos cómo se pueden realizar las compilaciones con DB2).

Sería lo siguiente para compilar, por ejemplo, el programa JJ0004CB.

//JJCOM1CL JOB 102,'COMPILADOR COMPLETO',NOTIFY=&SYSUID,           
//  MSGCLASS=Q,CLASS=A,MSGLEVEL=(1,1),REGION=0M,TIME=(0,7)         
//**************************************************************   
//* SYSLIB  ES LA LIBRERIA DE COPYS      
//* SYSIN   ES LA LIBRERIA DE FUENTES                        
//* SYSLMOD ES LA LIBRERIA DE EJECUTABLES          
//**************************************************************   
//STEP0          EXEC IGYWCLG,PARM.COBOL='LIB,APOST,XREF,MAP,OFFSET'
//* LIBRERIA EN LA QUE SE ENCUENTRA EL COMPILADOR IGYCRCTL         
//COBOL.STEPLIB  DD DSN=IGY410.SIGYCOMP,DISP=SHR                   
//* LIBRERIA DE FUENTES                                            
//COBOL.SYSIN    DD DSN=LIBPR.FUENTES.JJ00(JJ0004CB),DISP=SHR      
//* STEPLIB      DD DSN=LIBPR.MODULOS.JJ00,DISP=SHR                
//* AÑADIMOS COPYS Y MODULOS PARA PASO LKED DE IGYWCL (PGM HEWL)   
//LKED.SYSLIB    DD DSN=CEE.SCEELKED,DISP=SHR                      
//               DD DSN=LIBPR.COPYS.JJ00,DISP=SHR                  
//LKED.SYSLMOD   DD DSN=LIBPR.MODULOS.JJ00(JJ0004CB),DISP=SHR      
//                                  
                               

Saludos.

miércoles, 31 de julio de 2013

Comprimir Libreria de Objetos en ISPF

Uno de los problemas típicos con los que se encuentra el desarrollador de Cobol es el consistente en el llenado de alguna de sus librerías de Objetos. Cuando esto ocurre, al intentar realizar un SAVE sobre cualquier objeto contenido en ella se obtiene un error de SYSTEM ABEND '0E37'.

IEC032I E37-04,IFG0554P,IBMUSER,DBSPROC,ISP11417,0A80,ZARES1,LIBPR.FUENTES.JJ00
***  
                                                                      

Para solucionar este problema, podemos realizar 3 posibles actuaciones sobre nuestra librería:

1) Comprimir el contenido de la librería, liberando espacio de la misma.

2) Ampliar el espacio de la librería.

3) Ampliar los bloques del directorio.

En el post que nos ocupa vamos a indicar cómo se puede acometer la primera solución propuesta, esto es, la compresión del contenido de la misma.

Una librería se puede comprimir de dos formas diferentes:

A) Opción 3.1 del ISPF

Se accede a la opción 3 del ISPF.

3  Utilities     Perform utility functions        

Y, a continuación, a la opción 1.

1  Library     Compress or print data set.  Print index listing.  Print, rename, delete, browse, edit or view members        

En la pantalla accedida se inserta el comando "C" en la línea "Option" y en el apartado "ISPF Library" se introduce el nombre de la librería que deseamos comprimir.



Tras pulsar INTRO, si todo ha ido correctamente se mostrará el mensaje:

Compress successful

B) Opción 3.4 del ISPF

Se accede a la opción 3 del ISPF.

3  Utilities     Perform utility functions        

Y, a continuación, a la opción 4.

4  Dslist      Print or display (to process) list of data set names. Print or display VTOC information               

Posteriormente, indicamos las librerías que queremos que se visualicen en la línea "Dsname Level". Por ejemplo, en nuestro caso introduciremos LIBPR*.

Enter one or both of the parameters below:
   Dsname Level . . . LIBPR*             
   Volume serial  . .                   


En la pantalla mostrada, introducimos el comando "Z" a la izquierda de la librería que deseamos comprimir.



Tras la ejecución, si todo ha ido bien, se mostrará el mensaje:

Compress successful

Tras realizar esta acción, ya no deberíamos tener problemas a la hora de almacenar más información en nuestra librería. Si, a pesar de ello, continuamos teniendo problemas de espacio, entonces no nos quedará más remedio que recurrir a las soluciones 2º ó 3º mencionadas más arriba (Ampliar el espacio de la librería o Ampliar los bloques del directorio). Pero esto ya lo veremos en un post aparte.

Saludos.

lunes, 29 de julio de 2013

Modificar un Registro en una Tabla DB2

Para actualizar un registro en una Tabla DB2 hay que recurrir a la sentencia UPDATE de SQL. Este comando nos permite actuar con precisión y elegir los datos que deseamos que sean modificados en el registro elegido, sin que por ello tengan que verse afectados el resto de campos.

 

UPDATE JJCLIEM0 
  SET (OBSERVACIONES,FECHA) =
  ('FINAL',CURRENT TIMESTAMP)              
  WHERE CLIENTE = 10;                                     
        

Para la correcta ejecución de esta sentencia tendremos que incluir el comando UPDATE seguido por el nombre de la tabla afectada.

UPDATE JJCLIEM0 

A continuación, se incluirá la cláusula SET seguida por el nombre de los campos (entre paréntesis) que van a ser modificados.

  SET (OBSERVACIONES,FECHA) = 

Posteriormente, se indicarán (entre paréntesis) los valores con los que van a ser actualizados los campos indicados anteriormente.

  ('FINAL',CURRENT TIMESTAMP)  

Finalmente, tendremos que añadir la cláusula WHERE para indicarle a la sentencia cuál (o cuales) es el registro que se va a ver afectado por el cambio indicado más arriba.

  WHERE CLIENTE = 10;

Una vez terminada la ejecución, la consulta realizada en QMF nos arrojará el registro con los nuevos valores indicados. En el ejemplo anterior vemos que ya aparece el valor "FINAL" en el campo OBSERVACIONES. 

OBSERVACIONES FECHA                    
------------- -------------------------

INICIAL       2013-07-24-10.50.22.2171

-             2013-07-25-10.22.26.4672

-             2013-07-25-10.43.08.6969

FINAL         2013-07-25-11.12.17.5948 

Por último, puntualizar que si únicamente quisiéramos actualizar un campo del registro, entonces no sería necesaria la inclusión de los paréntesis en la sentencia. La cosa quedaría así, por ejemplo:

UPDATE JJCLIEM0 SET OBSERVACIONES = 'FINAL'
  WHERE CLIENTE = 10;   
                   

Saludos.


domingo, 28 de julio de 2013

Insertar Registro en Tabla DB2

Para insertar registros nuevos en una tabla DB2, bastará con recurrir a la conocida sentencia INSERT de SQL. Nos bastará con realizar la ejecución del comando en la herramienta QMF y así nos quedará dado de alta el nuevo registro en el Fichero seleccionado.

 

INSERT INTO JJCLIEM0 
(CLIENTE,
NOMBRE,
APELLIDO1,
APELLIDO2,
ALTURA,
PESO,
IMC,
FECHA)
VALUES 
(3,
'MARINA',
'GUTIERREZ',
'ARAGON',
1.60,
60.00,
23.43,
CURRENT TIMESTAMP);

Para ejecutar correctamente la sentencia, en primer lugar tendremos que incluir el comando INSERT INTO seguido del nombre de la Tabla en la que queremos insertar el registro.

INSERT INTO JJCLIEM0 

A continuación tendremos que enumerar, entre paréntesis, todos los campos para los que vamos a insertar algún dato en el nuevo registro a crear.

(CLIENTE,

Después incluiremos la cláusula VALUES y, finalmente, entre paréntesis, los valores asociados (para el registro afectado) a cada uno de los campos mencionados previamente.

VALUES 
(3,

Tras la ejecución de la sentencia INSERT, el registro debería quedar dado de alta en la Tabla DB2. En el ejemplo anterior, la SELECT de SQL nos arrojaría el nuevo registro creado.

        CLIENTE  NOMBRE                APELLIDO1          
  -------------  --------------------  --------------------
              1  JOSE JAVIER           SANCHEZ            
              2  FREDDIE               SANCHEZ            
              3  MARINA                GUTIERREZ          
                                                          
                                                          
*** END ***              
                                                                               

Saludos.

sábado, 27 de julio de 2013

Modificar formato de Campo de una Tabla DB2

En el caso de que necesitemos modificar el formato de un campo de una Tabla DB2 (ya sea por causa de un error o porque se han modificado los requisitos funcionales), existe una instrucción que nos permite realizar dicha tarea con bastante facilidad.

ALTER TABLE JJCLIEM0                           
  ALTER COLUMN PESO SET DATA TYPE NUMERIC(5,2);


Para ello, únicamente tendremos que entrar en la herramienta QMF del DB2I y emplear el comando ALTER para la tabla afectada. Esta sentencia permite modificar la estructura de una tabla DB2 sin más que indicar el nombre de la misma.

ALTER TABLE JJCLIEM0

Posteriormente, se precisará incluir la cláusula ALTER COLUM y el nombre del campo afectado por la modificación de formato que queremos llevar a cabo.

ALTER COLUMN PESO SET DATA TYPE NUMERIC(5,2)

Esta cláusula incluirá también el comando SET DATA TYPE y, a continuación, el nuevo formato que va a asumir el campo afectado. En el ejmplo, el campo "PESO" pasará a tener el formato NUMERIC (5,2).



Tras ejecutar la sentencia ALTER, una simple consulta SQL lanzada desde la herramienta QMF nos mostrará la tabla con el nuevo formato del campo modificado. El campo PESO tiene una longitud de 8 posiciones, correspondiente al formato Numeric(5,2).

  ALTURA      PESO       IMC
--------  --------  --------
    1.77     84.00     26.81


Saludos.

viernes, 26 de julio de 2013

Añadir nuevo Campo a una Tabla DB2

En ocasiones, en la definición inicial de una Tabla no quedan recogidos todos los campos que se van a necesitar en un futuro. Puede que haya sido un error en la arquitectura o que simplemente se haya decidido posteriormente que se precisa un dato adicional en determinado sitio.

ALTER TABLE JJCLIEM0       
ADD COLUMN FECHA TIMESTAMP;


En estos casos, para añadir el nuevo campo a la tabla podremos recurrir a la sentencia ALTER de SQL.  Este comando nos permite alterar la estructura de la tabla, ya sea para añadir o para eliminar una columna determinada.

ALTER TABLE JJCLIEM0



En particular, para crear un nuevo campo tendremos que incluir la cláusula ADD y, a continuación, indicar tanto el nombre de la columna como el formato asociado a la misma. Finalmente, podremos incluir (o no) la cláusula NOT NULL, según convenga.

ADD COLUMN FECHA TIMESTAMP
 
En el ejemplo indicado, tras ejecutar la sentencia ALTER, se puede comprobar en una consulta que ya queda dada de alta una nueva columna denominada FECHA (con formato TIMESTAMP). Además, en este caso incluso ya hemos insertado un valor para dicho campo en uno de los registros.

      CLIENTE FECHA                    
------------- --------------------------
            1 2013-07-24-10.50.22.217174


Saludos.

jueves, 25 de julio de 2013

Creación de una Tabla DB2

Para crear un tabla DB2 necesitamos recurrir al comando CREATE de SQL. Este comando nos permite crear una tabla desde cero, sin necesidad de acceder a herramientas adicionales. Esto hace que esta labor sea muy sencilla en el entorno CICS. 

CREATE TABLE JJCLIEM0                  
     (CLIENTE   NUMERIC(10)   NOT NULL,
      NOMBRE    CHAR(20)      NOT NULL,
      APELLIDO1 CHAR(20)      NOT NULL,
      APELLIDO2 CHAR(20),              
      ALTURA    NUMERIC(3,2)  NOT NULL,
      PESO      NUMERIC(3,2)  NOT NULL,
      IMC       NUMERIC(3,2)  NOT NULL,
      OBSERVACIONES CHAR(50),          
      PRIMARY KEY(CLIENTE)); 
       

Como vemos en el ejemplo, esta función se compone de varias partes. Vamos a verlas detalladamente a continuación.

1º) En primer lugar, en el comando CREATE tenemos que indicar el nombre de la tabla que va a ser creada (obviamente).

CREATE TABLE JJCLIEM0      

2º) A continuación, se enumerarán todos los campos que van a estar incluidos en la misma. Para cada campo se indicará el formato asociado. Por ejemplo:

NOMBRE    CHAR(20)      NOT NULL

3º) También se deberá indicar cuál es la clave principal de la tabla creada. Esto se establecerá con el subcomando PRIMARY KEY.

PRIMARY KEY(CLIENTE)

4º) Adicionalmente, al final se puede indicar el TABLESPACE en el que deseamos que se incluya la tabla que vamos a crear. Esto se realizará con el comando IN.

IN TSCLIE

Si, como en el ejemplo inicial, no se incluye esta cláusula IN al final, entonces la ejecución del comando CREATE creará automáticamente un TABLESPACE que albergará únicamente a la tabla creada (se tratará de un Tablespace unitario que no podrá contener más de una tabla).

Una vez ejecutada la función CREATE, nuestra tabla quedará dada de alta. El comando puede ser ejecutado, por ejemplo, mediante la herramienta QMF (Query Management Facility) del DB2I, que se encuentra en el ISPF de cualquier entorno CICS.



Tras crear nuestra tabla, podríamos acceder a los campos de la misma mediante un simple comando SELECT, indicando el nombre que le hemos asociado a la misma.

SELECT * FROM JJCLIEM0;

La ejecución de este SELECT nos mostrará un display con todos los registros y todos los campos de la tabla. En este caso, como acabamos de crear la tabla, no se muestra ningún registro; únicamente podemos ver la lista de los campos creados.

        CLIENTE  NOMBRE                APELLIDO1          
  -------------  --------------------  --------------------
                                                          
                                                          
*** END ***                                                                                                   

Como vemos, la creación de tablas DB2 en el entorno CICS no es una labor que exija demasiado trabajo, siempre y cuando, previamente, hayamos definido correctamente la arquitectura del fichero.

Saludos.

Related Posts Plugin for WordPress, Blogger...