FoxPro/Visual FoxPro - Programa de Factuarcion

   
Vista:

Programa de Factuarcion

Publicado por Victor Perez (278 intervenciones) el 06/07/2011 18:10:01
Hola amigos,

Tengo un programa para facturar en la clinica que me esta dando un problema desde que lo hice.

El sistema se basa en un formulario donde se crea un cursor llamado _items que contiene cada uno de los renglones (detalle) de los productos o servicios facturados.

El evento LostFocus del codigo del producto (que es el primer campo en el Grid) contiene el siguiente codigo:

Sele almCa // Selecciona El Alias con los datos de los productos
Set orde to tag codigo
seek This.value

If Found()

// coloca en el campo del grid el valor del nombre del articulo segun el codigo
Thisform.pgfPeds.Page1.grid1._Art.txtArt.value=almCa.Ca_Nombre

IF _nuevo (si es nueva factura)
Thisform.pgfPeds.Page1.grid1._Cant.txtcan.Value=1
ENDIF

IF EMPTY(this.Value) //si dejo en blanco el codigo, por cualquier razon
Thisform.pgfPeds.Page1.grid1._cant.txtcan.Value=0
ENDIF


If _Items.It_Punt=0 // si el precio unitario es 0, entonces coloca el precio tomado de la base de
datos de los productos

THISFORM.pgfPeds.Page1.grid1._PUnit.txtPun.value=almCa.CA_PRECIO
Sele _Items
Thisform.Calcula
ENDIF


ELSE // Si no encuentra el codigo, abre una mascara donde estan todos los productos listados
y el usuario puede buscarlo por descripcion...Seleccionar el producto y con un doble click
volver a la factura trayendo toda la informacion del producto


If !empty(this.value)
Thisform.pgfPeds.page1.mskService.visible=.t.
THISFORM.PGFPEDS.PAGE1.MSKSERVICE.TXTBNOMBRE.SETFOCUS
Endif

ENDIF


Ahora bien, donde esta el problema, el asunto es que si por ejemplo colocamos el codigo "D1200" correspondiente a DESPACILINA 1.2 MILLONES IM , sale todo bien...me permite entrar la cantidad y poder modificar el precio.

Pero si, regreso nuevamente a ese campo del codigo del articulo, y lo cambio, me cambia perfectamente el nombre del servicio pero no me cambia el precio. (se mantiene con el mismo precio que tenia segun el codigo de articulo anterior).

He hecho muchas pruebas,...Si consigo que me cambie el codigo, la descripcion, el precio, entonces no me permite cambiarle el precio. En ocasiones damos precio especial a los paciente, sucede que el sistema me hace el calculo del subtotal de la linea, pero en el renglon de Precio unitario sigue apareciendo el valor de lista ,segun la tabla de articulos.

He tenido ese problema por mas de 3 años que tengo el sistema y no he podido lograr arreglarlo.

El problema es que ya me ha pasado que la secre se pone un codigo ,se equivoca, y lo corrige y no se fija que el precio está incorrecto. ademas es imposible saberse todo los precios...

Caualquier ayuda...bienvenida.

Tal vez no sea claro en la explicacion de mi sistema...si es asi, me dicen que info debo proveer para ayudar a hacerme comprender.

Saludos,


Victor -Panama -
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

Programa de Factuarcion

Publicado por alberto (399 intervenciones) el 06/07/2011 18:58:26
hola victor soy alberto de santa fe , te cuento como lo uso yo en mi sistema de gestion comercial
tengo una grilla con un cursor temporal donde voy grabando los items a facturar , pero esa grilla es de solo lectura , una vez que ingreso los datos ( codigo , detalle , importe , descuento y total ) ya no se puede modificar , si por error se cargo mal un renglon , les pongo una tecla de funcion para entrar a la grilla y otra para borrar ese renglon , recalculo todos los totales y vuelven a cargar el renglon de nuevo , asi de simple y para el operador es facil de usar.
creo que deberias programarlo asi y no tendrias problemas alguno.
para la carga de los items uso un form pequeño donde van cargando el codigo , saco el detalle del producto , pido cantidad y calculo importe total segun el importe que ingresan , yo siempre muestro el importe del art cargado en la tabla con posibilidad de modificarlo , como en tu caso.
saludos y cualquier cosa me comentas.
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

Programa de Factuarcion

Publicado por victor perez (278 intervenciones) el 06/07/2011 20:18:34
Hola,

Gracias por tu informacion.

En realidad mi Grid es de Solo Lectura....al final, al grabar es que entonces se pasa el Cursor a la base de datos de Detalle.

El problema es mientras te mueves dentro de la grilla cambiando los codigos.

De todas formas ya hice un cambio, de manera que una vez cliquees en la Cantidad, si es la factura Nueva, entonces te exponga el costo unitario segun la Tabla...si es Vieja, que lo deje tal y como está..Siempre con la posibilidad de modificarlo.

