FoxPro/Visual FoxPro - búsqueda con seek solo busca el primer registro

 
Vista:
sin imagen de perfil
Val: 313
Bronce
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

búsqueda con seek solo busca el primer registro

Publicado por Jose Francisco (166 intervenciones) el 31/01/2018 02:53:01
Estimados , tengo una rutina que busca el valor de un cálculo en una tabla , sólo encuentra el dato cuando está en el primer registro de la tabla , pero si el dato a buscar esta en otros registros no lo encuentra ( es como que el seek no recorre la tabla completa).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wcodactiv= (lcserialnumber*56)
wcodactiv=codactiv
SELECT 98
USE tablactiv.dbf IN 98 ALIAS M03
GO TOP
 
SEEK(codactiv)ORDER codactiv
 
IF codactiv >0 .AND. codactiv = wcodactiv
 
  MESSAGEBOX("Nro activ.existe",48,"Mensaje")
 
DO FORM formclave
RETURN
ELSE
MESSAGEBOX("Programa no corresponde a ésta PC, por favor comprar otra licencia  ", 0+48, "Error")
***QUIT
DO FORM FORMACTIVA
ENDIF

Aguardo respuesta.
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
Imágen de perfil de Abel
Val: 642
Plata
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

búsqueda con seek solo busca el primer registro

Publicado por Abel (286 intervenciones) el 31/01/2018 15:26:46
Seek busca en un archivo indexado, siempre la primera ocurrencia ya que supone que los datos es el campo son únicos, es decir que nunca se repiten y si tienes registros repetidos buscará el primero.

Mirando tu código hay una incongruencia en las 2 primeras líneas:
1. wcodactiv=(lcserialnumber*56) le indicas a la variable o campo wcodactiv el valor (lcserialnumber*56), pero el la siguiente línea
2. wcodactiv=codactiv cambias de opinion y le das a la misma variable el valor que tenga codactiv, lo cual en la sig. líneas
3. IF codactiv>0 .AND. codactiv=wcodactiv siempre cumplirá al menos la segunda condición "codactiv=wcodactiv"

Por otro lado en vez de usar SEEK podrías usar LOCATE-CONTNUE u usar SELECT-SQL; personalmente siempre usaria éste último.
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
sin imagen de perfil
Val: 313
Bronce
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

búsqueda con seek solo busca el primer registro

Publicado por Jose Francisco (166 intervenciones) el 31/01/2018 16:25:09
Estimado , en la tabla busco un número que sea igual a producto de (lcserialnumber*56),,,,,,,que es igual a la variable wcodactiv.-
La segunda igualdad wcodactiv=codactiv , no va incluida , me quedo de algo anterior,.
wcodactiv= (lcserialnumber*56)
Nuevamente el código:
SELECT 98
USE tablactiv.dbf IN 98 ALIAS M03
GO TOP

SEEK(codactiv)ORDER codactiv

IF codactiv >0 .AND. codactiv = wcodactiv

MESSAGEBOX("Nro activ.existe",48,"Mensaje")

DO FORM formclave
RETURN
ELSE
MESSAGEBOX("Programa no corresponde a ésta PC, por favor comprar otra licencia ", 0+48, "Error")
***QUIT
DO FORM FORMACTIVA
ENDIF

CUANDO PREGUNTO :
IF codactiv >0 .AND. codactiv = wcodactiv

codactiv es el número que tengo que buscar en la tabla , pero solo me encuentra el de arriba o sea el primer registro de la tabla, cuando busco un codactiv más abajo de la tabla o dentro de la tabla no lo encuentra, ,,,,,, inclusive también escribo: if codactiv= 130211276580 (que es nro del cálculo que esta en la tabla y si esta debajo del primer registro NO me lo encuentra.-SI ESTÁ EN EL PRIMER REGISTRO SI.-
Aguardo alguna respuesta , desde ya 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
sin imagen de perfil
Val: 10
Ha disminuido su posición en 2 puestos en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

búsqueda con seek solo busca el primer registro

Publicado por Yamil Bracho (6 intervenciones) el 31/01/2018 16:43:11
Quizas te h aga falta especificar el indice a ser usado despues del USE haces
SET ORDER TO <indice_a_usar>
y entonces haces el SEEK

SET ORDER TO TAG por_codigo
SEEK codactiv
...
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

búsqueda con seek solo busca el primer registro

Publicado por Fidel José (657 intervenciones) el 31/01/2018 16:40:05
1) Para abrir una tabla
USE tablactiv IN 0 ALIAS M03 && no arriesgas cerrar la tabla que ocasionalmente esté en el Area 98
SELECT M03

2) Para buscar en la tabla sobre un campo indexado
* SEEK -> Comando Obsoleto
* Usar la función SEEK() o INDEXSEEK()

3) Debes tener muy claro qué es lo que buscas, para no confundir el campo con una variable
Por ejemplo, qué significa esto?
wcodactiv= (lcserialnumber*56) && "lcSerialNumber" es una variable numérica, un campo o qué
wcodactiv=codactiv

4) Codactiv es la etiqueta de un índice y también el nombre de un campo de la tabla?

5) Acá buscas el valor de un campo de la tabla. Para qué lo buscas si ya lo tienes?

* Supongamos
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
LOCAL wCodActiv,lnTally,lcOpcion
 
lnTally = 0
lcOpcion = "indexseek | scan | sql |" && indicar la opción concreta seleccionada
wcodactiv= (lcserialnumber*56)  && VER SI ESTO CORRESPONDE. ? lcSerialNUmber
 
USE tablactiv IN 0 AGAIN ALIAS M03  && no arriesgas cerrar la tabla que ocasionalmente esté en el Area 98
 
DO CASE
	CASE lcOpcion == "indexseek"
		IF INDEXSEEK(m.wCodActiv,.f.,"m03","codactiv")
			SELECT m03
			SET ORDER TO codactiv
			INDEXSEEK(m.wCodActiv,.t.,"m03","codactiv")
			DO WHILE codactiv = m.wCodActiv
				lnTally = m.lnTally + 1
				SKIP
				IF EOF()
					EXIT
				ENDIF
			ENDDO
		ENDIF
	CASE lcOpcion == "scan"
 
		SELECT m03
		SCAN FOR codactiv = m.wCodactiv
			lnTally = m.lnTally + 1
		ENDSCAN
 
	CASE lcOpcion == "sql"
		SELECT CNT(*) ;
			FROM m03 ;
			WHERE codactiv = m.wCodactiv ;
			INTO ARRAY laCoincide
		lnTally = _tally
		* lnCount = NVL(laCoincide[1,1],0)
ENDCASE
 
* Cierra la tabla
USE IN m03
 
* Decisión
IF !EMPTY(m.lnTally)
	DO FORM formclave
ELSE
	MESSAGEBOX("Programa no corresponde a ésta PC, por favor comprar otra licencia  ", 0+48, "Error")
 
	DO FORM FORMACTIVA
ENDIF
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
Imágen de perfil de Eduardo
Val: 114
Bronce
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

búsqueda con seek solo busca el primer registro

Publicado por Eduardo (114 intervenciones) el 31/01/2018 23:31:41
¿No es más sencillo utilizar solo la sentencia SELECT?


Si el colega lo que quiere es obtener todos los registros que coincidan con el criterio de búsqueda, lo mejor es el SELECT y enviar el resultado a un cursor...

Saludos
Eduardo
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
sin imagen de perfil
Val: 313
Bronce
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

búsqueda con seek solo busca el primer registro

Publicado por Jose Francisco (166 intervenciones) el 01/02/2018 00:58:03
Hola estimados, ya lo solucioné con una pequeña rutina con la instrucción LOCATE (son pocos registros que tiene que buscar) ya que las instrucciones que uds me pasaron NO me funcionaron:
ASÍ FUNCIONA CORRECTAMENTE.
ERA SÓLO ENCONTRAR UN NRO EN LA TABLA O ARCHIVO.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wcodactiv= (lcserialnumber*56)
SELECT 98
USE tablactiv.dbf IN 98 ALIAS M03 SHARED
SET ORDER TO codactiv
GO TOP
LOCATE FOR codactiv=wcodactiv
IF FOUND()
MESSAGEBOX("Nro activ.existe",48,"Mensaje")
DO FORM formclave
RETURN
ELSE
MESSAGEBOX("Programa no corresponde a ésta PC, por favor comprar otra licencia ", 0+48, "Error")
DO FORM FORMACTIVA
RETURN
ENDIF

MUCHAS GRCIAS A TODOS, TENDRÉ EN CUENTA VUESTRAS INSTRUCCIONES PARA ALGÚN OTRO PROGRAMA
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