duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post Reply
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
MarioG
Posts: 1356
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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' )
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
MarioG
Posts: 1356
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
FiveWiDi
Posts: 910
Joined: Mon Oct 10, 2005 2:38 pm

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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
//------------------------------------------------------------------
 
Un Saludo
Carlos G.

FiveWin 19.06 + Harbour 3.2, BCC 7 Windows 10
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post by lucasdebeltran »

Hola:

Muchas gracias pero no me sirve ya que al usar ADS no se puede abrir el fichero a bajo nivel.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
RuFerSo
Posts: 55
Joined: Mon Feb 20, 2012 2:56 pm

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post by RuFerSo »

Lucas: en el Help del Arc de Advantage habla de los indices FTS, quizas te pueda ayudar.

Saludos
Ruben Fernandez
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post by fgondi »

Los indices FTS no son de Harbour, son de Advantage.

Revisa la ayuda del Arc de Advantage, como te dice Ruben Fernandez.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo

Post 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.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
Post Reply