Ver Mensaje Individual
  #9 (permalink)  
Antiguo 16/07/2009, 08:09
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Problema con datos reales

Encontré una solución y una explicación.
La explicación está aca, donde afirman los posibles problemas de exactitud de cierto tipo de datos. Para datos exactos, se recomienda usar el tipo de dato numeric con scale.

La solución:

Código sql:
Ver original
  1. CREATE TABLE detalle(
  2. codcab CHARACTER(2) NOT NULL,
  3. codigo CHARACTER(2) NOT NULL,
  4. importe1 NUMERIC(8,2) NOT NULL,
  5. importe2 NUMERIC(8,2) NOT NULL
  6. );
  7.  
  8. --Funcion
  9. CREATE OR REPLACE FUNCTION pa_grabardetalle(_codcab CHARACTER,_codigo CHARACTER[], _aimporte NUMERIC[][])
  10. RETURNS NUMERIC AS
  11. $BODY$
  12. BEGIN
  13. FOR i IN array_lower(_aimporte,1) .. array_upper(_aimporte,1) LOOP
  14. INSERT INTO detalle(codcab,codigo,importe1,importe2)
  15. VALUES(_codcab,_codigo[i],round(_aimporte[i][1]::NUMERIC,2),round(_aimporte[i][2]::NUMERIC,2));
  16. END LOOP;
  17. IF (SELECT SUM(importe1)-SUM(importe2) FROM detalle WHERE codcab=_codcab)<>0 THEN
  18. RAISE EXCEPTION 'las sumas no coinciden..!';
  19. RETURN 0;
  20. END IF;
  21. RETURN 1;
  22. END;
  23. $BODY$
  24. LANGUAGE 'plpgsql' VOLATILE;

Si deseas mas decimales de exactitud, cambia la escala en la declaración de la tabla y el casteo en el insert dentro del trigger.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming