Page 1 of 1

Busqueda incremental xBrowse+recursos+mariaDB

PostPosted: Thu Oct 27, 2022 4:41 pm
by JoseAlvarez
Hola a todos.

Hace meses hice por aca mismo la consulta de como hacer una busqueda incremental con xBrowse. En aquella oportunidad logre hacerlo pero con el detalle que estaba trabajando con arreglos de memoria.

Esta vez, el datasource quiero manejarlo con el resultado de una consulta (oQuery) pero no se como hacerlo. Me imagino que es algo sencillo pero el que no sabe es como el que no puede ver.

El xBrowse lo hago desde recursos con Pelles C, y uso MariaDB, Harbour y FW 17.01

Alguien me da una mano?

este es el codigo que estoy manejando.


 
Code: Select all  Expand view
#include "fivewin"


Static oBrwUsuarios

Function Fnct_Usuarios()

    Local oGetSeek , oBtnBuscar , oFHeadBrw
    Local cQuery   , cTabla     , cSeek
    Local cNombre, cNick, cTelf, cStatus
    local nKey
    Local lFound := .f.
    Local lSalir := .f.

    if Fnct_CheckActive()
        fGetOut('Porque Iniciaste en Otro Equipo')
    endif

    nKey      := 1
    cSeek     := Spac(35)
    cTabla    := _cPrefijo+"_usuarios"

    cQuery    := "Select * from "+cTabla+" ORDER BY nombre;"

    TRY
    oUsuarios:=_oSqlConex:Query( cQuery )
    CATCH
        Fnct_MsgErrorBD("NoMySql"  , .f. , "No hay conexión a La Base de Datos" , "Sin Acceso a La Red","Error en servicio de Datos",)
        _oSqlConex:End()
        return .f.
    END TRY

    _oSqlConex:End()

    cNombre:= 1
    cNick  := 2  // posiciones de los campos dentro del xBrowse
    cTelf  := 3
    cStatus:= 4

  *****************************************************************************************************************************************

  Define cursor oCursorBar       resource 'manito'
  Define cursor oCursorIndicador resource 'Indicador'

  Define Font oFHeadBrw Name "Segoe UI SemiBold" Size 0, -14


  Define Dialog oDlg_Usuarios resource "oDlg_Usuarios" title 'Actualización de Datos de Usuarios'
       oDlg_Usuarios:lHelpIcon:=.f.

       Redefine get oGetSeek Var cSeek Id 11  of oDlg_Usuarios on change ;
      ((cSeek:=oGetSeek:GetText(),nkey :=oGetSeek:bKeyDown, Fnct_Seek(cSeek, oGetSeek, nKey ))

       Redefine xBrowse oBrwUsuarios Id 10  DATASOURCE oUsuarios AUTOCOLS AUTOSORT COLUMNS  2, 5, 3, 8  ;
                                                      HEADERS    "Nombre"   ,;
                                                                 "Nick"        ,;
                                                                 "Teléfono"  ,;
                                                                 "Status"      ;
                                                       FIELDSIZES  245, 98, 186,85   ;
                                                       PICTURE     nil, nil, nil, nil  ;
                                                       JUSTIFY     AL_LEFT,   AL_LEFT, AL_LEFT, AL_LEFT ;
                                                       CELL LINES FASTEDIT FOOTERS of oDlg_Usuarios
     WITH object oBrwUsuarios

            oBrwUsuarios:aCols[cNombre] :oHeaderFont:=oFHeadBrw
            oBrwUsuarios:aCols[cNick]   :oHeaderFont:=oFHeadBrw
            oBrwUsuarios:aCols[cTelf]   :oHeaderFont:=oFHeadBrw
            oBrwUsuarios:aCols[cStatus] :oHeaderFont:=oFHeadBrw

            oBrwUsuarios:nMarqueeStyle  := MARQSTYLE_HIGHLROW   // para que el apuntador ilumine la fila completa
            oBrwUsuarios:l2007          := .f.
            oBrwUsuarios:lFooter        := .t.
            :aCols[cNombre] :bFooter := { || 'Total Usuarios-> '+transform(oUsuarios:Reccount(),"@E 99") }

            :lIncrFilter := .T.
            :cFilterFld:='nombre'
            :lSeekWild   := .T.
            :oSeek       := oGetSeek

             FOR nI := 1 TO 4

                WITH OBJECT oBrwUsuarios:oCol(nI)
                   :cSortOrder     := nil
                   :cOrder         := nil
                END

            NEXT

           oBrwUsuarios:gotop()
           oBrwUsuarios:Refresh()

         END


  Activate dialog oDlg_Usuarios center

    oUsuarios:End()
    _oSqlConex:end()

return .t.

********************************************************************************************************************
Static Function Fnct_Seek(cSeek, oGetSeek, nKey )

    local cTabla, cWhere

    cTabla    := _cPrefijo+"_usuarios"
    cWhere    := "Select * from "+cTabla+" WHERE nombre LIKE '%"+alltrim(cSeek)+"%' ;"

    _oSqlConex:=tDolphinSrv():New( _cHost, _cUser, _cPasswordUser, val(_cPuertoMysql),, _cDataBase,  { | oConex, nError |  SQL_ConnetError( oConex, nError ) })
    if _oSqlConex:lError
      return .f.
  endif

    TRY
    oUsuarios:=_oSqlConex:Query( cWhere )
    CATCH
        Fnct_MsgErrorBD("NoMySql"  , .f. , "No hay conexión a La Base de Datos" , "Sin Acceso a La Red","Error en servicio de Datos",)
        _oSqlConex:End()
        return .f.
    END TRY

  oBrwUsers:SetData(oUsuarios)
  oBrwUsers:Refresh()

return .t.

 

Re: Busqueda incremental xBrowse+recursos+mariaDB

PostPosted: Fri Oct 28, 2022 10:51 pm
by Willi Quintana
Hola Amigo:
Code: Select all  Expand view

-----
oApp:cSeek := ""
....
.....
                REDEFINE XBROWSE oLbx ;
                          DATASOURCE oLProduc;    ///                AUTOCOLS ;                AUTOSORT LINES ;
                          FASTEDIT LINES ;
                          COLOR CLR_BLACK, oApp:cFondo02 ;
                          FONT oApp:oFontBrw1 ;
                          ON CHANGE (oApp:cSeek := "", cObser  := MyCampo(oLProduc, "observaciones"), RRefresh(oProd) ) ;
                          ID 101 OF oFld:aDialogs[1]

                          oCol := oLbx:AddCol()
                          oCol:bStrData      := { || STR(oLProduc:saldo,12,2) }
                          oCol:cHeader       := "Saldo/Stock"
                          oCol:bClrStd       := { || { CLR_BLACK, oApp:cFondo02 } }
                          oCol:nDataStrAlign := AL_RIGHT
                          oCol:nWidth        := 105

                          oLbx:bKeyDown            := {|nKey|IF(nKey = 27, ( lOk := .f., oDlg:End()), (BrowSeek(nKey, oLProduc, 1), oLbx:Refresh() ) }

......
.....
//--------------------------------------------------------------------------------------------------------------------
Function BrowSeek(nKey, oDat, nCol)
local nLen, nRec

If (nKey > 47 .AND. nKey < 58 ) .OR. ( nKey > 64 .AND. nKey < 91 ) .OR. nKey = 8 .OR. nKey = 32
 If nKey = 8 .AND. LEN(oApp:cSeek) > 0
   oApp:cSeek := SUBSTR(oApp:cSeek, 1, LEN(oApp:cSeek) - 1)
 EndIf
 If nKey <> 8
   oApp:cSeek += CHR(nKey)
 EndIf
 nLen := LEN(oApp:cSeek)
 nRec := oDat:RecNo()
 oDat:GoTop()
 WHILE !oDat:EOF()
    IF SUBSTR(oDat:FieldGet(nCol),1, nLen) == oApp:cSeek
       nRec := oDat:RecNo()
       EXIT
    EndIf
    oDat:Skip()
 ENDDO
 oDat:GoTo(nRec)
EndIf

Return(nRec)


 
 

Re: Busqueda incremental xBrowse+recursos+mariaDB

PostPosted: Fri Oct 28, 2022 11:55 pm
by cmsoft
Creo que esta bueno aprovechar las funcionalidades que nos da Xbrowse, y con eso lo tienes solucionado
Simplemente indicas que quieres que sea autoincremtal y filtrada la busqueda, pero no tienes que hacer ninguna funciona aparte
Code: Select all  Expand view

DEFINE DIALOG oDlg RESOURCE "ABMS" OF oWnd1
     REDEFINE XBROWSE oBrw DATASOURCE oQry;
              COLUMNS "codigo","nombre";
              HEADERS "Codigo","Nombre";
              SIZES 80,250;
              ID 111 OF oDlg AUTOSORT
     REDEFINE SAY oBrw:oSeek PROMPT "" ID 113 OF oDlg
     oBrw:aCols[2]:SetOrder()
     oBrw:lIncrFilter := .T.
     oBrw:cFilterFld:='nombre'
     oBrw:lSeekWild   := .T.
 

Y eso hace toda la magia

Re: Busqueda incremental xBrowse+recursos+mariaDB

PostPosted: Sat Oct 29, 2022 6:04 pm
by Willi Quintana
La forma automática que tiene xbrowse para la búsqueda, funciona solo con una sola letra,,,, salvo que me equivoque
si tenemos una lista ordenada, y presiono "U", el puntero se coloca en el 1er registro que empieze con "U", pero si quiero hacer una búsqueda con más caracteres no funciona..
Salu2

Re: Busqueda incremental xBrowse+recursos+mariaDB

PostPosted: Fri Nov 04, 2022 11:45 pm
by nageswaragunupudi
XBrowse incrseek / filter etc work with more letters than one.
Please try again