Realisar entrada de detalle con grid
Estado revizando tus respuestas y me anime arealizarte una solicitud de ayuda estoy realizando un inventario sencillo pero me etopado a la hora de ingresar gresar
No encuentro la forma de trabajar con el grid
Esta es una imagen de lo q pretendo
Lo que pretendo q al hacer click en agrgar me ponga una fila para ingresar los registros y el de quitar para quitar el registro seleccionado
Espero poder ayudarte.
Trabajar con un grid es fácil. Pero hay que saber hacerlo, porque si no, nos llevamos muchos dolores de cabeza. :/ Un grid, según Andy Kramek en su publicación 1001 things you always wanted to know about VFP, es el objeto menos comprendido del entorno de foxpro. No obstante, es un potente aliado si se sabe administrar bien.
Básicamente, un grid es como una extensión... como una ventana directa de la tabla y los registros, por tanto, se comporta como una tabla. Permite la consulta rápida de datos, la edición de registros, agregar nuevos y la eliminación de los mismos.
Para poder agregar un registro a la tabla a través de un grid, hay varias maneras de hacerlo. La forma mas "rápida" es así:
Primero enlazamos la tabla con el objeto grid. Antes, agrega la tabla al entorno de datos de tu form. Luego ve a las propiedades del grid y setea estas propiedades :
READONLY = .F.
RECORDSOURCE = nombredetutabla.
Ahora, coloca el numero de campos de tu tabla que deseas ver en la grid, estableciendo dicho numero en la propiedad ColumnCount. Ahora... debes ir al grid, y seleccionar cada text1 de cada columna y enlazar cada campo de la tabla con la columna. Haz click sobre la grid, selecciona entonces, en la ventana de propiedades a través del combobox de objetos, cada text1 de cada objeto column y en las propiedades de cada text1, en la pestaña data, selecciona la propiedad controlsource y escoge el campo que quieres enlazar a esa columna.
Luego de esto, vamos al evento click del botón agregar y colocamos un código como este:
SELECT nombredetabla
APPEND BLANK
THISFORM. Refresh
**--//
Y listo. :) El grid estará disponible para que, en el ultimo registro, puedas agregar datos. En un botón "cancelar", cuya función sea revertir lo que ha agregado, coloca un código como este
SELECT nombredetabla
TABLEREVERT(.F.)
THISFORM. Refresh
Para guardar los cambios que hagas, agrega un botón "Guardar" y en el click coloca esto:
SELECT tabla
TABLEUPDATE(.T.)
**--//
Hay muchas otras funciones que puedes realizar con el grid, como la eliminación de registros... Así mismo, otras formas de agregar registros, uno por uno, o varios a la vez... agregar registros cuando tienes una tabla principal y otra secudnaria ligada a la principal y se deben comportar como una sola...
Bueno... si quieres, puedes hacerme las consultas sobre estos temas, uno por uno, y así ir enseñándote detalladamente como se realiza cada acción. Con mucho gusto, te ayudare! :) Y veras que buenos frutos obtendrás del uso del objeto grid! :D
Bien. Estoy a la orden!
Desde Managua, Nicaragua
Un abrazo
Ravenn :D :D
e realizado los pasos que tu me indicas pero encuentro un problema que no me muestra solo los datos de la orden que estoy in gresasndo y como puedo hacer para que en la columna nombre me ponga el nombre del articulo digitado
me pregunto si me puedes hacer un ejemplo para ver el código y entender mejor la funcionalida del grid
en mi caso yo tengo las tablas
articulo que consta de cod_art,nombre,descripción
entradacb cod_ent,nfactura,fecha,total
entradadt cod_ent,cod_art,cantidad,punitario
"¿Encuentro un problema que no me muestra solo los datos de la orden que estoy in gresasndo" que et muestra? ¿Todos los registros que habías ingresado antes? Aclarame para poder ayudarte en esa parte.
Ahora... si deseas digitar un código de articulo y que en la columna descripción te aparezca la descripción de dicho articulo, procede así. Mira, antes que nada debes tener una tabla de catalogo donde cargues los datos de los productos que vas a registrar. Imagina que tenemos la tabla "productos" con los campos: código, descripción, unidadmedida, precio. Aquí cargamos todos los datos de los productos que facturaremos.
Esa tabla, la agregamos al entorno de datos de nuestro form. En el init() de tu form, coloca esto
CURSORSETPROP("Buffering", 5, "productos")
Ahora... para que, al digitar el código en la columna código del grid, te aparezca en la columna que sigue y de forma automática la descripción del producto, ve al evento KeyPress del text1 de la columna código del grid, y coloca un código como este
**--Al presionar la tecla ENTER
IF nKeyCode = 13 &&13 - Enter
SELECT productos
LOCATE FOR productos = VAL(THISFORM.Column1.Text1.Value)
**--Encontramos coincidencias
IF FOUND()
THISFORM.Column2.Text1.Value = productos.descripción
THISFORM.Column3.Text1.Valu = productos.unidadmedida
**--Y sigues rellenando las columnas con los datos
ELSE
MESSAGEBOX("Producto no registrado.")
CANCEL
ENDIF
**--//
si me muestra todos los registros que ya están en la tabla
con el código que me acabas de pasar me da un error en esta linea
LOCATE FOR articulo = THISFORM.dgentrada.Column1.Text1.Value
el erro es no se encuentra la variable articulo
LOCATE FOR busca un registro coincidente en la tabla especifica y posiciona el cursor en dicho registro encontrado. Veo que la tabla donde agregas tus registros se llama articulo y que la tabla sobre la cual buscas el producto se llama articulo. A ver... debes separar las cosas. Para generar el "levantado" automático de datos (es cuando digitas el código en una columna del grid y en las columnas siguientes te aparece el resto de datos asociados a dicho código) debes partir de OTRA tabla que funciona a modo de catalogo. Es decir, que contiene información sobre los productos que servirá para alimentar OTRAS tablas, en un uso posterior.
Por ejemplo: en mi caso, yo tengo la tabla datosclientes con los campos código, nombre, dirección, teléfono
Cuando voy a registrar una factura de venta, necesito saber los datos del cliente al que estoy vendiendo (si ya es un cliente de trayectoria). Par facturar, uso unatabla llamada "facturaenc" en donde tengo los datos de encabezado de la factura, entre los cuales están los datos del cliente: código, nombre y dirección. Entonces, en un text, yo dígito el código del cliente y en otros textos me arroja el nombre, dirección. Como ves, alimente los datos de facturaenc con el levantamiento de datos desde la tabla clientes.
En el keyPress del text1 yo coloco
SELECT clientes
LOCATE FOR clientes.código = VAL(THISFORM.Text1.Value)
IF FOUND()
THISFORM.Text2.Value = clientes.nombre
THISFORM.Text3.Value = clientes.dirección
ENDIF
**--//
Y listo. Cargue mis datos.
Por tanto, debes separar los datos de tus productos en una tabla que haga modo de catalogo y cuando registres en tu grid, con la tabla artículos, vas a usar la tabla de datos de los productos para generar los datos que necesitas y luego almancenar dichos datos en tu tabla artículos. :)
El error que te da, es porque estas haciendo referencia a un objeto que no existe en tu formulario. Crea una tabla llamada (por ejemplo) datos_productos, con los campos que sean necesarios para la caracterización de un producto (código, nombre, unidadmedida, etc). Luego procedes como te explique antes, y haces referencia a esa tabla y al campo código. Recordá agregar la tabla al entorno de datos. :)
Avisame si te sigue dando error! Estoy a la orden para ayudarte! :) COn mucho gusto!
Saludos!
Desde Managua, Nicaragua!
Ravenn :D :D
ahora lo expuesto así
if nkeycode=13 and VAL(this.value)<>0
SELECT articulo
LOCATE FOR articulo.cod_art = this.Value
*THISFORM.dgentrada.Column1.Text1.Value
**--Encontramos coincidencias
IF FOUND()
THISFORM.dgentrada.Column3.Text1.Value = articulo.nombre
* THISFORM.Column3.Text1.Valu = productos.unidadmedida
**--Y sigues rellenando las columnas con los datos
ELSE
MESSAGEBOX("Producto no registrado.")
CANCEL
ENDIF
ENDIF
pero no me muestra el nombre en la columna el comportamiento del grid es así
en la columna1 ingreso el numero de orden , columna2 ingreso el código del articulo , columna3 tiene que mostrar el nombre pero no lo hace me pone 0.0 como si fuera la cantidad , y la columna4 que seria para la cantidad pongo el punitario, columna5 que seria para ingreasar el punirario no me deja dijitar
Hagamos esto: mandame la estructura completa de la tabla donde agregaras los registros del grid y la tabla donde tenes el cataogo de productos. Así te armare el código. :) :) :)
ya se cual era el problema que no existía el campo nombre en entradadt pero me sigue mostrando todos los registros en el grid como se puede hacer para que solo muestre los lo que se este agregando de esa orden digamos
le doy nuevo me genera la orden 24 pero en detalla no tengo nada aun como hacer que cuando agregue solo me muestre lo que se le este agregando a la orden 24
Solo que veré el proyecto hasta hoy en la noche o mañana. No te prometo hoy porque aun estoy en el trabajo y aquí no lo puedo abrir! :/
Con mucho gusto te ayudare si! :) :) Envialo. Y recuerda finalizar esta pregunta. Nos contactamos por correo! Una vez que lo reciba, te aviso para que cierres la pregunta! :D :D Y así no estés con la duda si me llego o no! :D
Saludos! :D
- Compartir respuesta