FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Seek en consulta dolphin
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Seek en consulta dolphin
Posted: Wed Dec 11, 2013 05:20 PM
Amigos, requiero de su ayuda
estoy usando dolphin para visualizar datos en xbrowse, esta es la imagen

necesito hacer busquedas ya sea en el campo "No Cliente" (numerico), "Nombre de cliente" (caracter), "No Cédula" (caracter)
uso esta funcion que encontre en el foro.
Code (fw): Select all Collapse
FUNCTION QSeek( c, oBrw, oSay, cQryWhere )
   LOCAL oQry := oBrw:oMySql
   LOCAL cSortOrder, nStart
   LOCAL uData, nNum, lRet

   STATIC aLastRec := {}

   nNum := AScan( oBrw:aCols, {| o | !Empty( o:cOrder ) } )

   IF nNum < 1
      RETURN FALSE
   ENDIF

   cSortOrder := oBrw:aCols[ nNum ]:cSortOrder

   IF Len( c ) == 1
      aLastRec := {}
   ENDIF

   IF Len( aLastRec ) < Len( c )
      IF Len( aLastRec ) == 0
         nStart := 1
      ELSE
         nStart := oQry:RecNo()
      ENDIF
      AAdd( aLastRec, nStart )
   ELSE
      ASize( aLastRec, Len( c ) - 1 )
      IF Len( aLastRec ) == 0
         nStart := 1
      ELSE
         nStart := ATail( aLastRec )
      ENDIF
   ENDIF

   IF HB_IsObject( oSay )
      oSay:SetText( Upper( c ) )
   ENDIF

   lRet := ( oQry:Seek( c, cSortOrder, nStart - 1, oQry:LastRec(), !oQry:FieldType( cSortOrder  )=='N', .T. ) != 0 )

RETURN lRet


este es el codigo de la implementacion el el browse
Code (fw): Select all Collapse
...
   REDEFINE XBROWSE oBrw ID 101 OF oDlg DATASOURCE oQryClie AUTOSORT ;
      ON DBLCLICK Clientes_Editar( FALSE ) FONT oFontD

   ADD TO oBrw DATA oQryClie:NUM_CLIE  TITLE "Nº Cliente"        SIZE 096 PICTURE "@L 999999" CENTER
   ADD TO oBrw DATA oQryClie:NOMBRE    TITLE "Nombre de cliente" SIZE 250
   ADD TO oBrw DATA oQryClie:CEDULA    TITLE "Cédula"            SIZE 120
   ADD TO oBrw DATA oQryClie:CIUDAD    TITLE "Ciudad"            SIZE 055
   ADD TO oBrw DATA oQryClie:RUTA      TITLE "Ruta"              SIZE 055
   ADD TO oBrw DATA oQryClie:ACTIVO    TITLE "Act"               SIZE 030 CENTER
   ADD TO oBrw DATA oQryClie:TIENENOTA TITLE "Nota"              SIZE 030 CENTER

   WITH OBJECT oBrw
      :MyConfig( TRUE )

      :aCols[ 01 ]:cSortOrder := "NUM_CLIE"
      :aCols[ 02 ]:cSortOrder := "NOMBRE"
      :aCols[ 03 ]:cSortOrder := "CEDULA"
      :aCols[ 06 ]:SetCheck( { "BMS_BULLETGREEN", "BMS_BULLETPINK" } )
      :aCols[ 07 ]:SetCheck( { 0, "BMS_POSTIT"      } )

      :bKeyDown      := {|nKey| Clientes_ProcesaTecla( nKey ) }
      :bSeek         := {|c| QSeek( Upper( c ), oBrw, oItem ) }
      :bOnChanged    := {|| IIf( Empty( oBrw:cSeek ), oItem:SetText( oBrw:cSeek ), NIL ) }
      :lHScroll      := FALSE
      :nHeaderHeight := 36
      :nFreeze       := 7
   END
...


El caso es que la busqueda funciona bien si:

estando ordenada la columnas caracter busco caracter.
estando ordenada la columna numerico busco numeros.

