FoxPro/Visual FoxPro - Problema con tablas, se bloquean solas

   
Vista:

Problema con tablas, se bloquean solas

Publicado por Gabriel Méndez (2 intervenciones) el 17/01/2016 22:39:38
Buenas, tengo un problema usando el foxpro, al momento en que hago una busqueda en mi texto 1, al momento de conseguir el registro todo bien, lo muestra y todo , pero cuando no lo consigue, se bloquean todos los campos solos, ayuda por favor,

tengo mi texto 1 con lo siguiente :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
If empty(thisform.txtci.value)
Else
 
Select Trabajador2
Set order to ci
Seek ALLTRIM(thisform.txtci.value)
if found()
Wait window "LA CEDULA YA EXISTE"
 
thisform.Refresh
 
Else
WAIT WINDOW "Ingrese datos"
 
thisform.txtnombre1.SetFocus
 
 
 
Endif
ENDIF
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

Problema con tablas, se bloquean solas

Publicado por ANTONIO (16 intervenciones) el 18/01/2016 13:52:40
Buenas, donde tienes ese texto puesto? en el valid del text?
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

Problema con tablas, se bloquean solas

Publicado por Mauricio (42 intervenciones) el 18/01/2016 15:59:29
Puedes subir el form??
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

Problema con tablas, se bloquean solas

Publicado por Fidel José (318 intervenciones) el 18/01/2016 23:55:20
Tal vez tengas los campos liados por ControlSource a la tabla Trabajador2.
Si es así, lo que ocurre es que cuando falla SEEK el puntero se ubica en EOF Y ahí no hay ningún dato, por lo que los campos quedan bloqueados.

De todos modos siempre es mejor usar Indexseek().
1
2
3
4
5
6
7
8
9
10
lcValor = ALLTRIM(thisform.txtci.Text)
IF !INDEXSEEK(lcValor , .f. ,"trabajador2","ci")                 && no mueve el puntero en la tabla
              Messagebox("La cédula no Existe, Ingrese Datos")
              Thisform.TxtCi.Setfocus
               REturn
ENDIF
             INDEXSEEK(lcValor , .T. , "TRABAJADOR2" , "CI" )       && ahora mueve el puntero en la tabla.
             Thisform.Refresh                          && siempre conviene efectuar el refresh solamente sobre los controles que están liados por Control Source. En el resto no hará nada.
             Thisform.TxtNombre.SetFocus
ENDIF
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema con tablas, se bloquean solas

Publicado por Gabriel Méndez (2 intervenciones) el 20/01/2016 05:38:11
MIL Y UN GRACIAS Fidel, abajo del primer endif falta un if alado del indexseek, pero yo entendi , ya no sabia que hacer entre el seek y el locate.
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

Problema con tablas, se bloquean solas

Publicado por Fidel José (318 intervenciones) el 20/01/2016 22:44:45
En realidad, la forma de uso del INDEXSEEK sería:

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
En este caso, la primera invocación a INDEXSEEK() está en un condicional porque tengo una derivación de proceso
Cuando ya se que existe el valor buscado y necesito ir al registro, ejecuto INDEXSEEK sin ninguna estructura condicional porque ya sé que existe y no necesito ninguna derivación del proceso.
 
IF INDEXSEEK(lcValorBuscado , .F. , lcAliasTabla , lcEtiquetaIndice)
	INDEXSEEK(lcValorBuscado , .T. , lcAliasTabla , lcEtiquetaIndice)
	* Proceso de valor Encontrado
ELSE
	* Proceso de Valor no Encontrado
ENDIF
 
*!*	También
LOCAL lDoit
lDoit = INDEXSEEK(lcValorBuscado , .F. , lcAliasTabla , lcEtiquetaIndice)
IF m.lDoit
	* Se encontró el valor, Muevo el puntero de registro en la tabla
	INDEXSEEK(lcValorBuscado , .T. , lcAliasTabla , lcEtiquetaIndice)
ENDIF
 
 
*!*	A veces conviene ponerlo en sentido inverso,
*!*	por ejemplo cuando se necesitan agregar registros
*!*	salvo que ya existan
* En este caso solamente se quiere saber que no existe el valor de tcDocum en la tabla. Si ya existe, salta.
IF !INDEXSEEK(tcDocum,.f.,lcTabla,lcTabla)
	INSERT INTO (lcTabla) (NroDoc,Fecha,Fecola,HoCola,TeCola,Concepto);
		VALUES (tcDocum,tdFecha,ldFegra,lcHogra,lcTerminal,tcConcepto)
 
ENDIF

Ventajas de INDEXSEEK:
1) Con el segúndo parámetro como .F. busca solamente en la tabla de índices y no mueve el puntero de registro en la tabla física (dbf) o cursor. Con esto obtienes una ventaja de velocidad en procesos repetitivos.
2) No necesitas tener la tabla o cursor seleccionada
3) Como INSERT INTO tampoco requiere la tabla seleccionada, la combinación resulta muy buena.
4) A diferencia de SEEK y de LOCATE, Indexseek con el segúndo parámetro en .F. no mueve el puntero de registro al EOF() de la tabla o cursor, cuando no encuentra coincidencia.

Precauciones:
1) No selecciona la tabla, por lo que si hay que hacer modificaciones mediante REPLACE, es totalmente recomentable seleccionar la tabla.
1
2
3
4
5
6
7
8
9
10
11
12
IF INDEXSEEK(lcValorBuscado , .F. , lcAliasTabla , lcEtiquetaIndice)
	INDEXSEEK(lcValorBuscado , .T. , lcAliasTabla , lcEtiquetaIndice)
	SELECT (lcAliasTabla)
	IF RLOCK()
		REPLACE (lcCampo1) WITH lcValor1,;
			(lcCampo2) WITH lcValor2
		UNLOCK
	ENDIF
	* Proceso de valor Encontrado
ELSE
	* Proceso de Valor no Encontrado
ENDIF

2) No pone un master index. Cuando se necesite por algún motivo (búsqueda de 1 a varios), será necesario establecer el SET ORDER correspondiente.
En el ejemplo que sigue, se crea un cursor vacío identico a la tabla que se usa y se lo rellena con los valores encontrados de la tabla
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT * FROM (lcAliasTabla) WHERE .t. INTO CURSOR lcAliasCursor READWRITE  && crea cursor sin datos.
IF INDEXSEEK(lcValorBuscado , .F. , lcAliasTabla , lcEtiquetaIndice)
	SELECT (lcAliasTabla)
	SET ORDER TO (lcEtiquetaIndice)
	INDEXSEEK(lcValorBuscado , .T. , lcAliasTabla , lcEtiquetaIndice)
 
       * usar siempre SELECT  / SET ORDER / INDEXSEEK
 
	DO WHILE lcAliasTabla.Campo == lcValorBuscado
		SCATTER TO laFieldsValue
		INSERT INTO (lcAliasCusor) FROM ARRAY laFieldsValue
		SKIP
		IF EOF()
			EXIT
		ENDIF
	ENDDO
        SELECT (lcAliasCursor)
        BROWSE
ENDIF

3) La búsqueda de datos, igual que en SEEK, SEEK() o LOCATE, no es estricta, a menos que SET EXACT ON
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

Problema con tablas, se bloquean solas

Publicado por Fidel José (318 intervenciones) el 21/01/2016 20:31:00
Ja, ja, Mirando, me parece que la chinga es que en lugar del endif del medio, va un ELSE.
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