Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   SP en Firebird y consulta con Zeos Query (https://www.clubdelphi.com/foros/showthread.php?t=82311)

ElGatitoTapatio 21-02-2013 20:53:17

SP en Firebird y consulta con Zeos Query
 
Muy buen día a todos, tengo un problema o mas que eso una falta de conocimiento, mi pregunta es cual es la forma correcta de mandar llamar un stored procedure desde los componentes ZEOS cuando este cuenta con info de salida.

Ese es mi procedimiento almacenado:
Código SQL [-]
CREATE PROCEDURE ABRIR_SESION(
  ID_USUARIO INTEGER,
  EQUIPO VARCHAR(15) CHARACTER SET ISO8859_1,
  IP_LOCAL VARCHAR(15) CHARACTER SET ISO8859_1,
  WINUSER VARCHAR(20) CHARACTER SET ISO8859_1)
RETURNS(
  ID_SESION INTEGER)
AS
BEGIN
  /* Procedure body */
  INSERT INTO HISTORICO_SESIONES(EQUIPO,IP,ID_USUARIO,WINUSER)
  VALUES (:EQUIPO,:IP_LOCAL,:ID_USUARIO,:WINUSER) RETURNING ID INTO ID_SESION;
  SUSPEND;
END;

y este es mi codigo en Delphi:

Código Delphi [-]
...
    with ZQuery_Cambios do
      begin
        Close;
        With SQL do
          begin
            Clear;
            if Not Cerrar then
              Add('Select ID_SESION from ABRIR_SESION('+IntToStr(IDUsuarioConectado)+','''+
                  GetPCName+''','''+GetLocalIP+''','''+GetUserWin+''')');
            Open;
            IDSesion:= Fields[0].AsInteger;
          end;
      end;

    ShowMessage(IntToStr(IDSesion));
...


Mi problema es que no se actualiza el dato en la tabla hasta que cierro mi sistema, tengo la impresion que tengo que utilizar ExecSQL sin embargo cuando hago esto no se como obtener el dato que me devuelve el procedimiento. Intente hacerlo por medio de parametros fallando en el intento.

Alguien podria resolver mi duda por favor! se que es algo muy simple que se me esta escapando.

Muchas gracias de antemano!!

duilioisola 21-02-2013 23:47:20

Supongo que tienes que trabajar con transacciones.
Abres una transaccion, haces el select y luego haces commit.
No se como será con Zeos, pero supongo que no será complicado.

He visto este código aqui:

Código Delphi [-]
With spDeleteByName do Begin
   ParamByName ('Name').Value := 'DontKnowHow';
   conConnection.StartTransaction
   Try
      // execute StoredProc
      ExecProc;
   Except
      conConnection.Rollback;
   End;
   conConnection.Commit;
End;

ElGatitoTapatio 22-02-2013 00:12:45

Gracias duilioisola ya probé hacer eso y sigue sin funcionar, como info extra tengo mi Connection con la propiedad AutoCommit en True. Para todas las consultas de tipo insert y update sin abrir y cerrar Transaccion se hace el autocommit menos para esta consulta a procedimiento.

La verdad sigo perdido... :(

ElGatitoTapatio 27-02-2013 21:06:46

Pues parece que no salió ninguna propuesta :(, comento lo que me dí cuenta y como lo resolví, aunque no me gustó la forma pues fué la única que encontré.

Lo que me di cuenta es que en los ZConnection con la propiedad Autocommit en True, funciona correctamente para los querys que he utilizado, tales como updates, inserts, deletes, etc, sin embargo con los SP no realiza el commit sino hasta que se cierra la aplicación (en mi caso). Lo que hice fué justo antes de abrir el Query del SP cambiar la propiedad de Autocommit del ZConnection a False, y justo despues ejecutar el Query y obtener el resultado del SP realizo un Commit a la Connection para despues regresar su propiedad Autocommit a True.

Repito no me convence mucho esta solucion, sin embargo es como lo he podido resolver, si alguien tiene mas propuestas estoy atento a escucharlas.

Saludos y Gracias!

duilioisola 27-02-2013 22:30:59

¿El Query no tiene una propiedad Autocommit?
Quizás la conexión tenga esta propiedad para cuando creas algún componente que dependa de esta pero luego a cada uno de estos componentes deberías poder modificarle esta propiedad.
Quedaría algo así:

Código Delphi [-]
...
    with ZQuery_Cambios do
      begin
        Autocommit := False; // La propiedad Autocommit de ZQuery_Cambios
        conConnection.StartTransaction
        Close;
        With SQL do
          begin
            Clear;
            if Not Cerrar then
              Add('Select ID_SESION from ABRIR_SESION('+IntToStr(IDUsuarioConectado)+','''+
                  GetPCName+''','''+GetLocalIP+''','''+GetUserWin+''')');
            Open;
            IDSesion:= Fields[0].AsInteger;
          end;
          conConnection.Commit;
      end;

    ShowMessage(IntToStr(IDSesion));
...

ElGatitoTapatio 28-02-2013 19:48:19

No mi estimado, el ZQuery no cuenta con esa propiedad :(... y el codigo que pones es exactamente como lo estoy solucionando... sin embargo sigo con la espinita de si se puede hacer de forma distinta....

Muchas gracias por tu atencion y comentarios!


La franja horaria es GMT +2. Ahora son las 23:12:36.

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