Page 1 of 1

Busqueda incremental en todo el campo

Posted: Fri Mar 19, 2010 7:00 pm
by mariordz
Hola amifos del foro, nuevamente solicitando de su ayuda, he implementado un xBrowse con busqueda incremental, pero tengo dos detalles:

1.- Cuando hago una busqueda incremental no veo lo que estoy digitando, es decir, empiezo a teclear y el xBrowse se mueve al primer registro que cumple el criterio de busqueda, pero no veo lo que estoy tecleando, la duda es como le digo al xBrowse que busque el valor contenifo en un get dentro del mismo dialogo?

2.- La busqueda incremental solo encuentra concordancia al inicio del contenido del campo, ¿Como de digo que busque el valor buscado dentro de todo el contenido del campo? Ej. si busco "TORRES" y el nombre de mi cliente es SANDRA TORRES la busqueda no lo va a detectar, ya que "TORRES" no esta al inicio del campo. Adicionalmente desearia que se hiciera un filtrado del resultado obtenido y solo sea eso lo que me muestre en mi xBrowse, les paso parte de mi código para darle una mejor idea de lo que hago.

Muchas gracias por anticipado.

Code: Select all

   Public oDlg, oBrw, oGet1
   Public cBusca := space(25)
   USE &dbcust shared new alias clientes
   index on cliysub to &dbidx1
   index on razonsoc to &dbidx2
   index on razoncom to &dbidx3
   index on contacto to &dbidx4
   index on conta2 to &dbidx5
   index on dir5b to &dbidx6
   close all
   use &dbcust shared new alias clientes
   set index to &dbidx1,&dbidx2,&dbidx3,&dbidx4,&dbidx5,&dbidx6
   DEFINE DIALOG oDlg resource "dlgverdb8"// FROM 5,10 TO 20,60
   oBrw := TXBrowse():New( oDlg )
   //ESTILOS DE LINEAS
   oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW //barra selectora
   oBrw:nColDividerStyle := LINESTYLE_INSET
   oBrw:nRowDividerStyle := LINESTYLE_INSET
   oBrw:lColDividerComplete := .t. //completa pintado hasta el footer cuando lineas no llenan todo el browse
   //HEADERS Y FOOTERS
   oBrw:nHeaderHeight := 22 //Altura cabeceras de col
   oBrw:lFooter := .t. //Que tendrá footer
   oBrw:nFooterLines := 1 //Lineas del footer
   oBrw:nFooterHeight := 22 //Altura del Footer
   oBrw:lRecordSelector := .t. //poner o no, COL de la flechita de la izq
   //COLORES (texto y fondo del texto)
   oBrw:bClrHeader := {|| { nRGB(152, 251, 152), nRGB(47, 79, 79) } }//{|| { nRGB(140, 0, 0), nRGB(229,0,0) } } // VERDECITO
   oBrw:bClrFooter := oBrw:bClrHeader
   oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
   oBrw:bClrSel := {|| { nRGB( 0, 0,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
   oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
   oBrw:nRowHeight := 19 //altura entre lineas
   //COLUMNAS DEL BROWSE
   oCol = oBrw:AddCol()
   oCol:bStrData = { || str(clientes->no_clien)+"-"+str(clientes->no_subcli) }
   oCol:nDataStrAlign := 0
   oCol:cHeader = "No. de cliente"
   oCol:cFooter = "No. de cliente"
   oCol:nWidth = 80
   oCol:bLClickHeader:= {|| DbSetorder(1),oBrw:Gotop()}

   oCol = oBrw:AddCol()
   oCol:bStrData =  { || clientes->razonsoc }
   oCol:nDataStrAlign := 0
   oCol:cHeader = "Razon social"
   oCol:cFooter = "Razon social"
   oCol:nFootStrAlign := 0
   oCol:nWidth = 320
   oCol:bLClickHeader:= {|| DbSetOrder(2),oBrw:Gotop() }

..... (MAS COLUMNAS)

   oBrw:SetRDD()

   oBrw:CreatefromResource(0)

REDEFINE GET oGet1 VAR cBusca ID 4 OF oDlg PICTURE "@!" UpDate

oBrw:bSeek := {|c| DbSeek( Upper( c ),oBrw:refresh() ) }
   REDEFINE BTNBMP oBtn ID 2 OF oDlg ACTION ( lpegar := .T., lExit := .F., oDlg:end() )
   REDEFINE BTNBMP oBtn ID 3 OF oDlg ACTION ( lExit := .T., oDlg:end(), ciccc:="N" )
   ACTIVATE DIALOG oDlg CENTERED
 

Re: Busqueda incremental en todo el campo

Posted: Fri Mar 19, 2010 7:19 pm
by acuellar
Mario, tu indices los tienes que hacer con TAG
Asi:
USE &dbcust shared new alias clientes
index on cliysub TAG CAMPO1 //CUALQUIER NOMBRE SIEMPRE CREA EN INDICE CON EL MISMO NOMBRE DE LA BASE
index on razonsoc TAG CAMPO2
y Hacer esto

Code: Select all

oCol:=oBrw:AddCol()
   oCol:bStrData:= { || CLIENTES->cliysub }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader:= "COD."
   oCol:nWidth:=32
   oCol:nDataStrAlign:= AL_CENTER
   oCol:cSortOrder:=CAMPO1   //AQUI USAS EL INDICE TAG
                 
   oCol:=oBrw:AddCol()
   oCol:bStrData  := { || CLIENTES->razonsoc  }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:cHeader:= "R A Z O N "
   oCol:nWidth:=300
   oCol:cSortOrder:=CAMPO2

Y... PARA TU BUSQUEDA

   @4,260 SAY oSay VAR xClave SIZE 40,8 PIXEL OF oDlg UPDATE PICTURE "@!"
   oBrw:bSeek := {|c| (DbSeek(UPPER(c)) ) }; oBrw:oSeek:=oSay
 
Al dar click sobre el HEADER se invierte el indice como el explorer de windows

Espero te sirva

Saludos

Adhemar

Re: Busqueda incremental en todo el campo

Posted: Fri Mar 19, 2010 10:01 pm
by mariordz
Hola, gracias por tu respuesta, esto funciona bien, aunque aún no logro hacer lo que necesito, esta busqueda sigue dandome resultados solo si mi busqueda esta al inicio del campo. Como puedo agregar la busqueda tipo "AT()", para que busque lo que estoy digitando en todo el contenido del campo y no solo en al inicio?. Gracias

Re: Busqueda incremental en todo el campo

Posted: Fri Mar 19, 2010 11:14 pm
by Pedro
En xHarbour creo que existe la funcion OrdWildSeek donde puedes emplear comodines ( * y ? ) para buscar dentro del indice.

Re: Busqueda incremental en todo el campo

Posted: Sat Mar 20, 2010 4:22 am
by JavierVital
Mario, lo que yo creo que debes de hacer es un filtro, yo lo hago con ADS y el tiempo de respuesta es muy bueno
lo que voy teckeando lo va filtrando y solo me va poniendo el resultado, lo hago con una tabla de clientes de unos 5000 registros

Saludos.

Re: Busqueda incremental en todo el campo

Posted: Sat Mar 20, 2010 4:41 am
by joseluisysturiz
Creo lo que el colega quieres es que la busqueda tambien sea de una PALABRA dentro de una FRASE para ver si hay coincidencia y que no se cumpla solo por el indice, de la forma que el quiere no hace fala indice, es solo buscar una palabra en una frase, hay una funcion de clipper que hace eso...reviso y te aviso... yo lo hacia en un sistema bajo fox base... saludos... :shock: