Crear form con grid para Facturacion

Pues aquí queriendo aprender más acerca de este poderoso lenguaje de programación de Foxpro, solicito de tu ayuda para crearlo.

1 respuesta

Respuesta
1
Ok! Me complace saber que te intereesa mucho foxpro! Eso es muy + para nuestra comunidad! Vamos al asunto: ¿Primeramente decime que partes tienes hechas y que necesitas?! Lo iremos desglosando por partes. Si te parece. EXPLICAME que es lo que quieres y requerís!
Saludos!! :D :D :D
Pues bien.
tego en Form.
Dentro del form tendo un Pageframe de 2 columnas una donde creare las nuevas facturas y la otra donde estará la lista de las facturas en un grid.
En la de generar facturas tengo textbox para agregar el nº de cliente a la par cree un label donde me aparecerá el nombre del cliente para ver si el código que introduje es del cliente que quiero, ¿si no me se el numero quiero que con F2 me mande a llamar un form que hicimos para buscarlos los clientes recuerdas? Al localizarlo quiero que el código de ese cliente me lo pegue en el text.
Tengo un listbox donde indica si la factura es de crédito o contado, por su puesto la fecha, y ademas un text donde se le coloca la persona la cual va a retirar los productos. Esto es en el encabezado
en el detalle, tengo un grid con las siguientes columnas
codpro, cantidad, precio, subtotal, iva, Total
en el campo codpro al presionar f2 mando a llamar un form para buscar un producto, al localizarlo me copie el código al campo
que en el campo precio, me aparezca el precio del producto.
Tengo un CommandButt donde mando a imprimir la factura. Espero haberme explicado. Sino me avisas
Respecto a la primera parte... para llamar un form (para buscar los clientes) con el teclado (F2) es fácil. Ve al evento Keypress de tu form y escribí esto:
IF nKeyCode = -1        &&Tecla -1 = F2&&
         DO FORM "Formbusquedaclientes.scx"
ENDIF
Podes consultar la lista de claves para las teclas aqui... http://msdn.microsoft.com/es-es/library/cc451013(v=vs.71).aspx
EN la parte del grid, para llamar al form para buscar un producto cuando te ubiques en la columna "codpro", podes copiar un código similar al anterior...! Lo podes ubicar en el mismo evento keypress del text1 de la columna del codpro.
¿Cómo es eso de... "que en el campo precio, me aparezca el precio del producto."? ¿A qué te refieres? ¿Podrías explicarme un poco más?
Ok. Mira ya hice lo de las teclas de función, excelente me llama bien al form para buscar, como puedo hacer para que me copie el código del cliente al text box del form donde introduzco el código del cliente y en otro tex me aparezca el nombre del cliente.
En el grid vamos a introducir los productos, en la primera conlumna esta el código del producto, luego cantidad luego precio, en precio que me aparezca el precio del producto desde la tabla productos, que es la que tiene el precio real del producto, ya que el grid es una tabla temporal y de esa tabla temporal los voy a pasar a una permanente.
Me alegra que te haya funcionado. Por lo que comprendo, supongo que quieres abrir el form de clientes a modo de "consulta" para buscar algún cliente! Y luego seleccionar ese cliente y mostrar su código en tu form de facturas. Sabes... yo nunca he aplicado "llamar" registros de un form a otro form cuando el entorno de datos de los mismos esta comprendido con tablas diferentes. ¿Cómo seleccionas un registro de un form asociado a una tabla POR para mostrarlo en un form (control text) asociado a una tabla Y? Nunca he probado eso jajaja! Osea... si se supone que es a nivel de consulta, no sabría como mandarlo de un form a otro! Lo que yo hago, en lugar de utilizar llamados de forms por aquí y por allá es usar un combobox ligado a la tabla que contiene los datos. Así, es más sencillo para el usuario. Claro que tu punto de vista esta muy bien... hacer la consulta con el form... yo también las hago así, usando rutinas .prg! Pero para la selección es sobre la misma tabla...! Dejame investigar como se procede en ese caso y te aviso... ¿dale?
Para lo segundo: si quieres que el precio (y otros datos más) te aparezcan "automaticamente" desde la tabla productos, es fácil. Te recomiendo esto: digita el código del producto en la primera columna (codpro) y al dar enter para pasar a la segunda, que los datos de ese producto (descripción, precio) se rellenen solos...! Va asi... 
1. Agrega la tabla productos a tu entorno de datos.
2. Andate al KEYPRESS Text1 de la columna donde digitas el código (primera columna), escribí (adecuando tu código claro) esto:
IF nKeyCode = 13 
SELECT * FROM tablaproductos WHERE campocodigo = THIS.Value INTO CURSOR micursor
IF RECCOUNT ('micursor')> 0
*
THISFORM.Grid1.Column2.Text1.Value = cur_pro.descripcion &&Descripcion&&
THISFORM.Grid1.Column3.Text1.Value = cur_pro.precio &&precio&&
ELSE 
RETURN .F.
MESSAGEBOX ('El producto no existe') &&, 0 + 64)
Endif
Endif
Proba y me avisas! :D :D
Ohhhh! Disculpa! Me equivoque en algo: El correcto es así:
IF nKeyCode = 13  
SELECT * FROM tablaproductos WHERE campocodigo = THIS.Value INTO CURSOR micursor 
      IF RECCOUNT ('micursor')> 0 
            THISFORM.Grid1.Column2.Text1.Value = micursor.descripcion    &&Descripcion&& 
            THISFORM.Grid1.Column3.Text1.Value = micursor.precio      &&precio&& 
             ELSE  
                  RETURN .F. 
                    MESSAGEBOX ('El producto no existe') &&, 0 + 64) 
        ENDIF
Endif
Buena idea me diste, lo que hice fue agregar un combo donde me muestra los cliente ordenados alfabéticamente, puede escribir para localizar el cliente, es más practico
con respecto a lo segundo.
lo que tengo es una tabla creada "tempfact" esta, está ligada al grid una vez ingresado los datos ahi, selecciono factura_detalla que es donde tendre el detalle de todas las facturas
entonces al dar click en un boton hago esto
use factura_detallada
append from tempfac
use tempfac
delete all
hago bien?
Entonces como ves no es un cursor en donde tengo el grid sino una tabla, al ingresar el código del producto en el grid. Que me aparezco el precio en otra columna del grid y el nombre en una label fuera del grid
Que bueno que te sirvió lo de los combos! Siiiiiii... es más practico! Respecto a lo segundo... tienes una tabla tempfact ligada al grid. Bien. Ingresas los datos. Bien. Luego seleccionas otra tabla factura_detallada... y es aquí donde no entiendo. ¿Qué es lo que quieres hacer? En tempfact guardas el detalle del grid... aja... y la otra tabla, ¿qué función tiene? Explicame bien que es lo que queresss... y te ayudo! Dale! Con mucho gusto! :D :D :D
Ok. Mira en tempfact voy guardando temporalmente el detalle de los productos
una vez ingresado todo, los traslado a factura_detalle y vacío tempfact.
factura_detalle va guardando todas las facturas hechas
Entiendo...! Podes usar INSERT INTO para pasar los datos de una tabla a otra. Supone que quieres pasar de la tabla1 a la tabla 2, los campos1 y 2! Va asi: 
Select tabla2
INSERT INTO tabla2(campo1, campo2) ;
VALUES(tabla1. Campo1, Tabla1. Campo2)
Y despues, aplicas TABLEUPDATE (.T.) y listo!
Para eliminar los registros de la tabla "temporal o transitoria" usa:
SELECT tabla
DELETE ALL
Y listo! Dejame aclararte y preguntarte algo si. ¿Por qué usas una tabla transitoria para cargar los datos de l grid y luego pasarlos a otra tabla y marcar los registros para eliminación? ¿Por qué no trabajas directamente con la tabla detalle de las facturas ligada a tu grid? Usar cursores... pues es bueno... pero es mejor evitarlos...! Ahora... usar 2 tablas... pues no se... no me parece! Claro.. es solo mi opinión je je! Tu eres el programador aquí! Lo que pasa es que... eso de meter los registros en un tabla, pasarlos a otra y después regresarte a la tabla primera y borrarlos... no esta bien y te diré por que: la tabla 1, la que vacías... va a estar siempre con los registros. DELETE o DELETE ALL no elimina fisicamente los registros de la tabla. "LOS MARCA PARA ELIMINACIÓN y con SET DELETED ON | OFF en el init de tu form, decidís si quieres ver o no esos registros "MARCADOS PARA ELIMINACIÓN". Aplica DELETE ALL a tu tabla... después anda abrila aparte, y vas a ver que ahí están los registros... unicamente marcados para elimnacion.
Te digo esto porque... vas a estar llenando 2 tablas con los mismo datos...solo que unos van a estar activos y otros "MARCADOS PARA ELIMINACION"... pero alli van a estar...! Aplica DELETE ALL... despues crea un boton en tu form y en el evento click pone
SELECT tutabla
RECALL ALL
Y vas a ver que los registros se desmarcan y se activan nuevamente! Estas ocupando espacio innecesario en tus tablas! Ves! Aclaro.. es mi humilde opinión nada más... solo te aconsejo! No es que estés mal.. nononononon! Eso nunca! Le haces bastante huevo... y lo que programas esta bien si satisface las necesidades tuyas y de tu cliente... pero mira la viabilidad que te quiero mostrar ok! Jajaja! DALE! Si tienes alguna duda, preguntame... que para eso estamos!
Que andes bien!
Saludos! :D :D :D 
Ravenn!
Muy buena tu aclaración y de verdad tienes toda la razón, pero como no se usar eso de cursor, fue lo que se me ocurrió, me punse a pensar que si uso solamente una tabla, me van a aparecer en el grid los datos que ya había montado antes y en una nueva factura van los datos que el usuario digite, a no ser que haya algo para que en el grid no aparezca nada cuando elabore una nueva factura
Los cursores no son mala idea. Pero te aconsejo que los evites! A menos que tu apliaccion los requiera inevitablemente! Las tablas .dbf son excelentes para trabajar! Ahora bien... hay varias soluciones para tu problema. No te preocupes! "No dudes de fox prooo... jaja"! Para un facturador... hay que usar 2 tablas. Al menos... yo así aplico y me funciona! Una tabla es para cargar los datos de "generales" de la factura (numero de factura, fecha, cliente... etc.). Y la otra es para manejar el detalle de los productos (para el grid). Las tablas se enlazan por un campo común (podría ser el numero de factura), es decir, las relacionas. La tabla principal debe ser la "general" y la tabla hija debe ser la de detalle (la del grid) Así cuando desplaces los registros, se van a mover al mismo tiempo. Así mismo, ya no te van a aparecer los datos ya montados cuando ingreses un nuevo registro. Es como si ambas tablas funcionaran como una sola! Ves!
Si usas una sola tabla, al dar click en nuevo, te va a "limpiar" los textos del encabezado de la factura... pero en el grid, te va a mostrar los datos que ya agregastes y unicamente vas a poder agregar un registro al final del grid! Per ocon 2 relacionadas, te "limpia" el grid y los textos... y vas de viaje! :D :D :D
Ohhh y eso... jaja! Esta bien! Fue lo único que se te ocurrió...! Jaja! Es bueno! Que implementes todas las ideas que se te ocurran... así se aprende! :D :D :D
Entiendo perfactemente. Eso ya lo he hecho en access, nada más que en access es más fácil y cuando se usa el asistente.
¿Ya lo relacione y todo pero no me aparece en el grid los datos que me falta?
Asegurate que la relación este correcta! La tabla parent debe ser donde llenas los datos generales del la factura y la child debe ser la tabla detalle del grid! Mira.. esto se basa en la relación y los datos contenidos en los campos (el campo de relación... numero de factura, por ejemplo) de ambas tablas. Ambos campos deben serrr "iguales" y deben ser indices! Cuando agregas un registro nuevo, en la tabla "general" (encabezado de la factura) llenas un numero de factura (supongamos que es el campo de relación)... por ejemplo, la factura 100. Cuando pasas a agregar al grid, ese mismo numero de factura debe ir en cada registro que hagas, es decir, en cada linea de la grid "que corresponda a esa factura". SI de la factura 100, vendes 5 productos diferentes, en el grid va a tener 5 lineas con esos productos cargados, entonces para cada linea del grid, debes asignarle el mismo numero de factura. Así:
Encabezado
Factura [ 100]
Grid:
Factura |  CodPro  |    Descripcion   |    Precio unitario|
100             555         AAA                      10
100              667        BBB                      15
100              323         CCC                     12
100              544         DDD                     14    
100              322         EEE                      20
Ves! Cada registro del grid debe corresponder a su "NUMERO ÚNICO DE FACTURA"! Así, cuando desplaces la tabla "General", como esta con indice en el campo factura, va a ordenar los datos a través de ese campo... y al estar relacionada con otra tabla por ese campo, te va a mostrar los datos de detalle del grid en un solo movimiento! Así vas a poder desplazar correctamente!
Exacto, comprendo perfectamente lo que me dices, pero hice una prueba y si pongo en el encabezado un nuevo numero de factura siempre me salen los datos de la anterior en el grid, ya cree las relaciones, en la propiedades de la relación aparece Parent Factura_datos y Child Factura_detalle, ¿hay algo más que debo hacer?, disculpa la preguntadera :)
Ohhh no te preocupes! Podes hacer las preguntas que querrás! Tranquilo! Que para eso estamos! :D :D :D Hagamos algo pues, si te parece... mandame las tablas y el form al correo! Para ver que esta pasando! Dale!
Recordá cerrar tu pregunta! :D :D :D Saludos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas