Visual Foxprogram

Encuentra una gran variedad de ejemplos prácticos que pueden ser útiles para el desarrollo de tu trabajo.

Visual Foxprogram

Podrás encontrar la herramienta necesaria para solucionar tu problema.

Visual Foxprogram

No olvides suscribirte a la página.

Visual Foxprogram

Podrás en contrar ejemplos de clases, creaciones de Menu estilo CSS,crear reportes PDF.

Visual Foxprogram

Todas las Herramientas en un solo sitio VISUAL FOXPROGRAM.

Mostrando entradas con la etiqueta Grid. Mostrar todas las entradas
Mostrando entradas con la etiqueta Grid. Mostrar todas las entradas

sábado, 22 de junio de 2019

MANEJO DE GRID EN VISUAL FOXPRO

Manejo de Grid



Muchos presentamos problemas al trabajar con Grillas en Visual Foxpro, tal vez sea por el desconocimiento mismo de este control o es que existe poca información referente al tema. 

Hoy vamos a ver como podemos realizar ciertas tareas que nos permitan dominar un poco mas las herramientas de Visual Foxpro en especial el Grid.

En este artículo vamos a destacar como poder guardar la información mediante la instrucción Insert Into y reflejar dicha información sobre un Grid.

También veremos como crear una tabla Free y colocar el campo codigo de tipo INT y autoinc, el cual irá obteniendo un nuevo valor a medida que se realice un nuevo registro sin necesidad de colocar el campo en insert into.

De igual forma observarás como es posible darle color a un Grid. Podrás ver en la imagen como se utilizan dos(2) tipos de colores. Muchos preguntan si es posible darle un color distinto a cada una de las filas, y ciertamente si se puede realizar pero debemos condicionar cierto valor para que esto se haga.

Este tema también cuenta como podemos obtener la información de un grid y plasmarla sobre un container y asignarles el resulta a cada uno de los textos que aparezcan en el formulario.

Podrás moverte en la dirección que desees y presionar ENTER o en su defecto DBClick y se mostrará el container con toda la información de tu Grid.


Pasos a seguir:

Paso 1: Evento Load

If !File("DEMO.DBF")
Create Table "DEMO.DBF" Free(codigo Int(4) Autoinc,fecha d(8),concepto c(25),grupo c(15),barra c(15),cant N(5,2),precio N(8,2))
Index On codigo Tag codigo Of demo
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"MATEMATICA I","Matematica","752993695214",4,10000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"MATEMATICA II","Matematica","752993636911",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"FISICA CUANTICA","FISICA","75299888373691",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"LO QUE EL VIENTO SE LLEVÓ","LITERATURA","752893636914",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"ROMEO Y JULIETA","LITERATURA","752493636916",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"CLIPPER","INFORMATICA","75299363666",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"VISUAL FOXPRO 9","INFORMATICA","75260936914",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"PHP","INFORMATICA","752993636683",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"PASCAL","INFORMATICA","752993636841",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"BASIC","INFORMATICA","7529936386834",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"QUIMICA ORGANICA","QUIMICA","75299363214",5,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"FISICA CAMERO Y CRESPO","FISICA","7529765743",7,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"ESTADISTICA","ESTADISTICA","752997674",3,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"CONTABILIDAD I","CONTABILIDAD","752996866823",2,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"CONTABILIDAD II","CONTABILIDAD","75299363691",1,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"HB","GRAFITO","75299363688",9,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"HB II","GRAFITO","75299363681",5,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"HB III","GRAFITO","75279936369",6,19000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"MATEMATICA III","Matematica","752997536369",6,15000)
Insert Into demo(fecha,concepto,grupo,barra,cant,precio) Values (Date(),"MATEMATICA IV","Matematica","75299363976",23,15000)
Endif

Paso 2: Evento Init

SET TALK OFF
SET scor off
SET SAFETY OFF
SET TALK OFF
SET DATE FRENCH 
SET EXCLUSIVE off
CLEAR
thisform.Height=SYSMETRIC(1)
thisform.Width=SYSMETRIC(2)
thisform.grid1.RecordSource =""
thisform.grid1.RecordSourceType = 1 
thisform.grid1.Width =SYSMETRIC(21)-280 
select demo
go top
thisform.grid1.recordsource="demo"
thisform.container1.Visible =.f.
thisform.container1.Enabled =.f.

Paso 3: Evento Keypress

If nKeyCode=27
   thisform.Release()
Endif

En menu de propiedades deberás colocar Keypresspreview en .t.

Paso 3: En el Grid en Text1 de la columna  1 en el Evento Click y DBClick


Thisform.container1.text1.Value=demo.codigo

Thisform.container1.text2.Value=demo.fecha

Thisform.container1.text3.Value=demo.concepto
Thisform.container1.text4.Value=demo.grupo
Thisform.container1.text5.Value=demo.barra
Thisform.container1.text6.Value=demo.cant
Thisform.container1.text7.Value=demo.precio
Thisform.container1.Visible =.T.
Thisform.container1.Enabled =.T.
Thisform.Refresh

Este código deberás pegarlo en cada una de las columnas del Grid para que pueda funcionar.

Mediante este procedimiento llamaremos el container1 en donde mostraremos la información.

En post posteriores estaré enseñando como insertar un Check dentro de un Grid sin mayor inconveniente. 

Como de costumbre en la parte inferior les dejaré el link de descarga del programa.








viernes, 21 de junio de 2019

Como Crear Grid Dinámico

Grid Dinámico

He podido observar el problema que se nos presenta el tener que utilizar un grid en Visual Foxpro y uno de ellos es cuando cargamos los datos y se nos des-configuran las columnas dándonos grandes dolores de cabeza. 

El otro es que muchos programadores quieren buscar un producto en particular dentro de una table y que se muestre en el grid.

En este artículo les vamos a mostrar como enmendar estos tipo de inconveniente de una manera muy sencilla.

En cuanto a la des-configuración del grid me tocó investigar bastante para conseguir la solución la cual es bastante sencilla. Una vez que introduzcas en el campo la descripción a buscar deberás colocar estas instrucciones y las columnas de tu grid conservarán tu tamaño original.

thisform.grid1.RecordSource = "" 

thisform.grid1.RecordSourceType =1

Estas instrucciones debes colocarlas en el LostFocus del Text que estés utilizando.

El segundo caso se solucionó de la siguiente manera. Cuando el usuario desee buscar un producto X, tan solamente deberá colocar las primeras iniciales del producto y el sistema les mostrará todos aquellos productos que comiencen por las primeras letras las cuales se introdujo en el Text.

También observarán como al desplazar el Mouse por las imagenes en donde aparecen las flechas el puntero del Grid comenzará a desplazarse según la flecha.

Coloque en el Evento Load:

Set Talk Off
Set Scor Off
Set Talk Off
Set Safety Off
SET DATE FRENCH 
Set Deleted On
Clear
If !File("DEMO.DBF")
Create Table "DEMO.DBF" Free(codigo Int(4) Autoinc,fecha d(8),concepto c(25),cant N(4),precio N(8,2))
Index On codigo Tag codigo Of demo
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA I",4,10000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA II",3,13000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA III",2,14000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA IV",5,9000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA VI",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"FISICA I",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"FISICA II",3,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"QUIMICA VI",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"INGLES V",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"HISTORIA VI",1,19000)
SELECT * FROM demo INTO CURSOR "Vista" ORDER BY codigo
Else
    SELECT * FROM demo INTO CURSOR "Vista" ORDER BY codigo
Go Top

Endif

Note que el campo codigo es de tipo entero y se auto-incrementa cada vez que se introduce un registro nuevo.

En el evento init colocamos lo siguiente :


PUBLIC xbusco,xlen

xlen=1

xbusco=""
thisform.grid1.Column4.Alignment = 3 
thisform.grid1.Column5.Alignment = 1 
select Vista
go top
thisform.grid1.recordsource="Vista"

En el Lostfocus del Text colocamos :

thisform.image3.Click 

En el evento Click de la imagen3 agregamos el siguiente código :

xlen=LEN(ALLTRIM(xbusco))
thisform.grid1.RecordSource = ""
thisform.grid1.RecordSourceType =1
SELECT * FROM demo INTO CURSOR "Vista" WHERE SUBSTR(ALLTRIM(concepto),1,xlen)=SUBSTR(ALLTRIM(XBUSCO),1,xlen)
select Vista
go top
thisform.grid1.recordsource="Vista"
xbusco=""


La variable xlen nos permitirá saber la longitud exacta del texto a buscar. Si la longitud vale 3 entonces el programa buscará aquellas palabras que comiencen por las 3 primeras letras y así sucesivamente irá buscando la palabra indicada.

De igual manera te informo que acá podrás conseguir temas relacionados con el tema de como desplazarse en un grid .






jueves, 20 de junio de 2019

Desplazarse sobre un Grid

Como desplazar en Grid


