12.11.2003, 07:55 | #1 |
Участник
|
Связывание нескольких таблиц
Каким образом средствами 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 |
Дмитрий Ерин
|
А если "напрямую" к серверу? Не пробовал? Интересно, что получится...
PHP код:
|
|
12.11.2003, 08:33 | #3 |
Участник
|
Про "прямой" SQL запрос я читал в форуме, но можно ли его каким либо образом "прикрутить" к визуальным компонентам на форме.
|
|
12.11.2003, 08:48 | #4 |
Дмитрий Ерин
|
Да уж, с этим сложнее...
Если только "ручками", но это уже - маразм! Будем ждать ответов ГУРУ |
|
15.11.2003, 13:38 | #5 |
Участник
|
В 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 |
Участник
|
используй NotExist Join
Действительно, в аксапте нет Outer join.
Но в аксапте есть exist join и notexist join. Я, помнится мне, для получения запросов такого рода из аксапты использовал именно notexist join. Правда в итоге вместо одного запроса получается два. К томуже notexist join на больших БД работает довольно медленно. Что ж, исскуство требует жертв |
|
17.11.2003, 12:50 | #7 |
Участник
|
Цитата:
Изначально опубликовано Ruff
Вообще-то на менее сложных запросах работает медленно |
|
17.11.2003, 13:15 | #8 |
Участник
|
Проблему решил следующим образом
QBE: InventTable -ij InventSum --oj InventDim ---oj InventBatch --ij InventDim Связь InventSum.ItemID = InventBatch.ItemID установил через AddDynaLink Второй InventDim необходим в с случае установки фильтра по полю InventLocationID (Выдаем картотеку на определенном складе) |
|
17.11.2003, 13:54 | #9 |
Участник
|
Re: используй NotExist Join
Цитата:
Изначально опубликовано Волчара
Действительно, в аксапте нет Outer join. Но в аксапте есть exist join и notexist join. Я, помнится мне, для получения запросов такого рода из аксапты использовал именно notexist join. Правда в итоге вместо одного запроса получается два. К томуже notexist join на больших БД работает довольно медленно. Что ж, исскуство требует жертв NotExistsJoin строит запрос вида not exists in (запрос) !!! |
|
17.11.2003, 14:03 | #10 |
Участник
|
Поспешил с предыдущим письмом:
(Проблему решил следующим образом 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 |
Участник
|
Цитата:
Изначально опубликовано jan_psn
Поспешил с предыдущим письмом: (Проблему решил следующим образом QBE: InventTable -ij InventSum --oj InventDim ---oj InventBatch --ij InventDim Связь InventSum.ItemID = InventBatch.ItemID установил через AddDynaLink Второй InventDim необходим в с случае установки фильтра по полю InventLocationID (Выдаем картотеку на определенном складе)) Последнее выражение (ij InventDim) не странслируется в SQL-запрос. Ранее в форуме читал о такой фичи Axapta. Действительно это так или нет |
|
18.11.2003, 05:23 | #12 |
Участник
|
Опишу возникшую проблему.
Стандартная форма 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 Криво все это. Чего то я не понимаю (не знаю). |
|
|
|