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

Función un poco mas estable.

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

Sigo buscando. Todavía no me lo explico.



EDITO: OTRA MAS ESTABLE AUN, PERO FALLA DESPUES DE 10 INSERCIONES.
FALLA EN EL RETORNO DE LA FUNCIÓN, PERO TODAS LAS INSERCIONES SE HACEN CORRECTAMENTE


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

Estoy ofendido... Por que razón toma los valores con decimales escondidos?
Sigo buscando
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 15/07/2009 a las 13:44