Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-02-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 26
kinobi Va por buen camino
Hola,

como es un asunto de componentes de acceso, muevo el hilo desde "InterBase y Firerbird" a "Conexión con bases de datos".

Saludos.
Responder Con Cita
  #2  
Antiguo 23-02-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 24
Giniromero Va por buen camino
Perdonar mi torpeza, pero, ......

1) ¿tengo que "abrir" el StoredPRoc, como con las tablas, esto es:

IBStoredPRoc.Active := True;?


2) En la ayuda que tengo de Ib me dicen que tengo que usar "prepare" para el IBStoredPRoc.

Después dentro de un try lo ejecutarlo con ExecProc
y en el finally le hago un "unprepare" para liberar los recursos que este estuviera usando.

Ahora, me comentais que ...


Cita:

tr.Active := False;
IBP.StoredProcName := nombredelprocedimiento;

if not tr.InTransaction then
tr.StartTransaction;

// Si tuvieras que enviarle algun parámetro
IBP.ParamByName('Parametro').AsInteger := Para;
IBP.ExecProc;
tr.Commit;

Me podríais, si no es mucha molestia, explicar para que sirbe, y como usar, cada uno de estos comandos relaccionados con el IBStoredPRoc? Por que me estoy haciendo un lío, y no parece que consigua hacerlo funcionar.

Muchas gracias por todo,


Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #3  
Antiguo 23-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 27
__cadetill Va por buen camino
A ver, un IBStoredProc tienes que planteartelo "como si fuera" una TIBQuery con parámetros. Es decir, a un procedimiento almacenado, tu puedes pasarle parámetros si los necesitas (que puedes definirlos en la propiedad Params del mismo), que es lo que te comenta Nuria con lo de
Código:
BP.ParamByName('Parametro').AsInteger := Para;
Por otro lado, un TIBStoredProc no "se abre", sino que se ejecuta
Código:
BP.ExecProc;
Y por supuesto ha de ir dentro de una transacción
Responder Con Cita
  #4  
Antiguo 23-02-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 24
Nuria Va por buen camino
Cita:
1) ¿tengo que "abrir" el StoredPRoc, como con las tablas, esto es:

IBStoredPRoc.Active := True;?
No, porque el IBStoredProc lo tienes enlazado con una transacción, lo que realmente activas es la transacción.

Cita:
2) En la ayuda que tengo de Ib me dicen que tengo que usar "prepare" para el IBStoredPRoc.
Yo no lo uso y me funciona correctamente. Quizá es recomendable usarlo no sé.

Cita:
Por que me estoy haciendo un lío, y no parece que consigua hacerlo funcionar.
Porque no pones parte del código para ver si hay algo que haces mal.

Saludos!
Responder Con Cita
  #5  
Antiguo 24-02-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 24
Giniromero Va por buen camino
Hola,

este es mi código:

Cita:
screen.cursor := crHourGlass;
FrmEfePago := TFrmEfePago.Create(Self);
Screen.cursor := crDefault;

FrmDModule.TbEconoPago.Prepare;
TRY
FrmDModule.IBTransFXProce.Active := false;

if not FrmDModule.IBTransFXProce.InTransaction then begin
FrmDModule.IBTransFXProce.StartTransaction;
end;
FrmDModule.TbEconoPago.ParamByName('numalu').AsInteger := FrmDModule.TbAlumnosNUMALU.AsInteger;
FrmDModule.TbEconoPago.ExecProc;
//si NO hay registros de deudas
// if FrmDmodule.TbEconoPago.RecordCount = 0 then begin
// showmessage('No existen efectos a pagar !!!');
// end
// else begin // Si hay registros de deudas
//inserta un registro
FrmDmodule.TbEcono.Append;
//mostramos como modal el form
FrmEfePago.ShowModal;
// end;

FrmDMOdule.IBTransFXProce.Commit;
FINALLY

FrmEfePago.Free;
//liberamos recursos usados con el Procedure
FrmDMOdule.TbEconoPago.UnPrepare;
END;
Si quito el comentario del " if FrmDmodule.TbEconoPago.RecordCount = 0 then " me responde siempre que 'No existen efectos a pagar !!!'

Si lo comento, al menos me deja entrar en la ventana en cuestión, pero este procedimiento está conectado con un DBgrid, que no muestra nada, asíque parece como si ni siquiera se llegase a abrir el procedimento.

hay algo que se me esté escapando?

GRacias por la ayuda.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #6  
Antiguo 24-02-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 24
Nuria Va por buen camino
Hola Giniromero!

Una sugerencia, has probado el procedimiento por el ibConsole o algún programa similar, igual lo que te falla es el procedimiento. Haz la comprobación desde ahí a ver si te devuelve registros.

Podías indicar el código del procedimiento.

Saludos!
Responder Con Cita
  #7  
Antiguo 24-02-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 24
Giniromero Va por buen camino
Hola Nuria,

El procedimiento funciona perfectamente desde IBExpert, que es, de hecho, donde lo he creado. Me devuelve 300 registros más o menos que son los pendientes de pago.

Por ahí no hay ningún problema.

El tema es que no sé como abrir el procedimiento desde la aplicación.

Te cuento lo que tengo, para ver si me falta algo.

Tengo un procedure creado en IB, (usando IBExpert), que tiene el siguiente código:

Código:
CREATE PROCEDURE PROECONOPAGO (
    NUMALUACT SMALLINT)
RETURNS (
    CODIGO INTEGER,
    NUMALU SMALLINT,
    NUMGRUP SMALLINT,
    FECHA TIMESTAMP,
    ASIENTO INTEGER,
    CONCEPTO VARCHAR(50),
    IMPDEBE NUMERIC(15,2),
    IMPHABER NUMERIC(15,2),
    FORPAGO SMALLINT,
    RECIBO VARCHAR(10),
    FACTURA VARCHAR(10),
    USUARIO VARCHAR(10),
    TIPO VARCHAR(1),
    EMPRESATXT VARCHAR(1),
    CONTROL VARCHAR(1))
AS
DECLARE VARIABLE VCODIGO INTEGER;
DECLARE VARIABLE VNUMALU SMALLINT;
DECLARE VARIABLE VNUMGRUP SMALLINT;
DECLARE VARIABLE VFECHA TIMESTAMP;
DECLARE VARIABLE VASIENTO INTEGER;
DECLARE VARIABLE VCONCEPTO VARCHAR(50);
DECLARE VARIABLE VIMPDEBE NUMERIC(15,2);
DECLARE VARIABLE VIMPHABER NUMERIC(15,2);
DECLARE VARIABLE VFORPAGO SMALLINT;
DECLARE VARIABLE VRECIBO VARCHAR(10);
DECLARE VARIABLE VFACTURA VARCHAR(10);
DECLARE VARIABLE VUSUARIO VARCHAR(10);
DECLARE VARIABLE VTIPO VARCHAR(1);
DECLARE VARIABLE VPRODUCTOGRUP VARCHAR(2);
DECLARE VARIABLE VEMPRESAPRO VARCHAR(1);
begin
for select CODIGO, NUMALU, NUMGRUP, FECHA, ASIENTO, CONCEPTO, IMPDEBE, 
IMPHABER, FORPAGO, RECIBO, FACTURA, USUARIO, TIPO

from ECONO
WHERE NUMALU =:NUMALUACT
order by numalu
into
:VCODIGO,:VNUMALU,:VNUMGRUP,:VFECHA,:VASIENTO,:VCONCEPTO,:VIMPDEBE,
:VIMPHABER, :VFORPAGO,:VRECIBO,:VFACTURA,:VUSUARIO,:VTIPO  do
begin
select  PRODUCTO from grupos where NUMGRUP =:vnumgrup  into  :vproductogrup ;
select  EMPRESA from produ where PRODUCTO=:vproductogrup  into :vempresapro;

  If (:vasiento <2 AND :vimpdebe <> 0 ) Then Begin
    CODIGO = :VCODIGO;
    NUMALU = :VNUMALU;
    NUMGRUP = :VNUMGRUP;
    FECHA = :VFECHA;
    ASIENTO = :VASIENTO;
    CONCEPTO = :VCONCEPTO;
    IMPDEBE = :VIMPDEBE;
    IMPHABER = :VIMPHABER;
    FORPAGO = :VFORPAGO;
    RECIBO = :VRECIBO;
    FACTURA = :VFACTURA;
    USUARIO = :VUSUARIO;
    TIPO = :VTIPO;
    EMPRESATXT =:vempresapro;
    suspend;
    end
end
end
Luego, en mi aplicación, (usando delphi 6 e interbase 7), dentro de un DataModule, tengo un TIbStorePro, conectado a una transaccion que solo le afecta a el, conectada a la base de datos general.

El TIBStorePRo tiene las siguientes propiedades:


Cita:
object TbEconoPago: TIBStoredProc
Database = IBDBFX
Transaction = IBTransFXProce
OnCalcFields = TbEconoPagoCalcFields
OnNewRecord = TbEconoPagoNewRecord
StoredProcName = 'PROECONOPAGO'
Left = 282
Top = 80
ParamData = <
item
DataType = ftInteger
Name = 'CODIGO'
ParamType = ptOutput
end
item
DataType = ftSmallint
Name = 'NUMALU'
ParamType = ptOutput
end
item
DataType = ftSmallint
Name = 'NUMGRUP'
ParamType = ptOutput
end
item
DataType = ftDateTime
Name = 'FECHA'
ParamType = ptOutput
end
item
DataType = ftInteger
Name = 'ASIENTO'
ParamType = ptOutput
end
item
DataType = ftString
Name = 'CONCEPTO'
ParamType = ptOutput
end
item
DataType = ftBCD
Name = 'IMPDEBE'
ParamType = ptOutput
end
item
DataType = ftBCD
Name = 'IMPHABER'
ParamType = ptOutput
end
item
DataType = ftSmallint
Name = 'FORPAGO'
ParamType = ptOutput
end
item
DataType = ftString
Name = 'RECIBO'
ParamType = ptOutput
end
item
DataType = ftString
Name = 'FACTURA'
ParamType = ptOutput
end
item
DataType = ftString
Name = 'USUARIO'
ParamType = ptOutput
end
item
DataType = ftString
Name = 'TIPO'
ParamType = ptOutput
end
item
DataType = ftString
Name = 'EMPRESATXT'
ParamType = ptOutput
end
item
DataType = ftString
Name = 'CONTROL'
ParamType = ptOutput
item
DataType = ftSmallint
Name = 'NUMALUACT'
ParamType = ptInput
end

