Cita:
Empezado por fjcg02
Para recoger el valor desde Delphi, en los componentes ADO tienes el componente TADOStoredProc. Lo sueltas en el formulario, le indicas el store procedure, le indicas qué parámetros tienes, y lo ejecutas. Atención que los parámetros tendrás que revisar si son de entrada o de salida ( input ó output).
Un saludo
|
Hola fjcg02, yo veo bien los de los parámetros de entrada/salida, pero te explico, yo tendo en SQL esto
Código SQL
[-]CREATE PROCEDURE Clonar
@AnoAClonar CHAR(4),
@AnoClonado CHAR(4),
@Salida CHAR(255) OUTPUT
AS
DECLARE @IdIndicador INT, @CodigoI CHAR(10), @NombreI CHAR(255), @CUPI MONEY, @CUCI MONEY,
@IdAcapite INT, @CodigoA CHAR(10), @NombreA CHAR(255), @CUPA MONEY, @CUCA MONEY,
@IdPartida INT, @CodigoP CHAR(10), @NombreP CHAR(255), @CUPP MONEY, @CUCP MONEY,
@IdElemento INT, @CodigoE CHAR(10), @NombreE CHAR(255), @CUPE MONEY, @CUCE MONEY,
@IdSubElemento INT, @CodigoSE CHAR(10), @NombreSE CHAR(255), @CUPSE MONEY, @CUCSE MONEY
DECLARE @varIdIndicador INT
DECLARE Todos CURSOR
FOR
SELECT dbo.Indicador.IdIndicador, dbo.Indicador.Codigo, dbo.Indicador.Nombre, dbo.Indicador.CUP, dbo.Indicador.CUC,
dbo.Acapite.IdAcapite, dbo.Acapite.Codigo, dbo.Acapite.Nombre, dbo.Acapite.CUP, dbo.Acapite.CUC,
dbo.Partida.IdPartida, dbo.Partida.Codigo, dbo.Partida.Nombre, dbo.Partida.CUP, dbo.Partida.CUC,
dbo.Elemento.IdElemento, dbo.Elemento.Codigo, dbo.Elemento.Nombre, dbo.Elemento.CUP, dbo.Elemento.CUC,
dbo.SubElemento.IdSubElemento, dbo.SubElemento.Codigo, dbo.SubElemento.Nombre, dbo.SubElemento.CUP, dbo.SubElemento.CUC
FROM dbo.Indicador LEFT OUTER JOIN
dbo.Acapite ON dbo.Indicador.IdIndicador = dbo.Acapite.IdIndicador LEFT OUTER JOIN
dbo.Partida ON dbo.Acapite.IdAcapite = dbo.Partida.IdAcapite LEFT OUTER JOIN
dbo.Elemento ON dbo.Partida.IdPartida = dbo.Elemento.IdPartida LEFT OUTER JOIN
dbo.SubElemento ON dbo.Elemento.IdElemento = dbo.SubElemento.IdElemento
WHERE (dbo.Indicador.Ano = @AnoAClonar)
OPEN Todos
FETCH Todos INTO @IdIndicador, @CodigoI, @NombreI, @CUPI, @CUCI,
@IdAcapite, @CodigoA, @NombreA, @CUPA, @CUCA,
@IdPartida, @CodigoP, @NombreP, @CUPP, @CUCP,
@IdElemento, @CodigoE, @NombreE, @CUPE, @CUCE,
@IdSubElemento, @CodigoSE, @NombreSE, @CUPSE, @CUCSE
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @Salida='Paso 1'
IF (SELECT COUNT(*) FROM Indicador WHERE Ano=@AnoClonado)=0
BEGIN
INSERT INTO Indicador (Ano, Codigo, Nombre, CUP, CUC) VALUES (@AnoClonado, @CodigoI, @NombreI, @CUPI, @CUCI)
SET @varIdIndicador=@@IDENTITY
END
FETCH Todos INTO @IdIndicador, @CodigoI, @NombreI, @CUPI, @CUCI,
@IdAcapite, @CodigoA, @NombreA, @CUPA, @CUCA,
@IdPartida, @CodigoP, @NombreP, @CUPP, @CUCP,
@IdElemento, @CodigoE, @NombreE, @CUPE, @CUCE,
@IdSubElemento, @CodigoSE, @NombreSE, @CUPSE, @CUCSE
END
GO
Te pregunto, al parámetro @Salida se le puede asignar el valor así?, al ejecutar el programa Delphi me da el siguiente error,
en Delphi lo hago así:
Código Delphi
[-]procedure TfrmGenerales.ADOProcedimiento(Nombre: array of WideString;
TipoDato: array of TDataType;
Direccion: array of TParameterDirection;
Tamano: array of Integer;
Valor: array of OleVariant;
Procedimiento: string);
var
i: integer;
sp:TADOStoredProc;
begin
sp := TADOStoredProc.Create( self );
with sp do
try
Connection:=frmAutenticacion.ADOCSistema;
ProcedureName := Procedimiento;
with parameters do begin
for i:=0 to Length(Nombre)-1 do
CreateParameter(Nombre[i], TipoDato[i], Direccion[i], Tamano[i], Valor[i]);
end;
Open;
Close;
finally
sp.Free;
end;
end;
y la llamada al procedimiento así:
Código Delphi
[-]frmGenerales.ADOProcedimiento(['@AnoAclonar', '@AnoClonado', '@Salida'],
[ftString, ftString, ftString],
[pdInput, pdInput, pdOutput],
[4, 4, 255],
[leAClonar.Text, leClonado.Text, ''],
'Clonar');
Ahora me sigue la duda, el valor que retorna @Salida como lo recojo en Delphi?
Saludos y gracias.