Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-12-2005
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #2  
Antiguo 01-12-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
¿cual "udf truncate"?
¿en que casos te devuelve null...? ¿será siempre?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 01-12-2005
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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 ISPONIBLE;
        DISPONIBLE = truncate(DISPONIBLE/UNIDADESLIN);
        if (disponible < Cantidad) then
           Cantidad = disponible;
     end
  suspend;
end

Espero que puedan ayudarme. Muchas gracias
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #4  
Antiguo 01-12-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 01-12-2005
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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)
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #6  
Antiguo 02-12-2005
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #7  
Antiguo 02-12-2005
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
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
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:02:52.


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
Copyright 1996-2007 Club Delphi