FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Xbrowse no busca bien con Dolphin con campo BigInt
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Xbrowse no busca bien con Dolphin con campo BigInt
Posted: Sat Mar 19, 2016 02:38 AM
Estimados:
Utilizando la clase Xbrowse y Dolphin cuando hago búsquedas por un campo de tipo BigInt, no me posiciona bien en el registro que tiene el valor buscado.
La tabla tiene cargado códigos de barra de productos, y los valores son del tipo 7790387014327.
El xbrowse en la FUNCTION DolphinSeek hace la busqueda con:
Code (fw): Select all Collapse
oQry:Seek( c, cSortOrder, nStart, oQry:LastRec(), !oQry:FieldType( cSortorder  )=='N', .T. )

En codigos cortos del tipo 77912954 los encuentra bien, pero en los largos como el de arriba no los encuentra.
Alguna pista?
Gracias de antemano.


Harbour 3.1.0dev (Rev. 17114)
Borland 5.82
FiveWin Version: FWH 11.11
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Xbrowse no busca bien con Dolphin con campo BigInt
Posted: Tue Mar 22, 2016 10:16 AM

+1

Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: Xbrowse no busca bien con Dolphin con campo BigInt
Posted: Thu Oct 20, 2016 06:55 PM

+1

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Xbrowse no busca bien con Dolphin con campo BigInt
Posted: Sat Oct 22, 2016 06:23 PM
puede por favor reemplazar estas funciones en function.c, recompilar y prubar?
nos comenta por favor como ha ido el cambio, gracias.

Code (fw): Select all Collapse
static void ChkInverted( long * lStart, long * lEnd, unsigned long ulValue, BOOL bInvert )
{
   if( bInvert )
   {
      *lStart = ulValue;
   }
   else
   {
      *lEnd = ulValue;
   }
}

unsigned int InternalSeek( MYSQL_RES* mresult, int iData, unsigned int uiField, BOOL bSoft, char * szSearch )
{
   MYSQL_ROW row;
   unsigned long * pulFieldLengths;
   int iRet = -1;
   unsigned int uiLen = strlen( szSearch );
   char * szTempSearch = (char *) hb_xgrab( sizeof( char * ) * uiLen );
   char * szSource;

   hb_strncpy( szTempSearch, szSearch, uiLen );

   mysql_data_seek( mresult, iData );

   row = mysql_fetch_row( mresult );
   pulFieldLengths = mysql_fetch_lengths( mresult ) ;

   if( pulFieldLengths[ uiField ] != 0 )
   {
      if( bSoft )
      {
         szSource = (char *) hb_xgrab( sizeof( char * ) * uiLen );
         hb_strncpy( szSource, row[ uiField ], uiLen );
         hb_strLower( szSource, uiLen  );
         hb_strLower( szTempSearch, uiLen );
      }
      else
      {
         szSource = (char *) hb_xgrab( sizeof( char * ) * pulFieldLengths[ uiField ] );
         hb_strncpy( szSource, row[ uiField ], pulFieldLengths[ uiField ] );
      }

      if( IS_NUM( mresult->fields[ uiField ].type ) )
      {
         iRet = _fltcmp( atof( szTempSearch ), atof( szSource ) );
      }
      else
      {
         setlocale( LC_COLLATE, szLang );
         iRet = strcoll( (const char *) szSource, (const char *) szTempSearch );
      }

      hb_xfree( szSource );
   }

   hb_xfree( szTempSearch );

   return (unsigned int) iRet;
}

HB_FUNC( MYSEEK2 )
{
   MYSQL_RES * mresult = (MYSQL_RES *) hb_MYSQL_RES_par( 1 );
   unsigned int uiField = (unsigned int) hb_parni( 2 ) - 1;
   char * szSearch = (char *) hb_parc( 3 );
   BOOL bSoft = hb_parl( 6 );
   BOOL bInverted = hb_pcount() > 6 ? hb_parl( 7 ) : FALSE;
   unsigned int uiRet, uiRet2;
   long lOk = -1;
   long lStart, lStart2, lMid, lEnd;
   long lLastFound;

   ChkInverted( &lEnd,
                &lStart,
                ( HB_ISNUM( 4 ) ? (unsigned long) hb_parnl( 4 ) - 1 : 0 ),
                bInverted );

   if( mresult )
   {
      if( !HB_ISNUM( 5 ) )
      {
         ChkInverted( &lStart, &lEnd, mysql_num_rows( mresult ), bInverted );
      }
      else
      {
         ChkInverted( &lStart, &lEnd, (unsigned long) hb_parnl( 5 ), bInverted );
      }

      uiRet = InternalSeek( mresult, 0, uiField, bSoft, szSearch );

      if( uiRet == 0 )
      {
         lOk = 0;
      }

      lMid = ( lEnd + lStart ) / 2;

      while( ( bInverted ? lStart > lMid : lStart < lMid ) && lOk < 0 )
      {
         uiRet = InternalSeek( mresult, lMid, uiField, bSoft, szSearch );

         if( uiRet == (unsigned int) ( bInverted ? 1 : -1 ) )
         {
            ChkInverted( &lEnd, &lStart, (unsigned long) lMid, bInverted );
         }
         else if( uiRet == (unsigned int) ( bInverted ? -1 : 1 ) )
         {
            ChkInverted( &lStart, &lEnd, (unsigned long) lMid, bInverted );
         }
         else
         {
            lLastFound = lMid;
            lStart2 = lLastFound - 1;

            while( lLastFound > lStart2 )
            {
               uiRet2 = InternalSeek( mresult, lStart2, uiField, bSoft, szSearch );

               if( uiRet2 != 0 )
               {
                  break;
               }
               else
               {
                  lLastFound = lStart2;
               }

               lStart2 = lLastFound - 1;

               if( lStart2 < 0 )
               {
                  break;
               }
            }
            lOk = lLastFound;
            break;
         }
         lMid = ( lEnd  + lStart ) / 2;
      }
   }

   lOk = lOk >= 0 ? lOk + 1 : 0;

   hb_retnl( (unsigned long) lOk );
}
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion