FoxPro/Visual FoxPro - Tengon un pequeño problema aritmetica

 
Vista:

Tengon un pequeño problema aritmetica

Publicado por es_binario (757 intervenciones) el 08/09/2010 01:14:45
Resulta que hice un programita muy sencillo que unicamente imprime las facturas de un cliente y solo calcula el subtotal, el iva y el total

bueno pues resulta que al cliente le permito re-imprimir una factura ya hecha y el caso que en alguna ocacion me hizo el calculo mal, algo asi

el problema y es que ya no recuerdo bien pero fue algo asi:

Cant Descripcion p.unitario importe
1 rectificacion de poleas 577 577
sub-total 1052
iva 168.32
total 1220.32

ahi en el sub-total todo bien, pero no encuentro el error en mi codigo.

el comando es el siguiente tengo un metodo que dispara la impresion de factura usando variables y un cursor pero no usa, data enviroment en el reporte.

lo raro es que no lo hace siempre. eso si es muy raro, tal vez me puedan ayudar a dar con el error. gracias por su apoyo.

la forma en que lo llamo es algo asi:

thisformset.imprime_factura(2,1,.f.)
con este comando le digo que imprima la factura no.2 una sola copia y que no sea vista previa sino directa impresion a la impresora.

gracias.-----------------------------

LPARAMETERS pedido_imprime as Integer, no_copias as Integer, imprime_vista_previa as Boolean
*// imprime una determinada factura
PUBLIC FECHA_I as Date
PUBLIC NOMBRE_I as String
PUBLIC RFC_I as string
PUBLIC DOM_I as string
PUBLIC COL_I as string
PUBLIC CIUD_I as string
PUBLIC CP_I as string
PUBLIC TEL_I as string
PUBLIC SUB_TOTAL_I as double
PUBLIC IVA_I as double
PUBLIC RET_IVA_I as double
PUBLIC TOTAL_I as double

*// ver que la venta este registrada
SELECT * FROM ventas WHERE ventas.pedido = pedido_imprime;
INTO CURSOR mi_venta_imprime
SELECT mi_venta_imprime
IF RECCOUNT() > 0
*// procede una vez encontrada la venta
FECHA_I = mi_venta_imprime.fecha

LOCAL cliente_imprime as Integer
cliente_imprime = mi_venta_imprime.cliente
SELECT * FROM clientes WHERE clientes.cliente = cliente_imprime;
INTO CURSOR mi_cliente_imprime
*// datos del cliente
NOMBRE_I = ALLTRIM(mi_cliente_imprime.nombre )
RFC_I = ALLTRIM(mi_cliente_imprime.rfc )
DOM_I = ALLTRIM(mi_cliente_imprime.domicilio )
COL_I = ALLTRIM(mi_cliente_imprime.colonia )
CIUD_I = ALLTRIM(mi_cliente_imprime.ciudad )
CP_I = ALLTRIM(mi_cliente_imprime.cp )
TEL_I = ALLTRIM(mi_cliente_imprime.tel )

*// detalle de la venta

SELECT cantidad as CANT_I, descripcion as DESCRIP_I, p_unitario as P_UNITARIO_I, pedido;
FROM detalleventa WHERE detalleventa.pedido = pedido_imprime;
INTO CURSOR isi READWRITE

*// si se desglosa o no el iva
*//
IF !EMPTY(RFC_I) && desglosa iva
*// el cursor se mantiene igual

*// subtotal
SELECT SUM(isi.CANT_I * isi.P_UNITARIO_I) as subtotal_imprime FROM isi;
INTO CURSOR cur_tot_sub_a
SUB_TOTAL_I = ROUND(cur_tot_sub_a.subtotal_imprime,2)

*// totales
IVA_I = ROUND(SUB_TOTAL_I * (iva_/100),2)
RET_IVA_I = 0
TOTAL_I = ROUND(SUB_TOTAL_I * (1+(iva_/100)),2)


ELSE && no desglosa el iva
*// el cursor se le agrega el iva
UPDATE isi SET isi.P_UNITARIO_I = ROUND((isi.P_UNITARIO_I * (1 + (iva_/100))),2)
*// subtotal
SELECT SUM(isi.CANT_I * isi.P_UNITARIO_I) as subtotal_imprime FROM isi;
INTO CURSOR cur_tot_sub_b
SUB_TOTAL_I = ROUND(cur_tot_sub_b.subtotal_imprime,2)

*// totales
IVA_I = 0
RET_IVA_I = 0
TOTAL_I = SUB_TOTAL_I

ENDIF

*// listo todo para mandar imprimir
IF imprime_vista_previa = .T.
*// una sola vez
Report form "C:\SISSERPCFACTUR\REPORTS\factura.frx" preview
ELSE && manda a la impresora
*// las veces que el cliente indique
FOR a = 1 TO no_copias
Report form "C:\SISSERPCFACTUR\REPORTS\factura.frx" to print noeject noconsole
ENDFOR
ENDIF

ENDIF
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Tengon un pequeño problema aritmetica

Publicado por ANDRES CORTEZ M (162 intervenciones) el 08/09/2010 06:53:10
Hola es_binario

Los lenguajes tanto como clipper, visual basic, foxpro o vfp tiene problemas de redondeo, no siempre aveces generalmente es cuando en tercer decimal es 5

ejemplo

el resultado es 168.325478 = ( formula)
al hacer el roun(x*y,2)

deberia ser 168.33 lo cual no lo hace

hace los calculos por linea de comando segun tus formulas y ve que valores te da haber si puede ser eso.

espero te sirva

Acm.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tengon un pequeño problema aritmetica

Publicado por es_binario (757 intervenciones) el 08/09/2010 16:39:28
Si es eso y creo que se debe al segundo parentesis, pero voy a hacer prueba con el floor como se rrecomienda en portalfox, gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tengon un pequeño problema aritmetica

Publicado por xx (378 intervenciones) el 08/09/2010 23:03:48
Hasta donde se puede ver el problema no esta en el redondeo:
El VFP trabaja bien con los flotantes es decir SET DECIMALS define la cantidad de decimales con la que trabaja obviamente por defecto creo que es 5 es decir con 5 decimales y si tu tienes una expresion 6.123456 el VFP te lo convierte a 6.12346 puesto que se redondea a uno mas el numero anterior siempre y cuando sea mayor que 5 es decir el mismo funcionamiento que cualquier calculadora.

Cant Descripcion p.unitario importe
1 rectificacion de poleas 577 577
sub-total 1052 (lo correcto seria que muestre 577 creo, deberias inspeccionar aqui)
iva 168.32 (%desconocido)
total 1220.32 (calculo correcto)

suponiendo que no encuentras el problema en el codigo se puede deducir que el problema esta en otro lado o tambien podria estar en la tabla quizas exista un registro mas aparte del que muestras con el mismo numero de pedido.

Suerte con tu busqueda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar