Subject | TIB_LocateCursor problem |
---|---|
Author | Andreas Hesse |
Post date | 2004-03-11T21:36:09Z |
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
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