Interactuar con un grid

Tengo problemas para interactuar con un grid, explico: En un formulario puse un grid con cuatro columnas y algunas etiquetas, que apunta a una tabla. La función de este grid es, actualizar los datos de una tabla para hacer cálculos con esos datos, entonces requiero algunas cosas: La columna 1 no se pueda modificar; en un label o caja de texto (lo que sea) se vea el valor actual de la columna 1, que se actualice según cambia de renglón. Esto porque la etiqueta o caja de texto tiene mayor tamaño y se aprecia mejor. 2 que al ingresar un valor en la columna 2, en otra etiqueta se refleje ese valor y en otra etiqueta se acumulen los valores de la columna 2. Por ejemplo, estando en el primer renglón y al ingresar un valor, las dos etiquetas tienen el mismo valor, pero al ingresar un valor en el segundo renglón, las etiquetas cambian, la primera con el valor recién ingresado y en la segunda la suma de los dos valores ingresados... Y la suma de estos valores no permita pasar de 100.

2 respuestas

Respuesta
1

Un placer poder ayudarte. Va así:

1. Columna 1 no modificable: anda a las propiedades de la columna 1, en la pestaña DATA escoge la opción ReadOnly y establecela en .T. si quieres algo mas "bloqueado" anda a la pestaña other y escoge Enabled = .t. y así no podrás si quiera interactuar con los datos.

1.1. Valor actual de la columna 1: ¿A qué te refieres con valor actual? ¿La suma de todos los registros solo de esa columna? ¿O todo el campo de la tabla? Aclarame este punto! :)

2. Para sumar los valores que ingresas y que ves en pantalla... pues ahí debes trabajar directamente sobre la tabla. Eso es un poco complicado al inicio.. porque foxpro no permite que sumes directamente ciertos valores de los campos... debes sumarlos todos o debes usar condiciones. Yo elijo condiciones siempre. Aquí podes proceder de 2 formas:

Podes agregar un campo en tu tabla que sea para enumerar en bloque los registros (renglones) que vas grabando. Por ejemplo... yo tengo en mi tabla facturación, un campo llamado "numerofact" donde guardo el numero de factura. Así, si en una factura vendo (registro) 10 productos... todos los renglones o registros de esa factura (que veo en pantalla) tienen como una especie de código identificador de bloque que me indica cuales productos pertenecen a un numero de factura especifico. Así, puedo ir sumando lo que veo en pantalla. Por ejemplo: registro la factura 100 y los productos:

Renglon1: zapatos - cantidad 10

Renglon2: camisa - cantidad 10

Cada registro, lleva el numero de factura 100... así se que el bloque lleva 2 productos y puedo sumar de la tabla con condición, unicamente esos 2 registros: así:

LOCAL lnCantidad

SELECT facturación

SET FITLER TO numfactura = 100

CALCULATE SUM (cantidad) TO lnCantidad

**--Evaluamos que no sea mayor a 100
IF lnCantidad => 100
MESSAGEBOX("La cantidad excede el limite." 48)
CANCEL
ENDIF

**--Asigamos valor a un text para ver la suma total de cantidades

THISFORM.Text1.Value = lnCantidad

THISFORM.Text1.Refresh

**--Quitamos el filtro de la tabla

SET FILTER TO

Ves! :)

Otra forma seria ir alimentando un cursor aparte, donde vayas cargando paralelamente a tu tabla física, los valores y luego calcular totales sobre ese cursor:

Siguiendo el ejemplo anterior:

En el INIT() de tu form, creamos un cursor

CREATE CURSOR temporal1( cantidad N(12,2))

Luego... a medida que vayas agregando datos al grid (y por consiguiente a tu tabla) vas cargando paralelamente el cursor:

SELECT temporal1

INSERT INTO temporal1(cantidad) VALUES(thisform.grid1.Columnx.Value)

Y luego vamos sumando sobre el campo del cursor:

SELECT temporal1

CALCULATE SUM(cantidad) TO lnCantidad

**--Evaluamos que no sea mayor a 100

IF lnCantidad => 100

MESSAGEBOX("La cantidad excede el limite." 48)

CANCEL

ENDIF

**--Asignamos a un text el total

THISFORM.Text1.Value = lncantidad

THISFORM. Refresh

Ves! :)

Este tema del calculo de totales que se ven en pantalla... es un dolor de cabeza para los programadores... puesto que siempre "los que saben" te mandan a sumar el valor total del campo así

SELECT SUM...

Es necesario un debate a profundidad sobre este tema... con mas detalle! Yo solo te doy una pequeña pista aquí. Si quieres y tienes tiempo, puedes hacerme la consulta en otra pregunta para que lo abordemos a profundidad y quedes mas claro. Y así ayudar a otros también que tengan la misma duda!

Muy bien maestro, me queda claro (al menos al leerlo, deja que lo implemente y te comento, jajaja) bien. Se me ocurría algo un poco mas interactivo, por ejemplo: Al ingresar el valor al campo cargarlo en una variable, por ejemplo en el gotfocus de la columna 3 poner algo así:

xx=thisform.grid1.column2.value

x1=xx+xx

thisform.label3.caption=str(x1,5,2)

Pero obviamente no me funcionó, voy a probar con tu sugerencia y te cuento.

Para algo mas interactivo... coloca tus lineas de código en el evento InteractiveChange del objeto. Así cuando hagas cualquier cambio, se actualiza el valor! :) Lo de las variables esta bien! Es bueno implementar variables pero con cuidado! :) Evitar variables publicas lo mas que se pueda!

Respuesta
1

Ok, en la ventana de propiedades pon la propiedad ReadOnly del Column1 en .T., en el evento beforerowcolchage y afterrowcolchange agregas el siguiente codigo, mas o menos:

Thisform.Text1.Value = This.Column1.Text1.Value

Thisform. Refresh

En el evento refresh del formulario puedes recorres tu tabla origen de la grilla y agregar el sig codigo

Select tabla

mValor=0

SCAN

mValor = mValor + valor

ENSCAN

Thisform.Text2.Value = mValor

Maestro, gracias por tu ayuda. La verdad "medio me sirvió", explico: La primera parte funciona bien, pero: "Creo que" por poner el scan, no puedo cambiar de renglón... (lo comento porque al quitar el scan, cambiaba sin problemas), intento poner en el gotfocus de la columna 3, esto:

mvalor=thisform.grid1.column2.value
mvalor = mvalor + mvalor
thisform.label3.Caption=STR(mvalor,5,2)
thisform.Refresh

Obviamente, me sale error.

Creo que con esto tendría....

Muchas gracias

Fijate donde inicializas la variable mvalor y que cuando la inicialice sea en 0, es decir numérica, en cuanto al Scan, lo que puedes hacer es marcar el registro en el que estaba antes, mas o menos así:

Select mitabla

mRecno=Recno()

Scan

...

Endscan

GO mRecno

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas