Xbrowse no busca bien con Dolphin con campo BigInt

Xbrowse no busca bien con Dolphin con campo BigInt

Postby cmsoft » Sat Mar 19, 2016 2: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: Select all  Expand view
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
User avatar
cmsoft
 
Posts: 1285
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Xbrowse no busca bien con Dolphin con campo BigInt

Postby cmsoft » Tue Mar 22, 2016 10:16 am

+1
User avatar
cmsoft
 
Posts: 1285
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Xbrowse no busca bien con Dolphin con campo BigInt

Postby MGA » Thu Oct 20, 2016 6:55 pm

+1
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1249
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: Xbrowse no busca bien con Dolphin con campo BigInt

Postby carlos vargas » Sat Oct 22, 2016 6: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: Select all  Expand view

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)
User avatar
carlos vargas
 
Posts: 1719
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 24 guests