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.
Comparacion Numerica REXX
-
- Usuario
- Mensajes: 15
- Registrado: 17 Ene 2012, 12:47
- País: Inglaterra
- Ciudad: Milton Keynes
- Ocupación: Implementador
- Vicente
- Colaborador avanzado
- Mensajes: 546
- Registrado: 21 Jul 2011, 04:52
- País: España
- Ciudad: Malaga
- Ocupación: Técnico en Sistemas
Re: Comparacion Numerica REXX
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
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.
pueden ahorrarte quince minutos de lectura de un manual.
-
- Usuario
- Mensajes: 15
- Registrado: 17 Ene 2012, 12:47
- País: Inglaterra
- Ciudad: Milton Keynes
- Ocupación: Implementador
Re: Comparacion Numerica REXX
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
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
-
- Usuario
- Mensajes: 15
- Registrado: 17 Ene 2012, 12:47
- País: Inglaterra
- Ciudad: Milton Keynes
- Ocupación: Implementador
Re: Comparacion Numerica REXX
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.
Estoy perdidisimo y este condicional es clave para lo que quiero hacer.
Un saludo.
- Vicente
- Colaborador avanzado
- Mensajes: 546
- Registrado: 21 Jul 2011, 04:52
- País: España
- Ciudad: Malaga
- Ocupación: Técnico en Sistemas
Re: Comparacion Numerica REXX
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.
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.
pueden ahorrarte quince minutos de lectura de un manual.