FoxPro/Visual FoxPro - Form y Grid Actualizables

 
Vista:

Form y Grid Actualizables

Publicado por Pablo (Argentina) (433 intervenciones) el 20/05/2009 02:02:21
Hola Amigos, Yo de nuevo, ja. A ver les cuento 2 situacion y a ver si me pueden ayudar y aconsejar cual es la mejor forma para trabajar con esto.

Primero: Tengo un Form con 3 tablas de las cuales 1 esta relacionada con las otras 2 ahora bien en el form tambien tengo un grid en el cual yo muestro los datos filtrados usando el comando set filter y veo los datos correctamente en el grid.
Lo que quiero saber es como hacer para poder EDITAR el grid para modificar algunos datos y despues poder GRABAR esos cambios o sino quiero hacer nada poder REVERTIR lo hecho. Actualmente como no se como hacerlo que hice, Utilizo el PICBTNS de la clase WIZSTYLE y listo es una forma facil de hacer todo lo que dije, pero obviamente tiene sus contras porque no puedo saber otras cosas como ser que moviemiento hicieron en el grid ¿me explico? entonces lo que yo quiero es poder usar botones de comando u alguna otra forma que uds me aconsejen para poder hacer ese tipo de cosas ¿Se entendio?. en modo reducido lo que quiero hacer es poder reemplazar el PICBTNS y poder hacer lo mismo, si me pueden ayudar.

Segundo: esta es mas corta que el testamento de arriba, jajajaja, yo en el form que es el mismo de arriba, utilizo mucho el set filter y me parece que no es lo adecuado, veo que se usa mucho el SQL o Select. ¿que es mejor para filtrar una tabla y obtener datos para mostrarlos en el grid.

LOCAL cDisplayValue

LOCAL cDisplayValue,cCountryName
cDisplayValue = ALLTRIM(THIS.DisplayValue)
THIS.SelLength = 0
IF EMPTY(m.cDisplayValue)
RETURN
ENDIF

THISFORM.LockScreen = .T.

SELECT * FROM stock ;
WHERE UPPER(ALLTRIM(stock.codigo)) = UPPER(ALLTRIM(THIS.Value));
.and. factura = " " .and. pin <> "0001" into CURSOR Custs
thisform.grdcust.recordsource = "Custs"

este codigo esta puesto en un Combox y actualiza el grid, pero la primera vez funciona bien, las demas veces funciona tambien pero en el grid, me junta todas las columnas y no se lee nada porque pasa eso?

Bueno, se que pido mucho y es muy lago lo que escribi pero bueno, espero me guien para saber como es este tema.

desde ya muchas gracias a todos
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

RE:Form y Grid Actualizables

Publicado por Mario (199 intervenciones) el 20/05/2009 15:37:14
Tendrías que leer la ayuda acerca de vistas actualizables y trabajar con buffering
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

RE:Form y Grid Actualizables

Publicado por es_binario (757 intervenciones) el 20/05/2009 19:57:08
En la red hay mucho codigo fuente de foxpro, sobre todo en foros en ingles, sin embargo un buen proyecto que yo recomiendo es CentralDoor, aunque el autor ya tiro los guantes y a dado por finalizado su apoyo, es su codigo solo se vee los buenos deberes a la hora de desarrollar, codigo claro y funcional.

codigo fuente
http://www.codeplex.com/centraldoor/Release/ProjectReleases.aspx?ReleaseId=8435
ahi busca en formulario el form "frmjustdocventa" maneja exactamente lo que tu describes arriba.

Ahora en lo que te refieres que te desordena el tamaño de las columnas en el grig con cada filtra es por te falta agregar una linea a tu codigo.

*// nueva linea
thisform.grdcust.recordsource = ""

SELECT * FROM stock ;
WHERE UPPER(ALLTRIM(stock.codigo)) = UPPER(ALLTRIM(THIS.Value));
.and. factura = " " .and. pin <> "0001" into CURSOR Custs
thisform.grdcust.recordsource = "Custs"

poniendo antes de la consulta el recordsource en = "" && nada eso mantendra el grid como lo hayas hecho a la hora del diseño.

Yo te sugiero que crees un metodo llamado refresca_grilla y asi desde ese metodo controlas los pormenores de los grids

este es solo un ejemplo de lo que tengo en un refres_grid
con una vista parametrizada.

LOCAl pedido_vista
SELECT ventas
SET ORDER TO pedido
GO bottom
STORE ventas.pedido + 1 to pedido_vista
SELECT view_ventas
=REQUERY()
Thisformset.Form1.Refresh

&& Calcula el total
SELECT ROUND(SUM(cantidad * p_publico *(1 - (desc/100))),2) as totality FROM detallev;
Where detallev.pedido = pedido_vista INTO CURSOR temp_total
IF ISNULL(totality) && Corrige Valores Nulos
ThisformSet.Form1.Txttotal.Value = 0
Thisformset.Form1.Grid1.ToolTipText = ""
ELSE
ThisformSet.Form1.Txttotal.Value = totality
Endif

el codigo de un boton next "CentralDoor"
IF This.Parent.Parent.secuenciavalidacion()=.t. THEN
IF TABLEUPDATE()=.t. THEN
IF TXNLEVEL()>0
END TRANSACTION
BEGIN TRANSACTION
thisform.soloinstanciarmode()
ENDIF
SKIP 1
IF EOF( )
GO BOTTOM
ENDIF
This.Parent.parent.Refresh()
ELSE
AERROR(aErrores)
WAIT WINDOW "Problemas para actualizar: " + aErrores(2) TIMEOUT 6
ENDIF
ELSE
this.Parent.showwaitwindow()
ENDIF

NOTA: una vista o un cursor pueden ser modificables con la instruccion ReadWrite al finanal, y asi puedes manejar los cambios de un cursor para despues afectar a las tablas dependientes de el

pequeño ejemplo de pedidos para uno de mis programas farmaciai

Thisform.Grid1.RecordSource = ""
SELECT articulos.cve_prov,;
articulos.descrip,;
articulos.pv,;
articulos.requerido,;
(articulos.pv + articulos.requerido),;
articulos.existencia,;
pedir,cod_barra;
FROM articulos;
WHERE articulos.pv > 0 or articulos.requerido > 0 ;
INTO CURSOR Articulos_a_solicitar readwrite;
ORDER BY articulos.descrip
Thisform.Grid1.RecordSource = "Articulos_a_solicitar"

asi el usuario puede modificar los datos directamente en la grilla ese methodo esta en el refresh de mi formulario

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

Para Es Binario

Publicado por Pablo (Argentina) (433 intervenciones) el 20/05/2009 20:08:02
Es_Binario, Muchas Gracias la verdad que me has ayudado muchas veces con mi problemas o dudas que no se como hacer para salir adelante y siempre me ayuda, Te agradezco mucho tu ayuda y voy a poner en practica lo que me has escrito y voy a ver ese ejemplo que me comentas del centraldoor.

Muchas Gracias
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