Method LT2_CursorReordersDNRs builds and indexes the cursor: LOCAL ; lnSelect lnSelect = SELECT(0) WAIT WINDOW NOWAIT "Building Indices..." * Open tables: USE (ALLTRIM(goApp.LT2_cLT1_DataRoot) + ALLTRIM(goApp.LT2_cYearName) + ; "\Reorders") IN 0 SHARED SELECT ; A.Reord_No, ; A.CustName, ; PADR(ALLTRIM(B.Sch_Name) + ", " + ; ALLTRIM(B.Sch_City) + ", " + ; ALLTRIM(B.Sch_Prov) + " " + ; ALLTRIM(B.Sch_Phone), 70, " ") AS cSchool, ; A.OrdrDate ; FROM Reorders A ; INNER JOIN Schools B ; ON B.Sch_ID == A.Sch_ID ; INTO CURSOR _SearchRD USE (DBF("_SearchRD")) ALIAS SearchRD IN 0 AGAIN SELECT SearchRD INDEX ON UPPER(CustName) TAG CustName INDEX ON UPPER(cSchool + CustName) TAG cSchool WAIT CLEAR SELECT (lnSelect) * Method LT2_IncrementalSearch performs the search: LPARAMETERS ; tcSearchString LOCAL ; lnSelect, ; lcOldOnError, ; llSoftSeekFailed, ; lcSearchAlias lnSelect = SELECT(0) DO CASE CASE This.opgType.Value = 1 lcSearchAlias = "SearchSD" CASE This.opgType.Value = 2 lcSearchAlias = "SearchRD" CASE This.opgType.Value = 3 lcSearchAlias = "SearchGr" ENDCASE SELECT (lcSearchAlias) IF EMPTY(tcSearchString) GO TOP IN (lcSearchAlias) ELSE <b>IF SEEK(UPPER(tcSearchString), lcSearchAlias)</b> * OK ELSE * Not found, do a soft seek to get a close record: lcOldOnError = ON("ERROR") llSoftSeekFailed = .F. ON ERROR llSoftSeekFailed = .T. GO RECNO(0) IN (lcSearchAlias) IF llSoftSeekFailed GO BOTTOM IN (lcSearchAlias) ENDIF ENDIF ENDIF * Pop the focus to the grid so the RecordMark shows properly: =This.grdSearch.SetFocus() =This.txtcSearchString.SetFocus() SELECT (lnSelect)The incremental search method supports searching in 3 cursors with a total of 5 index tags. Other controls ensure that the correct tag is active for the desired search.