MariaDB Rowset Seek Method returns always .T.

MariaDB Rowset Seek Method returns always .T.

Postby shri_fwh » Tue Oct 09, 2018 6:38 am

Dear Rao Sir ,

Expecting .F. value when oRs:Seek( Alltrim ( chr( nKey) ) , .T. ) method fails to seek the desired record. But the oRs:Seek method always return .T.


Please guide me on this. Thanks in advance...!


Thanks
Shridhar
Thanks
Shridhar
FWH 19.12, BCC 7 32 bit, MariaDB
shri_fwh
 
Posts: 301
Joined: Mon Dec 07, 2009 2:49 pm

Re: MariaDB Rowset Seek Method returns always .T.

Postby vilian » Tue Oct 09, 2018 10:58 am

Hi,

I Think it's happening because you are using softseek(.T.), IF you do oRs:Seek( Alltrim ( chr( nKey) ) ) this does not happen.
Sds,
Vilian F. Arraes
vilian@vfatec.com.br
Belém-Pa-Brazil
User avatar
vilian
 
Posts: 978
Joined: Wed Nov 09, 2005 2:17 am
Location: Brazil

Re: MariaDB Rowset Seek Method returns always .T.

Postby shri_fwh » Tue Oct 09, 2018 11:11 am

Hi Vilian F. Arraes ,

I am using DBF Seek Approach where SoftSeek also returns .F. value when record not found.

Need to know more about MariaDB Rowset behavior compare to DBF Record.

Thanks
Shridhar
Thanks
Shridhar
FWH 19.12, BCC 7 32 bit, MariaDB
shri_fwh
 
Posts: 301
Joined: Mon Dec 07, 2009 2:49 pm

Re: MariaDB Rowset Seek Method returns always .T.

Postby nageswaragunupudi » Wed Oct 10, 2018 3:16 am

OT: AllTrim() for CHR(nKey) may not be necessary because CHR(nKey) is a single character and where nKey = 32, AllTrim() produces undesirable result of "" instead of the required " ".

Present behavior of RowSet Seek method:
Syntax:
oRs:Seek( uSeek, [lSoftSeek = .f.], [lWildSeek = .f.] ) --> lFound

    Works only when the rowset is sorted on any column(s).
    Seek is performed on the sorted column.
    In the case of character values, the search is caseinsensitive.

HardSeek:
oRs:Seek( uSeek ) or oRs:Seek( uSeek, .f. ):

Locates the first record from top where fieldvalue = uSeek (case insensitive). If found, moves record pointer to the matching record, sets oRs:lFound to .t. and returns .t..
If a match is not found, does not move the record pointer, sets oRs:lFound to .f. and returns .f..

In the case of descending order, the search is reversed.

SoftSeek:
oRs:Seek( uSeek, .t. )

Locates the first record from top where fieldvalue >= uSeek (case insensitive). If found, moves record pointer to the matching record, sets oRs:lFound to .t. and returns .t..
If an exact match or next higher value is not found, does not move the record pointer, oRs:lFound is set to .f. and returns .f.

For better clarity, this example can be used.
Code: Select all  Expand view  RUN

function TestSeek()

   local oCn   := FW_DemoDB()
   local oRs

   oRs         := oCn:RowSet( "states" )
   oRs:Sort    := "CODE" // Same as oRs:SetOrder( "CODE" ) / oRs:OrdSetFocus( "CODE" )
   oRs:GoTop()           // Same as oRs:MoveFirst()

   // Now the values of the field "CODE" are arranged in this order:
   //
   // AK,AL,AR,AZ,CA,CO,CT,DC,DE,FL,GA,HI,IA,ID,IL,IN,KS,KY,LA,MA,
   // MD,ME,MI,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NM,NV,NY,OH,OK,OR,PA,RI,
   // SC,SD,TN,TX,UT,VA,VT,WA,WI,WV,WY
   //


   // HardSeek
   ? oRs:Code                  // -> AK
   ? oRs:Seek( "C" ), oRs:Code // .T., CA
   ? oRs:Seek( "E" ), oRs:Code // .F., CA
   ? oRs:Seek( "X" ), oRs:Code // .F., CA

   oRs:GoTop()

   // SoftSeek
   ? oRs:Code                  // -> AK
   ? oRs:Seek( "C", .t. ), oRs:Code // .T., CA
   ? oRs:Seek( "E", .t. ), oRs:Code // .T., FL
   ? oRs:Seek( "X", .t. ), oRs:Code // .F., FL

   oRs:Close()
   oCn:Close()

return nil
 


Comparison with DBSEEK()
1) DbSeek() moves record pointer to eof() when a match is not found and in case of softseek, next higher value also is not found. oRs:Seek() does not move record pointer in such cases.
2) In the case of softseek, DbSeek() returns .f., when an exact match is not found even though the next higher value is found. oRs:Seek() returns .t. if exact match or next higher value is found and returns .f. only when the next higher value is also not found.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10659
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: MariaDB Rowset Seek Method returns always .T.

Postby shri_fwh » Thu Oct 11, 2018 3:48 am

Dear Rao Sir ,

Thanks a lot for the detailed explanation. Now I have to change the code accordingly.




Thanks
Shridhar
Thanks
Shridhar
FWH 19.12, BCC 7 32 bit, MariaDB
shri_fwh
 
Posts: 301
Joined: Mon Dec 07, 2009 2:49 pm

Re: MariaDB Rowset Seek Method returns always .T.

Postby MarioG » Tue Jun 16, 2020 12:41 am

Hello (sorry for my english)
Can I Seek for two fields?
For example: I've a Table with LAST and FIRST; How?
My select say ... ORDER BY LAST, FIRST
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: MariaDB Rowset Seek Method returns always .T.

Postby nageswaragunupudi » Tue Jun 16, 2020 1:02 am

No please.
Instead you may use
Code: Select all  Expand view  RUN

oRs:Locate( "last = 'ge' .and. first = 'aa'" ) //--> lfound
 

The search condition should be in dbf syntax.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10659
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: MariaDB Rowset Seek Method returns always .T.

Postby MarioG » Tue Jun 16, 2020 1:37 pm

Many thanks Mr. Rao
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR


Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 51 guests