end>
object TbEconoPagoCODIGO: TIntegerField
FieldName = 'CODIGO'
Origin = 'PROECONOPAGO.CODIGO'
end
object TbEconoPagoNUMALU: TSmallintField
FieldName = 'NUMALU'
Origin = 'PROECONOPAGO.NUMALU'
end
object TbEconoPagoNUMGRUP: TSmallintField
FieldName = 'NUMGRUP'
Origin = 'PROECONOPAGO.NUMGRUP'
end
object TbEconoPagoFECHA: TDateTimeField
FieldName = 'FECHA'
Origin = 'PROECONOPAGO.FECHA'
end
object TbEconoPagoASIENTO: TIntegerField
FieldName = 'ASIENTO'
Origin = 'PROECONOPAGO.ASIENTO'
end
object TbEconoPagoCONCEPTO: TIBStringField
FieldName = 'CONCEPTO'
Origin = 'PROECONOPAGO.CONCEPTO'
Size = 50
end
object TbEconoPagoIMPDEBE: TIBBCDField
FieldName = 'IMPDEBE'
Origin = 'PROECONOPAGO.IMPDEBE'
Precision = 18
Size = 2
end
object TbEconoPagoIMPHABER: TIBBCDField
FieldName = 'IMPHABER'
Origin = 'PROECONOPAGO.IMPHABER'
Precision = 18
Size = 2
end
object TbEconoPagoFORPAGO: TSmallintField
FieldName = 'FORPAGO'
Origin = 'PROECONOPAGO.FORPAGO'
end
object TbEconoPagoRECIBO: TIBStringField
FieldName = 'RECIBO'
Origin = 'PROECONOPAGO.RECIBO'
Size = 10
end
object TbEconoPagoFACTURA: TIBStringField
FieldName = 'FACTURA'
Origin = 'PROECONOPAGO.FACTURA'
Size = 10
end
object TbEconoPagoUSUARIO: TIBStringField
FieldName = 'USUARIO'
Origin = 'PROECONOPAGO.USUARIO'
Size = 10
end
object TbEconoPagoTIPO: TIBStringField
FieldName = 'TIPO'
Origin = 'PROECONOPAGO.TIPO'
Size = 1
end
object TbEconoPagoEMPRESATXT: TIBStringField
FieldName = 'EMPRESATXT'
Origin = 'PROECONOPAGO.EMPRESATXT'
Size = 1
end
object TbEconoPagoCONTROL: TIBStringField
FieldName = 'CONTROL'
Origin = 'PROECONOPAGO.CONTROL'
Size = 1
end
object TbEconoPagoNUMALUACT: TSmallintField
FieldName = 'NUMALUACT'
Origin = 'PROECONOPAGO.NUMALUACT'
Size = 1
end

end

Este TIbStoreProc tiene un DataSource enlazado a él.

Este DataSource está relacionado con el DBGrid de la ventana en la que quiero se muestren los registros de los apunte económicos pendientes de pago, que, como te comenté antes, salen vacios, como si no lo ejecutase.

El código que utilizo para abrir este procedimiento es:

Código:
     screen.cursor := crHourGlass;
     FrmEfePago := TFrmEfePago.Create(Self);
     Screen.cursor := crDefault;


     TRY
        FrmDMOdule.IBTransFXProce.Active := false;

        if not FrmDModule.IBTransFXProce.InTransaction then begin
           FrmDModule.IBTransFXProce.StartTransaction;
        end;
        FrmDModule.TbEconoPago.ParamByName('numaluACT').AsInteger := FrmDModule.TbAlumnosNUMALU.AsInteger;
        FrmDModule.TbEconoPago.Prepare;
        FrmDMOdule.IBTransFXProce.Active := true;
        FrmDModule.TbEconoPago.ExecProc;
        //si NO hay registros de deudas
       if FrmDmodule.TbEconoPago.RecordCount = 0 then begin
         showmessage('No existen efectos a pagar !!!');
       end
       else begin // Si hay registros de deudas
           //inserta un registro
           FrmDmodule.TbEcono.Append;
           //mostramos como modal el form
           FrmEfePago.ShowModal;
       end;

        FrmDMOdule.IBTransFXProce.Commit;
     FINALLY

       FrmEfePago.Free;
       //liberamos recursos usados con el Procedure
       FrmDMOdule.TbEconoPago.UnPrepare;

     END;

Muchas gracias por la ayuda,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #8  
Antiguo 24-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 27
__cadetill Va por buen camino
Hola Virginia

Quizás este hilo te sirva de guía para lo que quieres hacer
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 13:57:36.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi