AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.03.2004, 16:03   #1  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Надо построить 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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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>
какой запрос у вас получается?


ЗЫ Вы делаете выпадающий список с наименованиями?
__________________
полезное на axForum, github, vk, coub.
Старый 25.03.2004, 16:17   #3  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Да действительно опечатка, и действительно пытаюсь сделать выпадающий спасок наименований, но пока безрезультатно

Добавила в job
<div class='XPPtop'>X++</div><div class='XPP'>info(q.datasourseno(1).toString())</div>
но выдается этоже сообщении о Недопустимой комбинация поля / поля ссылки.
Старый 25.03.2004, 16:27   #4  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Вся проблема в этом блоке

qbds.addLink(fieldNum(Table4, Field3), fieldNum(Table1, Field3)); //что-то неправильное здесь
qbds.joinMode(JoinMode::NoExistsJoin);
Старый 25.03.2004, 16:33   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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>
__________________
полезное на axForum, github, vk, coub.
Старый 25.03.2004, 16:36   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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 может быть только по одной таблице, если у вас вложенные в запросе таблицы.
__________________
полезное на axForum, github, vk, coub.
Старый 25.03.2004, 16:47   #7  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Можно ли в Query задать два DataSource на одном уровне?
Старый 25.03.2004, 16:59   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
можно. в руководстве разработчика даже описано в каком порядке будут возвращаться записи в этом случае

ключевая фраза "Sequencing of retrieved records"
__________________
полезное на axForum, github, vk, coub.
Старый 25.03.2004, 17:42   #9  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
У меня еще нет опыта создания 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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Bukovka, говорю же.
Создайте нужный вам запрос в AOT.
потом используйте его

q = new Query(querystr(myQuery));

получите результат сначала так. Потом и программировать научитесь.
__________________
полезное на axForum, github, vk, coub.
Старый 26.03.2004, 14:27   #11  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
А аргументы в 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  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Цитата:
Сообщение от Maxim Gorbunov
А аргументы в addLink местами менять пробовали?
Да пробовала менять, не помогает.
Старый 26.03.2004, 14:47   #13  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Так же пробовала создать 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  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Хм... Начнем с того, что в Вашем коде есть очевидная логическая ошибка:
с одной стороны:<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  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Официальное опровержение
Только что проверил. В 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  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
И последнее. То, что Вы хотите сделать (связь 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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
а что будет с запросом, если использовать AddRange?
какая разница между addLink и addRange?
__________________
полезное на axForum, github, vk, coub.
Старый 26.03.2004, 16:19   #18  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Мне надо реализовать такой 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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
тут, похоже, одинм аксаптовсим запросом не обойтись.
__________________
полезное на axForum, github, vk, coub.
Старый 26.03.2004, 17:05   #20  
Bukovka_imported is offline
Bukovka_imported
Участник
 
12 / 10 (1) +
Регистрация: 22.03.2004
Цитата:
Сообщение от mazzy
тут, похоже, одинм аксаптовсим запросом не обойтись.
И какие могут быть варианты борьбы с аксаптовскими запросами?
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:43.