[DUG] Searching ClientDataSet using locate

Neven MacEwan neven at mwk.co.nz
Fri Nov 7 11:19:21 NZDT 2008


Stephen

I got lost when you used DBISAM and sql in the same sentence :-)

This all works well until you put a slow network in the way, but its not
really and issue now is it, raw grunt trumps poor design

Neven
>> I think you'll find the filtering is a "a brute force scan of all 
>> records in code" :-)
>>     
>
> Yeah but the performance depends on the database/tdataset design. I've never
> used tclientdataset so can't comment, but for example with DBISAM running in
> client-server mode, table filters are performed on the server the same as a
> where clause in sql, whereas the onfilterrecord event is processing locally
> as is a loop in code.
>
> Steve
>
>
>
>   
>> I'd like to know where the data is soming from because I 
>> always think it 
>> is better to
>> to the selection in the database rather than loading lots of 
>> records and 
>> doing this kind of select locally
>>
>> N
>>     
>>> Hi John,
>>>
>>> Are you trying to locate the same string within multiple 
>>>       
>> fields? If so, I
>>     
>>> don't think the locate will help you there.
>>>
>>> Try using the onfilterrecord event as Neven said, or a 
>>>       
>> filter expression
>>     
>>> like this if your database allows it:
>>>
>>> .filter := 'name like ''%'+findstr+'%'' or address1 like 
>>>       
>> ''%'+findstr+'%''
>>     
>>> or...
>>>
>>> or even do a brute force scan of all records in code.
>>>
>>>
>>> hth
>>> Steve 
>>>
>>>   
>>>       
>>>> -----Original Message-----
>>>> From: John Bird [mailto:johnkbird at paradise.net.nz] 
>>>> Sent: Thursday, 6 November 2008 6:13 p.m.
>>>> To: NZ Borland Developers Group - Delphi List
>>>> Subject: Re: [DUG] Searching ClientDataSet using locate
>>>>
>>>> Yes that would work for searching two fields, but do I do "n" 
>>>> fields - ie
>>>> what I am trying to do is generalise and build a list of 
>>>> fields to search
>>>> for at runtime where the number of fields to search changes
>>>>
>>>> (ie all where Datatype = ftString) - I can build a string 
>>>> listing the wanted
>>>> string fields, and this goes in the first parameter ok.
>>>>
>>>> What I have not figured yet is how to build the second 
>>>> parameter when I am
>>>> searching in an arbitrary number of fields  I am using the 
>>>>         
>> same search
>>     
>>>> string  on all the fields,  (it has to be passed as a variant 
>>>> array with as
>>>> many entries as the number of fields being searched if I understand
>>>> correctly).
>>>>
>>>> I have tried something like
>>>>
>>>> Findstr:  String;                        //string to find in 
>>>> the dataset
>>>> AlphaFieldsList: String;           //fields list of all 
>>>> string fields, eg
>>>> 'Name;Address1;Address2;Description'
>>>>                                              //this is built 
>>>> at runtime by
>>>> looking at the dataset
>>>> vAlphaStringsList:variant;
>>>> AlphaFieldsAmx: iinteger;        //This is set to the 
>>>>         
>> number of string
>>     
>>>> fields found in this dataset
>>>>
>>>>                 ...
>>>>
>>>>   if AlphaFieldsamx >=0 then
>>>>  begin
>>>>    vAlphaStringsList := VarArrayCreate([0, AlphaFieldsAmx],  
>>>> varVariant);
>>>>    for i := 0 to AlphaFieldsAmx do
>>>>    begin
>>>>        cAlphaStringsList[i] := Findstr;
>>>>    end;
>>>>
>>>>
>>>>   cdsFind.locate(AlphaFieldsList, vAlphaStringsList, [loPartialKey,
>>>> loCaseInsensitive])
>>>>
>>>> I suspect I am doing something wrong building the variant 
>>>> parameter and I am
>>>> new to working with variants...
>>>>
>>>> But it don't seem to work.....any suggestions how to build 
>>>>         
>> the second
>>     
>>>> parameter?
>>>>
>>>> I have thought of doing the search by filtering, but some of 
>>>> the datasets I
>>>> want to search on are already filtered which makes it harder 
>>>> to use filters
>>>> for new functions..
>>>>
>>>> John
>>>>     
>>>>         
>>>>> .Locate('Field1;Field1', VarArrayOf([Variable1, Variable2])
>>>>>
>>>>> Works fine for me (all over the place but just with std TDataset)
>>>>>       
>>>>>           
>>>> _______________________________________________
>>>> NZ Borland Developers Group - Delphi mailing list
>>>> Post: delphi at delphi.org.nz
>>>> Admin: http://delphi.org.nz/mailman/listinfo/delphi
>>>> Unsubscribe: send an email to delphi-request at delphi.org.nz 
>>>> with Subject: unsubscribe
>>>> No virus found in this incoming message.
>>>> Checked by AVG - http://www.avg.com 
>>>> Version: 8.0.175 / Virus Database: 270.8.4/1749 - Release 
>>>> Date: 5/11/2008 7:17 a.m.
>>>>
>>>>
>>>>     
>>>>         
>>> _______________________________________________
>>> NZ Borland Developers Group - Delphi mailing list
>>> Post: delphi at delphi.org.nz
>>> Admin: http://delphi.org.nz/mailman/listinfo/delphi
>>> Unsubscribe: send an email to delphi-request at delphi.org.nz 
>>>       
>> with Subject: unsubscribe
>>     
>>>   
>>>       
>> _______________________________________________
>> NZ Borland Developers Group - Delphi mailing list
>> Post: delphi at delphi.org.nz
>> Admin: http://delphi.org.nz/mailman/listinfo/delphi
>> Unsubscribe: send an email to delphi-request at delphi.org.nz 
>> with Subject: unsubscribe
>> No virus found in this incoming message.
>> Checked by AVG - http://www.avg.com 
>> Version: 8.0.175 / Virus Database: 270.8.4/1749 - Release 
>> Date: 5/11/2008 7:17 a.m.
>>
>>
>>     
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at delphi.org.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject: unsubscribe
>
>
>   



More information about the Delphi mailing list