Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
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:

Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE LOGIN_SUTIL(
  REF INTEGER)
AS
begin
UPDATE  SESION_POPUP
SET modificar = 0
where referencia =:REF;
END^

SET TERM ; ^

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.
Responder Con Cita
  #2  
Antiguo 24-05-2010
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 288
Poder: 21
kalimero Va por buen camino
Hola

Commit?

saludos
Responder Con Cita
  #3  
Antiguo 24-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Hola, ¿donde pongo el commit?
Dentro del procedimiento, nunca he usado procedimeintos para actualizar registros y no lo tengo claro.

Saludos.
Responder Con Cita
  #4  
Antiguo 24-05-2010
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 288
Poder: 21
kalimero Va por buen camino
Hola.
Tienes que hacer el commit en el componente transaction que tengas asociado para ejecutar al procedimiento almacenado.

saludos
Responder Con Cita
  #5  
Antiguo 24-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿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
Responder Con Cita
  #6  
Antiguo 24-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Lo estoy probando directamente desde el gestor de firebird (utilizo EMS Firebird Management), mi idea es llamarlo desde delphi, así desde el ClientDataSet:

Código Delphi [-]
with datDatos.CDSSesionPopup do
begin
                Close;
                CommandText:= 'execute procedure LOGIN_SUTIL (:ref)'                        
                Params.ParamByName('ref').AsInteger:= referencia;
                Execute;
end;

¿Es correcto?
Responder Con Cita
  #7  
Antiguo 24-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Qué es CDSSesionPopup?

Si es un algún tipo de dataset, entonces necesitas algo así como:

Código Delphi [-]
datDatos.CDSSesionPopup.close;
datDatos.CDSSesionPopup.CommandText:='execute procedure LOGIN_SUTIL (:ref)';
datDatos.CDSSesionPopup.Params.ParamByName('ref').AsInteger := referencia;
datDatos.CDSSesionPopup.Execute;
datDatos.CDSSesionPopup.Transaction.Commitretaining;
Responder Con Cita
  #8  
Antiguo 24-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Es un ClientDataSet que accede a su DataSetProvider en el servidor de capa intermedia, no tiene la propiedad Transaction.
Responder Con Cita
  #9  
Antiguo 24-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #10  
Antiguo 24-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
El registro existe porque lo estoy tomando directamente de la tabla, no obstante he probado con otros campos y tampoco los modifica.
Responder Con Cita
  #11  
Antiguo 24-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
O sea, quieres decir que si abres el ibexpert y tecleas lo siguiente:

Código:
update sesion_popup 
set modificar = 0
where referencia = 'XXX'
y le das al botón 'commit'... ¿no te actualiza el registro?

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
Responder Con Cita
  #12  
Antiguo 24-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Si, correcto, pero eso de imposible vamos a dejarlo, cosa más raras he visto.
Responder Con Cita
  #13  
Antiguo 24-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No, no, jejeje no podemos rendirnos tan rápido.

Veamos, qué tipo de campos son "modificar" y "referencia", varchar, char, integer, etc. ????
Responder Con Cita
  #14  
Antiguo 24-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Vale, acabo de modificarlo desde el ibexpert sin problemas, pero desde el ClientDataSet no lo consigo, no se como mandarle el commit.
Responder Con Cita
  #15  
Antiguo 24-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #16  
Antiguo 24-05-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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).
Responder Con Cita
  #17  
Antiguo 24-05-2010
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 288
Poder: 21
kalimero Va por buen camino
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
Responder Con Cita
  #18  
Antiguo 25-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
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.
Responder Con Cita
  #19  
Antiguo 25-05-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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:
TClientDataset

TClientDataSet implements a database-independent dataset.

Unit

DBClient

Description

TClientDataSet represents an in-memory dataset. A client dataset can be used as

* A fully-functional, stand-alone, file-based dataset for single-tiered database applications. When used in this manner, the client dataset represents the data stored in a dedicated file on the user’s hard disk.

* A local in-memory buffer of the records from another dataset. The other (source) dataset can reside in the same form or data module as the client dataset (for example, when the client dataset provides navigation and editing support for the data from a unidirectional dataset). The source dataset can also reside on a separate system when the client dataset supports the client portion of a multi-tiered database application.

Note: The two functions described above are not mutually exclusive. An application can be designed to support the option of working with data offline, using the “briefcase” model. On site, the application uses TClientDataSet to communicate with the database server associated with a source dataset. When a user works off site, the client dataset writes a snapshot of the data to the hard disk. The application works with this snapshot off site, with the client dataset acting as a file-based dataset in a single-tiered application.

When a client dataset represents the data from another dataset, it communicates with that dataset through a dataset provider. The client dataset communicates with this provider through the IAppServer interface. When the provider is in the same form or data module as the client dataset, the IAppServer interface is implemented by a hidden object that is created for you. When used in a client application as part of a multi-tiered application, the client dataset passes all calls to the provider through a remote data module’s IAppServer interface.
No encontrarás la menor referencia a usar un ClientDataset para lanzar directamente consultas de actualización (ya vengan de procedimientos almacenados, consultas simples, ...). Repito, un ClientDataset es para mantener un Dataset en memoria.

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.
Responder Con Cita
  #20  
Antiguo 25-05-2010
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
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


La franja horaria es GMT +2. Ahora son las 19:20:31.


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
Copyright 1996-2007 Club Delphi