Subject | Re: [IBO] TIB_LocateCursor problem |
---|---|
Author | jwharton@ibobjects.com |
Post date | 2004-03-13T11:56:37Z |
Does this work?
if ( BDataset.SysFieldNames.Count = BDataset.FieldCount ) and
( BDataset.Fields.RelationCount < 2 ) then
tmpItem := Trim( GetCharValues( BDataset.SysFieldNames[tmpCol.FieldNo] ))
else
tmpItem := tmpCol.FullFieldName;
Thanks,
Jason Wharton
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
I have a problem with TIB_Query.Locate().
The base SQL Text is a JOIN statement, like:
select a.*
from a
join b on a.id_b = b.id_b
with MasterSource to table "c" and MasterLinks set to: b.id_c = c.id_c
But if I want to locate "a.id_b", the resulting SQL looks like:
SELECT a.id_a
FROM a
join b on a.id_b = b.id_b
WHERE b.id_c=? /* BIND_0 */
AND b.id_c=? /* MLNK_id_c_0 */
AND (((id_b = ? /* LOC_2 */ )))
That leads to an error:
ISC Fehlermeldung:
Dynamic SQL Error
SQL error code = -204
Ambiguous field name between table a and table b
id_b
I found 2 problems:
1) the double b.id_c=? ... comes from using a hardcoded ? as ParamChar
(ParamChar was :)
2) the search-condition should be "a.id_b = ? ..." and not "id_b = ?",
but the relation name is not used because in
"procedure TIB_LocateCursor.SysPrepareSQL;"
I found this line:
if BDataset.SysFieldNames.Count = BDataset.FieldCount then
"use only FieldName" else "useFullFieldName"
==> solution
it should be checked if the SQL is a join (JoinLinks not empty or
contains the key word 'JOIN').
Than the locate cursor should allways use the fullFieldName.
Andreas Hesse
___________________________________________________________________________
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
if ( BDataset.SysFieldNames.Count = BDataset.FieldCount ) and
( BDataset.Fields.RelationCount < 2 ) then
tmpItem := Trim( GetCharValues( BDataset.SysFieldNames[tmpCol.FieldNo] ))
else
tmpItem := tmpCol.FullFieldName;
Thanks,
Jason Wharton
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
I have a problem with TIB_Query.Locate().
The base SQL Text is a JOIN statement, like:
select a.*
from a
join b on a.id_b = b.id_b
with MasterSource to table "c" and MasterLinks set to: b.id_c = c.id_c
But if I want to locate "a.id_b", the resulting SQL looks like:
SELECT a.id_a
FROM a
join b on a.id_b = b.id_b
WHERE b.id_c=? /* BIND_0 */
AND b.id_c=? /* MLNK_id_c_0 */
AND (((id_b = ? /* LOC_2 */ )))
That leads to an error:
ISC Fehlermeldung:
Dynamic SQL Error
SQL error code = -204
Ambiguous field name between table a and table b
id_b
I found 2 problems:
1) the double b.id_c=? ... comes from using a hardcoded ? as ParamChar
(ParamChar was :)
2) the search-condition should be "a.id_b = ? ..." and not "id_b = ?",
but the relation name is not used because in
"procedure TIB_LocateCursor.SysPrepareSQL;"
I found this line:
if BDataset.SysFieldNames.Count = BDataset.FieldCount then
"use only FieldName" else "useFullFieldName"
==> solution
it should be checked if the SQL is a join (JoinLinks not empty or
contains the key word 'JOIN').
Than the locate cursor should allways use the fullFieldName.
Andreas Hesse
___________________________________________________________________________
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