Búsqueda secuencial

Hola,
Tengo una tabla que contiene varios campos carácter, el objetivo es generar una búsqueda en el 1º campo si no encuentra el dato, que ingrese al segundo campo y así consecutivamente hasta llegar al 7º u octavo campo y si no lo encuentra que salga un mensaje,
podrías darme un ejemplo a fin de adaptarlo a mi programa .
Gracias.
[email protected]

3 Respuestas

Respuesta
1
Imagina que queremos hallar el primer registro que contenga la cadena "Hola" en algún campo de algún registro; para hacer una búsqueda en toda la tabla de datos, puedes hacer lo siguiente:
*Almacenamos el total de registros existentes en una variable
STORE RECCOUNT() TO totreg
*Creamos una bandera, para indicar el resultado de la búsqueda. Por omisión le damos un valor que signifique "Búsqueda fallida"
STORE 0 TO bandera
*Revisamos si hay registros en la tabla
IF totreg > 0
*Revisamos registro por registro
FOR i = 1 TO totreg
GO RECORD i
*Preguntamos si la cadena se halla en el primer campo del registro activo
IF "Hola! $ campo1
STORE 1 TO bandera && Cambiamos el significado de la señal
código... && Ejecutamos núestro código
EXIT FOR && Como encontramos el dato salimos del ciclo For-EndFor
ENDIF
IF "Hola! $ campo2
STORE 1 TO bandera && Cambiamos el significado de la señal
código... && Ejecutamos núestro código
EXIT FOR && Como encontramos el dato salimos del ciclo For-EndFor
ENDIF
IF "Hola! $ campo3
STORE 1 TO bandera && Cambiamos el significado de la señal
código... && Ejecutamos núestro código
EXIT FOR && Como encontramos el dato salimos del ciclo For-EndFor
ENDIF
IF "Hola! $ campo4
STORE 1 TO bandera && Cambiamos el significado de la señal
código... && Ejecutamos núestro código
EXIT FOR && Como encontramos el dato salimos del ciclo For-EndFor
ENDIF
IF "Hola! $ campo5
STORE 1 TO bandera && Cambiamos el significado de la señal
código... && Ejecutamos núestro código
EXIT FOR && Como encontramos el dato salimos del ciclo For-EndFor
ENDIF
IF "Hola! $ campo6
STORE 1 TO bandera && Cambiamos el significado de la señal
código... && Ejecutamos núestro código
EXIT FOR && Como encontramos el dato salimos del ciclo For-EndFor
ENDIF
IF "Hola! $ campo7
STORE 1 TO bandera && Cambiamos el significado de la señal
código... && Ejecutamos núestro código
EXIT FOR && Como encontramos el dato salimos del ciclo For-EndFor
ENDIF
ENDFOR
ENDIF
*Revisamos el valor de la señal
IF bandera = 0
codigo para desplegar un mensaje...
ENDIF
Otra forma podría ser usando una consulta Select SQL:
SELECT * ;
FROM mitabla.dbf ;
WHERE "Hola" $ mitabla.campo1 ;
.OR. "Hola" $ mitabla.campo2 ;
.OR. "Hola" $ mitabla.campo3 ;
.OR. "Hola" $ mitabla.campo4 ;
.OR. "Hola" $ mitabla.campo5 ;
.OR. "Hola" $ mitabla.campo6 ;
.OR. "Hola" $ mitabla.campo7 ;
ORBER BY mitabla.nombre ;
INTO CURSOR busqueda
Este último ejemplo te presenta una ventana Browse con todos los registros que cumplan con la condición.
No olvides valorar la respuesta. Hasta pronto.
Respuesta
1
Creo que lo que necesitas es algo así, revísalo y adáptalo a tus necesidades:
**BUSCAR EN TODOS LOS CAMPOS DE UNA TABLA
Clear
On error DO ERROR
DIMENSION aCampos(FCOUNT( ))
FOR I = 1 TO FCOUNT( ) && Bucle para el número de campos.
aCampos(I) = FIELD(I)
NEXT
FOR I = 1 TO FCOUNT( ) && Bucle para el número de campos.
CcAMPO = ACAMPOS(I)
IF CcAMPO = 'timestamp' OR CCAMPO = 'objcode'
MESSAGEBOX('NUMERICO')
ELSE
* MESSAGEBOX("&cCampo = 'SJ'")
? 'CAMPO A VISITAR: &cCampo'
Locate For LIKE('*SJI*',UPPER(&CcAMPO))
IF FOUND()
MEssageBox('Campo: &cCampo'+chr(13)+'reg: '+entero(REcno()))
ENDIF
ENDIF
NEXT
Return
Respuesta
1
Existen dos formas de hacer esto.
* Crea un indice por cada campo y realiza busquedas con seek() en cada campo hasta que el resultado sea verdadero.
** Ten en cuenta que en éste ejemplo los campos tienen nombres con números al final que permiten un control secuencial, asi cam1,camp2,camp3...camp8
Igualmente hay un indice por cada campo realizados en orden es decir camp1 tiene el indice 1, el código podría ser:
LOCAL vRet, i, campo
i=0
vRet=.F.
USE mitabla IN 0 ALIAS mt
FOR i=1 To 8
campo="camp"+ALLTRIM(STR(i))
vRet=SEEK(vDato,"mt",i)
IF vRet
EXIT &&Sale del bucle
ENDIF
NEXT
IF vRet
=messagebox("dato encontrado en "+campo,0+64,"Alerta")
ELSE
=messagebox("dato NO encontrado",0+64,"Alerta")
ENDIF
La otra forma es sin crear los indices mediante SQL, es decir realizar una consulta por cada campo con el WHERE filtrando el dato seleccionado. Esto implicaría 8 consultas o una con 8 condiciones, te doy la última, la ventaja de esta opción es que no necesitas crear 8 indices.
LOCAL vCountReg
cCountReg=0
SELECT * from mitabla WHERE camp1=vDato OR camp2=vDato OR camp3=vDato OR camp4=vDato OR camp5=vDato OR camp6=vDato OR camp7=vDato OR camp8=vDato OR INTO CURSOR rConsulta
SELECT rConsulta
COUNT ALL TO cCountReg && Cuenta los registros
IF cCountReg=0
=messagebox("dato NO encontrado",0+64,"Alerta")
Endif
Listo Prueba y decide cual utilizar.

Añade tu respuesta

Haz clic para o