Ver Mensaje Individual
  #12  
Antiguo 10-11-2011
rubio rubio is offline
Miembro
 
Registrado: mar 2009
Posts: 36
Reputación: 0
rubio Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
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.
Responder Con Cita