FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Crear secuencia numerica con un procedimiento almacenado
Saludos a todos...
Estoy realizando un procedimiento almacenado que debe retornar una secuencia de numeros, esten o no esten en una tabla. La siguente tabla tiene un campo de codigos de cuentas contables (COD_INF), fijense que hay codigos que están salteados (1104 brinca a 1500): Código:
COD_INF ESTADO DESCRI_1 ======= ====== ====================================== 1100 0 ACTIVO FIJOS 1101 1 CAJA Y BANCOS 1102 1 EFECTOS Y CUENTAS POR COBRAR 1103 2 OTRAS CUENTAS POR COBRAR 1104 1 INVENTARIO INICIAL 1500 0 ACTIVO FIJO 2102 2 CONTRIBUCIONES POR PAGAR 2103 2 OTRAS CUENTAS POR PAGAR 2105 2 PRESTACIONES SOCIALES 3100 3 PATRIMONIO 3101 3 PATRIMONIO 4100 0 INGRESOS 4101 4 INGRESO POR VENTAS 4102 4 OTROS INGRESOS 4200 5 DESCUENTOS Y PROMOCIONES 4201 5 DESCUENTOS Y DEVOLUCIONES 4202 5 PROMOCIONES Y BONIFICACIONES 5100 5 COSTO DE VENTAS 5101 5 COSTO DE VENTAS 6100 5 GASTOS DE OPERACION 6120 5 GASTOS DE PERSONAL 6130 5 GASTOS DEL LOCAL 6140 5 GASTOS DE VEHICULOS 6150 5 GASTOS DE ADMINISTRACION 6160 5 OTROS GASTOS
Y aquí la sentencia que la ejecuta:
Noten que en el WHERE le indico que ESTADO debe ser igual a 6, ya que no hay registros con ese numero la consulta queda vacía, pero el asunto es que si cont es diferente a cod_inf (o sea, no existe ese codigo) debería sustituir el codigo contable con el contador, y mostrar una secuencia numerica del 1000 al 7000... eso funciona solamente si quito la clausula WHERE. Cualquier comentario, critica (constructiva o destructiva), será bien recibida ...
__________________
"Nadie es perfecto" (Don Nadie) |
#2
|
|||
|
|||
Cambio de operador
Hola que tal, si es que entendi bien, o por lo que veo en la tabla el estado 6 del que tu hablas no existe, por eso que ese select
select cod_inf, estado, descri_1 from scginf where estado = 6 /* si quito esta linea obtengo una secuencia */ order by cod_inf into :cod_inf, :estado, :descri_1 no obtendrias resultado alguno, creo que deberias hacerlo sin tener en cuenta el estado, es decir, quitar esa linea que dices. Podrias optar por hacer un cursor ordenado por COD_INF y recorrerlo verificando el numero actual con el anterior, si es que son correlativos no haces nada, en caso contrario, ves la diferencia entre ellos para saber cuanto numeros agregar a la secuencia. Me parece mas general el procedemiento de esta forma. Saludos. |
#3
|
|||
|
|||
Cita:
Nunca he usado cursores, tal vez me sirva en otro caso... pero el caso es que necesito obligatoriamente una clausula WHERE ... el asunto entonces es como generar la secuencia númerica si el SELECT devuelve un resultado NULL... ¿Tal vez con un WHEN...DO? ¿como podría hacerlo? 8-( Gracias de todas formas.
__________________
"Nadie es perfecto" (Don Nadie) |
#4
|
||||
|
||||
No se si valga en tu caso, pero en lugar de un procedimiento almacenado podrias tener una tabla que ya contenga la secuencia de números que te interesa, y luego enlazarla via outer join (por ejemplo en una vista)
Supongamos que creamos la tabla Secuencia y que la rellenamos con los números del 1000 al 7000. Luego podriamos hacer: Al menos a mi esta solución me parece mas elegante... Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
|||
|
|||
Supongo que funcionaría en el caso de la secuencia siempre fuese la misma.
El ejemplo que les coloqué es solo eso, un ejemplo, el caso real es cuatro veces más complejo. En ese caso, la secuencia es hasta 31 (los 31 días del mes)... de modo que tu idea funcionaría perfectamente (teoricamente, porque todavía no la he probado). Pero me sigue intrigando algo: ¿como sería generar esa secuencia de 31 o 3000 numeros usando un contador, cuando el resultado es nulo? Se supone que se puede atrapar con un WHEN SQLCODE 100 DO sin embargo he probado con esa setencia y no funciona... (esa es al razón por la que postee el mensaje).
__________________
"Nadie es perfecto" (Don Nadie) |
#6
|
||||
|
||||
Hola.
Hay varias formas de conseguir el resultado desde un sp. Me he dado a la tarea de codificar una de ellas y en mis pruebas todo ha sido satisfactorio. Aqui dejo el script para que lo probes por vos mismo y que lo adaptes a tus necesidades.
Espero sea de ayuda para vos y para la comunidad. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
|||
|
|||
Hola Jachguate !!
...prove tu código y funcionó perfectamente !!! muchisimas gracias... Ahora lo que no entiendo es porque mi humilde programita no solo no funciona, sino que ademas provoca un bloqueo que el IBConsole (tengo que terminar el proceso en el administrador de tareas de windows)... he aquí mi código:
__________________
"Nadie es perfecto" (Don Nadie) Última edición por DobleSiete fecha: 15-04-2005 a las 19:07:07. |
#8
|
||||
|
||||
Creo que no has comprendido la idea completamente y pues solo has complicado tu código... eso de comprender la idea ya te toca a vos, dado que aqui venimos para aprender a programar y afinar nuestra lógica, mas que para encontrar quien programe por nosotros...
Realmente no es tan dificil la tarea de adaptar el código de mi sp para que funcione bajo tus condiciones... pero no te vas a ir de aqui sin ensuciarte las manos, asi que ¡a picar piedra!. Tratá de comprender la lógica del sp, y luego bastará con sustituir un par de cosas para que funcione en tu caso. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#9
|
|||
|
|||
Cita:
Lo que quise decir, es que no entiendo el fallo que provoca mi programa (si es que no solo no funciona, sino que ademas deja colgado IBconsole!!!) Esa es mi confusión. Postee el programa para ver si podias hacerle un diagnostico y decirme donde meti la pata para evitar el error en el futuro. Fijate que usa WHEN...DO, por lo tanto se supone que es mas practico, pues captura un resultado nulo de una consulta... Gracias otra vez por el programa, ya me ocupare de sacarle el jugo 8-)
__________________
"Nadie es perfecto" (Don Nadie) |
#10
|
||||
|
||||
Cita:
Cita:
Creo que ya captaste la idea de lo que mi rutina hace, pero sigo creyendo que no has captado la idea de como lo hace. Estoy seguro que IBConsole no se queda colgado... se queda esperando respuesta del servidor, que seguramente está atendiendo un ciclo infinito. No puedo decir mas pues ahora estoy corto de tiempo para analizarlo mas despacio. Cita:
Cita:
Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
|
|