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
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.