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)
-   -   Could not convert variant of type (olestr) into type (boolean) al ejecutar sp (https://www.clubdelphi.com/foros/showthread.php?t=89600)

MarinaLR 22-12-2015 16:39:01

Could not convert variant of type (olestr) into type (boolean) al ejecutar sp
 
Hola a todos.
Trabajo con delphi XE2 y datasnap, sql server 2008.
Tengo un procedimiento almacenado que funciona perfectamente si lo ejecuto desde la base de datos, pero me da el error "Could not convert variant of type (olestr) into type (boolean)" cuando lo ejecuto desde delphi. Ya verifiqué los parámetros que le estoy pasando y están correctos, también eliminé y volví a configurar los componentes del lado cliente y del lado servidor, y sigue sin funcionar.
La aplicación servidor tiene los componentes Datasetprovider y SQLDataset (también lo probé con SQLStoredProc).
La aplicación cliente tiene el componente clientdataset.

Aquí pego el código del procedimiento:
Código SQL [-]
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE dbo.pSJAcumulaPromediaImportes
    @pCodigEmple VARCHAR(10),
    @pFechaIngre DATE,
    @pFechaLiqui DATE,
    @pNumerLiqui INT,
    @pCantiMeses INT,
    @pAcumuProme VARCHAR(3),    -- ACU = acumulado, PRO = promedio
    @pImporDevol VARCHAR(3),    -- SRE = suj.ret., SRT = suj.ret.c/tope, HEX = hab.exen., RET = reten., CON = contrib., SFA = salar.fliar.
    @pDecimConfi TINYINT,
    @pImporResul DECIMAL(15,4) OUTPUT
AS
BEGIN

  SET NOCOUNT ON;

  DECLARE @pFechaResta DATE;
  DECLARE @pFechaInici DATE;
  DECLARE @vMesesDesco INT;
  DECLARE @vImporCalcu DECIMAL(15,4);

  SET @vMesesDesco = @pCantiMeses - 1  -- debe tomar un mes menos porque el de liquidación también está incluido
  SET @vImporCalcu = 0 
  SET @pFechaResta = DATEADD(mm, @vMesesDesco * -1, @pFechaLiqui)         -- obtiene los meses para atrás
  SET @pFechaInici = DATEADD(MONTH, DATEDIFF(MONTH, 0, @pFechaResta), 0)  -- obtiene el primer día del mes de esa fecha
  
  IF UPPER(@pImporDevol) = 'SRE'  -- Sujeto a retenciones
  BEGIN
    SELECT @vImporCalcu = SUM(dbo.tSJTotalLiqui.ImporLiquiSujetReten) FROM dbo.tSJTotalLiqui
                            WHERE dbo.tSJTotalLiqui.FechaLiqui >= @pFechaInici 
                              AND dbo.tSJTotalLiqui.FechaLiqui <= @pFechaLiqui
                              AND dbo.tSJTotalLiqui.NumerLiqui <> @pNumerLiqui
                              AND dbo.tSJTotalLiqui.CodigEmple = @pCodigEmple     
  END

  IF UPPER(@pImporDevol) = 'SRT'  -- Sujeto a retenciones con tope
  BEGIN
    SELECT @vImporCalcu = SUM(dbo.tSJTotalLiqui.AcumuSueld + dbo.tSJTotalLiqui.AcumuVacac + dbo.tSJTotalLiqui.AcumuSac) 
                            FROM dbo.tSJTotalLiqui
                              WHERE dbo.tSJTotalLiqui.FechaLiqui >= @pFechaInici 
                                AND dbo.tSJTotalLiqui.FechaLiqui <= @pFechaLiqui
                                AND dbo.tSJTotalLiqui.NumerLiqui <> @pNumerLiqui
                                AND dbo.tSJTotalLiqui.CodigEmple = @pCodigEmple     
  END

  IF UPPER(@pImporDevol) = 'HEX'  -- Haberes exentos
  BEGIN
    SELECT @vImporCalcu = SUM(dbo.tSJTotalLiqui.ImporLiquiExent) FROM dbo.tSJTotalLiqui
                            WHERE dbo.tSJTotalLiqui.FechaLiqui >= @pFechaInici 
                              AND dbo.tSJTotalLiqui.FechaLiqui <= @pFechaLiqui
                              AND dbo.tSJTotalLiqui.NumerLiqui <> @pNumerLiqui
                              AND dbo.tSJTotalLiqui.CodigEmple = @pCodigEmple     
  END

  IF UPPER(@pImporDevol) = 'RET'  -- Retenciones
  BEGIN
    SELECT @vImporCalcu = SUM(dbo.tSJTotalLiqui.ImporLiquiReten) FROM dbo.tSJTotalLiqui
                            WHERE dbo.tSJTotalLiqui.FechaLiqui >= @pFechaInici 
                              AND dbo.tSJTotalLiqui.FechaLiqui <= @pFechaLiqui
                              AND dbo.tSJTotalLiqui.NumerLiqui <> @pNumerLiqui
                              AND dbo.tSJTotalLiqui.CodigEmple = @pCodigEmple     
  END

  IF UPPER(@pImporDevol) = 'CON'  -- Contribuciones
  BEGIN
    SELECT @vImporCalcu = SUM(dbo.tSJTotalLiqui.ImporLiquiContr) FROM dbo.tSJTotalLiqui
                            WHERE dbo.tSJTotalLiqui.FechaLiqui >= @pFechaInici 
                              AND dbo.tSJTotalLiqui.FechaLiqui <= @pFechaLiqui
                              AND dbo.tSJTotalLiqui.NumerLiqui <> @pNumerLiqui
                              AND dbo.tSJTotalLiqui.CodigEmple = @pCodigEmple     
  END

  IF UPPER(@pImporDevol) = 'SFA'  -- Salario familiar
  BEGIN
    SELECT @vImporCalcu = SUM(dbo.tSJTotalLiqui.ImporLiquiSalarFamil) FROM dbo.tSJTotalLiqui
                            WHERE dbo.tSJTotalLiqui.FechaLiqui >= @pFechaInici 
                              AND dbo.tSJTotalLiqui.FechaLiqui <= @pFechaLiqui
                              AND dbo.tSJTotalLiqui.NumerLiqui <> @pNumerLiqui
                              AND dbo.tSJTotalLiqui.CodigEmple = @pCodigEmple     
  END
  
  IF @vImporCalcu is null
    SET @vImporCalcu = 0
    
  IF UPPER(@pAcumuProme) = 'PRO'    -- Promedio   
  BEGIN
    IF @pFechaIngre > @pFechaInici  -- si el empleado ingresó dentro del período de evaluación, debo promediar solo por esa cant.de meses
    BEGIN
      SET @pCantiMeses = @pCantiMeses - DATEDIFF(mm, @pFechaInici, @pFechaIngre)      
    END
    SET @vImporCalcu = ROUND(@vImporCalcu / @pCantiMeses, @pDecimConfi)     -- calculo el promedio mensual, sirve para cualquiera de los acumulados, redondeado a la cantidad de decimales configurada para el módulo
  END
  ELSE
    SET @vImporCalcu = ROUND(@vImporCalcu, @pDecimConfi)     -- redondeo a la cantidad de decimales configurada para el módulo
  
  SET @pImporResul = @vImporCalcu  
END

Aquí pego el código de donde lo ejecuto en delphi
Código Delphi [-]
    with vdSJCalcuLiqui.ClientDataSetProceAcumuPromeImpor do
    begin
        Params.Clear;
        Params.CreateParam(ftInteger, '@RETURN_VALUE', ptResult).Value;

        Params.CreateParam(ftString, '@pCodigEmple', ptInput).AsString := '0001';
        Params.CreateParam(ftDate, '@pFechaIngre', ptInput).AsDate := StrToDate('10/01/2013');
        Params.CreateParam(ftDate, '@pFechaLiqui', ptInput).AsDate := StrToDate('14/06/2013');
        Params.CreateParam(ftInteger, '@pNumerLiqui', ptInput).AsInteger := 1;
        Params.CreateParam(ftInteger, '@pCantiMeses', ptInput).AsInteger := 2;     
        Params.CreateParam(ftInteger, '@pDecimConfi', ptInput).AsInteger := 2;

        Params.CreateParam(ftFloat, '@pImporResul', ptOutput).Value := 0;
        Params.CreateParam(ftString, '@pAcumuProme', ptInput).AsString := 'ACU';
        Params.CreateParam(ftString, '@pImporDevol', ptInput).AsString := 'SRE';

        // ejecuta el procedimiento
        Execute;
El error surge cuando hace el Execute.
La verdad hace bastante que estoy renegando con esto y no encontré nada en internet que me ayude a solucionarlo. Ya hice varios cambios en el código fuente y siempre me sigue dando el mismo error. Tampoco encontré nada parecido buscando aquí dentro de los foros.
El error me desconcierta porque no estoy utilizando nada que sea del tipo boolean.
Cualquier ayuda, guía u orientación creo que me va a servir.
Desde ya muchas gracias.

ecfisa 22-12-2015 16:51:29

Hola MarinaLR , bienvenida a Club Delphi :)

Por favor, cuando incluyas código en tus mensajes, usa etiquetas para darle mas legibilidad:

(ya las agregué en tu mensaje)

Saludos :)


La franja horaria es GMT +2. Ahora son las 01:46:58.

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