[Myles wrote]
>Are the fields on which the locate is done Indexed (at either the
client or
>server end)??
>
>If you are using the briefcase model, is suspect it will have to load
all
>the records - an index may help.

The locate fields are only indexed at the server end inasmuch as they're
the result of a query with an order-by clause, and I don't have any
client end indexing (or rather if I do all the records must be brought
down anyway).

Looking at TClientDataSet.LocateRecord, I'm not sure an index would
help, as it seems to call CheckProviderEOF regardless (which loads down
everything).

>You could perhaps do some advanced fudging of the IProvider interface -
>depends on what data requests are sent from the client to the server.

Sounds hard. :)  I settled for mucking about with
TClientDataSet.LocateRecord, see below...

[Yanbo wrote]
>I have asked the similar question before, unfortuantely none answered
it. 
>
>In my project, when I do a Locate, I pass the Locate( a record number
or a >range string) params to the middleware, the middle checks the
params and >prepares a subset of the dataset( normally 1 ~ 100 records)
for the client >application. 
>
>When I started my n-tier prototype, I used the same method as yours.
>Navigation is very slow.

Latest developments
I changed the code in TClientDataSet.LocateRecord as follows:

begin
  CheckBrowseMode;
  CursorPosChanged;
//  CheckProviderEOF; // Don't want to bring all the data down
  Buffer := TempBuffer;
  Fields := TList.Create;
...
          Status := FLookupCursor.GetRecordForKey(FieldCount,
PartialLength, Buffer, Buffer);
          if SyncCursor then begin
                  while (Status <> DBIERR_NONE) and not ProviderEOF and
FetchOnDemand and (PacketRecords <> 0) do begin
                          FetchMoreData(false);
                          Status :=
FLookupCursor.GetRecordForKey(FieldCount, PartialLength, Buffer,
Buffer);
                  end;
          end;
...

Basically, every time I search and fail I download another packet.  Not
exactly what I wanted, as I'm relying _heavily_ on GetRecordForKey being
efficient, but it does seem to be a lot faster than stepping through
record by record.  And, unlike the normal locate, I'm only downloading
packets until I reach the record I want.

Any perceived flaws or suggested improvements?

Cheers,

Carl Reynolds                      Ph: +64-9-4154790
CJN Technologies Ltd.             Fax: +64-9-4154791
[EMAIL PROTECTED]                DDI: +64-9-4154795
PO Box 302-278, North Harbour, Auckland, New Zealand
12 Piermark Drive, North Harbour Estate, Auckland, NZ
Visit our website at http://www.cjntech.co.nz/

application/ms-tnef

Reply via email to