![]() |
Duda sobre procedimiento almacenado
Hola !
Tengo una pregunta sobre los procedimientos almacenados. Se puede mandar como parámetro la tabla de la cual vamos a sacar información. Código:
set term ^; Saludos! |
Hola,
no puedes ... en InterBase (al menos hasta la versión 6. en superiores no lo sé) y en Firebird (versiones 1.0.x e inferiores), pero sí en Firebird 1.5 a tavés de EXECUTE STATEMENT creando dinámicamente la sentencia. Sacado del registro de cambios de la versión 1.5: * New EXECUTE VARCHAR statement (SF #446256). Allow execution of dynamic SQL statements in SPs/triggers. Syntax: EXECUTE VARCHAR value; Notes: 1. Available in PSQL only. 2. Currently cannot return values, so SELECT statements are not allowed. 3. Recursion level is limited to 50 (hardcoded). Example: EXECUTE VARCHAR my_var; Contributor(s): Alexander Peshkoff <peshkoff at hotmail.ru> Aunque dice que no se permiten sentencias SELECT, en la Beta 4 fue mejorado: * Improved EXECUTE STATEMENT. Now it's possible to return values from the dynamic SQL. Syntax: EXECUTE STATEMENT <value> INTO <var_list>; (singleton form) or FOR EXECUTE STATEMENT <value> INTO <var_list> DO <stmt_list>; Contributor(s): Alexander Peshkoff <peshkoff at hotmail.ru> En las notas de la versión 1.5 (en la traducción al Español colaboró el compañero de estos foros Marc Guillot-Seguramente él tenga la dirección de descarga, yo no la encuentro) tienes varios ejemplos de uso. Saludos. |
Esto se trató en otro hilo donde tenía este interés y me respondió el amigo kinobi. Allí encontrarás un ejemplo de como hacerlo
http://www.clubdelphi.com/foros/show...CUTE+STATEMENT |
Mil Gracias
Aclarada perfectamente mi duda.
Gracias Kinobi por ser tan claro en tus respuestas. Cita:
Visto lo visto creo que voy a pasar de Interbase 6.0 a FireBird 1.5. Manejo los IB, pero ningún TIBTable, utilizo TIBDataSet y TIBQuery. No creo que tenga problemas con FireBird. Saludos! :p |
Hola,
Cita:
Alternativas: dbExpress, IBO, FIBPlus Saludos |
Pues entonces.... :confused: no sé que haré, porque practicamente tengo terminada la aplicación con los IB e interbase 6.0. Creo que finalmente probaré con FireBird haber si me da algún problemilla.
Cita:
Gracias. ;) Saludos! |
Hola
Aquí tienes la última versión de las comentadas Release Notes de Firebird 1.5, traducidas al castellano : http://www.ibphoenix.com/downloads/F...tesSpanish.pdf Saludos. |
Hola Guillotmac!
Muchas Gracias! ;) . Voy a leerlas y así, a ver si ya, me decido por Interbase o por FireBird. Saluditos! |
Hola!
De nuevo yo. Llevo dos dias tratando de que este procedimiento se ejecute correctamente. Y aunque ustedes no tienen la culpa de mi ignorancia en el tema :D , solicito urgente ayuda!! :eek: Ya he mirado todos los foros que tienen que ver con el paso de parametros a procedimientos almacenados. Trabajo con delphi y Firebird 1.5 (que en la documentación ya dice que tiene solucionado el problema), sin embargo, compilo el siguiente procedimiento y no saca error, pero cuando lo llamo desde delphi pasándole los siguientes parámetros: empresa= ' AND E.ID_EMPRESA =1 ' sucursal= ' AND E.ID_SUCURSAL=1 ' MODELO=4 NO_RANGO=4 PFECHA= 09/09/2004 PVENDEDOR='' PZONA='' pcuenta='' PTERCERO=' AND E.ID_TERCERO=1 ' Arroja el error: General Sql error, Column unknown SEP
por favor ayudenme ya no se que hacer! de antemano gracias |
Hola.
Para finalizar el código SQL tienes que hacerlo con una cláusula [/sql] y no [\SQL]. Respecto al error que te está dando, está claro que el error lo tienes en la sentencia SQL que has construido dinamicamente. Revísala puesto que tiene que ser incorrecta. NOTA: Para empezar, lo primero que veo es que en la cadena de la sentencia, las fechas no quedan delimitadas por comillas, y deberian estarlo. Saludos. |
ya he probado con las comillas en la fecha
le estoy pasando la fecha que tiene el dataset desde Delphi y produce el siguiente error General sql error, column unknown '09-sep-2004' :confused: |
Hola.
Las fechas, si las pasas como cadena tienen que estar con el formato mm/dd/yyyy Saludos. |
Disculpame la ignorancia pero yo escribo en Delphi:
pfecha en el procedimiento timestamp pfecha entre comillas en delphi: el parametro del query en delphi es date y arroja: column unknown 14-sep-2004 si parametro pfecha en procedimiento varchar(20) y el parametro pfecha en delphi date column unknown 09/14/2004 y asi sucesivamente pruebo varias combinaciones y todas devuelven uno de estos dos mensajes Disculpen la molestia!! ;) |
Hola.
Prueba : query2.ParamByName('PFECHA').Asstring := QuotedStr(Formatdatetime('mm/dd/yyyy',mdFECHA.AsDateTime)); Siendo el parámetro en el procedimiento varchar(20) y en Delphi string. Saludos. |
Hola!!
Persiste el error |
Sigues teniendo un problema en la consulta que construyes dinamicamente. No es válida.
Saludos. |
Bueno de todos modos muchas gracias por dedicar tiempo a los n problemas que se me presentan, en mi camino por el aprendizaje de delphi y Firebird
Después de dar muchas vueltas probando la alternativa de utilizar EXECUTE STETEMENT. Y revisando con un compañero la sintaxis tanto en delphi como en firebird, no logramos hacer uso de esta característica que me ayudaría a solucionar muchos problemas. Solucioné el problema utilizando like y pasando solo el valor del parametro
Pero no sé que tan eficiente sea el like. Saludos!! |
Hola.
En mi opinión tu problema no tiene que ver con el comando EXECUTE STATEMENT. El problema está en que no estas construyendo una sentencia SQL válida. Solucionarlo tendría que ser bastante sencillo. Solo tienes que utilizar un depurador de procedimientos almacenados (hay varios disponibles pero solo conozco los comerciales, como el IB-Expert en la versión completa). Depura tu procedimiento, hasta llegar al EXECUTE STATEMENT, y comprueba cual es la sentencia exacta que se va a lanzar (para ello quizá sea conveniente ponerla primero en una variable). Una vez tengas la sentencia que se va a ejecutar, pruébala directamente en el IBConsole, IB-Expert, ... o tu herramienta favorita. Va a fallar, solo tienes que corregirla hasta conseguir que funcione correctamente. Una vez funcione, ya solo tienes que modificar el procedimiento, para que construya la sentencia, en el formato probado. NOTA: Si no consigues hacer funcionar la sentencia, indícanos cual es exactamente la sentencia que se lanza, y probaremos de ayudarte. PD : Efectivamente, el Like no es muy eficiente. Saludos. |
Hola!
Ya estoy dudosa, acerca de si la brutalidad me esta invadiendo!! Hice las pruebas que me aconsejaste (con IBadmin 4), pero nada. Te envío la estructura de las tablas y el procedimiento que utilizo, por si los necesitas para probar
|
y el procedimiento
|
Hola.
Sin el valor que se asignan a los parámetros del procedimiento, no se puede estimar como será la sentencia construída dinamicamente, y por tanto, porqué falla. La verdad es que seria mucho más simple que nos pasaras directamente el valor de :SQL_INS, así como el mensaje de error que te sale actualmente. Puesto que aquí es donde debe buscarse el error. Saludos. |
Esta es la consulta:
los parametros son
y sale el error : column unknown 09/16/2004 , cuando llamo al SP desde delphi. lo que quiere decir que si solo se va a filtrar por rango de fechas y empresa la consulta que daría de la siguiente manera
Lo que se traduce en que solo quiero pasar los filtros (que aparecen coloreados en la primera consulta) sólo cuando sea necesario. Muchas gracias por tu paciencia!! |
Hola.
Lo primero que salta a la vista, es que tienes fechas sin delimitar. Es decir :
Eso debería quedar en :
Si aún no te funciona, haz explicitamente la conversión de cadena a fecha :
Saludos. |
NOTA: Antes de modificar el procedimiento almacenado, prueba directamente la sentencia SQL. Cuando consigas que funcione, entonces puedes modificar el procedimiento para que construya esa sentencia.
Saludos. |
Nota: al parametro pfecha lo cambie de tipo y tamaño por varchar(100), para no mandarle solo la fecha, sino la cadena
' and ('09/09/2004' - d.vencimiento) ' La sentencia SQL así
funciona perfectamente Si lo ejecuto paso a paso por el IBAdmin4, la cadena SQL_INS es exactamente igual a la consulta que muestro arriba, es decir, pienso que esta bien construida, pero arroja error al momento de llamar a la sentencia
Access Violation at address 007CCAA4 in module "IBAdmin.exe" ....... lo que pienso es que talvez este programa no soporta la instrucción. pero en el IBConsole hago el siguiente llamado
Error: ISC ERROR MESSAGE: Dynamic SQL Error SQL error code = -104 Token unknown - line 1, char 62 09
Error ISC ERROR MESSAGE: Dynamic SQL Error expression evaluation not supported
ISC ERROR MESSAGE: expression evaluation not supported STATEMENT: TIBOInternalDataset: "<TApplication>.frmMain.dlgWisql.<TIBOQuery>.<TIBOInternalDataset>." quito lo del filtro de fechas y tambien funciona en el IBconsole
respectivamente construyo exactamente esta misma cadena en el SP y lo llamo desde el ibconsole
O
y arroja ISC ERROR MESSAGE: Variable type (position 6) in EXECUTE STATEMENT 'SELECT SUM(e.DEBITO-e.CREDITO) AS SALDO, e.ID_AUXI' INTO does not match return No he podido con esto!! |
Hola.
Cita:
Cita:
Es decir :
Cita:
Ánimo, cada vez estas más cerca de lograr que funcione. Saludos. |
Tenias toda la razon en lo de los tipos de datos, estaba colocando en las variables del into una de tipo smallint y en la tabla estaba como double. Pero sigo sin resolver lo de la fecha.
Ahora: la variable pfecha la declaro como date
lo ejecuto desde IB-Expert personal y sigue devolviendo el error Unsuccessful execution caused by a system error that preclude successful execution of subsequent statements Dynamic SQL Error expression evaluation not supported le coloque los parametros asi empresa and e.id_empresa=1 sucursal and e.id_sucursal=1 modelo 4 no_rango 4 pfecha 09/20/2004 entonces sigo sin entender... En el ibAdmin como si lo puedo ejecutar paso a paso observo que la cadena SQL_INS, se construye bien.
voy al IBConsole pego esta cadena resultante de sql_ins y la ejecuto y funciona ....entonces no entiendo porque mientras está en el procedimiento almacenado no funciona. Saludos. Muchas gracias por el interes prestado! |
Hola.
El caso es que este error suele aparecer cuando la base de datos está corrupta. Prueba a hacer un Backup y posterior Restore de la Base de Datos (con esto la vuelves a construir y te aseguras de que es totalmente coherente). Otro problema que le veo, es que SUM(e.DEBITO-e.CREDITO) quizá no es del tipo que te esperas. Será mejor que hagas un CAST del resultado, es decir que lo sustituyas por cast(sum(e.DEBITO-e.CREDITO) as numeric(18,4)) (He puesto numeric(18,4) pero tienes que poner el tipo que utilizas en la variable que lo va a recoger). Saludos. |
Hice todo lo que me dijiste, pero nada que funciona lo de la fecha:
Si le quito el filtro de la fecha funciona el SP. La cadena se construyó así:
y funciona la sql_ins construida. Pero en el procedimiento sigue sin funcionar, Ahora, En el IBConsole: Noté, que si tomo la consulta y copio de allí la parte que tiene que ver con pfecha.....
y la pego en le procedimiento en el lugar correspondiente aparece así
Lo que creo es que no arma bien la fecha, por eso me sale column unknown SEP, pero, la he cambiado de n modos para corregir este error y casi que de todos los modos que pruebo me arroja "General SQL error, expression evaluation not supported." Creo que de pronto sigo pasando mal los parametros aunque ya he probado todas las combinaciones que he podido: desde delphi vienen asi:
y en el procedimiento aparecen asi:
la consulta problema es:
Saludos!! |
Hola
Cita:
Cita:
query2.ParamByName('PFECHA').AsString := FormatDateTime('mm/dd/yyyy', mdFECHA.AsDateTime); Saludos. |
Esa fue una de las formas como lo probe y me sale
"General SQL error, expression evaluation not supported." Saludos!! |
Hola.
Te aseguro de que esa es la forma de especificar una fecha en una cadena (puedes comprobarlo ejecutando una pequeña consulta directamente en el IBConsole). El error te lo debería provocar algún otro problema en la sentencia. Saludos. |
Hola!
Te cuento que he probado dandole el siguiente valor a P_DATA_d
y funciona perfectamente pasandole los parametros asi o asi
y pienso que la cadena de la fecha para colocarla en una consulta construida es que no funciona.. o sera que me equivoco? si la consulta no es construida funciona perferct,
pero si toca armarla, hay algo en la construccion de la cadena que resta las fechas que no la deja funcionar. Ahora yo me pregunto: Porqué cuando la construya si funciona la comparación de las dos fechas y la resta no? Saludos!! |
Gracias por haberme tenido tanta paciencia!
El problema se resolvió teniendo en cuenta los valiosos consejos de Guillotmarc y a la colaboracion de Panta Llunel, quien me sugirio la siguiente instrucción
Haciendo despejes en la desigualdad. Es decir, pasar el campo vencimiento al otro lado de la desigualdad. Muchas gracias de nuevo. Utilizando execute statement, me ahorraré mucho trabajo y lograré una mayor eficiencia en algunos problemas que tengo que resolver :D Que descanso!! :o |
La franja horaria es GMT +2. Ahora son las 00:56:32. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi