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.
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.
No hay comentarios:
Publicar un comentario