Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Retorno de datos procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=74942)

andresenlared 20-07-2011 00:07:27

Retorno de datos procedimiento almacenado
 
Saludos.

Estoy migrando un procedimiento almacenado firebird a SQL server, pero no tengo claro la parte del retorno de info que puede dar un procedimiento SQL.
En firebir puedo manejar un procedimiento en un select y me da los datos que tenga en return. Como puedo hacer esto mismo en SQL server??:confused:

mightydragonlor 20-07-2011 02:29:37

MS-SQL devuelve los datasets simplemente con un Select * From xxx, si requieres parámetros de salida, los defines como OUT, @Salida INT y le asiganas valor así: SET @Salida = 1;
eso es todo =)

andresenlared 21-07-2011 16:40:28

Muchas gracias por tu ayuda, ahora ya atengo el cuerpo del procedimiento almacenado pero al ejecutarlo marca error para las lineas donde esta declare y otros errores mas abajo. Entendi que para usar variables internas al procedimientio van despues del AS, y las de entrada y retorno van despues de create procedure. Coloco a continuacion el codigo que tengo...porque no he podido solucionar este problemilla. Gracias.

Código SQL [-]
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
-- =============================================
-- Author:    
-- Create date: <Create Date,,>
-- Description:  
-- =============================================
CREATE PROCEDURE GENERAR_FOLIO
  -- Add the parameters for the stored procedure here
  --<@Param1, sysname, @p1> int> = , 
  --<@Param2, sysname, @p2> int> = 
    @ID_UMAE INT, 
    @ID_PACIENTE INT, 
    @FOLIO CHAR(13) OUTPUT, 
    @DES_UMAE CHAR(50) OUTPUT, 
    @CVE_PRESUPUESTAL CHAR(13) OUTPUT
    
AS
   declare @CONSECUTIVO int,
   declare @NEWCONSECUTIVO int,
   declare @LARGO int,
   declare @DIFERENCIA int,
   declare @COMPLETAR char(5),
   declare @COD_UMAE int,
   declare @ANIO char(4),
   declare @DIGIANIO CHAR(2)
  
BEGIN

  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;
    -- Insert statements for procedure here
  --SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
   SELECT SET @CONSECUTIVO=tbl_usrporumae.consecutivo FROM tbl_usrporumae
   WHERE tbl_usrporumae.id_umae=@ID_UMAE
   
   SET @ANIO=substring(convert(char(8), getdate(),112),1,4)
   SET @DIGIANIO=substring(@ANIO,3,4)
   
   SET @NEWCONSECUTIVO=@CONSECUTIVO+1;
   SET @LARGO=5;

   SET @DIFERENCIA=@LARGO-LEN(STR(@NEWCONSECUTIVO,10);
   SET @COMPLETAR=''

   if (@DIFERENCIA=4) 
      SET @COMPLETAR='0000'

   If (@DIFERENCIA=3) 
      SET @COMPLETAR='000'

   if (@DIFERENCIA=2) 
      SET @COMPLETAR='00'

   if (@DIFERENCIA=1) 
      SET @COMPLETAR='0'

   set @FOLIO=@COD_UMAE+'-'+@DIGIANIO+'-'+@COMPLETAR+str(NEWCONSECUTIVO,10));

   UPDATE tbl_usrporumae SET tbl_usrporumae.consecutivo=@NEWCONSECUTIVO
   WHERE tbl_usrporumae.id_umae=@ID_UMAE;
   
   
   UPDATE tblpaciente SET tblpaciente.imp_e='T', 
   tblpaciente.id_umae=@ID_UMAE, TBLPACIENTE.fecha_impresione=getdate() where tblpaciente.id=@id_paciente;

END
GO

mightydragonlor 21-07-2011 16:58:44

Código SQL [-]
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
-- =============================================
-- Author:    
-- Create date: <Create Date,,>
-- Description:  
-- =============================================
CREATE PROCEDURE GENERAR_FOLIO
  -- Add the parameters for the stored procedure here
  --<@Param1, sysname, @p1> int> = , 
  --<@Param2, sysname, @p2> int> = 
    @ID_UMAE INT, 
    @ID_PACIENTE INT, 
    @FOLIO CHAR(13) OUTPUT, 
    @DES_UMAE CHAR(50) OUTPUT, 
    @CVE_PRESUPUESTAL CHAR(13) OUTPUT
