FoxPro/Visual FoxPro - busqueda y actualizar datos

   
Vista:
Imágen de perfil de jose

busqueda y actualizar datos

Publicado por jose maycoldsoft@gmail.com (4 intervenciones) el 25/11/2017 06:11:56
Hola amigos..!
si hubiera la forma de que me puedan ayudar, soy nuevo en esto, les explico mi problema.. tengo una base de datos compuesta por equipos computacionales, asimismo cada uno e estos bienes tienen a un responsable y tienen una ubicacion respectiva (todo esto esta en una sola tabla llamada bienes).

Entonces lo que quiero es que mediante una casilla de texto me permita buscar un bien por su código, y que al ubicarlo en el Grid lo muestre en unas casillas de texto, asimismo al cambiar los datos de las casillas de texto mediante un boton me permita cambiar o actualizar los datos del nuevo responsable y su nueva ubicación del bien buscado.

en resumen quiero buscar un registro, una vez ubicado actualizar los datos mediante un boton.

ejemplo:
SBN I NOMBRE I MARCA I MODELO I RESPONSABLE I UBICACION I
10001 -- PC -- HP -- WORK.. -- JOSE ELIAS -- OFI. LOGISTICA
10002 -- MONITOR -- LG -- 19S16 -- ROSA HUAYTA -- OFI. CONTABILIDAD

Mi dolor de cabeza es que ya lo he intentado.. cuando filtro o busco el bien y lo actualizo con el boton actualizar, todo bien pero si vuelvo a buscar otro bien desaparecen los datos.. o no realiza el filtro.. porfavor necesito ayuda.. soy autodidacta no soy experto.. ayuda gracias
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

busqueda y actualizar datos

Publicado por Fidel José (520 intervenciones) el 25/11/2017 14:38:10
Lo primero que debes hacer es plantear una metodología de Alta, Baja, Modificación y Consulta.
En muchos casos, dada la complejidad y las validaciones particulares, cada tabla puede necesitar un formulario ad-hoc para tratar sus temas de Alta, Modificación y Consulta. Esto apunta también a tener un solo browser de tablas (básicamente, un formulario con un grid y un commandgroup de 4 botones. Si el sistema es pequeño, se pueden trabajar las particularidades con estructuras DO CASE / ENDCASE.

También, es normal tener un solo formulario para búsqueda de datos en tablas maestras (Clientes, Proveedores, Personal, Productos, Oficinas, Sucursales, etc). Aunque hay mejores recomendaciones, este formulario suele ser modal, para que devuelva una respuesta en ek evento UNLOAD.

También es bastante usual tener un solo formulario para búsquedas intermedias y que también puede servir para mostrar el contenido de cursores. Como estos formularios pueden tener una parametrización compleja, una buena idea es crear una clase custom que contenga todos los parámetros, muchos de los cuales tendrán un valor por defecto, El proceso que requiere la aparición de este form, levanta la clase con Newobject(), rellena las propiedades necesarias y envía como parámetro el objeto al form de búsquedas intermedias.

Dicho esto, ya que dices que eres nuevo, te recomiendo que estudies lo mejor que puedas el comando SELECT - SQL ya que es bastante estandar y te servirá cuando quieras reemplazar las tablas nativas por un administrador de base de datos (SQL-SERVER, Firebird, MariaDb o cualquier otro).

Para tu caso, suponiendo que SBN sea un campo numérico, que tu grid se llame grid1 y que el textbox donde escribes el código que se buscará se llame txt_SBN (si Sbn es un campo numérico, este textbox debe estar inicializado en Cero, o sea, en el diseñador de formularios puedes ponerle Value = 0, o también en el Init del form).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
LOCAL lnSbn,lnTally,;
	loGrid as Object,;
	lnRecord
 
*<define_var>
lnSbn = thisform.txt_Sbn.Value
loGrid = thisform.Grid1                     && loGrid contiene la referencia al objeto Grid del formulario
*</define_var>
 
*<ejecuta_busqueda>
SELECT * , RECNO() AS x_Record ;
	FROM (loGrid.RecordSource) ;       && (loGrid.RecordSource) es el nombre de la tabla o cursor asociado al grid.
	WHERE SBN = m.lnSbn ;
	INTO CURSOR curBusca
lnTally = _tally		&& informa la cantidad de registros coincidentes
 
*!*	Nota1: SELECT - SQL tiene muchísimas opciones.
*!*	Es un poco duro de aprender pero debería ser el arma fundamental de cualquier sistema.
*!*	Para mejorar su velocidad, lo razonable es crear índices simples tipo machine en las tablas del sistema.
*!*	Los índices combinados no serán usados por el SQL salvo que coincidan exactamente con el criterio buscado.
 
*!*	Nota 2
*!*	Si el cursor resultante puede admitir modificaciones (incluso un indexado), la claúsula debe ser:
*!*		INTO CURSOR curBusca READWRITE
*!*	De otra forma es un cursor de solo lectura.
 
*!*	Nota 3
*!*	En algunos casos conviene dirigir la salida a un Array. Tener en cuenta esa posibilidad
 
*!*	Nota 4
*!*	El nombre del cursor para el caso en que el SELECT-SQL se realice en un PROCEDURE como caja negra,
*!*	debería ser aleatorio;
*!*	lcCursor = "cur"+SYS(2015)
*!*	lcSource = loGrid.RecordSource
*!*	lcNombre = TRIM(thisform.txt_Nombre.Value)
*!*	lcWhere = CHR(37)+m.lcNombre+CHR(37)
 
*!*	SELECT NOMBRE,RESPONSABLE,UBICACION,SBN,RECNO() AS x_Record ;
*!*		FROM (m.lcSource) ;
*!*		WHERE nombre LIKE "&lcWhere" ;
*!*		ORDER BY nombre,Ubicacion ;
*!*		INTO CURSOR (m.lcCursor) READWRITE
*!*	lnTally = _Tally
*!*	IF !EMPTY(m.lnTally)
*!*		SELECT (m.lcCursor)
*!*		BROWSE
*!*	ENDIF
*!*	USE IN SELECT(m.lcCursor)  && cierra el cursor
 
*</ejecuta_busqueda>
 
*<analiza_resultados>
DO CASE
	CASE EMPTY(m.lnTally)
		* No se encontró ninguna coincidencia
	CASE m.lnTally = 1
		* Una sola coincidencia
		lnRecord = curBusca.x_record
	OTHERWISE
		* Varios registros coinciden con el criterio de búsqueda
		* Debe seleccionarse alguno, para lo cual
		* será necesario presentar un form en pantalla para que
		* el usuario pueda seleccionar.
		* Este formulario sería en principo modal, aunque hay mejores recursos
		* pero resulta más complejos de implementar
		* y debe devolver el valor de lnRecord o Cero o (.F.)
 
		DO FORM MibusquedaIntermedia WITH "curBusca" TO lnRecord
ENDCASE
*</analiza_resultados>
 
*<solucion>
IF !EMPTY(m.lnRecord)
	SELECT (loGrid.RecordSource)
	GO m.lnRecord
	loGrid.Refresh
ELSE
	MESSAGEBOX("No hay registros coincidentes con el criterio de búsqueda",0,"Mensaje del Sistema",3000)
ENDIF
*</solucion>
*<limpieza>
IF USED("curBusca")
	USE IN curbusca
ENDIF
loGrid = null
*</limpieza>

Por último. El valor de los cuadros de texto que necesitas para modificar, deben asignarse en el método AfterRowColChange del grid. Tendrás que tener un botón para actualizar los datos y otro para cancelar la actualización, y alguna forma de que no puedan hacer otra cosa antes de confirmar o descartar la modificación (normalmente se ponen los cuadros y botones que se quieren excluir como Enabled = .F. hasta que se cancela o confirma la modificación. Utilizar un formulario Hijo donde se producen esas modificaciones puede resultar más sencillo. Para este caso se puede apelar a un cusor de un solo registro o a un objeto público creado con SCATTER NAME.

Alternativamente, y solamente si trabajas con Buffering, puedes liar estos textbox con ControlSource, producir las modificaciones que necesites y confirmar todos los cambios al final del proceso con TableUpdate(.t.) o Cancelar todos los cambios con TableRevert(.T:)

Artículos recomendados:
* Blog de Fernando D. Bozzo
https://fdbozzo.blogspot.com.ar/2014/01/crear-un-proyecto-foxpro-por-donde.html
http://fdbozzo.blogspot.com/2014/09/vfp-guia-de-buenas-practicas-de.html
http://fdbozzo.blogspot.com/2014/06/la-importancia-de-un-buen-nombre-para.html
https://fdbozzo.blogspot.com.ar/2015/05/tecnicas-de-optimizacion-en-vfp-tablas.html
https://fdbozzo.blogspot.com.ar/2014/08/como-trabaja-foxpro-internamente.html
https://fdbozzo.blogspot.com.ar/2014/01/como-usar-una-tabla-foxpro-varias-veces.html
https://fdbozzo.blogspot.com.ar/2014/01/desmitificando-el-control-de-errores.html

* Blog de Luis María Guayan para comunidadvfp
* Aquí hay una multitud de soluciones a problemas concretos.
http://comunidadvfp.blogspot.com/
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