Tuve la oportunidad de ver la problemática en un foro de como desplazarnos en un grid con Visual Foxpro pero que no fuera como presionando el boton del grid como tal.

La persona quiere que cuando coloque el Mouse sobre el objeto este comience a subir o bajar sin tener que dar click para que avance o retroceda.

Esto me llamó la atención y comencé averiguar como poder hacerlo.

Púes bien acá les traigo la manera de como realizar estos desplazamiento sin necesidad
de estar dando click a cada momento.

El usuario lo único que debe hacer es posesionarse sobre la imagen que elija y el cursor comenzará a desplazarse de manera automática al siguiente registro.

Si el usuario no desea que los registros sigan avanzando tan solamente deberá quitar el mouse sobre la imagen seleccionada y automáticamente se detendrá el avance.

Una vez que coloques el mouse sobre la otra imagen el avance continuará a partir del 
último registro en la cual quedó.

Pasos a seguir :

En el evento Load de tu formulario debes colocar lo siguiente:

Set Talk Off
Set Scor Off
Set Talk Off
Set Safety Off
Set Deleted On
Clear
If !File("DEMO.DBF")
Create Table "DEMO.DBF" Free(codigo Int(4) Autoinc,fecha d(8),concepto c(25),cant N(4),precio N(8,2))
Index On codigo Tag codigo Of demo
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA I",4,10000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA II",3,13000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA III",2,14000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA IV",5,9000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"MATEMATICA VI",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"FISICA I",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"FISICA II",3,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"QUIMICA VI",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"INGLES V",1,19000)
Insert Into demo(fecha,concepto,cant,precio) Values (Date(),"HISTORIA VI",1,19000)
Else
Select "DEMO"
Set Index To demo Order codigo
Go Top
Endif

Como podrás observar acá creamos una tabla free denominada "Demo.dbf" y en el cual colocamos los campos codigo, concepto, cant ,precio. 

Indexamos la table mediante el campo codigo.

Noten que el campo codigo se configuró de manera que se fuese auto-incrementando de manera automática sin necesidad de colocar el campo en el insert. Para poder hacer que el campo se auto-incremente debes declarar la variable de tipo INT(4) y agregar la palabra Autoinc, seguidamente se agregan los demás campos.

Una vez creada la table , insertamos los registros mediante la instrucción insert into. 

Cuando el programa se ejecuta por segunda vez la table DEMO no se creara nuevamente sino que la seleccionamos e indexamos para su ejecución.

En el inicio del programa colocaremos lo siguiente:

thisform.grid1.Column4.Alignment = 3 
thisform.grid1.Column5.Alignment = 1 
select DEMO
go top
thisform.grid1.recordsource="DEMO"

Se crearon  dos(2) imagenes en cual una indica hacia abajo y la otra hacia arriba en cual llamaremos image1 e image2 respectivamente.

En la image1 y el evento Mousemove insertamos el código siguiente :

thisform.grid1.DoScroll(1)
IF !EOF()
   reg=recno()
   GO reg
   wait WINDOW "" TIMEOUT .3
   Thisform.Grid1.SetFocus
endif  

Cuando la persona coloca el Mouse sobre la imagen seleccionada los registro empezarán a avanzar.

El wait window nos retarda unas milesimas de segundos para que su avance no resulte muy rápido al siguiente registro.

Una vez que retires el Mouse sobre el objeto este detendrá el avance.

En la image2 y en el evento Mousemove indicaremos el siguiente paso:

thisform.grid1.DoScroll(0)
IF !BOF()
   skip-1
   reg=recno()
   GO reg
   WAIT WINDOW "" TIMEOUT .3
   Thisform.Grid1.SetFocus
endif   

Como podrán notar en ambos eventos se utiliza el thisform.grid1.DoScroll , pero con la diferencia de que el primero es el que nos permite avanzar el siguiente registro. El thisform-grid1.Doscroll(0) esel que se encarga de retroceder el registro.

Bien como de costumbre les dejo el link de descarga en la parte inferior del Blog.





miércoles, 19 de junio de 2019

Grid avanzado en Visual Foxpro

Grid Avanzado

Una ´técnica que llama mucha la atención es poder mostrarle al usuario las distintas formas que hay mostrar mostrar la información en pantalla con tan solamente pulsar un tilde.

En este caso podemos observar como cuando pulsamos el Check cuando las cantidades son iguales a 1 el sistema es capaz de mostrarnos la información en un color distinto al valor de los demás datos el cual aparecen registrados, tal como aparecen en la figura de abajo.

