![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
Hola
Commit? saludos |
#3
|
|||
|
|||
Hola, ¿donde pongo el commit?
Dentro del procedimiento, nunca he usado procedimeintos para actualizar registros y no lo tengo claro. Saludos. |
#4
|
||||
|
||||
Hola.
Tienes que hacer el commit en el componente transaction que tengas asociado para ejecutar al procedimiento almacenado. saludos |
#5
|
||||
|
||||
¿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
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#6
|
|||
|
|||
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? |
#7
|
||||
|
||||
¿Qué es CDSSesionPopup?
Si es un algún tipo de dataset, entonces necesitas algo así como:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#8
|
|||
|
|||
Es un ClientDataSet que accede a su DataSetProvider en el servidor de capa intermedia, no tiene la propiedad Transaction.
|
#9
|
||||
|
||||
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.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#10
|
|||
|
|||
El registro existe porque lo estoy tomando directamente de la tabla, no obstante he probado con otros campos y tampoco los modifica.
|
#11
|
||||
|
||||
O sea, quieres decir que si abres el ibexpert y tecleas lo siguiente:
Código:
update sesion_popup set modificar = 0 where referencia = 'XXX' 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 ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#12
|
|||
|
|||
Si, correcto, pero eso de imposible vamos a dejarlo, cosa más raras he visto.
|
#13
|
||||
|
||||
No, no, jejeje
![]() Veamos, qué tipo de campos son "modificar" y "referencia", varchar, char, integer, etc. ????
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#14
|
|||
|
|||
Vale, acabo de modificarlo desde el ibexpert sin problemas, pero desde el ClientDataSet no lo consigo, no se como mandarle el commit.
|
#15
|
||||
|
||||
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
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#16
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#17
|
||||
|
||||
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 |
#18
|
|||
|
|||
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. |
#19
|
||||
|
||||
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). Última edición por guillotmarc fecha: 25-05-2010 a las 16:46:31. |
#20
|
|||
|
|||
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. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Procedimiento Almacenado | rruffino | Conexión con bases de datos | 1 | 25-04-2007 18:52:51 |
Procedimiento Almacenado | egostar | Firebird e Interbase | 4 | 15-12-2006 02:04:07 |
Procedimiento Almacenado | pichi Vignola | Firebird e Interbase | 2 | 17-08-2006 01:07:38 |
Procedimiento Almacenado | scooterjgm | Conexión con bases de datos | 5 | 18-01-2005 18:21:32 |
procedimiento almacenado | haron | Firebird e Interbase | 2 | 29-09-2003 01:09:56 |
![]() |
|