Alters

COBOL: lo básico de COBOL

Hola de nuevo, en esta entrega trataremos el segundo punto del índice expuesto en la primera entrada del mini-curso de COBOL.

- Lo básico de COBOL
   * PIC
   * Display
   * Accept

PIC

PIC es la instrucción clave para declarar variables en COBOL. Esta cláusula establece una máscara de entrada de datos.

Esto significa que nos podemos ir olvidando de "int", "float", "char", "String"... en cobol no hay de esto. Que suceda así tiene sus ventajas e inconvenientes:

Ventajas:
   - Comprobación automática de valores: si pedimos una entrada de 10 caracteres y nos introducen un número, automáticamente cancela la entrada y la vuelve a pedir, con todo lo que ello comporta

   - Adecuación a ficheros: siempre sabremos la longitud de cada variable, ya que siempre son de longitud fija

Inconvenientes:
  - Tenemos que tener siempre en cuenta los desbordamientos
  - Perdemos algunas mejoras con los tipos (esto se puede salvar con un extra de código)

Antes de aprender a declarar con PIC, vamos a ver qué máscaras hay:

X -> caracter alfanumérico
9 -> caracter numérico
A -> caracter alfabético
S -> caracter de signo
V -> caracter de decimal

Para aclarar un poco, veamos unas conversiones mySQL a COBOL:

varchar(5) -> PIC XXXXX
                 -> PIC X(5)

float(8, 2) -> PIC 999999V99
                -> PIC 9(6)V99
                -> PIC 9(6)V9(2)
                -> PIC S9(6)V9(2)

Como se ve, las máscaras se pueden abreviar, haciendo que el caracter escrito se repita n veces, escribiendo (n).

Bien, el tema de PIC está explicado; ahora falta un tema fundamental para las variables: el NIVEL

en COBOL, toda variable ha de tener un nivel. Pero ¿de qué sirve? pues es fácil: una variable de nivel alto depende de una de nivel bajo. Esto nos sirve para crear estructuras de una manera muy rápida.

Aquí unos ejemplos para ver cómo funcionan los niveles:



       01    CLI.
          02 CODCLI PIC X(5).
          02 NOMCLI PIC X(25).
          02 DIRCLI PIC X(25).
          02 POBCLI PIC X(25).
          02 POSCLI PIC 9(5).
          02 ALTCLI PIC X(8).
          02 IMPCLI PIC 9(6)V9(2).

Aquí creamos una variable global "CLI" (de cliente). Como se ve, tiene nivel 1 (01, siempre tienen 2 dígitos).
Inmediatamente debajo tenemos varias declaraciones de nivel 2 (02), que corresponden a un código, nombre, dirección, población, código postal, fecha de alta e importe, respectivamente.

Todas estas variables dependen de CLI. Esto significa, que realmente CLI sería (no realmente) algo como

77 CLI PIC X(80)9(5)X(8)9(6)V9(2).

¿Y eso? Pues bien, a la hora de pedir datos a variables (accept, ahora lo vemos), podemos pedir la variable CLI, o, por ejemplo, CODCLI. Tenemos que tener cuidado con eso.

Un par de apuntes más:

Las variables de nivel 77 son siempre independientes. No pueden tener "hijos" ni formar parte de un nivel superior.



Los niveles se pueden otorgar arbitrariamente, siempre que se incremente el nivel en los hijos. Dejo un ejemplo de cómo se hace mal y cómo se hace bien:

 05 CLI.
    06 CODCLI PIC XXXXX.
    06 POSCLI.
         10 PRO PIC 99.
         10 RES PIC 999.
    06 NOMCLI.

Esto estaría bien, pero lo siguiente NO


 05 CLI.
    06 CODCLI PIC XXXXX.
    06 POSCLI.
         77 PRO PIC 99.
         77 RES PIC 999.
    06 NOMCLI.

ya que tiene una variable de nivel 77.


