Page 1 of 1
duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 11:50 am
by lucasdebeltran
Hola compañeros,
Para buscar un valor en todos _ ahora uso:
cWild := "*"+ "VALOR A BUSCAR" +"*"
cFiltro := "hb_WildMatch( '"+cWild+"', DbRecordInfo( 9 ) ) .OR.
hb_WildMatch( '"+UPPER(cWild)+"', DbRecordInfo( 9 ) ) .or. hb_WildMatch(
'"+lower(cWild)+"', DbRecordInfo( 9 ) ) "
SET FILTER TO &cFiltro
Y funciona muy bien, pero ADS no lo soporta.
He probado con:
cName := "LUCAS"
cExpr1 := 'contains( *, "*'+UPPER( alltrim(cName) )+'*" ) '
AdsSetAOF( cExpr1 )
Y nada.
¿Alguno sabe cómo resolverlo por favor?.
Gracias.
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:04 pm
by MarioG
Lucas;
a ver si te ayuda. El filtro ADS lo uso así:
Code: Select all
cName := "LUCAS"
// que comience
AdsSetAOF( 'APEYNOM="' +cName+'"' )
// que contenga
AdsSetAOF( '"' +cName+ '" $ APEYNOM' )
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:19 pm
by lucasdebeltran
Muchas gracias Mario, pero se trata de buscar en todos _.
Eso es lo que permite el código anteriormente indicado. Además, funciona bastante bien con DBFCDX.
¿Tu haces este tipo de búsquedas totales?.
Muchas gracias de nuevo.
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:48 pm
by MarioG
lamento decirte que no
Otra opcion, con ADS, es hacerlo mediante sentencia SQL, que es lo que uso para casos como el que planteas. Si no tenes la ayuda de sentencias te la paso
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:59 pm
by FiveWiDi
lucasdebeltran wrote:Muchas gracias Mario, pero se trata de buscar en todos _.
Eso es lo que permite el código anteriormente indicado. Además, funciona bastante bien con DBFCDX.
¿Tu haces este tipo de búsquedas totales?.
Muchas gracias de nuevo.
Quizás esto te sirva:
Code: Select all
#include "fivewin.ch"
#include "Dbstruct.ch"
#include "DbInfo.ch"
/* Función para buscar en una DBF (en su orden NATURAL) un valor contenido
en un campo determinado.
Simula el comando LOCATE y CONTINUE, pero realizando un AT().
Devuelve el Recno() ó '0' según encuentre o no el valor a buscar.
Se asume que la DBF está abierta y se recibe su Alias().
Su uso es:
nAtInDbf( cAliasDBF, "APELLIDO", "GARCIA", .F. )
para continuar la búsqueda con los mismos parámetros:
nAtInDbf( cAliasDBF, , , .T. )
Para que nos entendamos, la primera vez vendría a ser un LOCATE, y la segunda
vez vendría a ser un CONTINUE.
--------------------------------------------------------------------------------- */
FUNCTION nAtInDbf( cAliasDBF, cFieldDBF, cString, lContinue )
STATIC cMemoDbf := "", ;
nBytesToField := 0, ;
nBytesEndField := 0, ;
nOffset := 0, ;
cSearch := "", ;
cfield := "", ;
nRegLocate_1 := 0
Local aEstruct := {}
Local nPos := 0
DEFAULT lContinue := .F.
/*
Traza( 1, cAliasDbf )
Traza( 1, ( cAliasDbf )->(DbInfo( DBI_FULLPATH )) )
Traza( 1, cFieldDbf )
Traza( 1, cString )
Traza( 1, lContinue )
*/
If .not. lContinue
If Len( cString ) < 1
MsgInfo("Not Data to Search.", "Search Error." )
Return 0
Endif
cMemoDbf := MemoRead( ( cAliasDbf )->(DbInfo( DBI_FULLPATH )) )
nOffset := 0
cSearch := cString
cField := Upper( cfieldDBF )
nRegLocate_1 := 0
nBytesToField := 0
nBytesEndField := 0
aEstruct := ( cAliasDBF )->(DBSTRUCT())
AScan( aEstruct, { |aCampo| If( aCampo[ DBS_NAME ] == cField, ;
(nBytesEndField := nBytesToField + aCampo[ DBS_LEN ] + aCampo[ DBS_DEC ], .T.), ;
(nBytesToField := nBytesToField + aCampo[ DBS_LEN ] + aCampo[ DBS_DEC ], .F. ) ;
) ;
} ;
)
If nBytesEndField = 0
MsgInfo("Field not found.", "Search Error." )
Return 0
Endif
EndIf
nPos := 0
While nPos <= ( ( cAliasDBF )->(Header()) + (nRegLocate_1 * ( cAliasDBF )->(RecSize()) ) + nBytesToField) .or. ;
nPos > ( ( cAliasDBF )->(Header()) + (nRegLocate_1 * ( cAliasDBF )->(RecSize()) ) + nBytesEndField)
nPos := AT( cSearch, SubStr(cMemoDbf, nOffset + 1) )
If nPos = 0
nRegLocate_1 = -1
Exit
EndIf
nOffset := nPos := nPos + nOffSet
nRegLocate_1 := INT( ( nPos - ( cAliasDBF )->(Header()) ) / ( cAliasDBF )->(RecSize()) ) // Registro anterior al localizado¿?
If (( nPos - ( cAliasDBF )->(Header()) ) % ( cAliasDBF )->(RecSize())) = 0
nRegLocate_1 = nRegLocate_1 - 1 // Registro anterior al localizado.
EndIf
End
Return nRegLocate_1 + 1
//------------------------------------------------------------------
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 1:28 pm
by lucasdebeltran
Hola:
Muchas gracias pero no me sirve ya que al usar ADS no se puede abrir el fichero a bajo nivel.
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Sat Mar 17, 2012 9:18 pm
by fgondi
Para usar la instrucción containsnNecesitas crear indices FTS sobre la tabla que quieras buscar.
Code: Select all
cExpr1 := 'contains( *, "*'+UPPER( alltrim(cName) )+'*" ) '
Revisa la ayuda de ADS sobre los indices FTS. Son una maravilla.
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Sun Mar 18, 2012 10:32 am
by lucasdebeltran
Hola Fernando:
Muchas gracias por responder.
Lo del * para todos _ ya lo descubrí en la ayuda, pero no se cómo crear un índice FTS para todos _.
¿Por favor, tienes un ejemplo?.
Y los índices FTS ¿son temproales o son como los .cdx?.
No he conseguido encontrar información sobre índices FTS y Harbour.
Un saludo y mil gracias de nuevo.
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Tue Mar 20, 2012 1:58 pm
by RuFerSo
Lucas: en el Help del Arc de Advantage habla de los indices FTS, quizas te pueda ayudar.
Saludos
Ruben Fernandez
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Tue Mar 20, 2012 3:41 pm
by fgondi
Los indices FTS no son de Harbour, son de Advantage.
Revisa la ayuda del Arc de Advantage, como te dice Ruben Fernandez.
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Tue Mar 20, 2012 5:08 pm
by lucasdebeltran
Sí, claro que lo miré, pero no lo entendí bien, sobre todo con el uso de un Diccionario para usar las Dbfs via AIS.
Todavía tengo el problema con los índices.
Con AIS, INDEX ON NUMERO TO PRESUA FOR PASADO = "S" .AND.
!Deleted() no me genera un .IDX sino un .CDX.
No lo entiendo.
En modo local sí me genera un .IDX, pero en modo AIS es un .cdx con el
mismo código.