Curso de Cobol y PowerCobol

Los tipos V y S de COBOL

Capítulo 13: Tipos V y S abreviaciones de PICTURE y máxima longitud

Continuamos en este capítulo número trece con las variables. En el capítulo anterior te hablé de tres de los cinco símbolos (hay más, estos son los principales) para definir tipos de datos en las variables. Veamos los dos que faltan.

El PICTURE V

El PICTURE V sirve para indicar dónde se encuentra el punto de un número decimal.

Supón que quieres almacenar números de dos dígitos con dos dígitos decimales en una variable, un total de 5 dígitos si contamos el punto del decimal.

Eso nos da la pista de que la longitud del PICTURE tiene que ser de 5.

La V representa donde se queda el punto.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo13.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
           01 Numero PIC 99V99 VALUE 10.53.
       PROCEDURE DIVISION.
       MuestraValor.
           DISPLAY Numero.

       STOP RUN.

       END PROGRAM Capitulo13.
10.53

En el código, el primer 99 representa en este caso al número 10. La V el punto decimal y el segundo 99 al 53. Si pones por ejemplo 105.3 no va a funcionar correctamente.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo13.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
           01 Numero PIC 99V99 VALUE 105.3.
       PROCEDURE DIVISION.
       MuestraValor.
           DISPLAY Numero.

       STOP RUN.

       END PROGRAM Capitulo13.

El warning de OpenCobolIDE me dice "value size exceeds data size", que significa que el tamaño del valor excede el tamaño de los datos. Con lo que en la consola, nos comemos el primer número y COBOL añade un cero al final.

05.30

¿Por qué ocurre este error así? Imagina de nuevo el ejemplo de las cajas. Supón que en un pedido, envías dos tipos de mercancías en la misma caja. Para una has reservado dos quintas partes de la caja (99), y para la otra, dos quintas partes más (99) la quinta parte es para un separador en medio de la caja (V), son mercancías diferentes (copas y tazas) y las quieres embalar separadas en la misma caja, ya que el vidrio es más delicado que la porcelana.

Cajas de envío

Si lo que quieres es enviar tres quintas partes de la caja de tazas, no te caben dos quintas partes más de copas con el separador.

En el ejemplo, las tazas equivalen al 105 para un espacio de 0 hasta 99 tazas, si ponemos una cantidad de tres dígitos, no caben ya en esa parte de la caja.

Mientras tanto, en el lado de las copas, como solo tenemos 3, queda vacío y se ocupa con un 0 que representa la ausencia de valor.

Pues eso, respeta cada 9, que son para un dígito.

Por cierto, fuera de tema, si te vas a dedicar a la logística con copas y tazas, por favor, utiliza dos cajas diferentes para el envío, te saldrá más barato...

Entonces, ¿Ya sabes que PICTURE necesitas para un número de tres enteros y un decimal como 105.3?

01 Numero PIC 999V9 VALUE 105.3.
105.3

¿Y para 1000.850?

01 Numero PIC 9999V999 VALUE 1000.850.
1000.850

Creo que con estos ejemplos, queda claro. Cualquier duda, tienes la caja de comentarios abajo.

El PICTURE S

El PICTURE S representa un símbolo, como el - o el + (números negativos o positivos).

Se utiliza principalmente para números negativos, ya que por defecto, sin indicar nada, todos los números son positivos.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo13.

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
           01 Numero PIC S99 VALUE -80.
       PROCEDURE DIVISION.
       MuestraValor.
           DISPLAY Numero.

       STOP RUN.

       END PROGRAM Capitulo13.

El resultado es un número negativo, con la S representando el -.

-80

No obstante, si ponemos un símbolo +, podemos mostrar literalmente ese símbolo en los números.

01 Numero PIC S99 VALUE +80.
+80

Ahora que ya sabes como usar todos los símbolos, veamos más cosas.

El picture especificado con la palabra PIC es una abreviatura de PICTURE IS:

01 Numero PICTURE IS S99 VALUE -80.

Puedes ponerlo como quieras, el efecto es el mismo, aunque por acortar, casi siempre lo verás abreviado como PIC.

También está permitido utilizar PICTURE sin el IS.