Creo que me trabajará bien. Parece que las ideas aparecen cuando uno pide la ayuda...hehe porque hasta hoy no se me habia ocurrido hacerlo asi.

Saludos y Gracias.

Victor,
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

Programa de Factuarcion

Publicado por xx (378 intervenciones) el 06/07/2011 22:10:44
No se entiende muy bien el problema pero si tu grid es de solo lectura este no deberia cambiar o alterar ningun valor de ningun campo, ahora lo que generalmente se hace al disenar un sistema de facturacion es tener una pantalla con una grilla para mostrar los productos o servicios que uno esta facturando, pero para agregar uno nuevo registro sea producto o servicio generalmente se abre un nuevo formulario y este deberia validar, actualizar los totalizadores, controlar el stock, calcular impuestos y por supuesto agregar el registro al cursor.

Saludos
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

Programa de Factuarcion

Publicado por victor perez (278 intervenciones) el 06/07/2011 23:20:20
hola xx,

Precisamente, mi sistema permite facturar linea por linea en el Grid. Todo lo manda en ese momento a un cursor...luego tu puedes subir o bajar en las celdas del grid y cambiar lo que es codigo, cantidad y precio unitario. no se puede cambiar en el subtotal ni en la descripcion.

En estos tres celdas modificables se puede cambiar la info y de igual manera tiene algunos eventos como el lostfocus, valid, etc...

Creo que el Grid no es de Lectura sino lectura y escritura...pero la informacion no se pasa a la base de datos hasta el final, cuando el cursor es vaciado a Detalles, los datos de la venta como cliente, codigo de cliente, fecha, condiciones, pago, metodo de pago, etc...son anexados a Cabecera..Esto se hace con el boton GRABAR ...

Ya solucionè temporalmente el problema al colocarle en el evento lostfocus de la celda de Cantidad la condicion para que lea el precio unitario de la base de datos de servicios siempre y cuando la factura sea nueva, no la edicion de una factura...

Mi programa permite editar la factura ...porque no se nos exige la impresion de la misma ya que profesiones como las mias , medico, tienen condicion de liberales y el fisco no es tan exigente con nosotros.

Saludos y gracias por tus comentarios.

Victor
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

Programa de Factuarcion

Publicado por es_binario (757 intervenciones) el 07/07/2011 01:21:51
Cambia tu codigo de lost focus al evento valid... lamentablemente el lost focus de foxpro no actua como deberia, primero se dispara el valid antes que el lost focus y lo primero que hace un cuadro de texto es validar los datos cuando pierde el enfoque...

por otro lado esta mal planeado tu sistema segun mi esperiencia (segun mi forma de programar), creo que lo ideal seria que tubieses los procesos en metodos con parametros para que fluyese de forma mas correcta la interaccion del usuario con el form.

por ejemplo cada que un textbox de mi grid es cambiado en el metodo valid de estos tengo una llamada a un metodo Thisformset.refresh_form() en el cual el programa actualiza la informacion de esta manera nunca pasa lo que a ti te ocurre. los datos siempre son los de mi venta...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Thisformset.formu1.grilla1.RecordSource = ""
SELECT detallepv.cantidad, articulos.descrip, con_iva(detallepv.p_pub, detallepv.iva), ;
	detallepv.descuento, descuenta(detallepv.p_pub, detallepv.descuento, detallepv.iva),;
	descuenta(detallepv.p_pub, detallepv.descuento, detallepv.iva) * detallepv.cantidad, ;
	articulos.antibiotic, detallepv.iva, articulos.tip_desc, detallepv.cod_barra FROM detallepv LEFT JOIN articulos;
	ON detallepv.cod_barra = articulos.cod_barra;
	INTO CURSOR muestra ;
	READWRITE && para permitir cambiar la cantidad directamente
Thisformset.formu1.grilla1.RecordSource = "muestra"
Thisformset.formu1.grilla1.Refresh()
 
*// calcula el total
SELECT SUM(detallepv.cantidad * descuenta(detallepv.p_pub, detallepv.descuento, detallepv.iva));
	as tot_de_venta FROM detallepv INTO CURSOR tot_vent_cur
IF ISNULL(tot_vent_cur.tot_de_venta)
	Thisformset.formu1.txttotal.Value = 0
ELSE
	Thisformset.formu1.txttotal.Value = ROUND(tot_vent_cur.tot_de_venta,2)
ENDIF



... otro ejemplo sencillo de parte de uno de mis programas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
LPARAMETERS bf_folio_consul
 
*// limpia form fundamental para cuando no hay datos
 
Thisformset.formnormal1.grilla_151.RecordSource = ""
Thisformset.formnormal1.grilla_151.Refresh()
Thisformset.formnormal1.edit1.Value = ""
Thisformset.formnormal1.txtsistPago.Value = ""
Thisformset.formnormal1.edit2.Value = ""
 
