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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.11.2003, 07:55   #1  
jan_psn is offline
jan_psn
Участник
 
6 / 10 (1) +
Регистрация: 15.10.2003
Связывание нескольких таблиц
Каким образом средствами Axapta получить данный запрос:

SELECT A.ITEMGROUPID,A.ITEMID,SUM(B.AVAILPHYSICAL),C.INVENTDIMID,D.PRODDATE,D.INVENTBATCHID
FROM INVENTTABLE A
inner join INVENTSUM B on (A.ITEMID=B.ITEMID)
inner join INVENTDIM C on ((b.inventdimid=c.inventdimid) and (B.AVAILPHYSICAL>0))
LEFT OUTER JOIN INVENTBATCH D ON ((C.INVENTBATCHID=D.INVENTBATCHID) AND (D.ITEMID = b.itemid))
GROUP BY A.ITEMGROUPID,A.ITEMID,B.ITEMID,C.INVENTDIMID,D.PRODDATE,D.INVENTBATCHID
ORDER BY A.ITEMGROUPID DESC,A.ITEMID,B.ITEMID,C.INVENTDIMID,D.PRODDATE,D.INVENTBATCHID

Все проблема в условии
LEFT OUTER JOIN INVENTBATCH D ON ((C.INVENTBATCHID=D.INVENTBATCHID) AND (D.ITEMID = b.itemid))

Axpata строит внутренее объединение через WHERE, а мне необходимо через inner join

Запрос необходим для показа в форме существующей номеклатуры с указанием даты производства товара.
Задачу конечно можно решить через временный таблицы (скорость будет не очень) или не делать объединение с InventBatch, а показывать нужные поля из этой таблицы другим способом (через метод display)
Но важно принципиально - можно построить такой запрос или нет
Старый 12.11.2003, 08:18   #2  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
А если "напрямую" к серверу? Не пробовал? Интересно, что получится...
PHP код:
   connection Con;
   
statement Stmt;
   
resultSet Res;
   
str SQLQuery "SELECT A.ITEMGROUPID,A.ITEMID,SUM(B.AVAILPHYSICAL),C.INVENTDIMID,D.PRODDATE,D.INVENTBATCHID "
    
+"FROM INVENTTABLE A "
+"inner join INVENTSUM B on (A.ITEMID=B.ITEMID) "
+"inner join INVENTDIM C on ((b.inventdimid=c.inventdimid) and (B.AVAILPHYSICAL>0)) "
+"LEFT OUTER JOIN INVENTBATCH D ON ((C.INVENTBATCHID=D.INVENTBATCHID) AND (D.ITEMID = b.itemid)) "
+"GROUP BY A.ITEMGROUPID,A.ITEMID,B.ITEMID,C.INVENTDIMID,D.PRODDATE,D.INVENTBATCHID "
+"ORDER BY A.ITEMGROUPID DESC,A.ITEMID,B.ITEMID,C.INVENTDIMID,D.PRODDATE,D.INVENTBATCHID ";

    
Con = new Connection();
    
Stmt Con.createStatement();
    
Res Stmt.executeQuery(SQLQuery);

    while (
Res.next())
    {
     ...
    } 
Вообще-то на менее сложных запросах работает медленно
Старый 12.11.2003, 08:33   #3  
jan_psn is offline
jan_psn
Участник
 
6 / 10 (1) +
Регистрация: 15.10.2003
Про "прямой" SQL запрос я читал в форуме, но можно ли его каким либо образом "прикрутить" к визуальным компонентам на форме.
Старый 12.11.2003, 08:48   #4  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Да уж, с этим сложнее...
Если только "ручками", но это уже - маразм!

Будем ждать ответов ГУРУ
Старый 15.11.2003, 13:38   #5  
LCh is offline
LCh
Участник
 
104 / 10 (1) +
Регистрация: 13.11.2002
Адрес: Санкт-Петербург
В Data Source формы:

InventDim
InventBatch (outer join с InventDim)
InventSum (inner join с InventDim)

далее по вкусу
InventTable
InventTableModule

у меня такое же прошло с ГТД
outer join строит именно left outer join в SQL
Старый 17.11.2003, 12:41   #6  
Волчара is offline
Волчара
Участник
 
210 / 29 (1) +++
Регистрация: 08.02.2003
Адрес: Москва
используй NotExist Join
Действительно, в аксапте нет Outer join.
Но в аксапте есть exist join и notexist join.
Я, помнится мне, для получения запросов такого рода из аксапты использовал именно notexist join. Правда в итоге вместо одного запроса получается два. К томуже notexist join на больших БД работает довольно медленно.
Что ж, исскуство требует жертв
Старый 17.11.2003, 12:50   #7  
Волчара is offline
Волчара
Участник
 
210 / 29 (1) +++
Регистрация: 08.02.2003
Адрес: Москва
Thumbs down
Цитата:
Изначально опубликовано Ruff

Вообще-то на менее сложных запросах работает медленно
Конечно медленно. SQL не сможет оптимизировать такой запрос по индексам. Посмотри как у тебя индексы устроены. Я не про конкретные индексы для этого запроса, а про все индексы Аксапты. Тебе надо DataAreaId ставить в Group By, Order By и во все условия.
Старый 17.11.2003, 13:15   #8  
jan_psn is offline
jan_psn
Участник
 
