PDA

Ver la Versión Completa : la funcion round no funciona en fastreport ?


IVAND
23-02-2008, 00:31:53
Hola a todos alguien me podria ayudar sobre el correcto uso de la funcion round en fastreport 2.5 yo lo uso asi y no funciona et
este valor va en dentro del memo

[round([Imp_partes."TOTAL_LINEA"],2)], pero me sigue enviando 4 decimales cuando quiero que solo me muestre dos , lo que necesito hacer es que en una factura las lineas tengan cuatro decimales y al final la suma del importe sea redondeada a 2 decimales , lo consigo hacer mediante la opcion de formateo pero cuando tomo ese valor para un calculo me muestra otra vez los cuatro decimales


Gracias por su interes

Lepe
23-02-2008, 01:39:54
Ya se ha dicho otras veces: Al menos en españa no es legal redondear importes intermedios. Para los cálculos, debes usar todos los decimales, solo puedes redondear el importe total a pagar.

Por tanto, como lo haces ahora, es como debe hacerse. Muestras 2 decimales en la Base imponible, pero usas los 4 decimales para calcular el IVA (si procede) y el importe total.

Saludos

IVAND
23-02-2008, 18:25:56
Gracias Lepe por tu respuesta pero fijate que no aca en ecuador el calculo del Iva se lo realiza en base a la las base imponible es decir 12.9566 seria igual a 12.96 y el Iva sera calculado en base a esta base (12.96*12/100) , pero ahi es donde esta mi problema porque uso la funcion round de fastreport pero esta no arroja el valor redondeado

Gracias de antemano

Nota : como puedo colocar mis propias funciones en fastreport , porque algo tiene que pasa con el dichoso round o no lo uso bien o no esta funcionando para nada

Lepe
23-02-2008, 20:18:05
Lo siento pero sólo usé 4 días el FastReport y no llegué a realizar cálculos de ese tipo. Espero que otra persona te pueda ayudar.

Lo único que puedo sugerirte es que grabes todo en la base de datos, la Base Imponible no tiene por qué calcularse cada vez que quieras imprimir la Factura, si ya está guardado todos los importes, mucho mejor (a mi parecer).

Saludos

IVAND
24-02-2008, 00:23:29
Totalmente de acuerdo con tu comentario y asi lo hago lo que pasa es que la factura la divido en (n) partes por cuestiones de formato de la factura del cliente pero bueno ya esta solucionado el problema
asi que ahi le va la explicacion para los posibles amigos con esta misma inquietud


1.- definimos una unidad en nuestya aplicacion que llamaremos uFastReportFunctions (Es el mismo ejemplo de una funcion creada en una pagina )

copiamos esta funcion completa


unit uFastReportFunctions;

interface
uses
Windows, Classes, SysUtils, FR_Class, FR_Const, FR_Utils;

type
TReportFunctionLibrary = class(TfrFunctionLibrary)
private
function RoundD(x: Extended; d: Integer): Double;
public

constructor Create; override;
// procedure dofunctio1(x: Extended; d: Integer); override;
procedure DoFunction(FNo: Integer; p1, p2, p3: Variant;
var val: Variant); override;
end;

implementation
uses
DB, DBClient, Variants, StrUtils, Math;

{ TReportFunctionLibrary }

constructor TReportFunctionLibrary.Create;
begin
inherited;
inherited Create;

// Todas las funciones que se quieran añadir al FR se declaran aquí
with List do
begin
Add('roundd');
end;

// Para que sean públicas en el apartado Functions del FR se declaran en
// el AddFunctionDesc

AddFunctionDesc('Roundd', 'MisFunciones', 'FR_ROUNDD(,)/Redondear valores (Devolviendo 1)');
end;

procedure TReportFunctionLibrary.DoFunction(FNo: Integer; p1, p2,
p3: Variant; var val: Variant);
begin
inherited;
val := RoundD(frParser.Calc(p1),frParser.Calc(p2));

// Todas las funciones que se declaren en el create se definen aquí

//case FNo of
// 0: val := GetImageType(frParser.Calc(p1), frParser.Calc(p2));
//end;
end;



function TReportFunctionLibrary.RoundD(x: Extended; d: Integer): Double;
var
n: Extended;
begin
n := Power(10, d);
x := x * n;
Result := (Int(x) + Int(Frac(x) * 2)) / n;
end;

initialization
frRegisterFunctionLibrary(TReportFunctionLibrary);

finalization
frUnRegisterFunctionLibrary(TReportFunctionLibrary);
end.



Segundo en tiempo de ejecucion no en desarrollo (al momento de dar click para ver el informe activamos el disenador frReport1.DesignReport; utilizamos la funcion que le hemos puesto mis funciones , la usamos asi

Cust:=roundd([([roundd([Sum([Imp_partes."TOTAL_LINEA"])],2)]*12/100)],2);

y listo , ya podremos declarar las funciones que queramos gracias a su apoyo