Con el simple hecho de haber presionado una tecla le dimos otra apariencia a la información mostrada sin tener que alterar nada en el programa.


Este ejemplo nos demuestra como podemos intercalar distintas formas de mostrar una información sin que cambiemos nada.


Observen como con tan solo tocar 2 teclas hemos podido cambiar la apariencia de la pantalla y nos permite visualizar la información que deseamos con mayor rapidez.

Examinemos el siguiente código en el evento Load de tu formulario.

Paso 1.

SET SAFETY OFF
SET TALK OFF ff
SET scor off
clear
CREATE TABLE prueba FREE (codigo c(4),concepto c(25),cant n(4),precio n(8,2))
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0001","Cemento Gris",10,5000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0002","Cemento Blanco",6,5500)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0003","Arena",2,3000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0004","Martillo",1,2000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0005","Alicate 3 ",1,1000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0006","Pintura Blanca",1,5000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0007","Pintura Fondo Gris",1,4000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0008","Brocha Grande",2,5000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0009","Pala",1,5000)
INSERT INTO prueba(codigo,concepto,cant,precio) VALUES ("0010","Cal",3,1400)

Paso 2.

Coloca en el formulario en el Evento Init lo siguiente:

thisform.grid1.Column3.Alignment = 2 
thisform.grid1.Column4.Alignment = 1 
thisform.grid1.RecordSource =""
thisform.grid1.RecordSourceType = 1 
SELECT prueba
GO top

thisform.grid1.RecordSource =prueba.codigo

Paso 3.

El check1 en el evento click .

IF this.Value = 1
    thisform.check2.Value=0
    thisform.check3.Value=0
thisform.grid1.SetAll('DynamicBackColor', "IIF(cant = 1, RGB(92,192,192), RGB(255,255,255))", "COLUMN")
ELSE
thisform.grid1.SetAll('DynamicBackColor', "", "COLUMN")
ENDIF

thisform.grid1.Refresh

Como pueden observar en este procedimiento comparamos la variable cant y verificamos si es igual a 1 para que nos muestra la información en un color distinto y que cumplan esta condición. 

Claro está que tú puedes modificar el programa y realizar otras comparaciones el cual vayan con tu información que manejes.

Paso 4.

El check2 en el evento click .

IF this.Value = 1
    thisform.check1.Value=0
    thisform.check3.Value=0
thisform.grid1.SetAll('DynamicBackColor', "IIF(cant > 1 and cant <5, RGB(192,192,192), RGB(255,255,255))", "COLUMN")
ELSE
thisform.grid1.SetAll('DynamicBackColor', "", "COLUMN")
ENDIF

thisform.grid1.Refresh

Al igual que el anterior la variable cant compara si es mayor que que 1 pero menor que 5
y nos muestra los resultados que cumplan con esa condición pero de una forma distinta.

Paso 5.

El check3 en el evento click .

Tan solamente activamos el reloj y ejecutamos el siguiente código:

With Thisform.grid1
If Empty(.Columns(1).DynamicBackColor)
Thisform.check1.Value=0
Thisform.check2.Value=0
.SetAll('DynamicBackColor', "IIF(cant > 5, RGB(255,255,128), RGB(255,255,255))", "COLUMN")
Else
.SetAll('DynamicBackColor', "", "COLUMN")
Endif
.Refresh()

Endwith

Comparamos que la variable Cant resulte mayor a 5 y este proceso hará que todos aquellos registros que cumplan esta condición empezarán a titilar.

Si quieres ampliar tu información te invito a que visites VFPAvanzado en donde encontrarás mas detalles referente al tema.



martes, 11 de junio de 2019

Grid en visual foxpro

Grid en visual foxpro

Me enfoqué en realizar este programa para aquellas personas que se están iniciando en el mundo de Visual Foxpro y muy especialmente para una persona que en el forum indicaba de estaba aprendiendo este lenguaje y quería un programa que le enseñe como llenar un Grid.


Este programa es bastante básico  pero puedes agregar,eliminar,modificar,grabar,buscar ,funciones básicas para realizar un programa.También te enseña como crear una tabla libre.

Hubo mucha redundancia en ciertos procedimientos los cuales se debieron hacer en métodos pero no quise ahondar en el tema por considerar que es para aquellas personas que se inician en este mundo.

Pasos aseguir :

Paso 1: En el Evento Load del Formulario creamos la tabla "Prueba".

IF !FILE("PRUEBA.DBF")
    CREATE TABLE prueba (cod_pro c(10),concepto c(25),precio n(8,2))
ENDIF

