Searching for partial matches in a datagrid

zryip theSlug zryip.theslug at gmail.com
Wed Aug 10 15:28:00 EDT 2011


Hi Bob,

Maybe time for sharing some hidden scripts.

Here is a part of the DGH engine script that could probably do the trick:

command dgh_FindLine pWhichDataGrid, pKeyIndexA, pSearchType, pSearchString
  local tTheIndexList, tIndex, tTheLineList

  _dgh_FindIndex pWhichDataGrid, pKeyIndexA, pSearchType, pSearchString
  put the result into tTheIndexList

  repeat for each item tIndex in tTheIndexList
     put the dgLineOfIndex[tIndex] of pWhichDataGrid into item (the
number of items of tTheLineList + 1) of tTheLineList
  end repeat

  if (tTheLineList is empty) then
     return 0
  else
     return tTheLineList
  end if

end dgh_FindLine

private command _dgh_FindIndex
pWhichDataGrid,pTpKeyIndexA,pSearchType,pSearchString
  local foundAMatch, theFoundIndex, i, theIndex, tIndexValue,
tSearchType, tNotSearch, tSearchString, tError

  if (pSearchType is among the items of _zuSearchContentOperatorList()) then
     try
        put the dgData of pWhichDataGrid into sDataArray

        repeat for each key theIndex in sDataArray
           repeat with i = 2 to the paramCount step 3
              put sDataArray[theIndex][param(i)] into tIndexValue
              put param(i+1) into tSearchType
              put param(i+2) into tSearchString

              if (first word of tSearchType is "not") then
                 put "not " into tNotSearch
                 delete first word of tSearchType
              else
                 put empty into tNotSearch
              end if

              put value(tNotSearch & "(" & quote & tIndexValue &
quote && tSearchType && quote & tSearchString & quote & ")") into
foundAMatch

              exit repeat
           end repeat

           if foundAMatch then
              put theIndex into item (number of items of
theFoundIndex + 1) of theFoundIndex
           end if
        end repeat

        if (theFoundIndex is empty) then
           return 0
        else
           return theFoundIndex
        end if

     catch tError
        answer tError
     end try

  else
     answer pSearchType && "is not in" && _zuSearchContentOperatorList())
  end if

end _dgh_FindIndex

private function _zuSearchContentOperatorList
  return "is,begins with,ends with,contains,is not,not begins
with,not ends with,not contains,=,>,>=,<,<=,<>"
end _zuSearchContentOperatorList

It is an implementation of the FindIndex and FindLine handler of the
Datagrid library with additional capabilities. The capacity of
searching with multiple queries is removed. I'm using another couple
of handlers for doing that.
Note that all the existing operators can be use: contains, begins
with, ends with, >, <, =, is, etc

Usage examples:

put the long id of grp "myDataGrid" into tDataGridRef
dgh_FindLine tDataGridRef, "Col1", "contains", "a"
put the result into tTheLineFound
set the dgHilitedLines of tDataGridRef to tTheLineFound

On Wed, Aug 10, 2011 at 12:43 AM, Bob Sneidar <bobs at twft.com> wrote:
> Hi all.
>
> I am hoping there will be a way to search a datagrid for PARTIAL matches. I already can find EXACT matches, and I tried regex on the findIndex command, to no avail. I know that if I cannot I can always get the dgText of the datagrid, but there is a problem with that method. First, the datagrid may contain a huge amount of data, and it seems inefficient to work with strings if I can use arrays instead. Second, if I need to set the dgText of the datagrid to what I find, it will wipe all my hidden data columns, that is array keys which I do not have a column for in the datagrid. I depend on these.
>
> So I can kludge a way to do this, but I was hoping I was simply missing something.


Best Regards,
-- 
-Zryip TheSlug- wish you the best! 8)
http://www.aslugontheroad.co.cc




More information about the use-livecode mailing list