Busquedas

Busquedas

Postby dobfivewin » Tue May 27, 2008 10:09 am

Estimados del Foro

Como puedo realizar una busques dentro de un listbox una palabra que esté en el interior de un campo (alfanumerico), yo realizo la busqueda de la siguientes forma:

@ 10, 1 GET oVar_Bus VAR Var_Bus OF oDlgBus ;
ON CHANGE (oVar_Bus:Assign(),;
If(Tp_Buscar<>20,&(BusBASE)->( dbseek( Var_Bus, .t. )) ,;
&(BusBASE)->( dbseek( let+Var_Bus, .t. )) ) ,;
oLbxBus:UpStable(),;
oLbxBus:Refresh() )

pero esto me busca desde Derecha a izquierda a medida que voy escribiendo la frase a busca, lo que necesito es que pueda buscar una palabra dentro del campo...

Muchas Gracias

DBarrio
Argentina
dobfivewin
 
Posts: 325
Joined: Sun Feb 03, 2008 11:04 pm
Location: Argetnina

Postby cmsoft » Tue May 27, 2008 10:35 am

Hola Dbarrio:
Como estas? Mira, yo utilizo las dos formas en los formularios de busqueda. La incremental y la por contenido.
Te muestro la funcion buscar.
Code: Select all  Expand view
FUNCTION buscar(base,oDlg)
   LOCAL oDlg1,oBot1:=ARRAY(3),oGet1:=ARRAY(2),mvar1:=ARRAY(2),oLbx,i,retorno, Bus := .f.
   (base)->(DBSETORDER(2))
   (base)->(DBGOTOP())
   mvar1[1] := SPACE(30)
   DEFINE DIALOG oDlg1 RESOURCE "BUSCAR" TITLE "Busqueda" OF oDlg
      oDlg1:lHelpIcon := .f.
      REDEFINE BROWSE oLbx  ID 101  OF oDlg1 ON DBLCLICK oDlg1:End();
            ALIAS (base)
            ADD COLUMN TO  oLbx DATA FieldWBlock( aCampo[1], Select(base) ) ;
                        SIZE  100 HEADER "Codigo" ALIGN RIGHT
            ADD COLUMN TO  oLbx DATA FieldWBlock( "nombre", Select(base) ) ;
                        SIZE  1300 HEADER "Detalle"
      REDEFINE GET oGet1[1] VAR mvar1[1] ID 102 OF oDlg1
      REDEFINE GET oGet1[2] VAR mvar1[2] ID 105 OF oDlg1
      oGet1[1]:bKeyDown := { |nKey,nFlag| bus(base, oGet1[1], oLbx, nKey) }
      oGet1[2]:bKeyDown := { |nKey,nFlag| Cam(oGet1[2], nKey, @Bus) }
      REDEFINE BUTTON oBot1[1] ID 103 OF oDlg1 ACTION oDlg1:End()
      REDEFINE BUTTON oBot1[3] ID 106 OF oDlg1 ACTION ;
               BuscarCon(mvar1[2],oLbx,base,@Bus)
   ACTIVATE DIALOG oDlg1 ON INIT oGet1[1]:SetFocus()
   retorno = (base)->codigo
   (base)->(DBSETORDER(1))
RETURN retorno


*********************************************
** Buscar por contenido
STATIC FUNCTION BuscarCon(Texto,oBrw,base,Bus)
LOCAL anterior := SELECT()
IF Bus
   SELECT (base)
   CONTINUE
   ELSE
   Bus := .t.
   SELECT (base)
   LOCATE FOR ALLTRIM(Texto) $ (base)->nombre
ENDIF
SELECT(anterior)
oBrw:BugUp()
oBrw:Refresh()
RETURN nil
*********************************
** Busqueda incremental
FUNCTION Bus(base, oGet, oLbx, nKey)
LOCAL cBus
cBus := LEFT(oGet:cText,oGet:nPos-1) + CHR(nKey)
(base)->(DBSEEK(cBus))
// Se refresca el listbox
oLbx:BugUp()
oLbx:refresh()
RETURN .T.
User avatar
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Postby Willi Quintana » Tue May 27, 2008 2:19 pm

Podria ser asi??, usando la funcion AT

** Buscar por contenido
STATIC FUNCTION BuscarCon(Texto,oBrw,base,Bus)
LOCAL anterior := SELECT()
local lOk, nRecno
lOK := .f.
nrecno := (base)->recno() // guardamos el puntero
DbGoTop()
WHILE !EOF()
IF AT(texto, (base)->nombre) > 0 // encontro la subcadena
lOK := .t.
EXIT
EndIf
DbSkip()
ENDDO

If !lOK
DbGoTo(nrecno)
EndIf

SELECT(anterior)
oBrw:BugUp()
oBrw:Refresh()
RETURN nil
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Busquedas

Postby dobfivewin » Tue May 27, 2008 5:07 pm

Amigos

muchas gracias

ya me pongo a probar las dos opciones

muchas gracias

dbarrio
Argentina
dobfivewin
 
Posts: 325
Joined: Sun Feb 03, 2008 11:04 pm
Location: Argetnina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 88 guests