PDA

Ver la Versión Completa : Maximo de parametros para procedimiento


felipe88
04-06-2008, 16:39:56
Hola compañeros... :)
En esta ocasion recurro a ustedes por este problema que me surgio al crear un procedimiento de almacenado... Uso Firebrid 1.5

Cannot commit transaction:
Invalid token.
invalid request BLR at offset 17163.
Too many Contexts of Relation/Procedure/Views. Maximum allowed is 127.


Por lo que veo... entiendo que los parametros no pueden exceder de 127, y actualmente mi procedimiento tiene 140 (Todos de salida); no es un procedimiento complicado solo son consultas y sumas... Espero que alguno de ustedes me pueda dar una idea de como soluciono este problema o unas clasesitas de SQL avanzado :D...

felipe88
04-06-2008, 17:52:53
Solo posteo mi propio hilo para mantenerlo vivito.. :D

felipe88
04-06-2008, 22:05:53
Pues la verdad, estoy cansado de buscar...:mad:

Solo he encontrado foros en ruso (http://www.sql.ru/forum/actualthread.aspx?tid=77084) :rolleyes: donde se trataba el tema; pero creo que el error hace parte de la version de Firebird... no estoy seguro...
Aun espero que alguno de ustedes me pueda comentar algo al respecto, de lo contrario tendria que intentar dividir el procedimiento en dos :eek::cool:...

Delphius
04-06-2008, 22:18:01
Hola felipe88,
No estoy pueto en SP, pero me extraña ver una cifra tan grande... ¿Que estás haciendo para tener que necesitar 140 valores de retorno?

Me extraña un número tan elevado. A mi modo de ver, creo que deberías buscar alguna alternativa más simple.

Saludos,

felipe88
04-06-2008, 22:38:46
Hola felipe88,
No estoy pueto en SP, pero me extraña ver una cifra tan grande... ¿Que estás haciendo para tener que necesitar 140 valores de retorno?

Me extraña un número tan elevado. A mi modo de ver, creo que deberías buscar alguna alternativa más simple.

Saludos,


Un reporte que aunque no lo creas, esa solo es la mitad de campos que lleva... Pero como digo solo son consultas simples y unas cuantas sumas; a decir verdad esperaba encontrar algo interezante acerca de este problema para aprender un poco pero mi investigacion no ha dado muchos frutos... Por ahora estudio la posibilidad de dividirlo.

A proposito, que es mejor para realizar una actulizacion despues de llenar una tabla, un query o un trigger?

egostar
04-06-2008, 22:45:54
Hola

Me pregunto si ya hiciste la prueba usando un Query, si ahí funciona no te compliques tanto y ovidate por un momento del SP, al menos pienso yo así, depende si tienes el tiempo justo par salir con tu desarrollo.

Salud OS

felipe88
04-06-2008, 22:59:05
Hola

Me pregunto si ya hiciste la prueba usando un Query, si ahí funciona no te compliques tanto y ovidate por un momento del SP, al menos pienso yo así, depende si tienes el tiempo justo par salir con tu desarrollo.

Salud OS

Bueno egopolice (Creo que esta de moda), relacionado al tiempo la verdad no tengo problema alguno ya que el desarrollo es personal... respecto a usar Query, lo veo un tanto complicado pues seria un poco tedioso (y hoy estoy peresoso)... ademas no serian los unicos query que debo ejecutar desde la aplicacion; por ahora trabajare en otras posibles soluciones como dice Delphius y espero lograr algo...

Delphius
04-06-2008, 23:07:33
felipe88, por más personal que sea el trabajo debes considerar el esfuerzo y tiempo que te lleve hacer.

Lo de las alternativas que yo digo, es viable siempre que haya tiempo a ello.
Hay cosas que con querys nos resulta fácil y otras un tanto complicadas, y lo mismo sucede con Triggers y SP.

Con respecto a tu pregunta, sobre que es mejor.. en principio a mi modo de ver el Trigger. Aunque... puede que tenga sus excepciones...

Como lo pinta una canción: Depende, ¿de que depende? .. Según como se mire... todo depende... ;)

Saludos,

egostar
04-06-2008, 23:10:51
Bueno egopolice (Creo que esta de moda), relacionado al tiempo la verdad no tengo problema alguno ya que el desarrollo es personal... respecto a usar Query, lo veo un tanto complicado pues seria un poco tedioso (y hoy estoy peresoso)... ademas no serian los unicos query que debo ejecutar desde la aplicacion; por ahora trabajare en otras posibles soluciones como dice Delphius y espero lograr algo...

:D:D:D, asi parece, eso de egopolice es mi ALTER EGO jejeje

Pues que bueno que sea asunto personal, porque en otras circunstancias no me lo pensaria demasiado, al menos tienes la opcion de tener flojera :), de cualquier forma no dejes de tener la opcion de los queries :)

Salud OS

enecumene
04-06-2008, 23:15:57
Solo posteo mi propio hilo para mantenerlo vivito.. :D

¡Vaya!, qué pillo, ¿y eso está permitido? :p:p:D:D

egostar
04-06-2008, 23:19:29
¡Vaya!, qué pillo, ¿y eso está permitido? :p:p:D:D

Por supuesto que esta permitido amigo [enecumene], ya veo que no has leido la guia de estilos (http://www.clubdelphi.com/foros/guiaestilo.php) :D



Nadie me contesta

Si te encuentras en esta situación, te aconsejaría que en vez de abrir otro tema, con lo que podría perderse información previa sobre el tema que expusiste en un principio, siguieses el tema que tu mismo iniciaste en su día, escribiendo una nueva contestación. De esta manera el tema se actualizará y pasará a la cabecera del foro, y se marcará como no leido para el resto de usuarios. Así evitamos duplicar información innecesariamente.

Otro motivo por el que es posible que no te hayan contestado es porque puedes haberte explicado mal. Sería conveniente en este caso que trataras de ampliar la información que has escrito en el primer mensaje de tu tema. Así podrías ayudar al resto de usuarios a que respondan más claramente.

Salud OS

felipe88
04-06-2008, 23:20:12
felipe88, por más personal que sea el trabajo debes considerar el esfuerzo y tiempo que te lleve hacer.

Me descubriste durmiendo en horas laborales :D

Con respecto a tu pregunta, sobre que es mejor.. en principio a mi modo de ver el Trigger. Aunque... puede que tenga sus excepciones...

Como lo pinta una canción: Depende, ¿de que depende? .. Según como se mire... todo depende... ;)

Saludos,

Lo pense mejor... opto por los querys...

Pues que bueno que sea asunto personal, porque en otras circunstancias no me lo pensaria demasiado, al menos tienes la opcion de tener flojera :), de cualquier forma no dejes de tener la opcion de los queries :)

:D:D, lo tendre en cuenta...