El programa comprueba si existe la tabla, si no existe el programa crea la tabla.

Paso 2 : En el Evento Init de tu formulario creamos lo siguiente :

SET TALK OFF
SET scor off
SET SAFETY OFF
PUBLIC sw as Number,xreg as Number  
CLEAR
thisform.Caption ="Como llenar un Grid"
thisform.text1.Enabled =.f.
thisform.text2.Enabled =.f.
thisform.text3.Enabled =.f.
thisform.text1.DisabledBackColor =RGB(255,255,255)
thisform.text1.DisabledForeColor =RGB(0,0,0)
thisform.text1.Value=""
thisform.text2.Value=""
thisform.text3.Value =0.00
xreg=0
thisform.grid1.COLUMN3.Alignment = 1 && Alinea la derecha
thisform.grid1.Enabled =.f.
thisform.container2.Visible =.f.
thisform.container2.Enabled =.F.

Paso 3:

En el evento Keypress colocamos lo siguiente :

If nKeyCode=27
sw=0
Thisform.text1.Enabled =.F.
Thisform.text2.Enabled =.F.
Thisform.text3.Enabled =.F.
Thisform.text1.DisabledBackColor =Rgb(255,255,255)
Thisform.text1.DisabledForeColor =Rgb(0,0,0)
Thisform.text1.Value=""
Thisform.text2.Value=""
Thisform.text3.Value =0.00
thisform.container2.Enabled =.F.
thisform.container2.Visible =.f.
thisform.container1.command1.SetFocus 
Endif

Paso 4:

En el command1 en el evento click colocamos el siguiente procedimiento :

thisform.text1.Enabled =.t.
thisform.text2.Enabled =.t.
thisform.text3.Enabled =.t.
thisform.text1.Value=""
thisform.text2.Value=""
thisform.text3.Value =0.00
sw=1
thisform.text1.SetFocus 

En el Command2 en el evento click se agrega lo siguiente :

If xreg>0
mensaje = ' Confirmar La Eliminacion '
i=Messagebox(mensaje,4,' Alerta ')
If i=7
Return
Else
Delete
Messagebox("Registro Borrado con Exito...!")
Thisform.grid1.RecordSource="prueba"
Thisform.text1.Enabled =.F.
Thisform.text2.Enabled =.F.
Thisform.text3.Enabled =.F.
Thisform.text1.DisabledBackColor =Rgb(255,255,255)
Thisform.text1.DisabledForeColor =Rgb(0,0,0)
Thisform.text1.Value=""
Thisform.text2.Value=""
Thisform.text3.Value =0.00
sw=0
xreg=0
Thisform.container1.command1.SetFocus
Endif
ELSE
    MESSAGEBOX("No Datos para Eliminar")
Endif

En el Command3 se agrega lo siguiente :

If !Empty(Thisform.text1.Value) And !Empty(Thisform.text2.Value) And !Empty(Thisform.text3.Value)
Thisform.text1.Enabled =.T.
Thisform.text2.Enabled =.T.
Thisform.text3.Enabled =.T.
sw=2
Thisform.text1.SetFocus
Endif

En el command4 en el evento click

cod=Thisform.text1.Value
des=Thisform.text2.Value
pre=Thisform.text3.Value
If !Empty(cod) And !Empty(des) And !Empty(pre)
If sw=1
Insert Into prueba (cod_pro,concepto,precio) Values (cod,des,pre)
ENDIF
If sw=2
UPDATE prueba set cod_pro=cod,concepto=des,precio=pre WHERE RECNO()=xreg
ENDIF
Select prueba
Go Top
Thisform.grid1.RecordSource="prueba"
Thisform.text1.Enabled =.F.
Thisform.text2.Enabled =.F.
Thisform.text3.Enabled =.F.
Thisform.text1.DisabledBackColor =Rgb(255,255,255)
Thisform.text1.DisabledForeColor =Rgb(0,0,0)
Thisform.text1.Value=""
Thisform.text2.Value=""
Thisform.text3.Value =0.00
sw=0
xreg=0
Thisform.container1.command1.SetFocus
ELSE
    mensa="Error:Recuerde rellenar todos los campos..."
    MESSAGEBOX(mensa,0+64,"Alerta")
    thisform.text1.SetFocus 
Endif

En el command5 se agrega el siguiente paso:

thisform.container2.Visible =.t.
THISFORM.container2.Enabled =.t.
thisform.container2.list1.Requery 
thisform.container2.list1.SelectedID(1)=.t.
thisform.container2.list1.SetFocus