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 Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 25-02-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 27
__cadetill Va por buen camino
De lo que no estoy seguro es de que los datos que devuelva un SP sean también de escritura (yo diría que no, pero no lo aseguro). Si estubiera en lo cierto, con un TIBQuery tienes más que suficiente para tus menesteres
Responder Con Cita
  #22  
Antiguo 25-02-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola.

Para complementar lo que han dicho los compañeros, solo comentar que un procedimiento que devuelve datos (selectable stored proc), es aquel que devuelve un conjunto de filas (como una consulta o una vista). Se utilizan cuando tienes que realizar una consulta muy compleja que no puedes condensar en una sentencia SELECT.

Los procedimientos almacenados que no devuelven datos, són aquellos que realizan una acción, como por ejemplo tu caso en que insertan un registro, es decir un procedimiento que ejecuta sentencias del tipo INSERT INTO, ...

En el primer caso es cuando hay que leer los datos devueltos, abriendo una consulta con un select * from PROCEDIMIENTO, en el segundo caso es cuando se ejecuta un procedimiento mediante un IBStoredProc.

Saludos.
Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #23  
Antiguo 26-02-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 24
Giniromero Va por buen camino
Tengo un TIBDataSet, (TbEconoPago), que tiene:


Código:
object TbEconoPago: TIBDataSet
  Database = IBDBFX
  Transaction = IBTransFX
  OnCalcFields = TbEconoPago1CalcFields

     //si ASIENTO tiene valor 1 es por que hemos seleccionado ese asiento
     //para que sea pagado, por lo que le ponemos una X en el campo de CONTROL
     IF FrmDModule.TbEconoPagoASIENTO.Value = 1 THEN BEGIN
        FrmDModule.TbEconoPagoCONTROL.Value := 'X';
     END
     ELSE BEGIN
        //si el ASIENTO no tiene valor 1, es por que no lo hemos seleccionado
        //para pagarlo
        FrmDModule.TbEconoPagoCONTROL.Value := '';
     END;


  OnNewRecord = TbEconoPago1NewRecord

    TbEconoPagoIMPHABER.Value := 0;
    TbEconoPagoIMPDEBE.Value := 0;
    //le inserto la fecha actual
    TbEconoPagoFECHA.Value := date;
    TbEconoPagoUSUARIO.Value := TbUsersUSUARIO.Value;
    TbEconoPagoNUMALU.Value  := TbAlumnosNUMALU.Value;
    TbEconoPagoNUMGRUP.Value  := 0;



  BufferChunks = 1000
  CachedUpdates = False
  DeleteSQL.Strings = (
    //NADA
    '')
  InsertSQL.Strings = (
    insert into ECONO  
      (CODIGO, NUMALU, NUMGRUP, FECHA, CONCEPTO, IMPDEBE, IMPHABER, FORPAGO, RECIBO, FACTURA, USUARIO, TIPO)  values
   (:CODIGO, :NUMALU, :NUMGRUP, :FECHA, :CONCEPTO, :IMPDEBE, :IMPHABER, :FORPAGO, :RECIBO, :FACTURA, :USUARIO, :TIPO))

  SelectSQL.Strings = (    
      select CODIGO, NUMALU, NUMGRUP, FECHA, CONCEPTO, IMPDEBE, 
IMPHABER, FORPAGO, RECIBO, FACTURA, USUARIO, TIPO, ASIENTO
    from PROECONOPAGO
    where numalu=:numalu
    order by fecha desc)


  ModifySQL.Strings = (
    update ECONO
    set
     CODIGO = :CODIGO,
     NUMALU = :NUMALU,
     NUMGRUP = :NUMGRUP,
    FECHA = :FECHA,
    CONCEPTO = :CONCEPTO,
    IMPDEBE = :IMPDEBE,
    IMPHABER = :IMPHABER,
     FORPAGO = :FORPAGO,
    RECIBO = :RECIBO,
    FACTURA = :FACTURA,
   USUARIO = :USUARIO,
    TIPO = :TIPO
   where
     CODIGO = :OLD_CODIGO
    )
  DataSource = SrcAlumnos
  Left = 40
  Top = 392
  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 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 TbEconoPagoASIENTO: TIntegerField
    FieldName = 'ASIENTO'
    Origin = 'PROECONOPAGO.ASIENTO'
  end
  object TbEconoPagocontrol: TStringField
    FieldKind = fkCalculated
    FieldName = 'control'
    Size = 1
    Calculated = True
  end
end

Mi procedimiento almacenado es el siguiente:


Código:
CREATE PROCEDURE PROECONOPAGO 
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);
DECLARE VARIABLE VCONTROL VARCHAR(1);
begin
for select CODIGO, NUMALU, NUMGRUP, FECHA, ASIENTO, CONCEPTO, IMPDEBE, 
IMPHABER, FORPAGO, RECIBO, FACTURA, USUARIO, TIPO

from ECONO

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;
    CONTROL = :vcontrol;
    suspend;
    end
end
end
El problema es que no creo que sea muy ortodoxo tomar los datos de un procedimiento y pedir que guarde registros en una tabla. Me imagino que estos procedimientos tienen que tener una forma más apropiada de insertar registros.
Además, aunque así me muestra los datos en el DBGrid, tarda mucho en abrirse el form en el que está ese dbgrid.

Por otro lado, la aplicación me va mucho más lenta cuando tengo este TIBDataSet conectado a mi procedimiento almacenado. O un TIBStoredPRoc, parece que le cuesta cada vez que se tiene que abrir. ¿es eso normal?
Me he vuelto a leer todo lo que me habéis escrito en este hilo, así como el que cadetill me aconsejo leer, y tengo dudas, (como no). Sigo sin Saber muy bien como se usan / tratan los procedimintos almacenados a través del delphi.

Esto es:

1) ¿Tengo que tener, por un lado, un TIBStoredProc, enlazado con una transacción, al cual tendré que ejecutar, cada vez que quiera que recalcule los campos a mostrar, (usando para ellos el .ExecProc. Y por otro lado, un query o tibdataset, donde seleccionar ese procedimiento almacenado, sus campos, etc... para mostrarlo en el DBGrid?

2) ¿qué tengo que hacer cada vez que quiera mostrar los datos, registros, resultantes del procedimiento almacenado?, ¿ejecutar primero el procedimiento con el execproc, cerrando y abriendo la transacción a la que está conectado?

3) Según esto:

Cita:
Para complementar lo que han dicho los compañeros, solo comentar que un procedimiento que devuelve datos (selectable stored proc), es aquel que devuelve un conjunto de filas (como una consulta o una vista). Se utilizan cuando tienes que realizar una consulta muy compleja que no puedes condensar en una sentencia SELECT.

Los procedimientos almacenados que no devuelven datos, són aquellos que realizan una acción, como por ejemplo tu caso en que insertan un registro, es decir un procedimiento que ejecuta sentencias del tipo INSERT INTO, ...

En el primer caso es cuando hay que leer los datos devueltos, abriendo una consulta con un select * from PROCEDIMIENTO, en el segundo caso es cuando se ejecuta un procedimiento mediante un IBStoredProc.
¿Tengo que tener dos procedimientos almacenados, uno para tomar los datos usando el ibdataset y otro para insertar datos, usando el ibStoredProc?

De antemano, gracias a tod@s por la ayuda,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
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


La franja horaria es GMT +2. Ahora son las 00:05:10.


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