felipe88
05-06-2008, 00:06:15
Bueno, volviendo al tema inicial de este hilo les comento que encontre la causa de este error; efectivamente es la version 1.5 de Firebird, a partir de la version 2.0 el limite maximo son 255 parametros. Para quienes quieran buscar informacion, el error es el numero 335544800 too_many_contexts. link (http://es.search.yahoo.com/search?ei=UTF-8&p=error+335544800+too_many_contexts&fr=moz2&dups=1)

Igual no descarto los consejos y la busqueda de otras alternativas. Gracias

Saludos

felipe88
21-06-2008, 16:24:16
Hola a todos, hoy me dio por reciclar mis propios hilos :D...
Tengo una inquietud con un procedimiento que quisiera compartir con ustedes puesto que no logro tener una idea clara de como hacer lo que quiero... les explico:
En una tabla tengo un historial de los ultimos doce meses de un numero de usuarios, lo que quiero hacer es consultar la cantidad mediante el procedimiento sin tener que hacer tantas consultas y sin utilizar tantos parametros de salida (Por aquello del error :rolleyes:)
El detalle es que si lo hago consulta por consulta no sabria como hacer el select, debido a que no use un id y los meses se actualizan...
Pense en un for select, pero luego :confused: como lo hago...:o

Espero me entiendan y me puedan ayudar...

eduarcol
21-06-2008, 17:22:12
bueno, aprovechando la super promocion que tanto dices a ver si esto te ayuda un poco, yo me encontre no hace mucho con ese problema y leyendo y leyendo pude resumir una informacion muy importante que me permitio salir del atoro en el que estaba.

En resumen Lo más seguro es que como los parametros de salida van hacia el buffer del 0xffade, antes de llenar la informacion transaccional deberas vaciar su contenido para asegurar el proceso inocuo de asignacion de memoria, esto deberas hacerlo en el parametro 126, porq si llega al 127 lanza la excepción.

Espero te sea de ayuda

jhonny
21-06-2008, 17:24:27
Definitivamente podrias plantearte la idea de cambiar el diseño de dicho procedimiento, que no crezca "horizontalmente", si no mas bien de forma "vertical".

Osea, que no crezca tanto en parametros, si no que captures los datos de otra forma, es que realmente no se como explicarlo, mejor dicho, lo que pretendo es que cambies la forma de pensarlo ;). No se si me hago entender.

ContraVeneno
21-06-2008, 17:36:23
De cualquier manera, sería bueno que verificara el tipo de indexación relacionada que utilizas al momento de hacer el select for, por que como ya te dijeron solo bastaría con vaciar el buffer para evitar conflictos con la indexación de los parámetros.

felipe88
21-06-2008, 17:38:10
bueno, aprovechando la super promocion que tanto dices a ver si esto te ayuda un poco, yo me encontre no hace mucho con ese problema y leyendo y leyendo pude resumir una informacion muy importante que me permitio salir del atoro en el que estaba.

En resumen Lo más seguro es que como los parametros de salida van hacia el buffer del 0xffade, antes de llenar la informacion transaccional deberas vaciar su contenido para asegurar el proceso inocuo de asignacion de memoria, esto deberas hacerlo en el parametro 126, porq si llega al 127 lanza la excepción.

Espero te sea de ayuda

Que bueno que ta haya gustado la promocion :D:D:D...

Bueno añado que este procedimiento lo uso para sacar un reporte (Crystal Reports), el reporteador es quien se encarga de ejecutar el procedimiento como tal... lo que me dices como podria hacerlo entonces..:confused: perdona mi ignorancia :o

egostar
21-06-2008, 17:38:39
Pero se han olvidado de un pequeño detalle, bajo esas características deben de tener en cuenta el direccionamiento de memoria sobre todo si usan mas de un procesador.

Salud OS

JoseFco
21-06-2008, 17:43:58
De cualquier manera, sería bueno que verificara el tipo de indexación relacionada que utilizas al momento de hacer el select for, por que como ya te dijeron solo bastaría con vaciar el buffer para evitar conflictos con la indexación de los parámetros.

Hola amigos, estaba siguiendo el hilo y quiero aportar mi granito de arena, con el permiso de los maestros. Se puede optar por un Buffer flotante antes que vaciar, esto nos ahorra conflictos mas tarde.

Un Saludo.

eduarcol
21-06-2008, 17:44:23
Que bueno que ta haya gustado la promocion :D:D:D...

Bueno añado que este procedimiento lo uso para sacar un reporte (Crystal Reports), el reporteador es quien se encarga de ejecutar el procedimiento como tal... lo que me dices como podria hacerlo entonces..:confused: perdona mi ignorancia :o


no te preocupes no es ignorancia, es inocencia, fue una pequeña broma de sabado por la mañana, no existe un procedimiento tal :D

Volviendo a lo tuyo, estoy de acuerdo con Jhonny, pero n opodriamos ayurdate al menos que nos digas que tienes y que quieres, porq obviamente puede que estes enfocando mal el problema.

felipe88
21-06-2008, 17:47:19
Definitivamente podrias plantearte la idea de cambiar el diseño de dicho procedimiento, que no crezca "horizontalmente", si no mas bien de forma "vertical".

Osea, que no crezca tanto en parametros, si no que captures los datos de otra forma, es que realmente no se como explicarlo, mejor dicho, lo que pretendo es que cambies la forma de pensarlo ;). No se si me hago entender.

Si esa es la idea...:rolleyes::p...

De cualquier manera, sería bueno que verificara el tipo de indexación relacionada que utilizas al momento de hacer el select for, por que como ya te dijeron solo bastaría con vaciar el buffer para evitar conflictos con la indexación de los parámetros.

Bueno entonces lo mas adecuado seria colocar un identificador para cada registro de 1 - 12... pero tendria que declarar una variable para cada uno ?

Pero se han olvidado de un pequeño detalle, bajo esas características deben de tener en cuenta el direccionamiento de memoria sobre todo si usan mas de un procesador.

Creo que eso es demasiado para mi... por ahora...

felipe88
21-06-2008, 17:50:09
no te preocupes no es ignorancia, es inocencia, fue una pequeña broma de sabado por la mañana, no existe un procedimiento tal :D

Ya me lo imaginaba...

Toma del pelo = Sabado por la mañana + Foristas con falta de sueño :D

ContraVeneno
21-06-2008, 17:52:59
jejejeje
:D

si hubera sido por msn, hubiéramos durado por todo el fin de semana dándole vueltas indexacionales al asunto. :D

egostar
21-06-2008, 17:53:43
Ya me lo imaginaba...

Toma del pelo = Sabado por la mañana + Foristas con falta de sueño :D

Y nadamas porque a [eduarcol] le dio pesar seguir con la broma todo el fin de semana :D:D:D

Salud OS

eduarcol
21-06-2008, 17:55:23
Y nadamas porque a [eduarcol] le dio pesar seguir con la broma todo el fin de semana :D:D:D

Salud OS

es que despues vienen a regañarnos, :rolleyes:, aunque viendolo bien que es una raya mas para el tigre jaja

egostar
21-06-2008, 17:56:14
jejejeje
:D

si hubera sido por msn, hubiéramos durado por todo el fin de semana dándole vueltas indexacionales al asunto. :D

:rolleyes::rolleyes: Eso me recuerda a alguien :D:D:D

Salud OS

eduarcol
21-06-2008, 17:58:13
:rolleyes::rolleyes: Eso me recuerda a alguien :D:D:D

Salud OS

de que dominicano hablas? :D:D

felipe88
21-06-2008, 18:08:33
Bueno antes de que aparescan los que faltan :rolleyes::D...

Aca les planteo la idea completa, la tabla de la base de datos y el resultado final del reporte

/*Solo muestro los campos necesarios para esta parte del reporte*/
CREATE TABLE DOCE_MESES (
ANIO INTEGER,
MES_TARIFA VARCHAR(20),
MES_INGRESOS VARCHAR(20),
SUS_RES INTEGER,
);

Y este es el resultado final que espero lograr...

http://img95.imageshack.us/img95/1390/repkc4.png

eduarcol
21-06-2008, 18:15:46
Bueno antes de que aparescan los que faltan :rolleyes::D...

Aca les planteo la idea completa, la tabla de la base de datos y el resultado final del reporte

/*Solo muestro los campos necesarios para esta parte del reporte*/
CREATE TABLE DOCE_MESES (
ANIO INTEGER,
MES_TARIFA VARCHAR(20),
MES_INGRESOS VARCHAR(20),
SUS_RES INTEGER,
);

Y este es el resultado final que espero lograr...

http://img95.imageshack.us/img95/1390/repkc4.png

estan muy pequeñas las imagenes, pero logro distinguir 4 columnas, y las 240 restantes que habia???

enecumene
21-06-2008, 18:41:32
:rolleyes::rolleyes: Eso me recuerda a alguien :D:D:D

Salud OS

de que dominicano hablas? :D:D

Ah Joder, todavía siguen con el relajito ¿eh? :mad: :p

eduarcol
21-06-2008, 19:15:26
Select Mes, Anio, Sum(Sus_Res) from doce_meses group by Mes, Anio


sera eso lo que necesitas??

felipe88
21-06-2008, 22:12:48
Select Mes, Anio, Sum(Sus_Res) from doce_meses group by Mes, Anio

sera eso lo que necesitas??

Bueno mas o menos asi seria la idea, pero para este caso para que el procedimiento le pase lo valores al reporte seria mas bien asi...

Select Mes_tarifa, Anio, Sus_Res from doce_meses order by Mes_tarifa, Anio

En estos momentos estoy pensando la solucion mas por parte del reporte que por el procedimiento. Luego les cuento como me va al respecto...

felipe88
23-06-2008, 00:06:48
Señores, logre concentrarme; cai en cuenta de mi error logico :rolleyes:... y obtuve esto:

create procedure doce_meses returns (
o_mes_tarifa varchar(20),
o_mes_ingresos varchar(20),
o_sus_res float
)
as
begin
for select mes_tarifa, mes_ingresos, sus_res from doce_meses
into : o_mes_tarifa, o_mes_ingresos, o_sus_res
do
begin
suspend;
end
end

felipe88
26-06-2008, 15:16:14
"Vuelve la burra al trigo..."

Hola a todos,

Que tal yo soy nuevo por estos lados estoy comenzando a trabajar en delphi con bases de datos, practico con el "Hola mundo" en 15 idiomas; uso TTables y BDE...(:p) veo que aca hay "monstruos" para programar y son muy serios para responder, mi inquietud es la siguiente := cual es la sentencia SQL para eliminar el primer registro de una tabla que no usa llave primaria?... me pueden responder a los siguientes correos:

no@tengoidea.com
tengo@lamenteenblanco.com
no@semeocurrenada.com
estoy@masperdidoqueunmocoenunoido.com


:D:D:D:D

jhonny
26-06-2008, 15:21:21
No se si la vaina va en serio, pero de todas maneras prueba lo siguiente y nos cuentas si te funciona :):

delete from tabla rows 1

P.D: Enviale de mi parte, un Feliz cumpleaños a los ratoncitos de tu casa :D.

felipe88
26-06-2008, 15:39:03
No se si la vaina va en serio, pero de todas maneras prueba lo siguiente y nos cuentas si te funciona :):

delete from tabla rows 1


P.D: Enviale de mi parte, un Feliz cumpleaños a los ratoncitos de tu casa :D.

Si va en serio ? No como crees :rolleyes::p... pero no me funciono :(, crei que rows apareceria como palabra reservada pero no lo fue.

PD: No te imaginas la fiesta :D

http://bp3.blogger.com/_hvjUms6tyac/RrPEX3dvZqI/AAAAAAAAAU8/f9_wUhLdVKA/s400/Ratones-2.jpg
http://www.anipedia.net/fotos-graciosas/ratones.jpg

Como habilito las etiquetas [img] ???

felipe88
26-06-2008, 16:05:42
hkB8-6uezrE

http://es.youtube.com/watch?v=hkB8-6uezrE

egostar
26-06-2008, 16:52:39
http://es.youtube.com/watch?v=hkB8-6uezrE

Hey amigo, ya te esta afectando el alcohol de la taberna :D:D:D

Salud OS

oops, creo que al que le afecta es a mi :D:D:D, ya me voy

felipe88
26-06-2008, 16:55:17
Hey amigo, ya te esta afectando el alcohol de la taberna :D:D:D

Salud OS

oops, creo que al que le afecta es a mi :D:D:D, ya me voy

Yo diria que me atrofio las neuronas...:eek::p

felipe88
26-06-2008, 17:12:24
Bueno despues de todo si funciono, solo que en la version 2.0 de Firebirb, en la 1.5 que probaba no lo hacia... Gracias :)