AS  
BEGIN
   declare @CONSECUTIVO int
   declare @NEWCONSECUTIVO int
   declare @LARGO int
   declare @DIFERENCIA int
   declare @COMPLETAR char(5)
   declare @COD_UMAE int
   declare @ANIO char(4)
   declare @DIGIANIO CHAR(2)

  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;
    -- Insert statements for procedure here
  --SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
   SELECT SET @CONSECUTIVO=tbl_usrporumae.consecutivo FROM tbl_usrporumae
   WHERE tbl_usrporumae.id_umae=@ID_UMAE
   
   SET @ANIO=substring(convert(char(8), getdate(),112),1,4)
   SET @DIGIANIO=substring(@ANIO,3,4)
   
   SET @NEWCONSECUTIVO=@CONSECUTIVO+1;
   SET @LARGO=5;

   SET @DIFERENCIA=@LARGO-LEN(STR(@NEWCONSECUTIVO,10);
   SET @COMPLETAR=''

   if (@DIFERENCIA=4) 
      SET @COMPLETAR='0000'

   If (@DIFERENCIA=3) 
      SET @COMPLETAR='000'

   if (@DIFERENCIA=2) 
      SET @COMPLETAR='00'

   if (@DIFERENCIA=1) 
      SET @COMPLETAR='0'

   set @FOLIO=@COD_UMAE+'-'+@DIGIANIO+'-'+@COMPLETAR+str(NEWCONSECUTIVO,10));

   UPDATE tbl_usrporumae SET tbl_usrporumae.consecutivo=@NEWCONSECUTIVO
   WHERE tbl_usrporumae.id_umae=@ID_UMAE;
   
   
   UPDATE tblpaciente SET tblpaciente.imp_e='T', 
   tblpaciente.id_umae=@ID_UMAE, TBLPACIENTE.fecha_impresione=getdate() where tblpaciente.id=@id_paciente;

END
Así debería funcionar.

andresenlared 24-07-2011 02:13:44

Saludos.

Sigo con el cuento del procedimiento almacenado...ya esta en base de datos tiene dos parametros de entrada y retorna 3 datos.

Mi pregunta va en que componente de los ADO debo usar y como usarlo, porque uso los parametros de salida para un reporte en PDF.

uso el AdoStoredproc cuando el procedimiento no retorna nada y lo hago de la siguiente manera.

Código Delphi [-]
Adostoresproc.ExecProc
;

y funciona bien.

pero para el procedimiento que me retorna datos, no se como usar el componente, si me sirve ese mismo, o se trabaja con un ADOquery o ADOdataset, como creo la sentancia. Ya he probado varias cosas me me salen errores.

:(

andresenlared 24-07-2011 16:34:10

Saludos.

Ya logre ejecutar el procedimiento desde un objeto Adoquery, es muy diferente a como se maneja en firebird. Para este caso uso el mismo procedimiento que esta en este hilo y para obtener los parametros de salida se hace lo siguiente.

Código SQL [-]
DECLARE @RC int
DECLARE @ID_UMAE int
DECLARE @ID_PACIENTE int
DECLARE @FOLIO varchar(13)
DECLARE @DES_UMAE varchar(50)
DECLARE @CVE_PRESUPUESTAL varchar(13)

-- TODO: Establezca los valores de los parámetros aquí.

EXECUTE @RC = [IMSS].[dbo].[GENERAR_FOLIO] 
   10
  ,1
  ,@FOLIO OUTPUT
  ,@DES_UMAE OUTPUT
  ,@CVE_PRESUPUESTAL OUTPUT

select "FOLIO"=@FOLIO, "DES_UMAE"=@DES_UMAE, "CVE_PRESUPUESTAL"=@CVE_PRESUPUESTAL

con este codigo en la propiedad SQL del Adoquery, ya se consigue obtener los parametros de salida.

Adoquery.open.

Lito..:D


La franja horaria es GMT +2. Ahora son las 04:06:35.

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