Searching for partial matches in a datagrid

Pete pete at mollysrevenge.com
Wed Aug 10 16:19:48 EDT 2011


I've had the same situation myself and ended up querying the database rather
than searching the datagrid.  Main reason was that it's possible that the
data in the database could have changed since the datagrid was loaded so
filtering the datagrid data might end up with outdated results.  Depends on
the application requirements, locking strategy, etc but that was the best
way to go for me.
Pete
Molly's Revenge <http://www.mollysrevenge.com>




On Wed, Aug 10, 2011 at 12:56 PM, Bob Sneidar <bobs at twft.com> wrote:

> 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
>
>
> _______________________________________________
> 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