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

1 respuesta

Respuesta
1

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

**--//

Ohhh... me falto un

ENDIF

**--//

al final del código... para cerrar el IF inicial! :)

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

dame el correo al que te puedo enviar el proyecto

[email protected]

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas