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';
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.