FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 11:50 AM

Hola compañeros,

Para buscar un valor en todos los campos 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.
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:04 PM
Lucas;
a ver si te ayuda. El filtro ADS lo uso así:
Code (fw): Select all Collapse
cName := "LUCAS"
// que comience
AdsSetAOF( 'APEYNOM="' +cName+'"' )
// que contenga
AdsSetAOF( '"' +cName+ '" $ APEYNOM' )
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:19 PM

Muchas gracias Mario, pero se trata de buscar en todos los campos.

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.
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:48 PM

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
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: duda ADS equivalente hb_WildMatch( '"+cWild+"', DbRecordInfo
Posted: Wed Mar 14, 2012 12:59 PM
lucasdebeltran wrote:Muchas gracias Mario, pero se trata de buscar en todos los campos.

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 (fw): Select all Collapse
#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 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: duda ADS equivalente hb_WildMatch( '&quot;+cWild+&quot;', DbRecordInfo
Posted: Wed Mar 14, 2012 01:28 PM

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.
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: duda ADS equivalente hb_WildMatch( '&quot;+cWild+&quot;', DbRecordInfo
Posted: Sat Mar 17, 2012 09:18 PM
Para usar la instrucción containsnNecesitas crear indices FTS sobre la tabla que quieras buscar.
Code (fw): Select all Collapse
cExpr1 := 'contains( *, "*'+UPPER( alltrim(cName) )+'*" ) '


Revisa la ayuda de ADS sobre los indices FTS. Son una maravilla.
Un saludo

Fernando González Diez

ALSIS Sistemas Informáticos
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: duda ADS equivalente hb_WildMatch( '&quot;+cWild+&quot;', DbRecordInfo
Posted: Sun Mar 18, 2012 10:32 AM

Hola Fernando:

Muchas gracias por responder.

Lo del * para todos los campos ya lo descubrí en la ayuda, pero no se cómo crear un índice FTS para todos los campos.

¿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.
Posts: 55
Joined: Mon Feb 20, 2012 02:56 PM
Re: duda ADS equivalente hb_WildMatch( '&quot;+cWild+&quot;', DbRecordInfo
Posted: Tue Mar 20, 2012 01:58 PM

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

Saludos
Ruben Fernandez

Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: duda ADS equivalente hb_WildMatch( '&quot;+cWild+&quot;', DbRecordInfo
Posted: Tue Mar 20, 2012 03:41 PM

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 Sistemas Informáticos
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: duda ADS equivalente hb_WildMatch( '&quot;+cWild+&quot;', DbRecordInfo
Posted: Tue Mar 20, 2012 05:08 PM
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.

Continue the discussion