*// ver si existe el folio en una venta
SELECT COUNT(folio) as bf_tot_encon FROM venta;
	WHERE venta.folio = bf_folio_consul ;
		INTO CURSOR bf_existe_cur
IF ISNULL(bf_existe_cur.bf_tot_encon) OR bf_existe_cur.bf_tot_encon = 0
	MESSAGEBOX("El folio no se encuentra registrado",64,;
		"El folio no se encuentra registrado")
	Thisformset.formnormal1.grilla_151.RecordSource = ""
	Thisformset.formnormal1.grilla_151.Refresh()
	RETURN -1 && da por terminado el proceso al no encontrar el folio
ENDIF
 
*// en este punto comienza a mostrar los datos de pagos para hacer
*// las cancelaciones, segun lo considere el usuario
LOCAL bf_dia as Character
bf_dia = "LUN"
*//
*// control de dias entre pagos
*//
LOCAL bf_fecha_ini_cuenta as Date, bf_dif_dias as Integer
bf_fecha_ini_cuenta 	= DATE()	&& inicia la variable contenedora de date
bf_dif_dias 			= 1			&& siempre sera un valor entero la diferiencia de dias
 
SELECT bf_dia as dia, abonos.fecha, bf_dif_dias as dif_diass, abonos.saldo_ant, abonos.abono, abonos.saldo_act, hojablanca.cobrador,;
	abonos.folio, abonos.tipo, abonos.operacion, abonos.hojablanca;
  FROM abonos INNER JOIN hojablanca;
  	ON abonos.hojablanca = hojablanca.hojablanca ;
	WHERE abonos.folio = bf_folio_consul;
		ORDER BY abonos.fecha ASC INTO CURSOR bf_pagos_encontrados_cur READWRITE
 
*// Si no tiene pagos, no podran cancelarse y termina
SELECT bf_pagos_encontrados_cur
IF RECCOUNT() = 0
	MESSAGEBOX("No Tiene Pagos este folio",64,"No Tiene Pagos este folio")
	RETURN -1 && termina la aplicacion
ENDIF
 
 
*// corregir los pagos que no fueron ingresados de forma cronologica
LOCAL bf_enganche_dago as Double, bf_importe as Double, bf_fecha_eng as Date
SELECT eng_dado, importe, fecha FROM venta;
	WHERE venta.folio = bf_folio_consul ;
		INTO CURSOR bf_datos_ini_cur
*// asigna los valores iniciales
SELECT bf_datos_ini_cur
bf_enganche_dago 	= bf_datos_ini_cur.eng_dado
bf_importe 			= bf_datos_ini_cur.importe
bf_fecha_eng		= bf_datos_ini_cur.fecha
*// variables del flujo
LOCAL bf_abono_acum as Double, bf_abon_apli as Double
LOCAL bf_sald_ant as Double, bf_nvo_sald as Double
LOCAL bf_oper_act as Integer
bf_abono_acum 	= 0
bf_abon_apli 	= 0
bf_importe 		= bf_importe - bf_enganche_dago
bf_sald_ant		= 0
bf_nvo_sald		= 0


en este caso esta parametrizada y se llama con la siguiente rutin en un textbox

1
2
3
4
IF This.Value > 0
	*// hay algo
	Thisformset.busca_folio(This.Value)
ENDIF


espero se entienda... saludos.
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

Programa de Factuarcion

Publicado por VICTOR PEREZ (278 intervenciones) el 07/07/2011 18:01:32
Hola Es_binario,

Entiendo tu punto. Yo tengo el thisform.refresh solo en los calculos de subtotales y totales.

Voy a emplear el valid, a ver si funciona...Te cuento luego.

victor,
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

Programa de Factuarcion

Publicado por xx (378 intervenciones) el 07/07/2011 01:36:21
Ahhh ahora entiendo,... bueno de todos modos te cuento que es muy dificil controlar la grilla cuando los registros tienen datos relacionados y complejos, igual te sugiero que en tu formulario de factura tengas un boton agregar y que al presionar este llames a otro y este valide el registro.

Ahora si no quieres hacerlo te sugiero investigues bien sobre los eventos gotfocus y lostfocus del text que contiene las columnas cantidad y precio ya que estos afectan a los totales e impuestos, es decir cuando se lanza gotfocus() del campo cantidad quiere decir que estas por editar la cantidad de un registro y por consiguiente debes quitar el registro de los totalizadores y cuando se ejecuta lostfocus del mismo control debes volver a incluir el registro en los totalizadores este mismo comportamiento debes reproducir para el campo precio, ademas debes enviar el foco a la columna codigo luego de editar la cantidad o el precio, esto es el unico modo de mantener consistente los totalizadores.

Ojala se entienda
Saludos
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