Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-11-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Te contesto al menos a una de las preguntas que haces.

Buscas en goole por SQLSERVER function y la primera entrada te da la sintaxis de cómo se realiza una función que devuelve un entero. a partir de ahí, ya tienes para investigar.

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).

Espero que te sirva.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #2  
Antiguo 10-11-2011
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Es lo mismo que una SQL normal y corriente,
eje.: Función ya definida como MySuma(X, Y)
Código SQL [-]
SELECT MySuma(5, 8)
El resultado seria 13.

Con ADO:
Código Delphi [-]
...
var
  xSuma: Integer;
begin
with ADOQry do
begin
  SQL.Add('SELECT MySuma(5,8) AS TOTALSUMA');
  Open;
  xSuma := FieldByName('TOTALSUMA').AsInteger;
end;

Espero que te sirva

Un saludo.
Responder Con Cita
  #3  
Antiguo 10-11-2011
rubio rubio is offline
Miembro
 
Registrado: mar 2009
Posts: 36
Poder: 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
  #4  
Antiguo 10-11-2011
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
La variable @Salida = 'Paso 1' tiene un valor fijo, que quieres que te devuelva lo mismo
La variable @varIdIndicador=@@IDENTITY no tiene ninguna utilidad en tu procedimiento, el @@IDENTITY lo que hace es guardar el valor que ha tomado al añadir el registro, pero nada más.
¿Que quieres que te devuelva el procedimiento, @Salida = 'Paso 1'?
Responder Con Cita
  #5  
Antiguo 10-11-2011
rubio rubio is offline
Miembro
 
Registrado: mar 2009
Posts: 36
Poder: 0
rubio Va por buen camino
Cita:
Empezado por olbeup Ver Mensaje
La variable @Salida = 'Paso 1' tiene un valor fijo, que quieres que te devuelva lo mismo
La variable @varIdIndicador=@@IDENTITY no tiene ninguna utilidad en tu procedimiento, el @@IDENTITY lo que hace es guardar el valor que ha tomado al añadir el registro, pero nada más.
¿Que quieres que te devuelva el procedimiento, @Salida = 'Paso 1'?
Disculpa, no explique, en ese procedimiento faltan una serie de instrucciones, el valor que devuelve @@IDENTITY yo lo uso mas adelante, en este caso yo le puse un valor fijo a la variable @Salida para hacer las pruebas, pero ella en realidad mas adelante toma diferentes valores en dependencia de lo que se haga, por eso quiero retornar la variable @Salida,

Gracias.
Responder Con Cita
  #6  
Antiguo 10-11-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Creo que quieres ir demasiado rápido.

Haz una pequeña prueba de concepto, y cuando la domines, te metes en harina.

Por otro lado, las instrucciones

with parameters do begin
for i:=0 to Length(Nombre)-1 do
CreateParameter(Nombre[i], TipoDato[i], Direccion[i], Tamano[i], Valor[i]);
end;

no son necesarias, ya que estás creando los parámetros. Si asignas la procedure al TADOStoredProc, ya dispones de los parámetros. Sólo tienes que asignarles el valor.

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;
      // Damos valor a los parámetros de entrada
      for i:=0 to parameters.Count-1 do
       begin
          with ParameterByName(Nombre[i]) do
          begin
            if Direccion = TInput then // al asignar el SP ya te pone los parámetros y si son de entrada o salida
            begin
              DataType:= TipoDato[i]; -> podría obviarse
              Direction:= Direccion[i]; -> podría obviarse
              Size:=Tamano[i]; -> Podría obviarse
              Value:=Valor[i];
            end;
          end;
      end;

      Execute; ->> Importante, con los SP's no se utiliza Open, o eso creo

    // recogemos los valores de los parámetros de salida
      for i:=0 to parameters.Count-1 do
       begin
          with ParameterByName(Nombre[i]) do
          begin
            if Direccion = TOutput then // al asignar el SP ya te pone los parámetros y si son de entrada o salida
            begin
              Valor[i]:= Value;
            end;
          end;
      end;

     // y ahora deberás hacer algo con los valores recogidos. Podrías definir como var el array de valores en la llamada a la función ya que si no los perdierías

    finally
      sp.Free;
    end;
end;

Buano, estoy escribiendo de memoria, pero creo que lo he puesto claro.

De todas maneras, crea un proyecto nuevo, tira un TADOStoredProc, asignale la conexión y el SP y mira cómo ya dispones de los parámetros.

Prueba a ver y nos cuentas.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 11-11-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
Creo puedes solucionanrlo asi en un TADOQuery en la propiedad SQL pones:
Código SQL [-]
declare@AnoAClonar CHAR(4), @AnoClonado CHAR(4), @Salida CHAR(255)
set @AnoAClonar = :AnoClonar
set @AnoClonado = :AnoClonado

Exec Clonar @AnoAClonar, @AnoClonado, @Salida OUTPUT
Set :Salida = @Salida
En su propiedad Parameters Listará 3 Los cuqales son (AnoClonar, AnoClonado, Salida),
Luego en Delphi lo Llamarias asi: ahi escogemos DataType ftstring para los 3 y solo para el parámetro "Salida" en Direction ponemos pdOutput.
Código Delphi [-]
 with ADOQuery1 do
Begin
  Close;
  Parameters.ParamByName('AnoClonar').Value := edit1.text; //Depende lo que quieras mandar
  Parameters.ParamByName('AnoClonado').Value := edit2.text; //Lo mismo depende de tu parametro
  Parameters.ParamByName('Salida').Value := ''; //Asignado asi porque es un parámetro de Salida
  ExecSQL;
  Edit3.Text := Parameters.ParamByName('Salida').Value; // Estoy Asignando a Edit3 lo que tiene despues 
                                                                           //de ejecutarse el Procedure
end;
Salu2
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cómo hacer para retornar valores de una Unit a otra karo Varios 6 14-03-2009 20:57:28
Retornar o no retornar desde un script principal dec PHP 6 24-03-2008 23:41:12
retornar un valor Proc.Almacenado cacu OOP 1 05-03-2008 22:39:16
Como retornar un valor en Delphi Stanley Varios 8 29-10-2007 04:04:03
Exite función para asignar otro valor si es null JavierO Varios 6 04-08-2005 18:22:56


La franja horaria es GMT +2. Ahora son las 12:29:07.


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