Ver la Versión Completa : 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:
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 :)
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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.