Comparacion Numerica REXX

Todo lo relacionado con REXX en este ambiente.
Responder
friendspark
Usuario
Usuario
Mensajes: 15
Registrado: 17 Ene 2012, 12:47
País: Inglaterra
Ciudad: Milton Keynes
Ocupación: Implementador

Comparacion Numerica REXX

Mensaje por friendspark » 30 Sep 2014, 07:34

Hola a todos,

Soy nuevo en el mundillo REXX y creo que mi duda es de basico basico level, pero me trae de cabeza.


Estoy tratando de hacer una comparacion numerica entre dos valores pero no me acaba de funcionar.

A continuacion pongo el fragmento de debug donde radica el error:

31 *-* KEYFLDA3= KEYFLDA1 || KEYFLDA2
>>> "1040000781"
32 *-* KEYFLDB3= KEYFLDB1 || KEYFLDB2
>>> "1040000780"
33 *-* IF KEYFLDB3 < KEYFLDA3
>>> "0"
37 *-* READFIA = READFIA + 1
>>> "4"
38 *-* DO WHILE KEYFLDB3 < KEYFLDA3 & RC = 0
>>> "0"
44 *-* IF KEYFLDA3==KEYFLDB3
>>> "0"
17 *-* ELSE
*-* DO

Como podeis ver no entra en la condicion, cuando deberia dar "1" como respuesta.

Muchas gracias.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Comparacion Numerica REXX

Mensaje por Vicente » 30 Sep 2014, 11:23

Hola friendspark,
para poder aportar más claridad al problema, por favor añade las instrucciones:

Antes de la línea 31
TRACE R

Antes del IF
SAY KEYFLDA1
SAY LENGTH(KEYFLDA1)
SAY KEYFLDA2
SAY LENGTH(KEYFLDA2)
SAY KEYFLDB1
SAY LENGTH(KEYFLDB1)
SAY KEYFLDB2
SAY LENGTH(KEYFLDB2)
SAY KEYFLDB3
SAY LENGTH(KEYFLDB3)

Ejecutalo y muestranos el resultado utilizando el botón "Code".
Ten muy en cuenta los espacios en blanco que puedan haber.
Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

friendspark
Usuario
Usuario
Mensajes: 15
Registrado: 17 Ene 2012, 12:47
País: Inglaterra
Ciudad: Milton Keynes
Ocupación: Implementador

Re: Comparacion Numerica REXX

Mensaje por friendspark » 30 Sep 2014, 12:05

Muchas gracias por vuestra ayuda.

He aumentado la clave de comparacion para evitar errores de matching, asi que ahora tengo:

DO WHILE RC = 0
KEYFLDA= SUBSTR(INFA.1,5,14)
KEYFLDB= SUBSTR(INFB.1,5,14)

SAY KEYFLDA
SAY LENGTH(KEYFLDA)
SAY KEYFLDB
SAY LENGTH(KEYFLDB)

IF KEYFLDB < KEYFLDA THEN DO
SAY "HELLO"
END

READFIA = READFIA + 1
DO WHILE KEYFLDB < KEYFLDA & RC = 0
"EXECIO 1 DISKR INFILB (STEM INFB."
KEYFLDB = SUBSTR(INFB.1,5,14)
END
IF KEYFLDA == KEYFLDB THEN DO

...


El resultado de la traza en el punto donde deberia saltar la condicion y no lo hace, lo muestro a continuacion:

26 *-* DO WHILE RC = 0
>>> "1"
27 *-* KEYFLDA= SUBSTR(INFA.1,5,14)
>>> "10123150000455"
28 *-* KEYFLDB= SUBSTR(INFB.1,5,14)
>>> "10123150000454"
30 *-* SAY KEYFLDA
>>> "10123150000455"
10123150000455
31 *-* SAY LENGTH(KEYFLDA)
>>> "14"
14
32 *-* SAY KEYFLDB
>>> "10123150000454"
10123150000454
33 *-* SAY LENGTH(KEYFLDB)
>>> "14"
14
35 *-* IF KEYFLDB < KEYFLDA
>>> "0"

39 *-* READFIA = READFIA + 1
>>> "5"
40 *-* DO WHILE KEYFLDB < KEYFLDA & RC = 0
>>> "0"

44 *-* IF KEYFLDA == KEYFLDB
>>> "0"
217 *-* ELSE
*-* DO
218 *-* SAY KEYFLDA
>>> "10123150000455"
10123150000455
219 *-* RNOTFOUND = RNOTFOUND + 1


Muchas gracias por la ayuda, este soporte es inestimable

friendspark
Usuario
Usuario
Mensajes: 15
Registrado: 17 Ene 2012, 12:47
País: Inglaterra
Ciudad: Milton Keynes
Ocupación: Implementador

Re: Comparacion Numerica REXX

Mensaje por friendspark » 01 Oct 2014, 05:20

Alguien sabe a que se debe este fallo en la comparacion?


Estoy perdidisimo y este condicional es clave para lo que quiero hacer.


Un saludo.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Comparacion Numerica REXX

Mensaje por Vicente » 01 Oct 2014, 09:15

Hola friendspark,
En este caso, hemos sido víctimas de la gran flexibilidad de manejo de datos del REXX.
Para lograr esta facilidad de uso REXX asume muchas cosas por nosotros a la hora de definir el formato de los datos.
En REXX basta con utilizar una variable para que se defina pero ... mucho cuidado con lo que asume REXX.
En tu caso KEYFLDA y KEYFLDB han recibido un valor que el interprete de REXX a asumido como numérico, pues la cadena está compuesta solo de números.
Pero por desgracia asume que usará 9 dígitos para los cálculos y manejos de estos números.
(Véase el capítulo 6 del manual de REXX)
En tu caso se diferencian en el número de la posición 14.
Para solucionar esto se me ocurren 2 posibilidades:
1) Utilizar, al prinicipio del programa, la sentencia NUMERIC DIGITS para cambiar este 9 por defecto. Por ejemplo NUMERIC DIGITS 20
(Véase en el manual de referencia de REXX otros usos de la instrucción NUMERIC).
2) Si en tu algoritmo el número de digitos es muy variable y no quieres controlarlos, puedes añadir una letra al principio del contenido de cada variable, para obligar al REXX a que maneje cadenas de caracteres y no números. Por ejemplo:
KEYFLDA = 'A' || KEYFLDA
KEYFLDB = 'A' || KEYFLDB

Esto que te ha pasado es digno de ser mencionado en el hilo que inicié llamado 'CURIOSIDADES DEL REXX' y así lo voy a hacer.

Un saludo y espero que lo comentado sirva para ayudarte a salir del problema.
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Responder