Subject | Re: [IBO] Problem with TIBOQuery |
---|---|
Author | Hans |
Post date | 2005-02-02T03:51:19Z |
Hello Helen,
Did some more digging and found out that
IB_Componets->function TIB_Dataset.SysGetCursorRecordCount: longint;
already converts a RecordCount call for
'select * from table where such = true'
to
'select count(*) from table where such = true'
at IB_Components->MakeCountSQL( ServerSQL, CountSQL );
and uses this modified select to get the proper count as fast as possible :)
This conversion is done in IB_Parse->MakeCountSQL
Elas, in the case of a 'select * from table union select * from table2' it
converts it to
'select count(*) from table1 union select * from table2' , which of course
results
in that at first rather obscure parameter count mismatch error.
By simply adding the following two statements before the last statement of
this routine
ep := getLitSafeStrPos( 'UNION', AnsiUpperCase( CountSQL ), 1 );
if ep > 1 then CountSQL := Copy(CountSQL,1,ep-1);
CountSQL := Trim( CountSQL );
RecordCount now only returns the count of the record of the first select and
doesn't
raise an exception.
However, I think with a little more work IB_Componets->function
TIB_Dataset.SysGetCursorRecordCount can be altered to split and
summerize the count(*) of the various unionized selects and thus returns
a momentarily correct RecordCount across all unions
What do you think ?
Best Regards
Hans
Did some more digging and found out that
IB_Componets->function TIB_Dataset.SysGetCursorRecordCount: longint;
already converts a RecordCount call for
'select * from table where such = true'
to
'select count(*) from table where such = true'
at IB_Components->MakeCountSQL( ServerSQL, CountSQL );
and uses this modified select to get the proper count as fast as possible :)
This conversion is done in IB_Parse->MakeCountSQL
Elas, in the case of a 'select * from table union select * from table2' it
converts it to
'select count(*) from table1 union select * from table2' , which of course
results
in that at first rather obscure parameter count mismatch error.
By simply adding the following two statements before the last statement of
this routine
ep := getLitSafeStrPos( 'UNION', AnsiUpperCase( CountSQL ), 1 );
if ep > 1 then CountSQL := Copy(CountSQL,1,ep-1);
CountSQL := Trim( CountSQL );
RecordCount now only returns the count of the record of the first select and
doesn't
raise an exception.
However, I think with a little more work IB_Componets->function
TIB_Dataset.SysGetCursorRecordCount can be altered to split and
summerize the count(*) of the various unionized selects and thus returns
a momentarily correct RecordCount across all unions
What do you think ?
Best Regards
Hans
----- Original Message -----
From: "Helen Borrie" <helebor@...>
To: <IBObjects@yahoogroups.com>
Sent: Tuesday, February 01, 2005 4:13 PM
Subject: Re: [IBO] Problem with TIBOQuery
>
> At 02:56 PM 1/02/2005 -0700, you wrote:
>
>>Hello,
>>
>>Version 4.5Ai
>>
>>Select * from Table1
>>where condition1
>>order by 1,2,3
>>
>>TIBOQuery.RecordCount returns correct value
>>
>>However
>>
>>Select * from Table1
>>where condition1
>>union
>>Select * from Table1
>>where condition2
>>order by 1,2,3
>>
>>TIBOQuery.RecordCount aborts and raises exception
>>
>>ISC ERROR CODE:335544569
>>SQL error code = -104
>>Invalid command
>>count of column list and variable list do not match
>>
>>The RecodCount call is generated by QReport in Page x of y calculations
>>
>>What is the solution, if any ?
>
> None that I know of. Fb/Ib currently doesn't return a RecordCount from
> selects. If you ask for one, IBO will (ultimately) try to get one by
> attempting to manufacture a SELECT COUNT(*) query internally from the SQL
> statement. However, SELECT COUNT(*) queries are not valid for unioned
> sets, so there isn't a valid RecordCount query that could be constructed.
>
> In a very awkward way, you could try to calculate a record count in a
> routine of your own, by a series of queries. I wouldn't recommend it,
> though.
>
> Helen
>
>
>
>
>
> ___________________________________________________________________________
> IB Objects - direct, complete, custom connectivity to Firebird or
> InterBase
> without the need for BDE, ODBC or any other layer.
> ___________________________________________________________________________
> http://www.ibobjects.com - your IBO community resource for Tech Info
> papers,
> keyword-searchable FAQ, community code contributions and more !
> Yahoo! Groups Links
>
>
>
>
>
>
>