Sequentially searches the table for the first record that matches the specified logical expression.
LOCATE [FOR lExpression1] [Scope] [WHILE lExpression2] [NOOPTIMIZE]
- FOR lExpression1
- Sequentially searches the current table for the first record that matches the logical expression lExpression1.
Rushmore optimizes a query created with LOCATE FOR if lExpression1 is an optimizable expression. For best performance, use an optimizable expression in the FOR clause.
- Specifies a range of records to locate. Only the records that fall within the range are located. The scope clauses are: ALL, NEXT nRecords, RECORD nRecordNumber, and REST. Commands that include Scope operate only on the table in the active work area.
The default scope for LOCATE is ALL records.
- WHILE lExpression2
- Specifies a condition whereby records are searched for as long as the logical expression lExpression2 evaluates to true (.T.).
- Disables Rushmore optimization of LOCATE.
The table doesn't have to be indexed.
If you use the LOCATE command without the FOR expression, Visual FoxPro positions the record pointer at the first logical record. This is faster than using GO TOP when a filter is in use or when DELETED is ON.
If LOCATE finds a matching record, you can use RECNO( ) to return the number of the matching record. If a matching record is found, FOUND( ) returns true (.T.), and EOF( ) returns false (.F.). If SET TALK is ON, the record number of the matching record is displayed.
After LOCATE finds a matching record, you can issue CONTINUE to search the remainder of the table for additional matching records. When CONTINUE is executed, the search process resumes, starting with the record immediately following the matching record. You can issue CONTINUE repeatedly until the end of the scope or the end of the table is reached.
If a match isn't found, RECNO( ) returns the number of records in the table plus 1, FOUND( ) returns false (.F.), and EOF( ) returns true (.T.).
LOCATE and CONTINUE are specific to the current work area. If another work area is selected, the original search process can be continued when the original work area is reselected.
In the following example, records for customers from Germany are located. The total count is then displayed.
CLOSE DATABASES OPEN DATABASE (HOME(2) + 'Data\testdata') USE customer && Open Customer table SET TALK OFF STORE 0 TO gnCount LOCATE FOR ALLTRIM(UPPER(customer.country)) = 'GERMANY' DO WHILE FOUND( ) gnCount = gnCount + 1 ? company CONTINUE ENDDO ? 'Total companies Germany: '+ LTRIM(STR(gnCount))