Searching the Text Fields of a Record
Description
The following script shows how to search the text fields of a record to see if they contain a match to a character search value. This illustration uses the Customer table of the AlphaSports sample database. A new form named New_Customer contains a tabbed control with two pages. The first page contains a text field that sets the value of a global variable named var->search_word.
The form also contains a button with the following script. First the script gets a count of fields, then it opens the first record.
dim tbl as P dim fld as P dim fbuffer as C dim fld_count as N dim k as N dim nam as C tbl = table.current() fld_count = tbl.fields_get() tbl.fetch_first()
The script sequentially reads the records of the file until it reaches the end, then it resets to the first record. The picked field of each record is set to False. This field serves to indicate which records contain the search word. Then the script steps through the fields of the record.
while .not. tbl.fetch_eof() tbl.change_begin() tbl.picked = .f. tbl.change_end(.t.) tbl.change_begin() for k = 1 to fld_count fld = tbl.field_get(k) nam = fld.name_get()
Because not all fields contain text, the script tests for the three types that might contain text using <FIELD>.TYPE_GET(). The script uses RTF_FIELD_TO_TEXT() for the rich text memo field and <FIELD>.VALUE_GET() for the text and text memo fields. If the search word is found, then the picked field is set to True and the script exits from the FOR loop.
if (fld.type_get()= "RTF") then fbuffer = rtf_field_to_text(nam) if (var->search_word $ fbuffer) then tbl.picked = .t. exit for end if else if (fld.type_get()= "M") then fbuffer = fld.value_get() if (var->search_word $ fbuffer) then tbl.picked = .t. exit for end if else if (fld.type_get()= "C") then fbuffer = fld.value_get() if (var->search_word $ fbuffer) then tbl.picked = .t. exit for end if end if next k tbl.change_end(.t.) tbl.fetch_next() wend tbl.fetch_first()
After the search is complete, clicking on Page 2 of the tabbed control displays an embedded browse. This browse shows only the records of the table where picked is TRUE.
When the user selects one of the tabbed pages, the following script (attached to the OnTabChange event) resets the form's filter so that Page 1 shows all records and Page 2 only shows selected records.
dim ptr as P ptr = Tabbed1.this if ptr.tab_get()= 2 then :New_Customer.queryrun("Picked = .T.") else :New_Customer.queryrun(".T.") end if