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)
-   -   Mal funcionamiento de truncate en firebird (https://www.clubdelphi.com/foros/showthread.php?t=27822)

Ivanzinho 01-12-2005 13:21:06

Mal funcionamiento de truncate en firebird
 
He agregado el UDF truncate a mi base de datos en FB1.5, pero la ejecución de dicha función me devuelve un NULL.

Buscando por los foros e internet he visto que hay más gente a que se encontro con este problema.

¿Alguien conoce una posible solución?, ¿tengo que crear yo una UDF?

Gracias por vuestra atención

jachguate 01-12-2005 15:14:48

¿cual "udf truncate"?
¿en que casos te devuelve null...? ¿será siempre?

Ivanzinho 01-12-2005 18:56:57

Estuve haciendo pruebas y si le paso un valor funciona, pero con una variable no va. Seguro que hago algo mal :(
Probe tanto con
Código SQL [-]
DECLARE EXTERNAL FUNCTION I64TRUNCATE
    DOUBLE PRECISION BY DESCRIPTOR,
    DOUBLE PRECISION BY DESCRIPTOR
RETURNS PARAMETER 2
ENTRY_POINT 'fbtruncate' MODULE_NAME 'fbudf'
como con
Código SQL [-]
DECLARE EXTERNAL FUNCTION TRUNCATE
    INTEGER BY DESCRIPTOR,
    INTEGER BY DESCRIPTOR
RETURNS PARAMETER 2
ENTRY_POINT 'fbtruncate' MODULE_NAME 'fbudf'
El procedimiento es el siguiente
Código SQL [-]
CREATE PROCEDURE CANSEROFEGLOBAL (
    COF VARCHAR(9),
    CEN NUMERIC(15,2))
RETURNS (
    CANTIDAD NUMERIC(15,2))
AS
DECLARE VARIABLE DISPONIBLE NUMERIC(15,2); /* Cantidade dispoñible en almacén da liña de oferta */
DECLARE VARIABLE FAM VARCHAR(3); /* Familia da liña */
DECLARE VARIABLE SER VARCHAR(9); /* Codigo da liña */
DECLARE VARIABLE UNIDADESLIN INTEGER;
begin
  -- Igualamos a cantidad máxima a servir á cantidad total a servir
  Cantidad = cen;
  -- Recorremos todas as liñas da oferta para ver cál é a cantidade máxima
  -- que se pode servir
  for select fam_of, ser_of, Cen_of * Uen_of from mblinofertas
      where cod_of = :cof
      into :FAM, :SER, :UNIDADESLIN do
     begin
        select Exi_al - Cre_al from mbalmacen
        where fam_al = :FAM and num_al = :SER
        into :DISPONIBLE;
        DISPONIBLE = truncate(DISPONIBLE/UNIDADESLIN);
        if (disponible < Cantidad) then
           Cantidad = disponible;
     end
  suspend;
end

Espero que puedan ayudarme. Muchas gracias

jachguate 01-12-2005 19:21:21

Estas seguro que ambas variables son no nulas antes de la llamada a la función.

Recordá que
truncate(null) => null,
null/cualquier valor => null y
cualquier valor/null => null,

Hasta luego.

;)

Ivanzinho 01-12-2005 19:28:17

Cita:

Empezado por jachguate
Estas seguro que ambas variables son no nulas antes de la llamada a la función.

Recordá que
truncate(null) => null,
null/cualquier valor => null y
cualquier valor/null => null,
;)

Estoy totalmente seguro, lo he ejecutado en modo debug y comprobé el valor de las varibles, las cuales tenían los valores correctos (comprobado con posterioridad en la BD)

Ivanzinho 02-12-2005 09:01:51

Mas pruebas
 
Hice prueba con los siguientes datos :

Código SQL [-]
Truncate(1.5); -- Resultado =  1
----------------XXXXXX------------
Truncate(3/2); --Resultado = NULL
----------------XXXXXX------------
DISPONIBLE = 3/2;
Truncate(DISPONIBLE) -- Resultado = NULL
Si encuentran el fallo agradecería su ayuda.

Ivanzinho 02-12-2005 17:29:16

Al final creé una UDF. Tan simple como:

Código Delphi [-]
library MisUdfs;
uses SysUtils, Windows;
 
function Truncar(var Valor : Real) : real; cdecl;
begin
   Result := Trunc(Valor);
end;
 
exports
  Truncar;
begin
end.
Y me va a la perfección


La franja horaria es GMT +2. Ahora son las 23:59:28.

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