Subject Test sub-release posted to all sites.
Author Jason Wharton
12/2/2000 Sub-Release 3.6 Bf

I added two events to the TIB_DataPump component to make it easier to react
to things on a record-by-record basis. The reason I added them was so that I
could also add to the dialog form the cumulative RowsAffected. I needed this
because I goofed and messed up almost a 1,000 records in a database and what
I did to correct them is select the records from a backup database and pump
them through an UPDATE statement that was designed to only touch the records
that were wrong. Thus, by seeing that after it was complete the total
RowsAffected exactly matched the number of records I messed up I knew I had
got all of them restored. There also seemed to be a problem with NOT NULL
columns in the source and being directly bound to a column that is NULLable.
This is now resolved.

I revisited the TIBODataset.RecordCount property. The way I have implemented
this in IBO was not consistent with how TQuery operated. TQuery would give
you exact count of the records where with IBO I was only doing the count of
rows in the buffer with a few touchups for smooth grid behavior where the
vertical scrollbar was concerned. Now what I have decided to do is to bring
the TIBODataset class into full harmony with what the BDE did before and
give the developer the option to make IBO behave in the manner that is
different than the BDE but in my opinion preferable. This will be
accomplished by adding in a new property called RecordCountAccurate. This
simple governs whether or not the RecordCount property is accurate as the
BDE would do or if it was allowable for the approzimation based on the
number of records in the buffer. I also added in a function called
RecordCountQuery that will return the exact record count in all cases.

The above changes may affect the behavior of TDBGrid controls vertical
scrollbar. They will now do the 3 position only thumb position. To get the
smoothe auto-adjusting scrollbar as it was previously, set AutoFetchAll to
true or set the RecordCountAccurate property to false. Either one of these
settings will make the DBGrid control use the smoothe scrollbar instead of
the dumb one. Smooth meaning that you can move it precisely and tell where
in the dataset you are because it adjusts for each individule row that is
scrolled to. This is implemented by impacting the return result of the
IsSequenced virtual method of the TDataset class.

I added in the BeforeScroll and AfterScroll events for the TIBODataset class
when a detail dataset is refreshed as a result of a new row in the master
dataset being selected. These had been omitted in the past and this is a
legitimate case for triggering the scroll events.

I made the TIBODataset class not transfer values from the master dataset
when using a master-detail relationship when inserting into the detail
dataset and the values for the target columns already have values plugged
into them. I had a developer complain that it should not overwrite the
values he has supplied.

The TIBODataset class was not always handling the boolean column definitions
if there was one that was configured using the default and then another
customized in the same dataset. Now it doesn't matter what combination of
boolean columns are used. IBO will handle them properly whether default or
customized in the ColumnAttributes property.

I fixed some SQLDialect 3 issues in the Browse form of IB_WISQL. It was not
handling some of the stored procedure and trigger names just right when
selecting information from the metadata and then parsing statements from it.

I improved the TIB_Grid control's ability to detect whether it has the focus
or not by checking the Screen.ActiveForm.ActiveControl for a match to a
control that the grid is a parent of. This was particularely useful for the
TIB_ComboBox control being embedded in the grid.

I fixed a problem with the IBC_CustomMemo file where it needed to consider
the dssPrepared state as a state in which there could be valid text being
displayed in the control. It was ignoring the text when in this mode and
that isn't correct behavior.

I fixed the FieldByName(), ParamByName(), FindField() and FindParam()
routines so that if you pass in an identifier that doesn't need double
quotes, but you still included it in double quoted strings then it will
still match up the column names properly. Before passing in such an
identifier resulted in a failed match.

Claudio helped us out by fixing a bunch of Delphi 3 large integer (comp)
issues where there was an infinite loop and some rounding issues when using
the comp type as a replacement for the int64 type. He also optimized a filed
trimming routine I had written a little inefficiently.

I added the caRefreshKeys CommitAction type so that a developer can tell a
dataset to do a RefreshKeys instead of a full Refresh when a transaction
commits or does a rollback.

I improved the connection and transaction components to deal with a lost
connection better. For some reason there was an AV in the client library if
certain calls were made after the API returned an error code signifying that
the connection to the server had been lost.

I needed to make some general corrections to the native IBO dataset so that
it would properly handle the cached record count figure when using the
tiConcurrency transaction isolation. It was not properly dealing with the
cases when records were being inserted into or deleted from a dataset after
a record count had already be processed. It will now work correctly for all
inserts and deletes and this is whether cached updates is on or off.

PS. Don't forget to vote for IBO in the readers's choice awards. See my
web-site for details. Also, Italian web-site for IBO is now linked up too...

Jason Wharton
CPS - Mesa AZ