6 / 10 (1) +
Регистрация: 15.10.2003
Проблему решил следующим образом
QBE:
InventTable
-ij InventSum
--oj InventDim
---oj InventBatch
--ij InventDim

Связь InventSum.ItemID = InventBatch.ItemID установил через AddDynaLink
Второй InventDim необходим в с случае установки фильтра по полю InventLocationID
(Выдаем картотеку на определенном складе)
Старый 17.11.2003, 13:54   #9  
LCh is offline
LCh
Участник
 
104 / 10 (1) +
Регистрация: 13.11.2002
Адрес: Санкт-Петербург
! Re: используй NotExist Join
Цитата:
Изначально опубликовано Волчара
Действительно, в аксапте нет Outer join.
Но в аксапте есть exist join и notexist join.
Я, помнится мне, для получения запросов такого рода из аксапты использовал именно notexist join. Правда в итоге вместо одного запроса получается два. К томуже notexist join на больших БД работает довольно медленно.
Что ж, исскуство требует жертв
Да вы что, граждане. Перечисление JoinMode::OuterJoin!
NotExistsJoin строит запрос вида not exists in (запрос) !!!
Старый 17.11.2003, 14:03   #10  
jan_psn is offline
jan_psn
Участник
 
6 / 10 (1) +
Регистрация: 15.10.2003
Поспешил с предыдущим письмом:
(Проблему решил следующим образом
QBE:
InventTable
-ij InventSum
--oj InventDim
---oj InventBatch
--ij InventDim

Связь InventSum.ItemID = InventBatch.ItemID установил через AddDynaLink
Второй InventDim необходим в с случае установки фильтра по полю InventLocationID
(Выдаем картотеку на определенном складе))

Последнее выражение (ij InventDim) не странслируется в SQL-запрос.
Ранее в форуме читал о такой фичи Axapta.
Действительно это так или нет
Старый 17.11.2003, 16:00   #11  
LCh is offline
LCh
Участник
 
104 / 10 (1) +
Регистрация: 13.11.2002
Адрес: Санкт-Петербург
Цитата:
Изначально опубликовано jan_psn
Поспешил с предыдущим письмом:
(Проблему решил следующим образом
QBE:
InventTable
-ij InventSum
--oj InventDim
---oj InventBatch
--ij InventDim

Связь InventSum.ItemID = InventBatch.ItemID установил через AddDynaLink
Второй InventDim необходим в с случае установки фильтра по полю InventLocationID
(Выдаем картотеку на определенном складе))

Последнее выражение (ij InventDim) не странслируется в SQL-запрос.
Ранее в форуме читал о такой фичи Axapta.
Действительно это так или нет
AddDynaLink использовать вместо OuterJoin всё равно что чёрствым батоном гвозди забивать. Это неправильно!
Старый 18.11.2003, 05:23   #12  
jan_psn is offline
jan_psn
Участник
 
6 / 10 (1) +
Регистрация: 15.10.2003
Опишу возникшую проблему.
Стандартная форма Axapta SalesQuickQuote работает не совсем корреектно в некоторых случаях.
Возникла необходимость в изменении поведения данной формы (создаю новую):
1. Данные отсортировать по номенклатурной группе, затем по наименованию
2. Подключить таблицу InventBatch (к примеру) и отсортировать по полю ProdDate
3. Выводить только товар имеющийся на определенном складе

Проблема с подключением InventBatch:
1. Объединяем с InventSum через Outer Join
2. Как установить условие InventBatch.ItemID==InventSum.ItemID ?
Сделал через AddDynaLink. Прошло - SQL запрос сформировался верным (смотрю через мониторинг)
Напрашивается решение через расширенный фильтр, но не получилось.

Следующая проблема - наложения условия на InventDim.InventLocationID
При выполнении AddRange условие добавляется в ON, а необходимо в WHERE.
В виду того что объединение внешнее, то записи все равно выводятся, но с пустым InventLocationID (если уловие не выполняется)
Решил проблему следующим образом - подключил через InnerJoin еще InventDim и объеденил с первым InventDim и на добавленный InventDim наложил условие по InventLocationId.


В результате получили

InventTable
-ij InventSum
--oj InventDim
---oj InventBatch
---ij InventDim

Криво все это. Чего то я не понимаю (не знаю).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Нужно сделать выборку из нескольких таблиц (в данном случае из четырех). niktata DAX: Программирование 10 30.09.2008 09:42
Лукап, содержащий поля нескольких таблиц matew DAX: Программирование 4 30.11.2006 16:02
Опять про OuterJoin нескольких таблиц murad DAX: Программирование 1 15.05.2006 10:26
Связывание таблиц по заранее неизвестному кол-ву полей из Dimension TasmanianDevil DAX: Программирование 2 22.03.2006 09:50
Передача нескольких временных таблиц в отчет Pegiy DAX: Программирование 5 03.06.2004 17:44

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

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

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