Subject Re: [IBO] TIBOTable Problem changing IndexName after using SetRange
Author cdevlpr
Hi Jason,
I thought it might be helpful to know if this SetRange problem is
still in place in the current release. I downloaded the eval kit for
version 4.8.6 and it does exhibit the same problem as our older
version.

Hope this information is useful -- Jeff Gaiche

--- In IBObjects@yahoogroups.com, "cdevlpr" <jgaiche@...> wrote:
>
> Hi Jason,
> I have placed a SetRangeTest.zip file in the files section. It
> contains both an executable and all of the Delphi 7 project/source
> files. All it needs is a path specified to an existing firebird DB
> and a valid username / password. The test app will create a table
> called "TestTable" and insert a couple of rows into it...and then
do
> a couple of setRange calls to demonstrate the problem. Thanks for
> your help.....Its greatly appreciated.
>
> Jeff Gaiche
>
>
> --- In IBObjects@yahoogroups.com, "Jason Wharton" <supportlist@>
> wrote:
> >
> > I believe a working sample is the only way I am going to be able
to
> > productively help with this issue. Is that possible? If there's
a
> fix I
> > can give you to your current source base then I'll do what I can
to
> get it
> > to you so you don't have to upgrade.
> >
> > Thanks,
> > Jason Wharton
> >
> > > I am encountering a problem with TIBOTable that occurs after
> > > setting a range and then changing the IndexName property. I
> > > have a function that gets called multiple times and has the
> > > same TIBOTable object passed to it. Each time the function
> > > is called it saves off the original IndexName property,
> > > changes the IndexName , does a SetRange, and then restores
> > > the IndexName to the original value. The first time the
> > > function is called everything works as expected. There is an
> > > odd problem on subsequent calls when the IndexName is set.
> > > On the subsequent calls, the SetRange is still in effect from
> > > previous passes. After the IndexName is set, it appears that
> > > there are no records in the table (i.e. mytable.RecordCount
> > > =0). Subsequent SetRange calls do not find any records either.
> > >
> > > I can do a CancelRange to prevent this from
> > > happening...but...its expensive. I can also close/open the
> > > table...but...that invalidates field references that I may have.
> > >
> > > We are using IBO Version 4.5B (an upgrade isn't feasible
> > > right now), FireBird 1.5.4
> > >
> > > Any thoughts on how to prevent the behavior without
> > > CancelRange or closing the table ?
> > >
> > > Below is a contrived example that illustrates the problem:
> > >
> > >
> > > procedure TForm1.TestSetRange;
> > > var
> > > mytable: TIBOTable;
> > > myConnection: TIB_Connection;
> > > seq: integer;
> > > begin
> > > BuildTable;
> > > myConnection:=nil; myTable:=nil;
> > > try
> > > myConnection:=TIB_Connection.Create(nil);
> > > myConnection.Username:='<YOUR USERNAME>';
> > > myConnection.Password:='<YOUR PASSWORD>';
> > > myConnection.Database:='<PATH TO YOUR DATABASE>';
> > > myConnection.Connect;
> > > myTable:=TIBOTable.Create(nil);
> > > myTable.IB_Connection:=myConnection;
> > > myTable.TableName:='TestTable';
> > >
> > > //Pass 1 works correctly
> > > mytable.Open;
> > > myTable.IndexName:='Sequence2Index';
> > > seq:=2;
> > > mytable.SetRange([seq],[seq]);
> > > showmessage('For Seq: '+inttostr(seq)+' :
> > > RecordCount='+inttostr(myTable.RecordCount));
> > > myTable.IndexName:='Sequence1Index';
> > >
> > > //Pass 2 fails to work correctly. myTable.RecordCount
> > > is 0 after setting the index
> > > //and SetRange does not find any records
> > > mytable.Open;
> > > myTable.IndexName:='Sequence2Index';
> > > //myTable.RecordCount becomes 0 after this line
> > > seq:=4;
> > > mytable.SetRange([seq],[seq]);
> > > showmessage('For Seq:'+inttostr(seq)+' :
> > > RecordCount='+inttostr(myTable.RecordCount));
> > > myTable.IndexName:='Sequence1Index';
> > > finally myConnection.Free; myTable.Free end;
> > > end;
> > >
> > > procedure TForm1.BuildTable;
> > > var
> > > query:TIB_Query;
> > > myConnection: TIB_Connection;
> > > begin
> > > query:=nil; myConnection:=nil;
> > > try
> > > myConnection:=TIB_Connection.Create(nil);
> > > myConnection.Username:='<YOUR USERNAME>';
> > > myConnection.Password:='<YOUR PASSWORD>';
> > > myConnection.Database:='<PATH TO YOUR DATABASE>';
> > > myConnection.Connect;
> > > query:=TIB_Query.Create(nil);
> > > query.IB_Connection:=myConnection;
> > >
> > > query.SQL.Add('drop table TestTable');
> > > try query.ExecSql; except end;
> > > query.SQL.Clear;
> > > query.SQL.Add('create table TestTable (');
> > > query.SQL.Add('Sequence1 integer NOT NULL,');
> > > query.SQL.Add('Sequence2 integer NOT NULL,');
> > > query.SQL.Add('primary key (Sequence1))');
> > > query.ExecSql;
> > > query.SQL.Clear;
> > > query.SQL.Add('create index Sequence1Index on TestTable
> > > (Sequence1)');
> > > query.ExecSQL;
> > > query.SQL.Clear;
> > > query.SQL.Add('create index Sequence2Index on TestTable
> > > (Sequence2)');
> > > query.ExecSQL;
> > > query.SQL.Clear;
> > > query.SQL.Text:='Insert into TestTable values (1,2)';
> > > query.ExecSQL;
> > > query.SQL.Text:='Insert into TestTable values (3,4)';
> > > query.ExecSQL;
> > > query.SQL.Text:='Insert into TestTable values (5,6)';
> > > query.ExecSQL;
> > > finally myConnection.Free; query.Free end;
> > > end;
> >
>