Siguiendo con PIC y las variables, hay ciertos valores preestablecidos que se pueden usar como constantes. Estos son, entre otros:

 - ZERO (también ZEROES, ZEROS): Rellena todo con 0, útil para iniciar numéricos
 - SPACE (también SPACES): Rellena todo con espacio (' '), útil para iniciar alfanuméricos
 - QUOTE (también QUOTES): Representa el caracter ', es como el \' de php o c.
 - ALL "texto": Rellena con el valor establecido (por ejemplo ALL "_" crearía un efecto línea)
 - HIGH-VALUE: inserta el valor más grande
 - LOW-VALUE: inserta el valor más pequeño.

Nótese que estas expresiones van sin encomillar.

Para usar estas expresiones, así como otras, podemos mover el valor en la PROCEDURE, o "settear" el valor de la variable a la par que la creamos.

Para settear variables, se añade la cláusula "VALUE" en la declaración, es decir, algo así:

77 SALUDO PIC X(4) VALUE 'HOLA'.
01 YO.
   02 FNAM PIC X(25) VALUE 'DAVID'.
   02 LNAM PIC X(25) VALUE 'SOLÉ'.
77 HR PIC X(80) VALUE SPACES.


Por otra parte, para mover valores en la PROCEDURE, se usa la instrucción MOVE.

MOVE ALL '_' TO HR.

Rellenaría la variable HR con 80 "_" (como un <hr> en HTML, por ejemplo).



Display


Esta instrucción se usa para mostrar cosas por pantalla.

¿Cosas? Si. Desde pantallas hasta registros completos. Por ahora lo dejamos ahí, y mostraré el funcionamiento básico de cómo usar DISPLAY:

DISPLAY SALUDO.
DISPLAY HR.
DISPLAY YO.

La instrucción DISPLAY tiene varias opciones, a saber:

- NO ADVANCING: evita un retorno de carro tras el display.
- LINE: en qué línea se mostrará
- POSITION: en qué columna se mostrará
- BEEP: emite un pitido tras el display
- ERASE (ERASE EOS, ERASE EOL): sirve para borrar zonas: ERASE borra toda la pantalla, ERASE EOS borra desde la posición del cursor hasta el final; ERASE EOL borra la línea en la que está el cursor.

Como se ve, se puede hacer un "print" indicando fila y columna... esto es realmente útil para las pantallas (ya lo veremos).

Accept

Sirve para recoger datos (de pantalla o no). Se suele usar así:

ACCEPT SALUDO.
ACCEPT LNAME.

También tiene opciones, las cuales son:

 - LINE, POSITION, NO BEEP, ERASE

Que hacen lo mismo que en DISPLAY.


Os dejo un pequeño ejemplo de display y accept:


77 SALUDO PIC X(4) VALUE 'HOLA'.
01 YO.
   02 FNAM PIC X(25) VALUE 'DAVID'.
   02 LNAM PIC X(25) VALUE 'SOLÉ'.
77 HR PIC X(80) VALUE SPACES.
01 DT PIC
     02 ANIO PIC X(2).
     02 MES PIC X(2).
     02 DIA PICX(2).

DISPLAY SALUDO LINE 3 POSITION 5.
DISPLAY 'COMO TE LLAMAS?' LINE 5 POSITION 5.
ACCEPT FNAM LINE 5 POSITION 22.
DISPLAY 'BIENVENIDO' FNAM ERASE LINE 3 POSITION 5.
ACCEPT DT FROM DATE.
DISPLAY 'HOY ES ' DIA ' DE ' MES ' DE '  ANIO LINE 5 POSITION 5.

Espero que podáis comprenderlo mejor con este pequeño ejemplo. Destacar que la sentencia "ACCEPT VAR FROM DATE/TIME" se usar para insertar la fecha (formato AAMMDD) o la hora (formato HHMMSSCC) en la variable.

En la siguiente entrega mejoraremos la presentación de este ejemplo, con pantallas.

Hasta la próxima!