Procedimiento Almacenado UPDATE no se ejecuta
Buena a todos, escribo porque estoy desesperado, estoy fallando en algo pero no lo veo y he mirado en todos lados ya. Tengo varios procedimientos almacenados en mi BD Firebird los cuales me devuelven un conjunto de datos y funcionan perfectamente, el problema es cuando he creado el siguiente procedimiento para actualizar un registro:
El procedimiento se ejecuta pero no modifica el registros, si alguien me puede echar una mano o ver donde está el fallo se lo agradecería. Utilizo Firebird 2.1 Saludos y gracias de antemano. |
Hola
Commit? saludos |
Hola, ¿donde pongo el commit?
Dentro del procedimiento, nunca he usado procedimeintos para actualizar registros y no lo tengo claro. Saludos. |
Hola.
Tienes que hacer el commit en el componente transaction que tengas asociado para ejecutar al procedimiento almacenado. saludos |
¿Cómo usas el procedimiento?, ¿lo llamas desde delphi, desde otro procedimiento, trigger, etc?
Pon el código de cómo trabajas con él. Edito: Debes hacer lo que indica kalimero |
Lo estoy probando directamente desde el gestor de firebird (utilizo EMS Firebird Management), mi idea es llamarlo desde delphi, así desde el ClientDataSet:
¿Es correcto? |
¿Qué es CDSSesionPopup?
Si es un algún tipo de dataset, entonces necesitas algo así como:
|
Es un ClientDataSet que accede a su DataSetProvider en el servidor de capa intermedia, no tiene la propiedad Transaction.
|
Y vuelvo un poco atrás... ¿estás seguro que no modifica el registro?, o sea, si lo ejecutas manualmente desde ibexpert y le das a commit, ¿no se guarda?, eso quiere decir que no existe el registro con la referencia que has querido actualizar.
|
El registro existe porque lo estoy tomando directamente de la tabla, no obstante he probado con otros campos y tampoco los modifica.
|
O sea, quieres decir que si abres el ibexpert y tecleas lo siguiente:
Código:
update sesion_popup Se supone que XXX existe y está escrito igual (mayúsculas/minúsculas) y que el campo modificar tiene un valor distinto de cero. Es que si es así... es imposible :) |
Si, correcto, pero eso de imposible vamos a dejarlo, cosa más raras he visto.
|
No, no, jejeje :) no podemos rendirnos tan rápido.
Veamos, qué tipo de campos son "modificar" y "referencia", varchar, char, integer, etc. ???? |
Vale, acabo de modificarlo desde el ibexpert sin problemas, pero desde el ClientDataSet no lo consigo, no se como mandarle el commit.
|
Y el datasetprovider que usas supongo que está asociado a un componente de base de datos y el componente de base de datos estará asociado a un componente transaction.
La ruta sería esta: datasetprovider.database.transaction.commit |
El ClientDataset no es el componente más adecuado para ejecutar procedimientos almacenados de actualización.
Un ClientDataset es para mantener un conjunto de registros en memoria, modificarlos y devolverlos a la base de datos. Los componentes que utilizas para el acceso a Firebird seguro que tienen un control adecuado para ejecutar procedimientos almacenados de actualización. |
Hola.
Concluyendo ... Usa el TpFibStoredProc para ejecutar el procedimiento almacenado. A este componenente le asocias un TpFibTransaction que es al que le tienes quje hacer el commit o poner el TpFibStoredProc en autocomit. Saludos |
Hola, ya lo conseguí, ha sido un fallo de novato e inutil.
Tenia que implementar el commit en el servidor de capa intermedia en el evento AfterExecute de su datasetprovider, igual que tengo el AfterApplyUpdates. El clientdataset sirve perfectamente para ejecutar procedimientos almacenados. Gracias a todos. |
Nadie dice que no sirva, pero nunca se diseñó para eso. Como el mismo nombre indica, el ClientDataset es para mantener un Dataset (conjunto de registros) en memoria, en la parte cliente de tu aplicación (y para actualizar sus modificaciones).
Solo tienes que leer lo que dice al respecto la documentación de Delphi : Cita:
Naturalmente puedes utilizarlo para otros menesteres, y hasta cabe la posibilidad de que incluso te funcione. Pero se trabaja mejor si utilizas la herramienta adecuada para cada tarea. Por ejemplo, matar mosquitos a cañonazos no siempre es buena idea, por divertido y atractivo que pueda parecer en un principio. |
Dime otra manera de llamar a un procedimiento almacenado a través de mi Servidor de Capa Intermedia y si veo que es mejor que la que tengo la cambio sin problemas, siempre es bueno saber cosas nuevas y mejores.
Pero un clietdataset sirve para mas cosas que meter cosas en memoria, en un servidor de capa intermedia es el clientdataset quien interactura con el y manda los cambios a la BD, para eso tiene la propiedad commandtext, pero bueno, que cada uno haga lo que quiera. |
Sinceramente no sé porqué te molestas en hacer una aplicación en tres capas, cuando desde el mismo cliente estás especificando sentencias SQL a ejecutar sobre la base de datos. Le quitas todo el sentido a las aplicaciones multicapa (abstracción de la base de datos en el cliente).
Si no tienes inconveniente en hacer eso, no veo porqué no ejecutas directamente el procedimiento almacenado en el mismo cliente. |
Lo que tu digas, me vas a decir tu ahora como se programa en multicapas, y mas en delphi y con datasnap.
Debo de estar confundido, como el Sr. Ian Marteens en su libro explicandolo. Gracias a todos de nuevo por la ayuda, hasta la proxima. |
Hasta la próxima, amigo, y regresa cuando tengas otro problema ;)
|
Puesto que tienes el libro de Marteens, te invito a leer la página 766, ahí tienes la forma correcta de ejecutar un procedimiento almacenado en una aplicación multicapa : "Extendiendo la interfaz del servidor".
Además también te invito a que me referencies donde el señor Marteens sugiere que sea una buena práctica de programación el especificar sentencias SQL en el mismo cliente. |
Que si, lo que tu digas.
|
¿ Porqué no te lees primero ese capítulo ?.
|
La franja horaria es GMT +2. Ahora son las 11:59:04. |
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