ayuda para seek o search
Posted: Sun Jul 30, 2006 2:59 pm
Amigos Saludos a todos:
Debido a la necesidad personal y de otros colegas del foro y aun mas a la
sugerencia del Sr. Antonio, me atrevi a intentar crear una funcion para hacer
unas busquedas rapidas en todos _ de una base de datos o tablas lo
cual creo haberlo conseguido, mas lo que me ha resultado imposible es poder
calcular exactamente el numero de registro donde ocurre la coincidencia.
Dejo ha los demas colegas el reto a colaborar en terminar lo que yo no pude.
Pruebenla con tablas muy grandes y se sorprenderan al igual que yo, de la
rapidez de la busqueda; al encontrar la solucion por favor envienmela.
La idea de esta rutina es complementar un "SEEK", al no encontrar resultados
pues simple y rapidamente traer registros parecidos que contengan esta palabra
motivo del fallido "SEEK".
Atentatamente RODOLFO SILVA
sildata@cantv.net
* ---------------------
FUNCTION MAIN(nmbbd,cBuscar)
* nmbbd= es el nombre de la tabla *.dbf donde se efectuara la busqueda
* cBuscar= es la palaba o strind a buscar en todos _ de la *.dbf
* ---------------------
LOCAL nfpos := 0, nDpos := 0
LOCAL g_recsize, g_header, g_lastrec, g_cdata, g_offset, G_CTDOR := 0
LOCAL a_data := {}
LOCAL g_handle, nheader, dbfheader, cfilename :=nmbbd
g_handle := FOPEN( cfilename )
g_recsize := BIN2I( FILESTR( cFileName, 8, 10 ) ) //tama¤o del registro de la DBF
g_header := BIN2I( FILESTR( cFileName, 2, 8 ) ) //tama¤o del header de la DBF
g_lastrec := BIN2L( FILESTR( cFileName, 2, 4 ) ) // numero de registros en la DBF
* lee todo el header con el tama¤o calculado
DBFHeader := FILESTR( cFileName, g_header, 10 ) //contenido del header de la DBF
DO WHILE .NOT. feof( g_handle )
g_cdata := FREADSTR( g_handle, g_recsize * 10 )
nfpos := g_ftell( g_handle ) // posicion del pointer en el archivo
g_offset := AT(cBuscar, g_cdata )
IF g_offset > 0
* aqui deberia calcular el numero de registro RECNO() Y agruparlos
* en una matriz para al final devolver la matriz al programa llamante
* aadd(a_data, int((g_lastrec - (g_offset-g_header)) / g_offset)+1)
ENDIF
ENDDO
FCLOSE( g_handle )
RETURN(a_data)
* ---------------------
FUNCTION fEOF( nHandle )
* ---------------------
LOCAL nCurrentPos, nEOF
nCurrentPos := FSEEK( nHandle, 0, 1 ) //busca desde la posicion actual
nEOF := FSEEK( nHandle, 0, 2 ) //busca desde el fin de archivo
FSEEK( nHandle, nCurrentPos, 0 ) // busca desde el inicio de archivo
RETURN nEOF <= nCurrentPos
* ---------------------
FUNCTION G_FTell( nFileHandle )
* ---------------------
RETURN ( FSEEK( nFileHandle, 0, 1 ) ) // devuelve la posicion actual
* ---------------------
* EOF: PRUEBA.PRG
Debido a la necesidad personal y de otros colegas del foro y aun mas a la
sugerencia del Sr. Antonio, me atrevi a intentar crear una funcion para hacer
unas busquedas rapidas en todos _ de una base de datos o tablas lo
cual creo haberlo conseguido, mas lo que me ha resultado imposible es poder
calcular exactamente el numero de registro donde ocurre la coincidencia.
Dejo ha los demas colegas el reto a colaborar en terminar lo que yo no pude.
Pruebenla con tablas muy grandes y se sorprenderan al igual que yo, de la
rapidez de la busqueda; al encontrar la solucion por favor envienmela.
La idea de esta rutina es complementar un "SEEK", al no encontrar resultados
pues simple y rapidamente traer registros parecidos que contengan esta palabra
motivo del fallido "SEEK".
Atentatamente RODOLFO SILVA
sildata@cantv.net
* ---------------------
FUNCTION MAIN(nmbbd,cBuscar)
* nmbbd= es el nombre de la tabla *.dbf donde se efectuara la busqueda
* cBuscar= es la palaba o strind a buscar en todos _ de la *.dbf
* ---------------------
LOCAL nfpos := 0, nDpos := 0
LOCAL g_recsize, g_header, g_lastrec, g_cdata, g_offset, G_CTDOR := 0
LOCAL a_data := {}
LOCAL g_handle, nheader, dbfheader, cfilename :=nmbbd
g_handle := FOPEN( cfilename )
g_recsize := BIN2I( FILESTR( cFileName, 8, 10 ) ) //tama¤o del registro de la DBF
g_header := BIN2I( FILESTR( cFileName, 2, 8 ) ) //tama¤o del header de la DBF
g_lastrec := BIN2L( FILESTR( cFileName, 2, 4 ) ) // numero de registros en la DBF
* lee todo el header con el tama¤o calculado
DBFHeader := FILESTR( cFileName, g_header, 10 ) //contenido del header de la DBF
DO WHILE .NOT. feof( g_handle )
g_cdata := FREADSTR( g_handle, g_recsize * 10 )
nfpos := g_ftell( g_handle ) // posicion del pointer en el archivo
g_offset := AT(cBuscar, g_cdata )
IF g_offset > 0
* aqui deberia calcular el numero de registro RECNO() Y agruparlos
* en una matriz para al final devolver la matriz al programa llamante
* aadd(a_data, int((g_lastrec - (g_offset-g_header)) / g_offset)+1)
ENDIF
ENDDO
FCLOSE( g_handle )
RETURN(a_data)
* ---------------------
FUNCTION fEOF( nHandle )
* ---------------------
LOCAL nCurrentPos, nEOF
nCurrentPos := FSEEK( nHandle, 0, 1 ) //busca desde la posicion actual
nEOF := FSEEK( nHandle, 0, 2 ) //busca desde el fin de archivo
FSEEK( nHandle, nCurrentPos, 0 ) // busca desde el inicio de archivo
RETURN nEOF <= nCurrentPos
* ---------------------
FUNCTION G_FTell( nFileHandle )
* ---------------------
RETURN ( FSEEK( nFileHandle, 0, 1 ) ) // devuelve la posicion actual
* ---------------------
* EOF: PRUEBA.PRG