Subject Re: Current record refresh in TIBOQuery
Author bdunstan@medisys.com.au
Geoff,

I appear to have found a simple solution:

qryEncounter.InvalidateBookmark(qryEncounter.Bookmark); // Just
refresh the current record

This seams to work OK. I didn't know this was supported by TIBOQuery
but it works (at least I haven't been able to fault it yet).

Thanks for your help :-)

Brian


--- In IBObjects@y..., "Geoff Worboys" <geoff@t...> wrote:
> > Sounds like an interesting idea, but I don't know how to
> > implement it. In this case the master would be a set of
> > records, just the keys I suppose, and the detail dataset
> > would have the same records with all the required fields.
> > But the detail dataset is connected to a grid and must
> > be scrollable. I don't know how that can be done.
>
> Hmmm, yes you understood the idea as I meant it, but the grid
> requirement does sort of upset things a bit.
>
> I dont think JoinLinks will help you. That property is there for
> people wanting to do implicit joins rather than 'JOIN xxxx ON'
syntax.
>
> Here is a different idea, still using two datasets but without
master
> detail relationship.
>
> You have your main selection dataset, presumably with just the keys
> although that may depend on other requirements. The where clause
with
> this dataset will apply the full restrictions required.
>
> You have a second independant dataset selecting all the required
> fields and using the IDENTICAL keylinks definition of the first.
The
> where clause for this dataset would be almost the same as the main,
> but would not check the status field that is causing you problems.
> Make sure FetchWholeRows is true. To this dataset you attach code
to
> the OnFilterRecord event that does something like...
>
>
> uses IB_Utils; // for BinaryToHexText function
>
> procedure Form1.SecondDatasetOnFilterRecord( ARow: TIB_Row;
> var Accept: boolean );
> var
> tmpBkmk: string;
> begin
> // Calculate bookmark string for supplied row
> tmpBkmk := BinaryToHexText( ARow.RowNode.KeyData,
> SecondDataset.NodeList.KeyDataLength );
> // Try to get main dataset to match rows
> MainDataset.BufferBookmark := tmpBkmk;
> // If row not found in maindataset then dont accept it.
> if MainDataset.BufferRowNum = 0 then
> Accept := false
> else
> Accept := true;
> end;
>
>
> I have not tried building a bookmark in this way before, but AFAICT
> the code shown above should be OK. If Jason is watching; how about
a
> direct function for this purpose?
>
> Obviously this is not totally efficient, since the SecondDataset
will
> be retrieving more records than it needs from the server, and then
> discarding those that are not found in the MainDataset. However it
> will allow you to refresh the second dataset independantly of the
> MainDataset (keeping records that are still selected by the
> unrefreshed main dataset) and will also allow you to attach the
second
> dataset to a grid for normal scrolling etc.
>
>
> I have NOT tried this before so I cannot be certain it will work
> exactly how you want. Its the best I can come up with at short
notice
> :-)
>
> Geoff Worboys
> Telesis Computing