25.03.2004, 16:03 | #1 |
Участник
|
Надо построить Query на Datasource на форме.
Пусть есть таблицы: Table1: Field1, Field3 Table2: Field1, Field2 Table3: Field2, Field4 Table4:Field2, Field3, Field4 Пишу в методе lookup: 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(‘1’); //условие sysTableLookup.parmQuery(q); sysTableLookup.performFormLookup(); Но при выполнеии lookup выдается сообщение "Недопустимая комбинация поля / поля ссылки". Что делать в этом случае? |
|
25.03.2004, 16:11 | #2 |
Участник
|
Цитата:
Сообщение от Bukovka
qbr = qbds.addRange(fieldNum(Field3, Field4));
должно быть <div class='XPPtop'>X++</div><div class='XPP'>qbr = qbds.addRange([color=:blue]fieldNum[/color](Table3, Field4));</div> Посмотрите получившийся sql запрос используя метод Глазова <div class='XPPtop'>X++</div><div class='XPP'>info(q.datasourseno(1).toString())</div> какой запрос у вас получается? ЗЫ Вы делаете выпадающий список с наименованиями? |
|
25.03.2004, 16:17 | #3 |
Участник
|
Да действительно опечатка, и действительно пытаюсь сделать выпадающий спасок наименований, но пока безрезультатно
Добавила в job <div class='XPPtop'>X++</div><div class='XPP'>info(q.datasourseno(1).toString())</div> но выдается этоже сообщении о Недопустимой комбинация поля / поля ссылки. |
|
25.03.2004, 16:27 | #4 |
Участник
|
Вся проблема в этом блоке
qbds.addLink(fieldNum(Table4, Field3), fieldNum(Table1, Field3)); //что-то неправильное здесь qbds.joinMode(JoinMode::NoExistsJoin); |
|
25.03.2004, 16:33 | #5 |
Участник
|
Цитата:
Сообщение от Bukovka
<div class='XPPtop'>X++</div><div class='XPP'>qbds = qbds.addDataSource([color=:blue]tablenum[/color](Table4));
qbds.addLink([color=:blue]fieldNum[/color](Table4,Field2), [color=:blue]fieldNum[/color](Table3, Field2)); qbds.addLink([color=:blue]fieldNum[/color](Table4,Field4),[color=:blue]fieldNum[/color](Table3, Field4)); qbds.addLink([color=:blue]fieldNum[/color](Table4, Field3), [color=:blue]fieldNum[/color](Table1, Field3)); qbds.joinMode(JoinMode::NoExistsJoin);</div> по-моему, не может один линк в query быть по разным таблицам. но вдруг это снова опечатка? можете проект сюда выложить? и потом, прежде чем программировать, попробуйте свой запрос создать в АОТ в ветке query... Проверите... А потом и в коде программировать не нужно будет. Достаточно будет написать <div class='XPPtop'>X++</div><div class='XPP'>q = [color=:blue]new[/color] Query([color=:blue]querystr[/color](myQuery))</div> |
|
25.03.2004, 16:36 | #6 |
Участник
|
Цитата:
Сообщение от Bukovka
<div class='XPPtop'>X++</div><div class='XPP'>qbds.addLink([color=:blue]fieldNum[/color](Table4, Field3), [color=:blue]fieldNum[/color](Table1, Field3)); [color=:green]//что-то неправильное здесь[/color]</div>
relation в query может быть только по одной таблице, если у вас вложенные в запросе таблицы. |
|
25.03.2004, 16:47 | #7 |
Участник
|
Можно ли в Query задать два DataSource на одном уровне?
|
|
25.03.2004, 16:59 | #8 |
Участник
|
можно. в руководстве разработчика даже описано в каком порядке будут возвращаться записи в этом случае
ключевая фраза "Sequencing of retrieved records" |
|
25.03.2004, 17:42 | #9 |
Участник
|
У меня еще нет опыта создания Query в АОТ, поэтому много вопросов.
Вот как я делаю: 1) В первый узел DataSource добавляю Table1. 2) В узле Table1 в DataSource добавляю Table2 с JoinMode = InnerJoin и в создаю Relation: Table1.Field1 = Table2.Field1. 3) В узле Table2 в DataSource добавляю Table3 с JoinMode = InnerJoin и в создаю Relation: Table3.Field2 = Table2.Field2. Пока все работает. Но... 4) В узле Table1 в DataSource надо добавить Table4 с Relations, но тогда в job пишу: Query q = new Query(); q = new Query(querystr(MyQuery)); Info(q.dataSourceNo(1).toString()); и получаю : Select * from Table1 и все.... Как создать два dataSource на одном уровне? |
|
26.03.2004, 09:02 | #10 |
Участник
|
Bukovka, говорю же.
Создайте нужный вам запрос в AOT. потом используйте его q = new Query(querystr(myQuery)); получите результат сначала так. Потом и программировать научитесь. |
|
26.03.2004, 14:27 | #11 |
Administrator
|
А аргументы в addLink местами менять пробовали?
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
26.03.2004, 14:37 | #12 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
А аргументы в addLink местами менять пробовали?
|
|
26.03.2004, 14:47 | #13 |
Участник
|
Так же пробовала создать Query в АОТ, например такой:
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, 15:25 | #14 |
Administrator
|
Хм... Начнем с того, что в Вашем коде есть очевидная логическая ошибка:
с одной стороны:<div class='XPPtop'>X++</div><div class='XPP'>qbds = qbds.addDataSource([color=:blue]tablenum[/color](Table4));</div> с другой стороны: <div class='XPPtop'>X++</div><div class='XPP'>qbr = qbds.addRange([color=:blue]fieldNum[/color](Table3, Field4));</div> Что Вы хотели сделать? Могу расказать, что делается на самом деле: добавляется Range по полю в таблице Table4, Id которого совпадает с Id поля Field4 в таблице Table3. У меня, к примеру, это оказалось поле Table4.Field2, но это зависит от порядка, в котором Вы создавали поля таблицы. Далее. addLink создает связь между полем таблицы, для которой он был вызван, с Id поля равным первому аргументу, и полем "над-таблицы" с Id поля равным второму аргументу. Рассмотрим вот эту вот строчку: <div class='XPPtop'>X++</div><div class='XPP'>qbds.addLink([color=:blue]fieldNum[/color](Table4, Field3), [color=:blue]fieldNum[/color](Table1, Field3));</div> Что здесь получается. В Query добавляется link между полем Table4.Field3 и полем Table3, Id у которого совпадает с Id поля Field3 в таблице Table1 (у меня это оказалось поле Table3.Field4, но это опять же зависит от порядка создания полей; кстати, Id поля можно посмотреть в его свойствах). В общем, у меня все отработало без ошибок, но это только потому, что в таблицах Table4 и Table3 нашлись поля с подходящими Id. У Вас же, видимо, где-то подходящего поля не нашлось. Отсюда и ошибка.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
26.03.2004, 15:38 | #15 |
Administrator
|
Официальное опровержение
Только что проверил. В addLink первый аргумент - Id поля в главной таблице, второй аргумент - Id поля во вложенной таблице (то есть той, для которой был вызван addLink). С молчаливого согласия аудитории предыдущее сообщение исправлять я не буду. В общем, просто имейте ввиду, читая предыдущее сообщение, это замечание. А Вам, bukovka, следует изменить порядок следования аргументов во всех addLink.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
26.03.2004, 15:53 | #16 |
Administrator
|
И последнее. То, что Вы хотите сделать (связь Table4.Field3 = Table1.Field3), сделать можно, но не через addLink, а через addRange.
Вместо <div class='XPPtop'>X++</div><div class='XPP'>qbds.addLink([color=:blue]fieldNum[/color](Table1, Field3), [color=:blue]fieldNum[/color](Table4, Field3));</div> напишите <div class='XPPtop'>X++</div><div class='XPP'>qbr = qbds.addRange([color=:blue]fieldNum[/color](Table4, RecId)); qbr.value(strfmt([color=:red]"(%1.%2 == %3.%4)"[/color], table1DSName, [color=:blue]fieldstr[/color](Table1, Field3), qbds.name(), [color=:blue]fieldstr[/color](Table4, Field3)));</div> Перед этим в table1DSName сохраните имя dataSource, связанного с table1 (того, который Вы добавляете самым первым).
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
26.03.2004, 15:55 | #17 |
Участник
|
а что будет с запросом, если использовать AddRange?
какая разница между addLink и addRange? |
|
26.03.2004, 16:19 | #18 |
Участник
|
Мне надо реализовать такой SQL запрос:
select Table1.* from Table1, Table2, Table3 where Table2.Field1 = Table1.Field1 and Table2.Field2 = Table3.Field2 and Table3.Field4 = '06' and not exists (select 1 from Table4 where Table4.Field4 = Table3.Field4 and Table4.Field3 = Table1.Field3 and Table4.Field2 = Table2.Field2) где Table1: Field1, Field3 Table2: Field1, Field2 Table3: Field2, Field4 Table4: Field2, Field3, Field4 Т.е здесь получается не линейный запрос. |
|
26.03.2004, 16:59 | #19 |
Участник
|
тут, похоже, одинм аксаптовсим запросом не обойтись.
|
|
26.03.2004, 17:05 | #20 |
Участник
|
Цитата:
Сообщение от mazzy
тут, похоже, одинм аксаптовсим запросом не обойтись.
|
|