Me gustaría saber si se puede hacer con xBrowse, para que los resultados se actualicen inmediatamente según se escribe.

Vídeo de ejemplo: http://www.mediafire.com/?dxm8190tuai1yem
Gracias
Eduardo

//----------------------------------------------------------------------------//
//GetLookUp(nKey, nFlags, oGet, cCampo, cTag ) Busca en una tabla, en el indice cTag, oGet:VarGet
//si lo encuentra rellena a oGet con el resto del campo
FUNCTION GetLookUp(nKey, nFlags, oGet, cCampo, cTag, lLast )
LOCAL nPos
//LOCAL cOrden, nRecno
if nKey = 46 .AND. (nFlags = 22216705 .OR. nFlags = 1095958529) //Del key (nFlags=22216705->1 pres, nFlags=1095958529=multiple pres)
Return NIL
endif
IF VALTYPE(oGet:VarGet())$"CM" .AND. nKey >= 32 .AND. nKey <= 255
nPos:=oGet:nPos
oGet:Assign()
//nRecno:=Recno()
//cOrden:=OrdSetFocus(cTag)
OrdSetFocus(cTag)
//IF DBSeek(UPPER(LEFT(oGet:VarGet(),nPos-1)),,lLast)
IF DBSeek(LEFT(oGet:VarGet(),nPos-1),,lLast)
oGet:cText( Compile(cCampo) )
ELSE
//oGet:cText( PADR(UPPER(LEFT(oGet:VarGet(),nPos-1)), LEN(Compile(cCampo))) )
oGet:cText( PADR(LEFT(oGet:VarGet(),nPos-1), LEN(Compile(cCampo))) )
ENDIF
oGet:SetPos(nPos)
//OrdSetFocus(cOrden)
//DBGoTo(nRecno)
ENDIF
RETURN oGetoGet:bChange := {|nKey, nFlags, oGet| CLIE_VIEW->(GetLookUp(nKey, nFlags, oGet, "CODIGO", "CODIGO" )) }oGet:bChange := {|nKey, nFlags, oGet| CLIE_VIEW->(GetLookUp(nKey, nFlags, oGet, "NOMBRE", "NOMBRE" )) }Muchas gracias.
Si te fijas en el vídeo, si pones en el GET ado, aparecen CLIENTE CONTADO y ALVARO ES UN PESADO.
Se trata por tanto de buscar indistíntamente mayúsculas/minúsculas y que aparezcan dinámicamente los registros que cumplen esa condición del campo especificado (Nombre).
Creo que no es posible.
casi estoy seguro que es form usa un "select ... from ... like ... to tablatmp" en un evento que se dispara cada vez que se introduce un caracter y el grid tiene asignado su datasource a tablatmp.
salu2
carlos vargas
Si lo pudes hacer, ya lo he visto en el foro, es en vez de una busqueda secuencia, es una busqueda de un valor en una cadena, en este caso le especificas la VAR contendeora de la cadena y listo, algo parecido a un LOCATE y CONTINUE, si lo veo te agrego el link...saludos.. ![]()
¿Habéis visto el vídeo?.
Allí se ve dinámicamente los cambios, pero LOCATE FOR sólo iría a la primera coincidencia de ado, no saldrían todos que es lo que quiero.
Amigo si lo quieres hacer con SQL se aplica asi
SELECT * FROM CLIENTE WHERE nombre LIKE "%RIVERA%"
y con funcion es asi:
Local cbusca:=""
REDEFINE GET oGet VAR cBusca ID 101 OF oDlg UPDATE FONT oVentPrinc:oFont COLOR CLR_BLUE when .f.
y dentro del browse xbrowse
oLbx:bKeyDown := {|nKey| iif( nKey=13,(cKey:=SQLField(cExi_Suc,"ma_arti"),paso:=1,oDlg:End() ),(PlisBuscar(nKey,@cExi_Suc,"exi_suc",nIndex[cVar],oLbx,@cbusca,cSelect),oLbx:Refresh(),oLbx:Refresh(),oGet:Refresh() ))}
la funcion PLISBUSCAR
FUNCTION PlisBuscar(nKey,oDatos,oTabla,oOrden,oLbx,cbusca,cSelect)
-----------------------------------------------------
Local cQuery,campo
DEFAULT cSelect := ""
If nKey=8
cbusca:= SubStr(cbusca,1,Len(cbusca)-1)
cQuery:="SELECT "+ cSelect + " FROM "+oTabla+" WHERE "+oOrden+" LIKE '"+UPPER(cBusca)+"%' ORDER BY "+oOrden+" LIMIT 100"
oDatos:=oServer:Query(cQuery,.T.)
Else
If nKey=190
cbusca :=cbusca + "."
Else
cbusca :=cbusca + Upper(chr(nkey))
Endif
cQuery:="SELECT "+ cSelect +" FROM "+oTabla+" WHERE "+oOrden+" LIKE '"+UPPER(cBusca)+"%' ORDER BY "+oOrden+" LIMIT 100"
oDatos:=oServer:Query(cQuery,.T.)
If oDatos:Reccount() == 0
cbusca:=left(cbusca,len(cbusca)-1)
cQuery:="SELECT "+ cSelect +" FROM "+oTabla+" WHERE "+oOrden+" LIKE '"+UPPER(cBusca)+"%' ORDER BY "+oOrden+" LIMIT 100"
oDatos:=oServer:Query(cQuery,.T.)
Endif
Endif
Setxbrowse(oLbx, oDatos ) // importante para la navegacion
oDatos:Refresh()
oLbx:Refresh(.t.)
oLbx:SetFocus()
oDatos:GOTOP()
SALUDO
return .t.
......
oBj1[9]:bkeydown:={|nKey|DOKEYCHECK(nKey,oBj1[9],oSay2,oDlg,oBj1,@cTecla)}
......
************************************************************
STATIC FUNCTION DOKEYCHECK(nKey,oLbx,oSay2,oDlg,oBj1,cTecla)
************************************************************
*------SINGLE CHARACTER BROWSE SEARCHER----------------------
&& Note ASCII values: 65-90 are Capital A through Z.
&& : 97-122 are lowercase a through z.
&& : 48-57 are numbers 0-9.
&& : 13 used below is for a RETURN key hit.
//
IF nKEY>=65 .AND. nKEY<=90 .OR. nKEY>=97 .AND. nKEY<=122 .OR. nKEY >=48 .AND. nKEY<=57 .OR. nKey = VK_SPACE
//
//cKey:=cKey+UPPER(CHR(nKEY))
cTecla:=cTecla+UPPER(CHR(nKEY))
//
oSay2:SetText(cTecla)
oSay2:Refresh()
FilTexto(cTecla,"AGENDA",oDlg,oLbx)
oLbx:oVscroll:setpos(recno()) && Refresh browser object sequence...
oLbx:refresh() &&
oLbx:UpStable() && Stablize
SysRefresh()
RETURN( NIL ) && Drop out!
ENDIF
//
DO CASE
*/
CASE nKEY == VK_BACK
//
cTecla=substr(cTecla,1,len(cTecla)-1)
FilTexto(cTecla,"AGENDA",oDlg,oLbx)
oSay2:SetText(cTecla)
oSay2:Refresh()
CASE nKEY == VK_DELETE
//
cTEcla=""
FilTexto(cTecla,"AGENDA",oDlg,oLbx)
oSay2:SetText(cTecla)
oSay2:Refresh()
CASE nKEY == VK_RETURN
(AgendaAltaModi(oLbx,"Ver/Modificar texto",.F.),oLbx:Refresh(),oLbx:SetFocus())
//
CASE nKEY == VK_INSERT
(AgendaAltaModi(oLbx,"Alta de nuevo registro",.T.),PonNumero("AGENDA",oBj1),oLbx:Refresh(),oLbx:SetFocus())
//
CASE ( nKey == Asc( "F" ) .OR. nKey == Asc( "f" ) ) .AND. GetKeyState( VK_CONTROL )
ENDCASE
//
RETURN( NIL )
******************************************
FUNCTION FilTexto(cFiltro,cFile,oDlg,oLbx)
******************************************
cFiltro := ALLTRIM(cFiltro)
IF ! EMPTY(cFiltro)
(cFile)->(DBSETFILTER({|| AT(UPPER(cFiltro), UPPER((cFile)->Texto)) > 0 },"AT(UPPER(cFiltro), UPPER((cFile)->Texto)) > 0" ))
ELSE
(cFile)->(DBCLEARFILTER())
ENDIF
(cFile)->(DBGOTOP())
oLbx:Refresh()
oDlg:Update()
RETURN(.T.)Hola amigos:
Hay una funcion que se llama StrToken(), que quizas pueda servir para lo que necesitan.
Saludos
Ruben Fernandez
Thanks G. N. Rao.
Very good the sample
You can do with Scope
Regards,
Adhemar
acuellar wrote:Thanks G. N. Rao.
Very good the sample
You can do with Scope
Regards,
Adhemar
Thanks G. N. Rao.
Regards,
Adhemar
yo lo tengo por un filter y realmente lo hace rapido
por cada tecla q presionas va filtrando