Subject Re: [IBO] TIB_LocateCursor problem
Does this work?

if ( BDataset.SysFieldNames.Count = BDataset.FieldCount ) and
( BDataset.Fields.RelationCount < 2 ) then
tmpItem := Trim( GetCharValues( BDataset.SysFieldNames[tmpCol.FieldNo] ))
tmpItem := tmpCol.FullFieldName;

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
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

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.
___________________________________________________________________________ - your IBO community resource for Tech Info papers,
keyword-searchable FAQ, community code contributions and more !
Yahoo! Groups Links