Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Error al querer incrementar semanas con DATEADD (https://www.clubdelphi.com/foros/showthread.php?t=96010)

Tcmn 19-12-2022 15:57:06

Error al querer incrementar semanas con DATEADD
 
Hola a todos, de antemano gracias por su tiempo en leer este hilo. Fijense que estoy haciendo un procedimiento almacenado con IbExpert, Firebird 2.1 y Windows 8 en el que quiero incrementar N semanas una fecha y lo hago de la siguiente manera:
Código SQL [-]
select coalesce(count(*),0)
from interesnooro
where num_cont=:v_num_cont  
into :v_pagosant;
v_semananva=(v_pagosant+1);

select  fechaoriginal
from contratosnooro
where num_cont=:v_num_cont
into  :v_fechacont;

v_semanaquepaga=dateadd (v_semananva week to v_fechacont);

la v_semananva es SMALLINT y obviamente V_SEMANAQUEPAGA y V_FECHACONT son de tipo DATE y cuando esta activa la linea donde quiero aumentar el numero de semanas al compilar el procedimiento me manda el mensaje:

expression evaluation not supported.
expression evaluation not supported.
At procedure 'INSERTAR1PAGOFORZNOORO' line: 60, col: 1.


Ya revisé la sintaxis, tipos de variables y no encuentro por qué me sigue marcando error en la linea DATEADD, cualquier idea la agradeceré mucho.

duilioisola 19-12-2022 16:46:09

He creado el un procedimiento de prueba para comprobar lo que mencionas.
Funciona correctamente en Firebird 2.5.

Código SQL [-]
create procedure prueba_dateadd (
    fecha_ini date,
    semanas smallint)
returns (
    fecha_fin date)
as
begin
    fecha_fin = dateadd(semanas week to fecha_ini);
    suspend;
end

Escribe el código entero de tu procedimiento para ver si hay algo raro que podamos ver.

duilioisola 19-12-2022 16:51:03

Esta no es la forma correcta de asegurar que un valor no sea nulo

Código SQL [-]
select coalesce(count(*),0)
from interesnooro
where num_cont = :v_num_cont  
into :v_pagosant;
/* Si no hay ningún registo que cumpla "num_cont=:v_num_cont", el valor de v_pagosant no se  modificará y seguirá con el valor que tenía antes del select (nulo si no se ha definido) */

v_semananva = (v_pagosant + 1);

La forma correcta sería:
Código SQL [-]
select count(*)
from interesnooro
where num_cont = :v_num_cont  
into :v_pagosant;

v_pagosant = coalesce(v_pagosant, 0);
v_semananva = (v_pagosant + 1);

/* O resumiendo en una sola línea */
v_semananva = (coalesce(v_pagosant, 0) + 1);

Casimiro Notevi 19-12-2022 16:52:20

Es que "week" no es un parámetro válido.
Cita:

Dateadd()
Adds the specified number of years, months, days, hours, minutes, seconds or milliseconds to a date/time value.
Puedes multiplicar "days" por 7 :)

duilioisola 19-12-2022 16:58:07

Es verdad, week se agregó en Firebird 2.5. En la versión 2.1 no está. Siempre me olvido de revisar versiones anteriores.

Cita:

Es que "week" no es un parámetro válido.
Cita:
Dateadd()
Adds the specified number of years, months, days, hours, minutes, seconds or milliseconds to a date/time value.
Se podría solucionar fácilmente como dice Casimiro:

Código SQL [-]
create procedure prueba_dateadd (
    fecha_ini date,
    semanas smallint)
returns (
    fecha_fin date)
as
begin
    fecha_fin = dateadd((semanas * 7) day to fecha_ini);
    suspend;
end

Casimiro Notevi 19-12-2022 18:19:13

Cita:

Empezado por duilioisola (Mensaje 549621)
Es verdad, week se agregó en Firebird 2.5. En la versión 2.1 no está. Siempre me olvido de revisar versiones anteriores.

No me había fijado en la versión, he acertado por casualidad :)

Tcmn 19-12-2022 21:04:45

Qué habil casimiro. Muchas gracias por las ideas duilioisola. En la abundancia de consejeros hay logro. Justo era WEEK, quien provocaba todo el problema. Problema resuelto. Mil gracias y buen día

cloayza 20-12-2022 13:30:10

Estimado Tcmn, puede estar de sobra mi recomendación, pero ahí va...

Le recomiendo migrar a la última versión, trae muchas mejoras y mas...El proceso no es nada de complicado.

Saludos cordiales


La franja horaria es GMT +2. Ahora son las 13:04:14.

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