IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducción

  • Mainframe : Un mainframe es un gran ordenador capaz de realizar el procesamiento de datos complejos. Mainframes se utilizan como sistemas centrales de las grandes organizaciones (empresas, instituciones, etc.). Mainframes se caracterizan por una alta velocidad de ejecución de tareas individuales y una arquitectura diseñada para permitir el equilibrio de beneficios y un mayor nivel de seguridad de los ordenadores de gama baja. Mainframes permite ejecutar varias aplicaciones en tiempo real y acceso al sistema por varios usuarios simultáneamente.

La llegada del nuevo siglo trajo importantes cambios para IBM. Los S/390 se vieron sucedidos por los System z, un nuevo nombre que también incluyó una nueva arquitectura, la z/Architecture.

Terminología

  • MVS : Multiple Virtual Storage. Es el sistema operativo de IBM para sus Mainframes. Se trata de un sistema destina a la gestión masiva de datos permitiendo funciones de multiprogramación y multiproceso. Sus evoluciones dieron lugar a los sistemas operativos OS/390 y z/OS.
  • TSO : Time Sharing Option (Sistema de tiempo compartido) es un intérprete de comandos, interactivo y opcional en tiempo compartido de sistema operativo IBM MVS y sucesores (OS/390 y z/OS).
  • ISPF/PDF : El TSO normalmente va acompañado de un producto a base de paneles para hacer más sencillo e intuitivo su manejo. El PDF (Program Development Facility) son una serie de herramientas para facilitar el desarrollo de programas.
  • CICS : Customer Information Control System (Sistema de control de información de Clientes). Sistema de base de datos y comunicación (DB/DC) de uso general para procesos interactivos. Suelen disponer de este sistema de teleproceso las instalaciones que trabajan con COBOL.
  • IMS : Information Manager System (sistema de administración de información) . Suelen disponer de este sistema las instalaciones que trabajan con DL/I ”Gestor de bases de datos jerárquicas” y PLI.
  • TERMINALES 3270 : El IBM 3270 es una clase de Terminal hecha por IBM desde 1972 normalmente usado para comunicarse con los Mainframes. Debido al color de texto de los modelos originales, eran informalmente llamados terminales pantalla verde. Al contrario que los terminales ASCII seriales, el 3270 minimizaba el número de interrupciones de E/S requeridas para aceptar los grandes bloques de datos, y usaba una interfaz propietaria de alta velocidad con cable coaxial. Actualmente el protocolo IBM 3270 se mantiene en uso a través de un emulador de Terminal para acceder a algunas aplicaciones basadas en mainframes. El uso del 3270 está disminuyendo con el paso del tiempo a medida que más y más mainframes adquieren interfaces Web, pero algunas aplicaciones web usan la técnica de "screen scraping" para capturar viejas pantallas y transferir los datos a salidas modernas.
  • BATCH : Programa COBOL que se ejecuta mediante una JCL.
  • ONLINE : Programa COBOL que se ejecuta mediante la interacción de un usuario desde una web con JAVA/Javascript que se encargará de recoger los datos de la vista y enviarlos al programa COBOL en HOST mediante el uso de una COPY.
  • COPY : Archivo que declara una serie de variables utilizado con intermediario entre un programa JAVA (p.e) y el programa COBOL o entre un programa COBOL y una rutina.
  • RUTINA : Programa COBOL que recibe una serie de argumentos de entrada a través de una COPY realiza una serie de acciones y devuelve o no datos al programa que le ha llamado (igual que una función).
  • DB2 : Marca comercial, propiedad de IBM, bajo la cual se comercializa un sistema de gestión de base de datos. Según IBM, DB2 lidera en términos de participación y rendimiento en el mercado de bases de datos. Aunque los productos DB2 se ofrecen para sistemas basados en UNIX y sistemas operativos de computadoras personales, DB2 sigue a productos de base de datos de Oracle en sistemas basados en UNIX y a Access de Microsoft en sistemas Windows.
  • SPUFI (SQL Processor Using File Input) : Permite usar el SQL sin tener que codificar un programa mediante instrucciones que pueden ser ejecutadas y mostrada el terminal.
  • SPOOL (Simultaneous Peripheral Operations On-Line) : Proceso mediante el cual la computadora introduce trabajos en un buffer (un área especial en memoria o en un disco), de manera que un dispositivo pueda acceder a ellos cuando esté listo.
  • DCLGEN (Declarations Generator) : Proporcionan sentencias de definición de datos en un archivo de texto que describe un formato de archivo en términos de DB2.
  • JCL (Job Control Language) : Conjunto de especificaciones de morfología y sintaxis requeridas para la redacción de instrucciones de ejecución de programas informáticos por parte del sistema operativo de un equipo informático. Este lenguaje se usa en los Ordenadores Centrales (Mainframes) y es específico para cada sistema operativo.

