![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#21
|
|||
|
|||
|
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
|
|
#22
|
||||
|
||||
|
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). |
|
#23
|
|||
|
|||
|
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
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:
De antemano, gracias a tod@s por la ayuda, Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
![]() |
|
|
|