pero falla y se bloquea el programa si:

estando ordenada la columnas caracter busco numero. (inicio presionando un numero)
estando ordenada la columnas numerica busco caracter. (inicio presionando una letra)

por favor cualquier ayuda sera bienvenida.
Aclaro que al inicio uso Set_MyLang( "es_ES" )

salu2
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Seek en consulta dolphin
Posted: Wed Dec 11, 2013 05:31 PM

Carlos

Probare si existe alguna falla con dolphin

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Seek en consulta dolphin
Posted: Wed Dec 11, 2013 05:45 PM

Gracias Daniel, la verdad este es el unico problema encontrado.
Estoy muy agradecido contigo por tdolphin, tan sorprendido y satisfecho estoy que
recomiendo esta herramienta en lugar de ads encarecidamente.

salu2

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 581
Joined: Tue Oct 11, 2005 11:28 AM
Re: Seek en consulta dolphin
Posted: Wed Dec 11, 2013 09:32 PM

De acuerdo contigo, Carlos. Muchas gracias Daniel por tan portentosa herramienta.

Kleyber Derick



FWH / xHb / xDevStudio / SQLLIB
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Seek en consulta dolphin
Posted: Tue Dec 17, 2013 11:10 PM
de alguna forma esta funcion cuando la columna es caracter y lo que se va a buscar es numerico entra en un loop
asi como cuando la columna es numerica y que se va a buscar es caracter entra en loop tambien, no he podido ser capaz de encontrar el error, por favor alguien con conocimientos mas avanzados nos diera una mano.

Code (fw): Select all Collapse
//------------------------------------------------//
// mysql_result, field pos, cSearch, nStart, nEnd
HB_FUNC( MYSEEK2 ) 
{
    MYSQL_RES * result = ( MYSQL_RES * ) hb_MYSQL_RES_par( 1 );
    unsigned int uii, uii2;
    int uiStart;
    int uiStart2;
    int uiEnd, uiOk = -1;
    unsigned int uiField = hb_parni( 2 ) - 1;
    char * cSearch = ( char *) hb_parc( 3 );
    BOOL bSoft     = hb_parl( 6 );
    BOOL bInverted = hb_pcount() > 6 ? hb_parl( 7 ) : FALSE;
    int iMid;
    int iLastFound;
    char * l;
   
    ChkInverted( &uiEnd, &uiStart, ( ISNUM( 4 ) ? ( unsigned int ) hb_parni( 4 ) - 1 : 0 ), bInverted );
   
    if(result > 0)
    {
        if( ! ISNUM( 5 ) )
        {
            ChkInverted( &uiStart, &uiEnd, mysql_num_rows( result ), bInverted );
        }
        else
        { 
            ChkInverted( &uiStart, &uiEnd, hb_parni( 5 ), bInverted );
        }

        //we need check first record
        uii = InternalSeek( result, 0, uiField, bSoft, cSearch );
      
        if( uii == 0 )
        { 
            uiOk = 0;
        }
      
        iMid = ( uiEnd + uiStart ) / 2;
      
        while( ( bInverted ? uiStart > iMid : uiStart < iMid ) && uiOk < 0 )
        {
            uii = InternalSeek( result, iMid, uiField, bSoft, cSearch );

            if( uii == ( bInverted ? 1 : -1 ) )
                ChkInverted( &uiEnd, &uiStart, iMid, bInverted );
            else if( uii == ( bInverted ? -1 : 1 ) )
                ChkInverted( &uiStart, &uiEnd, iMid, bInverted );
                uiEnd = iMid; // 
            else 
            {
                iLastFound = iMid;
                uiStart2 = iLastFound - 1;

                while( iLastFound > uiStart2 )
                {
                    uii2 = InternalSeek( result, uiStart2, uiField, bSoft, cSearch );
                
                    if( uii2 != 0 )
                    {
                        break;
                    }  
                    else
                    { 
                        iLastFound = uiStart2;
                    }
                    
                    uiStart2 = iLastFound - 1;
                    
                    if( uiStart2 < 0 )
                    {
                        break;
                    }
                }
                uiOk = iLastFound;
                break;
            }           
            iMid = ( uiEnd + uiStart ) / 2;
        }        
    }
   
    uiOk = uiOk >= 0 ? uiOk + 1 : 0;
    hb_retnl( ( long ) uiOk  );
}
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Seek en consulta dolphin
Posted: Wed Dec 18, 2013 12:48 PM