Sistema de ficheros en MVS

Los nombres de ficheros (DataSetName) indican la organización en jerarquía de niveles. Estos niveles se separan por puntos, p.e.

DEPT01.SYSTEM01.FILE01

Cada nivel en la jerarquía puede tener hasta 8 caracteres de largo, pero la longitud total del nombre del fichero no puede superar los 44 caracteres, incluyendo los puntos y debe tener como mínimo dos niveles.

  • Librería: Habitualmente definido por las dos primeras secciones de la jerarquía. (LLLLLLLL.HHHHHHH1).
  • Miembro : Hace referencia al programa/archivo ubicado en la librería y es la tercera sección de la jerarquía ((LLLLLLLL.HHHHHHH1.MMMMMMM1).

NOTA: Los nombres de las librerías para cada tipo de programas, las suelen definir los administradores de HOST. A nosotros nos valdrá con que nos informen de las ubicaciones de las JCL, DCLGEN, BATCH etc.. Para poder buscarlas. EL tipo de nombres utilizados viene definido por los mismos administradores.

COBOL IDE

No es que haya muchas opciones disponibles, pero podemos utilizar un IDE en local para programar en COBOL.

https://pypi.python.org/pypi/OpenCobolIDE

DB2

El DB2 es un sistema de manejo de bases de datos basado en un modelo relacional de datos. Rueda bajo sistema operativo MVS/SP como un sistema de este:
Db2.png

Tipos de datos

  • Cadenas de caracteres EBCDIC:
    • CHAR - Cadenas de longitud fija
    • VARCHAR - Cadenas de longitud variable
  • Datos numericos:
    • SMALLINT - Enteros binarios de media palabra
    • INTEGER - Enteros binarios de una palabra
    • DECIMAL - Numeros decimales
    • FLOAT - Numeros de coma flotante
  • Cadenas de caracteres graficos:
    • GRAFHIC - DBCS (Double Byte Character Data) de longitud
    • VARGRAPHIC - DBCS de longitud variable

Binding

https://mundohost.wordpress.com/2014/01/19/que-es-el-bind/

El BIND es un proceso por el que debe pasar todo programa COBOL que contenga instrucciones SQL.
Como el compilador de z/OS solo es capaz de interpretar sentencias COBOL, el SQL requiere un tratamiento especial que vamos a describir a continuación.
En primer lugar, antes de la compilación, un programa COBOL con SQL pasa por un proceso denominado precompilación, que realiza las siguientes acciones:

  • Una verificación sintáctica sencilla de las sentencias SQL utilizando las DCLGEN incluidas en el programa. Se comprueba que los nombres de campos y tablas de las sentencias coinciden con los de la DCLGEN.
  • Remplaza las sentencias SQL del programa fuente por llamadas al módulo de interfase con DB2,ST que sí pueden ser traducidas por el compilador.
  • Crea el módulo de llamadas a la base de datos (DBRM) en la librería DBRMLIB del sistema. Este módulo contiene las sentencias SQL extraídas del programa.

Después de la precompilación y la compilación, para poder conectar el programa a DB2 debemos ejecutar el proceso de BIND, que consiste en:

  • Comprobar que nuestro usuario tiene permiso para realizar el bind y las autorizaciones SQL necesarias para ejecutar las sentencias.
  • Una verificación sintáctica más completa de las sentencias SQL en la que se utiliza la información del catálogo de DB2.
  • La generación del código ejecutable correspondiente al SQL del DBRM. Se analizan todas las sentencias y para cada una de ellas se elige el camino de acceso menos costoso en términos de uso de CPU y número de operaciones de E/S.

¿Cúal el resultado del BIND?
El resultado final dependerá de la opción que hayamos elegido: es posible hacer un BIND PLAN o un BIND PACKAGE (PAQUETE). Plan y paquete son objetos DB2 que contienen código ejecutable y se almacenan en el directorio de DB2.

¿Qué diferencia hay entre un plan y un paquete?

La relación entre paquete y DBRM es siempre uno a uno. Los paquetes se agrupan en colecciones. Se utilizan en rutinas y módulos que son llamados por programas principales.

La relación entre plan y DBRM puede ser uno a muchos. Los planes se utilizan en programas principales y pueden contener también referencias a paquetes (cuyo BIND se realiza de forma separada). De esta forma, si cambian los accesos DB2 de un módulo llamado por el programa, sólo habrá que hacer el BIND PACKAGE del modulo; no será necesario el BIND PLAN del programa principal.

DCLGEN

Cuando estamos implementando un programa Cobol con acceso a DB2, una de las cosas que tenemos que incluir en el mismo es la declaración de las tablas DB2, junto con todos los campos que las componen, y la declaración de las variables auxiliares que vamos a emplear para recoger los registros de dichas tablas.
Básicamente lo que encontraremos en una DCLGEN es la estructura de la tabla y las variables de Cobol, relacionadas con dicha estructura, que emplearemos para el tratamiento de los datos dentro del programa.

NOTA: La librería donde se encuentre la DCLGEN así como el nombre nos lo facilitarán los arquitectos de DB2.

Ejemplo de DCLGEN

******************************************************************
* DCLGEN TABLE(SYSTEM1.EQUIPOS)                                  *
*        LIBRARY(JJ00.FACTURAS.DCLGEN.DATA(SEQUIPOS))            *
*        LANGUAGE(COBOL)                                         *
*        QUOTE                                                   *
*        INDVAR(YES)                                             *
* ... IS THE DCLGEN COMMAND THAT MADE THE FOLLOWING STATEMENTS   *
******************************************************************
     EXEC SQL DECLARE EQUIPOS TABLE                     
     ( EQUINO                         CHAR(3) NOT NULL,          
       EQUINAME                       VARCHAR(36) NOT NULL,      
       ENTNO                          CHAR(6),                   
       EMPREQUI                       CHAR(3) NOT NULL,          
       CITYNAME                       VARCHAR(16)                
     ) END-EXEC.                                                 
******************************************************************
* COBOL DECLARATION FOR TABLE SYSTEM1.EQUIPOS                    *
******************************************************************
 01  DCLEQUIPOS.                                                
     10 EQUINO               PIC X(3).                           
     10 EQUINAME.                                                
        49 EQUINAME-LEN      PIC S9(4) USAGE COMP.               
        49 EQUINAME-TEXT     PIC X(36).                          
     10 ENTNO                PIC X(6).                           
     10 EMPREQUI             PIC X(3).                           
     10 CITYNAME.                                                
        49 CITYNAME-LEN      PIC S9(4) USAGE COMP.               
        49 CITYNAME-TEXT     PIC X(16).                          
******************************************************************
* INDICATOR VARIABLE STRUCTURE                                   *
******************************************************************
 01  IEQUIPOS.                                                  
     10 INDSTRUC           PIC S9(4) USAGE COMP OCCURS 5 TIMES.  
******************************************************************
* THE NUMBER OF COLUMNS DESCRIBED BY THIS DECLARATION IS 5       *
******************************************************************

Declaración de tablas DB2 en COBOL

Cuando un programa COBOL realiza accesos a DB2 es necesaria la declaración de todas las tablas a las que se vayan a acceder. Esto se realiza mediante las declaraciones de las DCLGEN correspondientes a cada tabla.
Además es necesaria(una sola vez) la declaración genérica:

 EXEC SQL  INCLUDE SQLCA       END-EXEC.

Después declaramos las DCLGEN de las tablas que vamos a utilizar:

EXEC SQL
  INCLUDE NOMBRE_DCLGEN
END-EXEC.

NOTA: Deberán constar tantas declaraciones como tablas utilice el programa.

Sentencias

Basándonos en la DCLGEN de ejemplo se muestran una serie de sentencias sobre la tabla EQUIPOS.

SELECT de un solo registro

En este caso debemos especificar en que varibles guardaremos los campos obtenidos, antes de FROM, con la cláusula INTO.

EXEC SQL
  SELECT EQUINO, EQUINAME, ENTNO,CITYNAME
  INTO
        :DCLEQUIPOS.EQUINO
       ,:DCLEQUIPOS.EQUINAME
       ,:DCLEQUIPOS.ENTNO
       ,:DCLEQUIPOS.CITYNAME
  FROM EQUIPOS
  WHERE EQUINO = :WK-EQUINO AND
        EQUINAME =:WK-EQUINAME
END-EXEC.

Como se puede observar utilizamos las variables COBOL declaradas en la DCLGEN correspondiente para guardar los datos y en el WHERE se utilizan los valores de dos variables que estarían declaradas en la sección WORKING del programa COBOL (se explica más adelante).

SELECT de más de un registro

Cunado sabemos que la sentencia devolverá más de un registro, es necesario declarar un CURSOR, normalmente en la sección WORKING que después recorreremos. En este caso en la declaración no es necesario especificar en que campos guardar los valores, esto se realiza en la lectura del cursor.

EXEC SQL
  DECLARE EJEMPLO-CURSOR CURSOR FOR
    SELECT EQUINO, EQUINAME, ENTNO
      FROM EQUIPOS
END-EXEC.

A lo largo del programa lo primero que debemos hacer es abrir el cursor.

 EXEC SQL              
   OPEN EJEMPLO-CURSOR 
 END-EXEC.             
 IF SQLCODE NOT = 0    
*--HACER ALGO
 END-IF

NOTA: Por lo general se evalúa siempre el SQLCODE después de cada sentencia EXEC SQL para controlar los errores.

Una vez abierto el cursor y si todo ha ido bien (SQLCODE = 0), leeremos el cursor con la sentencia FETCH.

  EXEC SQL                                     
    FETCH EJEMPLO-CURSOR                       
     INTO :DCLEQUIPOS.EQUINO
         ,:DCLEQUIPOS.EQUINAME
         ,:DCLEQUIPOS.ENTNO
         ,:DCLEQUIPOS.CITYNAME      
 END-EXEC  
 IF SQLCODE NOT = 0 AND NOT = 100   
*--HACER ALGO
 END-IF 
 IF SQLCODE = 100
*--NO HAY MÁS REGISTROS. PARAR DE LEER
 END-IF                            

La sentencia FETCH ejecuta el SELECT de la declaración del cursor guardando los valores de los campos del primer registro en las variables que hemos especificado en el INTO.
En este momento realizaremos el tratamiento que necesitemos con dichos valores y después para obtener el siguente registro, tendremos que ejecutar de nuevo la sentencia de lectura para obtener el siguiente. Normalmente esto se ejecuta dentro de un bucle.

NOTA: Un código +100 devuelto por la variable SQLCODE determina que la sentencia se ha ejecutado correctamente pero no se ha encontrado ningún registro.

Una vez ya no quedan más registros por leer se cierra el cursor.

 EXEC SQL              
   OPEN EJEMPLO-CURSOR 
 END-EXEC.             
 IF SQLCODE NOT = 0    
*--HACER ALGO
 END-IF

INSERT

La ejecución de un de INSERT es similar a lo explicado antes.

 EXEC SQL
   INSERT INTO EQUIPOS
           (EQUINO, EQUINAME)
   VALUES( :DCLEQUIPOS.EQUINO
          ,:DCLEQUIPOS.EQUINAME)
 END-EXEC
 IF SQLCODE NOT = 0
*--HACER ALGO
 END-IF

NOTA: Podemos insertar tanto valores guardados en variables como los valores de forma directa, en este caso no es necesario que el valor se preceda de :

UPDATE

Similar a la sentencia INSERT.

EXEC SQL
   UPDATE EQUIPOS
         SET EQUINO =:DCLEQUIPOS.EQUINO
   WHERE     
          EQUINAME =:DCLEQUIPOS.EQUINAME
 END-EXEC
 IF SQLCODE NOT = 0
*--HACER ALGO
 END-IF

DELETE

EXEC SQL
   DELETE FROM EQUIPOS
   WHERE     
         EQUINAME =:DCLEQUIPOS.EQUINAME
 END-EXEC
 IF SQLCODE NOT = 0
*--HACER ALGO
 END-IF

Códigos de retorno DB2

Tras la ejecución de cualquier sentencia el código de retorno de la ejecución lo obtenemos de la variable SQLCODE impícita al declarar el INCLUDE de SQLCA.
Cuando la ejecución de cualquier sentencia se ha ejecutado correctamente el código de retorno será cero 0.
En el caso de que algo haya ido mal podremos verificar el error según el código.

Errores DB2

Códigos de aviso:

  +98 A dynamic SQL statement ends with a semicolon
+100 Row not found or end of cursor.
+222 Trying to fetch a row within a DELETE statement.
+223 Trying to fetch a row within an UPDATE statement.
+231 FETCH after a BEFORE or AFTER but not on a valid row.
+304 Value cannot be assigned to this host variable because it is
+802 The null indicator was set to -2 as an arithmetic.

El teclado

En el entorno HOST, normalmente el ratón no se emplea para nada, es más, tampo se podría utilizar.
Para movernos por la pantalla empleamos las teclas de función del teclado y las teclas de dirección.

  • F1 : Normalmente despliega un menú de ayuda.
  • F2 : Permite dividir la pantalla en dos partes. Resulta muy incómodo.
  • F3 : Volver atrás.
  • F5 : Cuando se realizan búsquedas en el código, se utiliza para saltar de una acorrencia a la siguiente.
  • F6 : Cuando se requiere realizar un refactor de alguna de las ocurrencias.
  • F7 : Subir la pantalla hacia arriba desde el punto en el que se encuentre el cursor.
  • F8 : Bajar la pantalla hacia abajao desde el punto en el que se encuentre el cursor.
  • F9 : Moverse entre las diferentes terminales que tengamos abiertas (ver Swap).
  • F10 : Mover la pantalla hacia la izquierda, a partir de donde se encuentre el cursor.
  • F11 : Mover la pantalla hacia la derecha, a partir de donde se encuentre el cursor.
  • Teclas de dirección : Mover el cursor en la dirección que indique la tecla.
  • Insert : Modo de escritura en insert o no.
  • Fin : Borra el texto que haya desde el cursor hacia la derecha.
  • Inicio : Mueve el cursor a la sección donde se introducen los comandos.

NOTA: Las opciones Ctrl+ [x,c,v] no existen en la terminal de no ser que se configuren en las opciones deteclado de la misma.

Cobol10.png

Proceso de LOGON TSO

Necesitaremos tener una sesión configurada con un HOST.
Para hacer pruebas podemos utilizar:

http://www.efglobe.com/cgi-bin/mainframe/mainuser

NOTA: Suelen bannear muy rápido.

Seguir estos pasos:

http://mainframegeek.me/2012/11/23/free-mainframe-id-to-practice/

Una vez tenemos la sesión configurada al abrirla veremos algo similar a esto:
Host1.png
Se nos pide usuario y contraseña y entramos en el menú principal.
Host2.png
Host3.png

  • Aspecto del menú inicial del TSO:

Host4.png

Opciones del menú principal

No se van a nombrar todas las opciones disponibles pues sería una eternidad, pero si las más utilizadas habitualmente.

Opción E

Ofrece 3 opciones de las que se suelen utilizar:

  • 1 DB2I : Interacción directa con DB2 acceso a los SPUFI (ejecución de sentencias SQL)

Spufi.png

  • 2 QMF : Herramienta que facilita la creación/ejecución de Querys en DB2.

Qmf.png

SPUFI

Ejecuta las sentencias SQL que haya declaradas en un archivo.

  • INPUT Data set name : Librería donde se encuentra el archivo con las sentencias SQL que se quieren ejecutar.
  • OUTPUT Data set name : Librería + archivo donde se guardará la salida de la ejecución.
  • Opciones:

Cobol11.png

  • CHANGE DEFAULTS : Mostrar el panel de SPUFI por defecto.
  • EDIT INPUT : Permitir la edición de las sentencias SQL desde el mismo SPUFI.
  • EXECUTE : Ejecuta las sentencias en la propia pantalla.
  • AUTOCOMMIT : Opción 'YES' no da la opción de hacer ROLLBACK, Opción 'NO' Pregunta si se quiere hacer ROLLBACK.
  • BROWSE OUTPUT : Muestra la salida en la misma pantalla, tras la ejecución de las consultas SQL.

Opción P

Al entrar aquí veremos una serie de opciones más amplia:
Cobol6.png
De todas las opciones que se ven en la imagen las más empleadas son:

  • Settings : Configuraciones personales del usuario.
  • View : Entrar en modo NO edición en una librería para ver el contenido de sus miembros.
  • Edit : Entrar en una librería en modo edición.
  • Utilities : Apartado que ofrece una serie de utilidades como se ve en la imagen.

Cobol7.png
Dentro de este apartado de utilidades las opciones más utilizadas son:

    • 2 Data set : Ubicar(allocate), renombrar(rename), borrar(delete) etc.. Archivos en general.
    • 3 Move/copy : Mover de sitio o copiar miembros de una librería o archivos.
    • 4 Dslist: Listado de miembros o archivos de una librería.
    • 14 Search-For : Búsqueda de cadenas de texto en un determinado miembro o en todos los miembros de una librería.

Opción S

Utilidad que muestra las colas de trabajos pendientes/ejecutados.
Cobol8.png
De las opciones que veremos dentro la más utilizada es :

  • ST : Muestra una lista con los trabajos ya ejecutados o que están en proceso de ejecución.

NOTA: Es justo a esta sección docde debemos acudir para buscar los posibles errores de compilación/ejecución que hayamos obtenido o mirar la salida de los DISPLAY que hayamos puesto en el programa a modo de chivatos.

Para buscar los trabajos que se ejecuten, que nos pertenezcan, en la línea de comandos buscaremos por nombre de usuario.

COMMAND INPUT ===> owner nombre_usuario  

El comando a utilizar se pone en la misma fila del nombre del trabajo justo en la columna de la izquierda denominada 'NP'.
Allí podremos utilizar :

  • ? : Mostrará la salida del trabajo desglosada por partes. Para ver cada parte utilizamos 'S' en la misma fila en la columna 'NP'
  • S : Muestra la salida de la ejecución/compilación sin desglosar. Como si fuera un único archivo.

Modo de edición

Para entrar en modo de edición seguiremos las opciones siguientes desde el menú principal:

P ----> 2

Supongamos que vamos a editar un miembro(programa) que se encuentra en la librería PARTE.SUBPARTE.APARTADO.
COBOL12.png
Aquí tendremos 2 opciones:

  • Especificar el nombre del miembro : Si hemos escrito todo bien abrirá el código del programa directamente.
  • Dejar en blanco el nombre del miembro : En este caso entrará en la librería y nos mostrará un listado de todos sus miembros. Después tendremos que realizar una búsqueda de aquel que queramos editar.

Una vez hemos encontrado el miembro para entrar en modo de edición pondremos el caracter 'E' en la izquierda del nombre del programa, justo a un espacio de distancia.
Cobol13.png

Terminales

Host no permite abrir dos sesiones a la vez, para poder tener dos terminales con varias cosas abiertas a la vez. Nos ofrece la posibilidad de poder abrir hasta 8 pantallas diferentes en la misma terminal, que se van superponiendo. Es decir no se pueden visualizar 2 pantallas al mismo tiempo, pero si saltar de una a otra según necesitemos. Para abrir una nueva pantalla ejecutamos el comando:

START

Para visualizar todas las pantallas que tenemos abiertas o abrir a una en concreto ejecutamos el comando :

SWAP LIST

Para movernos de una pantalla a otra utilizaremos la tecla de función F9. Si tenemos solo 2 pantallas abiertas bastará con la tecla de función. Si tenemos más de dos pantallas abierta y conocemos el número de aquella a la que nos queremos mover, pondremos su número en la línea de comandos y presionaremos la tecla de función F9.

Búsqueda de un miembro en una librería

Para realizar búsquedas de miembros dentro de una librería ejecutaremos:

L NOMBRE_MIEMBRO

O bien podemos usar el nombre parcial del mismo :

L INICIO_NOMBRE*

Esto mostrará en la lista ordenada todo lo que comience con INICIO_NOMBRE.

Búsqueda dentro de un miembro

Si queremos buscar dentro de un programa determinada cadena de texto:

F CADENA_A_BUSCAR

Si conocemos el número de línea al que queremos movernos:

L NUM_LÍNEA

Etiquetas o tags

Podemos marcar o etiquetar las líneas que nos interesen, cuando el programa es grande, para movernos de forma más fluida. Para ello pondremos un punto '.' seguido de un caracter en los números de la líne que queremos marcar.
Cobol14.png
Se pueden marcar tantas líneas como necesitemos.
Para desplazarnos a una línea con una etiqueta '.A', escribimos en la línea de comandos:

L .A

Copiar, mover, borrar

Podemos copiar, mover o borrar, líneas sueltas o bien trozos completos de código. La forma de hacerlo siempre es la misma, debemos situar el cursor en el primer dígito del número de línea y con el Insert descativado.
Una vez seleccionada una o varias líneas la forma de moverla(s) y/o copiar(las) en otra parte del programa es seleccionando justo la línea antes de la cual queremos que se mueva-copie el código, o bien la línea hjusta debajo de la que queremos que se copie-mueva el código. Se utilizan los caracteres:

  • A : Copía o mueve aquello que se haya seleccionado justo después de la línea en la que hayamos puesto este caracter.
  • B : Copía o mueve aquello que se haya seleccionado justo antes de la línea en la que hayamos puesto este caracter.

NOTA: Hola soy Coco, hoy os voy a enseñar la diferencia entre Antes y Después. ;)

  • Copiar
    • Copiar una línea : Con el caracter 'C'.
    • Copiar varias líneas : Ponemos los caracteres CC en la línea desde donde copiamos y los mismos caracteres en la línea final que copiamos.
  • Mover
    • Mover una línea : Con el caracter 'M'.
    • Mover varias líneas : Ponemos los caracteres MM en la línea desde donde copiamos y los mismos caracteres en la línea final que copiamos.
  • Borrar
    • Borrar una sola línea : Utilizamos el caracter 'D' en la línea y pulsamos Intro.
    • Borrar varias líneas seguidas : Ponemos los caracteres 'DD' en la primera línea desde la que vamos a borrar y en la última línea que pensamos borrar y pulsamos intro.

