![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
||||
|
||||
|
Gracias Casimiro.
Creo que no tiene nada que ver con las comillas, porque después de tu indicación lo he probado también sin comillas, y sigue igual. El hecho es que entra en el bucle 'while', pero no sale correctamente de él. Si el Select encuentra un valor (p.ej. el 1), Aux_Rand (mayúscula o minúscula, da igual ahora ...) no es null e intento entonces incrementar el valor de entrada para encontrar uno que no exista. Al pasar como valor de entrada el 1, me devuelve 201, lo que significa que sin duda alguna entra en el bucle de la suma para finalmente, al ser mayor de 200, devolverme 201. En cambio si haga la llamada con el valor de entrada 2, entonces me devuelve correctamente 2, ya que el 2 no existe, y entonces Aux_Rand sí que es null y ejecuta el primer 'Leave'. Por lo tanto tengo que deducir que el error está en el Select y el valor que le pasa 'into Aux_Rand'. No sé por qué rara razón, si en la primera vez que se ejecuta el Select, el valor no existe entonces Aux_Rand es null y sale del While. Si en cambio a la primera el valor existe, y ya ejecuta después el incremento + 1, entonces ya Aux_Rand nunca vuelve a ser null.
__________________
Piensa siempre en positivo ! |
|
#2
|
||||
|
||||
|
¿Puedes poner un metadata simplificado con algunos datos para probar?
Un script con su create table y los mínimos campos necesarios y algunos datos extraidos con ibexpert, por ejemplo, o el que uses.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#3
|
||||
|
||||
|
Voy a cambiar la tabla de nombre para simplicarlo todo. Introducimos un único registro con un único valor = 1. Creamos el Stored Procedure.
Y por último ejecutamos : Esta sentencia me devuelve el valor 201. Esta otra me devuelve el valor 2. ![]() Si pruebo con lo siguiente : para ver qué valor queda en Aux_Rand, entonces me devuelve el valor 1 y me devuelve null. P.D. La versión de Firebird es la 2.1
__________________
Piensa siempre en positivo ! |
|
#4
|
||||
|
||||
|
... parece como si una vez que Aux_Rand no ha tomado el valor null, ya no lo volviera a tomar más en el bucle y en su comprobación correspondiente If (:"Aux_Rand" is null) porque no hace el Leave adecuado, pero en cambio, al comprobar el valor con OUT_RANDOM, entonces sí que aparece el null.
... no lo entiendo ... ![]()
__________________
Piensa siempre en positivo ! |
|
#5
|
||||
|
||||
|
Me parece que está claro:
Si lo llamas con el valor 1, que existe, entonces como aux_rand no es null aumenta in_random en 1 hasta que llega a 200+1 y sale, devolviendo 201 Sin embargo, cuando lo llamas con 2, que no existe, no lo encuentra, entonces aux_rand es null y sale con el valor pasado, el 2 en este caso.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#6
|
||||
|
||||
|
Si lo que quieres es simplemente el número siguiente al mayor existente, entonces vale con hacer algo simple como:
Y si no pueden existir repetidos entonces mejor un generador. Y si es otra cosa, entonces es que no me he enterado todavía porque después de comer me está dando sueño y voy a por un café... ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#7
|
||||
|
||||
|
Exactamente !
.... pero eso no es lo que está programado !! Porque si el valor que le paso es '2', que no existe, y por lo tanto Aux_Rand es null, entonces correctamente sale. Pero si le paso '1', en la siguiente pasada por el bucle While, se incremeta 1 al 2, y debería de volver a comprobarlo, y ahora que el valor es 2 y no existe, me debería devolver 2 (!!) y no 201 ya que entra de nuevo en la suma !! ![]()
__________________
Piensa siempre en positivo ! |
|
#8
|
||||
|
||||
|
Acabo de leer tu último comentario.
El problema surge que hay muchos usuarios que acceden a esa tabla, y tengo que saber si cada usuario va a tener un número único. Para eso genero un número aleatorio cualquiera, y compruebo si existe ya previamente. Si no existe, perfecto, devuelvo ese mismo número aleatorio que le pasé de entrada, como salida. Pero si el número aleatorio (por p... casualidad) ya existiera, tengo que buscar otro que no exista para que cada usuario diferente tenga garantizado que su número obtenido es único en la tabla. Generalmente la tabla estará vacía, porque es una tabla para unos cálculos temporales, que después se muestran en un StringGrid. Una vez que salga del Form con ese StringGrid, los datos se vuelven a borrar de la tabla.
__________________
Piensa siempre en positivo ! |
|
#9
|
||||
|
||||
Por qué esta modificación, si ejecuto con el valor de entrada 1, entonces me devuelve 3 (!!! ) y si el valor de entrada es 2, entonces me devuelve 2 !!Parece como si no gestionase correctamente la Suma + 1 del parámetro de Entrada In_Random. Pero es que como ya dije anteriormente lo he probado incluso con variables propias del procedimiento, sin tocar la variable de entrada, y tampoco ....
__________________
Piensa siempre en positivo ! |
|
#10
|
||||
|
||||
|
Voy a probar con fb2.1, es que tenía ahora mismo la 1.5 y lo he adaptado porque no funcionaba las comillas, el rows 1, etc.
Ahora vuelvo...
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Stored Procedure !!! | Ledian_Fdez | C++ Builder | 0 | 02-03-2010 14:01:29 |
| Stored Procedure | StartKill | MySQL | 2 | 27-08-2008 06:18:44 |
| Ver los Stored Procedure | tgsistemas | SQL | 0 | 06-04-2004 17:18:22 |
| Stored Procedure | tgsistemas | SQL | 1 | 27-02-2004 13:10:33 |
| problema con stored procedure | Markoz | Firebird e Interbase | 8 | 27-06-2003 13:46:31 |
|