Hola Carlos

Disculpa a mi el codigo de dolphin me funciona bien

puedes probar los ejemplos testseek (modo consola) y testsk2 (fivewin)

o prepara un ejemplo que reproduzca el error

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Seek en consulta dolphin
Posted: Wed Dec 18, 2013 04:21 PM

ok, daniel.
preparare un ejemplo.

salu2

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 400
Joined: Tue Oct 16, 2007 05:51 PM
Re: Seek en consulta dolphin
Posted: Mon May 26, 2014 03:06 PM
Hola Daniel,

Hola Carlos, no se si pudiste solventar este error, a mi me pasa lo mismo usando tdolphin, inclusive baje la ultima version de tdolphin,
la unstable/1.1 y tampoco funciona.

La busqueda incremental con xbrowse por diferentes tipos de columna en una tabla (una tipo numerica y otra tipo caracter)
usando la funcion que incluyes en este tema me da el mismo error cuando estoy en la columna numerica y tipeo un caracter se queda en in lopp
y produce un error, lo mismo pasa cuando la columna es de tipo caracter y tipeo un numero.

Probe comentando la linea obrw:bSeek para que tome el codeblock por defecto del xbrowse y alli solo ordena pero no acepta los valores que
tipeo, es decir no funciona.

La tabla tiene dos indices uno por la columna "Codigo" y otro por la columna "Nombre"

Aqui el codigo :

Code (fw): Select all Collapse
  TRY
    oQry = oServer:Query( "SELECT * FROM " + TABLE_USUARIOS + " ORDER BY Codigo" )
  CATCH oError
      ShowError( oError, "SELECT * FROM " + TABLE_USUARIOS + " ORDER BY Codigo" )
      Return Nil
  END
    
  
  oQry:GoTop()
      
  REDEFINE XBROWSE oBrw OF oDlg ID 100;
    DATASOURCE oQry; 
    AUTOSORT LINES 
        
  ADD TO oBrw DATA oQry:Codigo TITLE "Codigo" SIZE 080 LEFT 
  ADD TO oBrw DATA oQry:Nombre TITLE "Nombre" SIZE 400  
  ADD TO oBrw DATA oQry:Cedula TITLE "Cedula" SIZE 100 RIGHT
  
  with object oBrw:Nombre
    :cSortOrder = "Nombre"
  end
          
  with object oBrw
    :nMarqueeStyle := MARQSTYLE_HIGHLROW
    :bClrStd = {|| If( oBrw:KeyNo() % 2 == 0, ;
                       { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ), RGB( 198, 255, 198 ) }, ;
                       { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ), RGB( 232, 255, 232 ) } ) }
    :bClrSel = {|| { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ), RGB( 0x33, 0x66, 0xCC ) } }
    cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ]
    :bClrSelFocus = {|| { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ), cClrBack } }
    :SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
    :aCols[ 01 ]:cSortOrder = "Codigo"
    // :bSeek  := { | c | SeekDolphin( c, oBrw ) }
    :bSeek  := { | c | QSeek( c, oBrw ) }
    :bLDblClick = {|| Nil }
  end


Aqui la funcion QSeek que encontre en el foro :

