25.03.2004, 12:18 | #1 |
Участник
|
Как построить Query?
Есть проблема с Query в lookup-е.
Есть таблицы: Table1 с полями Field1ID, Field4ID Table2 с полями Field2ID, Field3ID Table3 с полями Field1ID, Field2ID Table4 с полями Field2ID, Field3ID, Field4ID Как через Query записать SQL запрос: select Table1.* , Table2. Field3ID from Table1, Table3, Table2 where Table3. Field1ID = Table1. Field1ID and Table3. Field2ID = Table2. Field2ID and trim(Table2. Field3ID) = '06' //какое-то значение and not exists (select 1 from Table4 where Table4. Field4ID = Table1. Field4ID and Table4. Field2ID = Table3. Field2ID and Table4. Field3ID = trim(Table2. Field3ID)) |
|
25.03.2004, 13:10 | #2 |
Участник
|
как не пиши запрос, а Lookup форма принимает только 1 источник данных. И подумай о нагрузке на сервер при выполнении такого запроса!
|
|
25.03.2004, 13:23 | #3 |
Участник
|
я пишу так:
public void lookup(FormControl _formControl, str _filterStr) { SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(Table1), _formControl); Query q = new Query(); QueryBuildDataSource qbds ; QueryBuildRange qbr; ; qbds = q.addDataSource(tableNum(Table1)); qbds = qbds.addDataSource(tablenum(Table2)); qbds.addLink(fieldNum(Table1, Field1ID),fieldNum(Table3, Field1ID)); qbds.joinMode(JoinMode::InnerJoin); qbds = qbds.addDataSource(tablenum(Table2)); qbds.addLink(fieldNum(Table3, Field2ID),fieldNum(Table2, Field2ID)); qbds.joinMode(JoinMode::InnerJoin); qbr = qbds.addRange(fieldNum(Table2, Field2ID)); qbr.value(‘06’); // условие qbds = qbds.addDataSource(tablenum(Table4)); qbds.addLink(fieldNum(Table4, Field4ID), fieldNum(Table1, Field4ID)); qbds.addLink(fieldNum(Table4, Field2ID),fieldNum(Table3, Field2ID)); qbds.addLink(fieldNum(Table1, Field3ID), fieldNum(Table4, Field3ID)); qbds.joinMode(JoinMode::NoExistsJoin); sysTableLookup.parmQuery(q); sysTableLookup.performFormLookup(); } но выдается сообщение "Недопустимая комбинация поля / поля ссылки". Подозреваю, что аксапте не нравиться блок с NoExistsJoin. Как по-другому сделать не знаю. |
|
25.03.2004, 13:37 | #4 |
Участник
|
Цитата:
Изначально опубликовано Bukovka
... qbds.addLink(fieldNum(Table4, Field4ID), fieldNum(Table1, Field4ID)); qbds.addLink(fieldNum(Table1, Field3ID), fieldNum(Table4, Field3ID)); .... |
|
25.03.2004, 13:45 | #5 |
Участник
|
Цитата:
Изначально опубликовано Berty Wooster
В последнем addLink поменять местами поля. Первым должно идти поле таблице из qbds. |
|
25.03.2004, 14:05 | #6 |
Участник
|
Возможно в Table4 он не видит Table1.
И в приведенном коде не видно, где присоединяется Table3. qbds.addLink(fieldNum(Table3, Field2ID),fieldNum(Table2, Field2ID)); Тут тоже надо поменять местами fieldnum'ы. |
|
25.03.2004, 14:44 | #7 |
Участник
|
Исправленный вариант, но все равно не рабочий ....
Table1: Field1, Field3 Table2: Field1, Field2 Table3: Field2, Field4 Table4:Field2, Field3, Field4 SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(Table1), _formControl); Query q = new Query(); QueryBuildDataSource beds QueryBuildRange qbr; ; qbds = q.addDataSource(tableNum(Table1)); qbds = qbds.addDataSource(tablenum(Table2)); qbds.addLink(fieldNum(Table2,Field1),fieldNum(Table1, Field1)); qbds.joinMode(JoinMode::InnerJoin); qbds = qbds.addDataSource(tablenum(Table3)); qbds.addLink(fieldNum(Table3,Field2),fieldNum(Table2, Field2)); qbds.joinMode(JoinMode::InnerJoin); qbds = qbds.addDataSource(tablenum(Table4)); qbds.addLink(fieldNum(Table4,Field2), fieldNum(Table3, Field2)); qbds.addLink(fieldNum(Table4,Field4),fieldNum(Table3, Field4)); qbds.addLink(fieldNum(Table4, Field3), fieldNum(Table1, Field3)); qbds.joinMode(JoinMode::NoExistsJoin); qbr = qbds.addRange(fieldNum(Field3, Field4)); qbr.value(‘06’); sysTableLookup.parmQuery(q); sysTableLookup.performFormLookup(); |
|
26.03.2004, 12:49 | #8 |
Участник
|
Можно ли реализовать такой запрос в Query в АОТ? Можно ли задать два DataSource на одном уровне, например так?
1уровень:Table1 2уровень: Table2 по InnerJoin с Relation Table1.Field1 == Table2.Field1 3уровень: Tabel3 по InnerJoin с Relation Table2.Field2 == Table3.Field2 2уровень: Table4 по NotExistJoin с Relation Table1.Field3 == Table4.Field3 3уровень: Table3 по InnerJoin с Relation Table4.Field1 == Table2.Field1 с Relation Table4.Field2 == Table2.Field2 Как посмотреть полученный результат (можно через Job)? |
|
26.03.2004, 16:20 | #9 |
Пенсионер
|
...
qbr = qbds.addRange(fieldNum(Field3, Field4)); ... А что сие значит? Т.е. почему 2 Fild?
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
26.03.2004, 16:35 | #10 |
Участник
|
Это опечатка. Надо
qbr = qbds.addRange(fieldNum(Table3, Field4)); |
|