Searching for partial matches in a datagrid

Bob Sneidar bobs at twft.com
Wed Aug 10 15:56:08 EDT 2011


Oh hey that's awesome! I ended up crafting a SQL query to do it by querying the database, but of course, that may be a bit slower than filtering the datagrid itself with all the records in an array stored locally. 

I will have to test both methods and see how it goes. I am really leaning towards finding in the datagrid though. Thanks for this. 

Bob


On Aug 10, 2011, at 12:28 PM, zryip theSlug wrote:

> 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
> 
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode





More information about the Use-livecode mailing list