01 Numero PICTURE S99 VALUE -80.

O incluso más raro, con la abreviación y el IS.

01 Numero PIC IS S99 VALUE -80.

Ponlo como prefieras. Yo lo pondré casi siempre con PIC a secas.

Quizás te hayas fijado que en varias ocasiones he hecho algo como esto:

01 Numero PIC 9(5) VALUE 12345.

Esto representa un PICTURE de 5 símbolos 9. Es una abreviatura. Esto es lo mismo:

01 Numero PIC 99999 VALUE 12345.

Esta abreviatura, es como decirle a COBOL, el tipo de PICTURE en esta variable es 9 y quiero que me lo multipliques por 5 para representar un PICTURE de 9(5).

Con el resto de símbolos puedes hacer lo mismo:

01 Saludo1 PIC AAAA VALUE "hola".
01 Saludo2 PIC A(4) VALUE "hola".

Si necesitas escribir un string de por ejemplo, 25 caracteres como este: "Este es el curso de COBOL", te quedaría sin abreviar los campos(cada carácter, es otra forma de expresarlo) del PICTURE en esto XXXXXXXXXXXXXXXXXXXXXXXX. Si tiene 80, imagina...

De forma abreviada, es más fácil de ver y de especificar:

01 Curso PIC X(25) VALUE "Este es el curso de COBOL".

Además, que con este número 25 de la abreviación, puedes saber sin ponerte a contar X, cuantas tiene. Por eso, siempre es recomendable utilizar la abreviatura de la especificación de longitud.

Esto no quiere decir que no debas utilizar la otra forma. Por ejemplo, si tienes una variable con una longitud de 2, es más corto escribir XX que X(2) que necesita el doble de espacio para escribirlo, de dos caracteres X X a cuatro (X ( 2 ))

Aquí puede que se te presente la duda de si utilizas una combinación de símbolos ¿cómo se haría para abreviar? ¿Es posible escribir un número negativo y decimal a la vez en COBOL de forma abreviada? Sí es posible, a continuación tienes la prueba.

Aquí la forma sin abreviar. Estamos utilizando la S de Sign (signo) para el + o el -, los tres 9 para el número entero de tres dígitos, la V para el punto decimal y los últimos dos 9 para dos números decimales.

01 Numero PIC S999V99 VALUE -100.55.

Aquí, lo mismo, pero abreviado:

01 Numero PIC S9(3)V9(2) VALUE -100.55.

El último 99 no importaba abreviarlo, pero es para que veas que se puede abreviar así.

En ambos casos, el resultado es el mismo.

-100.55

Solo ves practicando todo esto y si te quedan dudas, ves dejándolas en los comentarios.

Aunque carece de sentido, hasta puedes utilizar la forma abreviada con los símbolos S y V.

01 Numero PIC S(1)9(3)V(1)9(2) VALUE -100.55.

No te preocupes por memorizar todas las combinaciones. Iré escribiendo un poco de todo durante el curso.

Hay más tipos de símbolos para el PICTURE, pero por el momento ya tienes para seguir con los próximos capítulos. Los veremos más adelante.

¿Cuál es la longitud máxima de un PICTURE?

En los PICTURE A y X, el límite son 268435456 bytes de longitud en la abreviación. Esto permite strings muy grandes.

01 Numero PIC X(268435456) VALUE " ".

En cambio, en cuanto al PICTURE 9, tenemos un máximo de 38 dígitos, al menos en este estándar de COBOL.

01 Numero PIC 9(38) VALUE 0.

Si pones 39 dígitos o más, da el error de "numeric field cannot be larger than 38 digits", que significa que el campo numérico no puede tener más de 38 dígitos.

Pese a que cambiemos la versión del compilador OpenCobolIDE no lo detecta, en la versión ANSI 85, el límite de longitud de un número era de 18 dígitos, en la ISO2002 se incrementó a 31 y en la última revisión, COBOL 2014, la que utilizamos ahora, hasta 38.

Así que ten en cuenta esto, que si la versión de COBOL es antigua, no funcionarán números tan grandes, al menos, con esto, ya sabrás porqué.


Comentarios

Si te quedan dudas sobre el temario, sobre Cobol, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.