Copiar desde un miembro a otro

Para copiar trozos de código desde un programa a otro, abrimos el programa desde el que queremos copiar el código y utilizamos los caracteres 'CC' en la primera línea desde la que queremos copiar y en la última línea que vamos a copiar. ahora en la línea de comandos ejecutamos:

CUT

Esto habrá copiado el número de líneas que hayamos seleccionado. Ahora abrimos la pantalla en la tengamos el programa destino donde queramos copiar el código, nos vamos a la línea exacta donde vayamos a pegar el código y utilizaremos los caracteres 'A' para ppegralo después y 'B' para pegarlo justo antes y desde la línea de comandos ejecutamos:

PASTE

Copiar todo el código de un programa en otro

Cuando el programa del cual copiamos el código(origen) está en la misma librería que el programa en el que vamos a copiar el código (destino), es tan facil como situarse en la línea de comandos del programa de destino y ejecutar:

COPY NOMBRE_PGR_ORIGEN

Después para guardar:

SAVE

En el caso de que el programa origen se encuentre en otra librería(ej:PARTE.SUBPARTE.APARTADO) podemos ejecutar desde la terminal del programa de origen lo siguiente:

COPY PARTE.SUBPARTE.APARTADO(NOM_DEL_MIEMBRO_ORIGEN)

En ambos casos, tanto si el origen del código está en la misma librería como en otra podemos abrir el programa origen y en la primera línea del mismo utilizar 'cc9999', lo que copiará hasta 9999 líneas que haya por debajo, despues en la línea de comandos :

CUT

Ahora, como antes, iremos al programa destino y en la línea que seleccionemos con 'A' o 'B' lo pegará antes o después, respectivamente, tras ejecutar en la línea de comandos:

PASTE