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 04-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.177
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tu pregunta es muy genérica, ¿a qué te refieres con "función"?, ¿un query desde delphi?, ¿un store procedure en la base de datos?, ¿de qué base de datos estamos hablando?, etc.
Deberías explicar detalladamente lo que necesitas, porque podemos adivinar, cierto, pero sería eso, adivinar.

Recuerda leer nuestra guía de estilo, por favor, gracias.
Responder Con Cita
  #2  
Antiguo 04-11-2011
rubio rubio is offline
Miembro
 
Registrado: mar 2009
Posts: 36
Poder: 0
rubio Va por buen camino
Disculpa, estoy hablando de SQL 2000, en la misma se pueden definir funciones por el usuario, de esas son las que estoy hablando, las que se programan en el mismo SQL. Te pongo un ejemplo hipotético, yo hago una función para sumar dos valores y retornar ese resultado. Esa función la programo en la sección "Funciones definidas por el usuario" de la base de datos en SQL. Ahora, ¿como yo ejecuto esa función desde Delphi para recuperar el valor que ella me devuelve?.
Responder Con Cita
  #3  
Antiguo 04-11-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 21
oscarac Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Tu pregunta es muy genérica, ¿a qué te refieres con "función"?, ¿un query desde delphi?, ¿un store procedure en la base de datos?, ¿de qué base de datos estamos hablando?, etc.
Deberías explicar detalladamente lo que necesitas, porque podemos adivinar, cierto, pero sería eso, adivinar.

Recuerda leer nuestra guía de estilo, por favor, gracias.
me parece que es un procedimiento almacenado... pq menciona que esta hecha en la base de datos, en delphi hay componentes para ejecutar SP (Store Procedure), no se si estoy en lo correcto... como dice casimiro.. da mas detalles
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #4  
Antiguo 04-11-2011
rubio rubio is offline
Miembro
 
Registrado: mar 2009
Posts: 36
Poder: 0
rubio Va por buen camino
Hola oscarac, mi problema es el siguiente, yo solo conozco para ejecutar procedimientos almacenados los componentes de ADO, y estos solo devuelven tipo recordset, yo necesito que el valor devuelto no sea del tipo recordset, yo he estado investigando y no he encontrado otros componentes para esto que no sean los de ADO. Te pongo un ejemplo sencillo, yo ejecuto un consulta en SQL en un procedimiento almacenado que me devuelve un valor entero (cantidad de articulos), ¿como lo obtengo en Delphi?.
Responder Con Cita
  #5  
Antiguo 04-11-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 21
oscarac Va por buen camino
lo que se me ocurre es que definas una variable en delphi y que la pases como parametro al SP, luego el resultado lo asignas a esa variable
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #6  
Antiguo 09-11-2011
rubio rubio is offline
Miembro
 
Registrado: mar 2009
Posts: 36
Poder: 0
rubio Va por buen camino
Cita:
Empezado por oscarac Ver Mensaje
lo que se me ocurre es que definas una variable en delphi y que la pases como parametro al SP, luego el resultado lo asignas a esa variable
Hola oscarac, me he demorado en contestar ya que he estado buscando información, pero aún no he logrado saber como asignar a una veriable en Delphi un valor retornado de un procedimiento almacenado que no sea un recorset. Por otro lado (no se si esto lo debo mostrar en otro hilo, lo hago aquí ya que tiene relación), como podría ver los mensajes que se emitan desde un procedimiento alm... con las instrucciones PRINT y RAISERROR de SQL.

Código SQL [-]
PRINT 'No Existe el área'

Código SQL [-]
RAISERROR ('El trabajo sobrepaso el nivel', 16, 1)

estos son ejemplos de lo que se pudiera retornar.

Gracias.
Responder Con Cita
  #7  
Antiguo 09-11-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.412
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
  #8  
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: 20
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
  #9  
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
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 11:02:47.


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