Code (fw): Select all Collapse
FUNCTION QSeek( c, oBrw, oSay, cQryWhere )
   LOCAL oQry := oBrw:oMySql
   LOCAL cSortOrder, nStart
   LOCAL uData, nNum, lRet

   STATIC aLastRec := {}

   nNum := AScan( oBrw:aCols, {| o | !Empty( o:cOrder ) } )

   IF nNum < 1
      RETURN FALSE
   ENDIF

   cSortOrder := oBrw:aCols[ nNum ]:cSortOrder

   IF Len( c ) == 1
      aLastRec := {}
   ENDIF

   IF Len( aLastRec ) < Len( c )
      IF Len( aLastRec ) == 0
         nStart := 1
      ELSE
         nStart := oQry:RecNo()
      ENDIF
      AAdd( aLastRec, nStart )
   ELSE
      ASize( aLastRec, Len( c ) - 1 )
      IF Len( aLastRec ) == 0
         nStart := 1
      ELSE
         nStart := ATail( aLastRec )
      ENDIF
   ENDIF

   IF HB_IsObject( oSay )
      oSay:SetText( Upper( c ) )
   ENDIF

   lRet := ( oQry:Seek( c, cSortOrder, nStart - 1, oQry:LastRec(), !oQry:FieldType( cSortOrder  )=='N', .T. ) != 0 )

RETURN lRet


Saludos Cordiales,
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Seek en consulta dolphin
Posted: Mon May 26, 2014 03:51 PM
dejame recordar que fue lo que hice, estos son cambios a otras funciones que uso
Code (fw): Select all Collapse
/*-------------------------------------------------------------------------------------------------*/

PROCEDURE QBrowse_OnKeyCharPress( nKey, oBrw, lUpperSeek, oQry )
   LOCAL lOldEscape := SetDialogEsc( TRUE )
   LOCAL oGet, cGet
   LOCAL oDlgS
   LOCAL cType, cOrder, cPicture, lDesc

   DEFAULT lUpperSeek := TRUE

   IF nKey < 32
      RETURN
   ELSE
      cOrder := AllTrim( StrTran( oQry:cOrder, " DESC", "" ) )
      lDesc  := ( " DESC" $ oQry:cOrder )
      IF Empty( cOrder )
         RETURN
      ELSE
         cType  := oQry:FieldType( cOrder )
         DO CASE
         CASE cType=="C"
            IF !( Upper( Chr( nKey ) ) $ "ABCDEFGHIJKLMNÑOPQRSTUVXYZ0123456789-" )
               RETURN
            ENDIF
            IF lUpperSeek
               cPicture := "@!"
            ENDIF
         CASE cType=="N"
            IF !( Chr( nKey ) $ "0123456789" )
               RETURN
            ENDIF
            cPicture := "99999999"
         ENDCASE
      ENDIF
   ENDIF

   cGet := PadR( IIf( lUpperSeek, Upper( Chr( nKey ) ), Chr( nKey ) ), 30 )

   DEFINE DIALOG oDlgS NAME "DLG_BUSC_BRW" OF IIf( ValType( oDlg ) <> "U" .and. ValType( oDlg )=="O", oDlg, GetWndDefault() ) FONT oFontD

   REDEFINE GET oGet VAR cGet ;
      ID 101 OF oDlgS ;
      PICTURE cPicture

   REDEFINE BUTTONBMP ;
      ID 201 OF oDlgS ;
      BITMAP "BMS_OK" ;
      ACTION ( QBrowse_SearchInCol( cGet, oBrw, oQry, cType, cOrder, lDesc ), oDlgS:END(), oBrw:SetFocus() )

   ACTIVATE DIALOG oDlgS ON INIT ( oDlgS:ToolWindow(), oGet:SetPos( 2 ), 0 )

   SetDialogEsc( lOldEscape )

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE QBrowse_SearchInCol( cGet, oBrw, oQry, cType, cOrder, lDesc )

   DO CASE
   CASE cType=="C"
      IF oQry:Seek( cGet, cOrder,,, TRUE ) = 0
         MsgInfo( "Dato no encontrado!" )
      ELSE
         oBrw:Refresh()
      ENDIF
   CASE cType=="N"
      IF oQry:Seek( Val( cGet ), cOrder,,, FALSE ) = 0
         MsgInfo( "Dato no encontrado!" )
      ELSE
         oBrw:Refresh()
      ENDIF
   ENDCASE

RETURN
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion