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