Mostrando entradas con la etiqueta conversion entre tipos de datos. Mostrar todas las entradas
Mostrando entradas con la etiqueta conversion entre tipos de datos. Mostrar todas las entradas

miércoles, 24 de julio de 2013

Cobol: conversiones entre tipos de datos (2)

Supongamos que tenemos un fichero de entrada en el que uno de los campos, por ejemplo REG-E-IMPORTE, es un PIC X(15) y representa un importe de 13 posiciones enteras y 2 posiciones decimales. ¿Qué tendríamos que hacer para convertir dicho campo a un PIC S9(13)V9(2) USAGE COMP-3?

Es muy sencillo y muy fácil. En un programa que he realizado recientemente (y que está probado) he declarado en working las siguientes variables:

          01 WS-IMP1                                 PIC X(15).             
          01 WS-IMP1-N REDEFINES WS-IMP1      PIC 9(15).             
          01 WS-IMP1-AUX                        PIC 9(15) VALUE ZEROES.
          01 WS-IMP-AMORT-PRINC       PIC S9(13)V9(02).      

En el programa, en donde corresponda, tendríamos que codificar lo siguiente:

          MOVE REG-E-IMPORTE               TO WS-IMP1                 

          MOVE WS-IMP1-N                        TO WS-IMP1-AUX             

          MOVE WS-IMP1-AUX(1:13)        TO WS-IMP-AMORT-PRINC(1:13)

          MOVE WS-IMP1-AUX(14:2)        TO WS-IMP-AMORT-PRINC(14:2)



Pues esto es todo lo que hay que hacer. A lo mejor te preguntarás: pero, ¿qué sucede si el campo REG-E-IMPORTE es un PIC X(13) y tenemos que convertirlo a un PIC S9(13)V9(2) USAGE COMP-3? Pues muy sencillo. Tanto la longitud de WS-IMP1 como la de WS-IMP1-N sería 13 mientras la definición de WS-IMP1-AUX y WS-IMPO-AMORT-PRINC sería exactamente a la indicada anteriormente. En cuanto al código, sería exactamente el mismo que el indicado anteriormente.

miércoles, 2 de enero de 2013

Cobol: conversiones entre tipos de datos (1)

En una entrada anterior, cuyo título era Cobol: redefines (pinchar aquí para ver dicha entrada),  vimos cómo utilizar la cláusula redefines. En uno de los ejemplos indicados se utilizaba esta cláusula para convertir un alfanumérico en un numérico. Ésto es muy útil cuando tenemos datos alfanuméricos del tipo '00005', '00045', '00345' y '02345' porque al redefinirlos en un dato numérico del tipo PIC 9(05) tenemos que obtendríamos los siguientes datos numéricos: 00005 (o lo que es lo mismo 5), '00045' (o lo que es lo mismo 45), '00345' (o lo que es lo mismo 345) y '02345' (o lo que es lo mismo 2345).

Pero, ¿qué sucede si nos llega un alfanumérico como '1     '? Como se puede observar en ese alfanumérico, lo que nos estaría llegando es un 1 y cuatro espacios en blanco detrás de ese 1. Si redefinimos dicho alfanumérico en un numérico como el indicado anteriormente, PIC 9(05), tendríamos el valor 1 con valores inadecuados en las cuatro posiciones siguientes y esto podría resultar indeseable al realizar un tratamiento de dicho dato numérico. Pues bien, en esta entrada vamos a ver cómo solventar este caso.

Veamos el siguiente ejemplo: queremos transformar la cadena '10        ' en una variable numérica 00010 (o 10) de tipo PIC S9(5). Para ello haremos el tratamiento que se explica a continuación.

Tenemos las siguientes variables:

  W100-NUM-DIAS -> PIC X(10)
  variable alfanumérica que podrá venir informado como '10        ' o '360       '

  W100-NUM-DIAS-N -> PIC S9(5)
  variable numérica en la que guardaremos el valor anterior transformado

  W400-INDICE   -> PIC 9(02)
  W400-CONT-NUM -> PIC 9(01)
  W400-IND-NUM  -> PIC 9(01)
  W400-IND-MAX  -> PIC 9(01)

Y la siguiente constante:

  W300-M-1 PIC S9(1) VALUE -1.

El código a ejecutar para realizar dicha transformación sería el siguiente:

     MOVE 1                         TO W400-CONT-NUM

     PERFORM UNTIL W100-NUM-DIAS(W400-CONT-NUM:1) IS NOT NUMERIC
                          OR W400-CONT-NUM > 5
           ADD 1                       TO W400-CONT-NUM
     END-PERFORM

     MOVE W400-CONT-NUM             TO W400-IND-NUM
     ADD W300-M-1                         TO W400-IND-NUM
     MOVE 5                                   TO W400-IND-MAX
     MOVE ZEROES                          TO W100-NUM-DIAS-N

     PERFORM UNTIL W400-IND-NUM = ZEROES OR W400-IND-MAX = ZEROES
          MOVE W100-NUM-DIAS(W400-IND-NUM:1) TO
                   W100-NUM-DIAS-N(W400-IND-MAX:1)  
          ADD W300-M-1                TO W400-IND-NUM
          ADD W300-M-1                TO W400-IND-MAX
     END-PERFORM.

Este fragmento podría incluirse en un párrafo cuyo nombre podría ser, por ejemplo, TRANSFORMAR-ALFANUM-NUM.