PDA

Ver la Versión Completa : Error al querer incrementar semanas con DATEADD


Tcmn
19-12-2022, 15:57:06
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:

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.

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


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:

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

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:


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
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