angenommen folgenden Artikel Nummern (ganze Blöcke von)
Code: Alles auswählen
SET EXACT ON
DbSeek( "6404", , , .T. ) // seek last
FELD ist Type "C", 5
"6403 "
...
"6403E"
...
"6404 "
.1
.2
"6404E"
.3
.4
"6505 "
"6505E"
gruss by OHR
Jimmy
Moderator: Moderatoren
Code: Alles auswählen
SET EXACT ON
DbSeek( "6404", , , .T. ) // seek last
FELD ist Type "C", 5
"6403 "
...
"6403E"
...
"6404 "
.1
.2
"6404E"
.3
.4
"6505 "
"6505E"
Code: Alles auswählen
FUNCTION DBSEEKLAST( cString )
LOCAL cIndexKey, cIndexVal, nLen
cIndexKey := IndexKey(0)
IF Empty( cIndexKey ) // Kein Index aktiv
RETURN .F. // *** RETURN ***
ENDIF
nLen := Len( cString ) // Letzten Chr() um 1
DbSeek( Left(cString,nLen-1) + ; // erh”hen f
Code: Alles auswählen
PROCEDURE MAIN
LOCAL cSeek := "0050"
CLS
IF !FILE("TEST.DBF")
C_TEST("TEST.DBF")
ENDIF
USE TEST
INDEX ON TESTNR TO TESTNR
*1
SET EXACT OFF
DBSEEK(cSeek)
? RECNO()
*2
SET EXACT ON
DBSEEK(cSeek)
? RECNO()
*3
SET EXACT OFF
DBSEEK(cSeek,,,.T.)
? RECNO()
*4
SET EXACT ON
DBSEEK(cSeek,,,.T.)
? RECNO()
*5
SET EXACT OFF
DBSEEKLAST( cSeek )
? RECNO()
*6
SET EXACT ON
DBSEEKLAST( cSeek )
? RECNO()
WAIT
RETURN
FUNCTION C_TEST(datei,alias,id)
LOCAL p,field_list:={}
LOCAL i
IF VALTYPE(datei)!="C"
datei="TEST.DBF"
ENDIF
IF VALTYPE(alias)!="C"
p=at(".",datei)
alias=if(p>0,substr(datei,1,p-1),datei)
ENDIF
IF VALTYPE(id)!="N"
id=0
ENDIF
SELECT (id)
IF !FILE(datei)
AADD(field_list,{"TESTNR","C",5,0})
DBCREATE(datei,field_list)
ENDIF
USE TEST
FOR i = 1 TO 100
APPEND BLANK
REPLACE TESTNR WITH STRZERO(i,4)
APPEND BLANK
REPLACE TESTNR WITH STRZERO(i,4)+"E"
NEXT
CLOSE
RETURN(.t.)
FUNCTION DBSEEKLAST( cString )
LOCAL cIndexKey, cIndexVal, nLen
cIndexKey := IndexKey(0)
IF Empty( cIndexKey ) // Kein Index aktiv
RETURN .F. // *** RETURN ***
ENDIF
nLen := Len( cString ) // Letzten Chr() um 1
DbSeek( Left(cString,nLen-1) + ; // erh”hen f
wie kommst Du darauf??AUGE_OHR hat geschrieben:mit verwunderlichen und IMHO falschen Ergebniss ?!
ok ich hätte den Bereicht um 0050 weiter spreizen sollen damit es nochMartin Altmann hat geschrieben:wie kommst Du darauf??AUGE_OHR hat geschrieben:mit verwunderlichen und IMHO falschen Ergebniss ?!
Du hast einen Indexschlüssel von 5 Zeichen Länge, suchst aber nur nach 4 Zeichen - was erwartest Du?
Gib Dir mal zusätzlich jeweils das Ergebnis von Found() mit aus - da siehst Du dann vielleicht ein wenig klarer...
das EXACT hab ich eigendlich wegen des Cl*pper Code wo ich ja einenMartin Altmann hat geschrieben: Deine Verwirrung kommt vielleicht daher, dass Du meinst, SET EXACT würde auch beim Seek Verwendung finden - dem ist aber latürnich nicht so!
EXACT kommt nur beim Vergleich von Zeichenketten zum Tragen - Du meinst sicherlich SOFTSEEK!
ja du hast Recht, aber für ein (DB)SEEK ist das völlig egal weil .T.Martin Altmann hat geschrieben: da hast Du falsch erwartet - es steht keine "0050" in der Datenbank, sondern eine "0050 "!
nope es bringt keinen Unterschied in dem Beispiel.Martin Altmann hat geschrieben: Mit Softseek geht es wie gewünscht.
Code: Alles auswählen
PROCEDURE MAIN
LOCAL cSeek := "0050"
CLS
IF !FILE("TEST.DBF")
C_TEST("TEST.DBF")
ENDIF
USE TEST
INDEX ON TESTNR TO TESTNR
SET EXACT OFF
DBSEEK(cSeek)
? RECNO()
SET EXACT ON
DBSEEK(cSeek)
? RECNO()
SET EXACT OFF
DBSEEK(cSeek,,,.T.)
? RECNO()
SET EXACT ON
DBSEEK(cSeek,,,.T.)
? RECNO()
SET SOFTSEEK ON
DBSEEK(cSeek)
? RECNO()
SET SOFTSEEK OFF
DBSEEK(cSeek)
? RECNO()
SET SOFTSEEK ON
DBSEEK(cSeek,,,.T.)
? RECNO()
SET SOFTSEEK OFF
DBSEEK(cSeek,,,.T.)
? RECNO()
SET EXACT OFF
DBSEEKLAST( cSeek )
? RECNO()
SET EXACT ON
DBSEEKLAST( cSeek )
? RECNO()
SET EXACT ON
SEEKLAST( cSeek )
? RECNO()
SET EXACT OFF
SEEKLAST( cSeek )
? RECNO()
WAIT
RETURN
FUNCTION C_TEST(datei,alias,id)
LOCAL p,field_list:={}
LOCAL i
IF VALTYPE(datei)!="C"
datei="TEST.DBF"
ENDIF
IF VALTYPE(alias)!="C"
p=at(".",datei)
alias=if(p>0,substr(datei,1,p-1),datei)
ENDIF
IF VALTYPE(id)!="N"
id=0
ENDIF
SELECT (id)
IF !FILE(datei)
AADD(field_list,{"TESTNR","C",5,0})
DBCREATE(datei,field_list)
ENDIF
USE TEST
FOR i = 1 TO 100
APPEND BLANK
REPLACE TESTNR WITH STRZERO(50,4)
APPEND BLANK
REPLACE TESTNR WITH STRZERO(50,4)+"E"
NEXT
CLOSE
RETURN(.t.)
FUNCTION DBSEEKLAST( cString )
LOCAL cIndexKey, cIndexVal, nLen
cIndexKey := IndexKey(0)
IF Empty( cIndexKey ) // Kein Index aktiv
RETURN .F. // *** RETURN ***
ENDIF
nLen := Len( cString ) // Letzten Chr() um 1
DbSeek( Left(cString,nLen-1) + ; // erh”hen f
dann solltest Du auch nach "0050 " suchen und nicht nach "0050"!AUGE_OHR hat geschrieben:was ich gerne als Ergebniss hätte wäre RECNO() = 199 (-> letzter "0050 ")