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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.05.2004, 14:55   #1  
axz is offline
axz
Участник
 
19 / 10 (1) +
Регистрация: 04.12.2003
? Ошибочное выполнение запроса Axapt-ой
Подскажите что неправильно в следующем запросе ...
Он подразумевает объединение временной и постоянной таблиц, выборку по условиям и группировку результата по 3м (хотя это не принципиально) полям. Проблема в том, что неправильно работает группировка, те в выборке получаються записи(>1) с одинаковыми полями, учавствующими в group by выражении. Причем проблема только при объединении и группировке временной таблицы (в данном случае TmpFrmVirtual ) и постоянной (в примере это InventTrans). Вопрос в том можно ли вообще в одном запросе использовать временную и пост. таблицы и если да то что я делаю неправильно?
Axapta 2.5
PHP код:
static void testJob1(args a)
{
    
InventTrans     inventTrans;
    
TmpFrmVirtual tmpFrmVirtual;
    
//Table3 tmpFrmVirtual;
    
;

    
tmpFrmVirtual.InventTransId "248661";
    
tmpFrmVirtual.insert();
    
tmpFrmVirtual.InventTransId "248661";
    
tmpFrmVirtual.insert();

    while
        
select tmpFrmVirtual
        join  inventTrans
            group by TransRefId
PackingSlipIdDatePhysical
            where   inventTrans
.InventTransId == tmpFrmVirtual.InventTransId &&
                    
inventTrans.TransType == InventTransType::Purch &&
                    
inventTrans.StatusReceipt == StatusReceipt::Received

    
{
        
info(strfmt("%1, %2, %3",inventTrans.TransRefIdinventTrans.PackingSlipIdinventTrans.DatePhysical));
    } 
Старый 12.05.2004, 15:14   #2  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
join со временной таблице транслируется Акскптой в нечто вроде
while select tmpTable
{
while select inventTrans
group by F1, F2
{
}
}
Естественной никакой уникальности полей F1, F2 в данном случае не гарантируется.
Старый 12.05.2004, 15:44   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Продублируй Group BY для tmpFrmVirtual (или для inventTrans)

PHP код:
while
        
select tmpFrmVirtual
            group by InventTransId
        join  inventTrans
            group by TransRefId
PackingSlipIdDatePhysical
            where   inventTrans
.InventTransId == tmpFrmVirtual.InventTransId &&
                    
inventTrans.TransType == InventTransType::Purch &&
                    
inventTrans.StatusReceipt == StatusReceipt::Received

    
{
        
info(strfmt("%1, %2, %3",inventTrans.TransRefIdinventTrans.PackingSlipIdinventTrans.DatePhysical)); 
Непонятно, почему ты собственно ожидал уникальности данных, если поле InventTransId даже не включено в список групировки?
Старый 12.05.2004, 16:11   #4  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Временную и постоянную таблицу можно использовать в одном запросе, но с известной степенью осторожности. Смотри поиском по сайту - это не раз обсуждалось.

В твоем случае логичнее было бы использовать exists join, а не inner join, поменяв при этом порядок следования таблиц в запросе. Однако, это всё равно не прокатит, т.к. поле для связки с временной таблицей (inventTrans.InventTransId) не входит в состав полей секции group by и соответственно не войдет в выборку.

По-моему, здесь дело не во временной таблице.
Старый 12.05.2004, 17:00   #5  
axz is offline
axz
Участник
 
19 / 10 (1) +
Регистрация: 04.12.2003
Цитата:
Изначально опубликовано Владимир Максимов
Продублируй Group BY для tmpFrmVirtual (или для inventTrans)
...
Непонятно, почему ты собственно ожидал уникальности данных, если поле InventTransId даже не включено в список групировки?
InventTransId и не должно входить в список полей по которым происходит группировка, по нему 2 таблицы связываються, а уже над тем результатом что получился уже выполняется группировка.
Старый 12.05.2004, 17:53   #6  
axz is offline
axz
Участник
 
19 / 10 (1) +
Регистрация: 04.12.2003
Цитата:
Изначально опубликовано dn
Временную и постоянную таблицу можно использовать в одном запросе, но с известной степенью осторожности. Смотри поиском по сайту - это не раз обсуждалось.

В твоем случае логичнее было бы использовать exists join, а не inner join, поменяв при этом порядок следования таблиц в запросе. Однако, это всё равно не прокатит, т.к. поле для связки с временной таблицей (inventTrans.InventTransId) не входит в состав полей секции group by и соответственно не войдет в выборку.

По-моему, здесь дело не во временной таблице.
]

Да с помощью exists join тоже не получиться. А во временной все и дело, потому что если вместо временной использовать постоянную, то результат получается правильный.

Кстати вот запрос SQL:

SELECT B.TRANSREFID,B.PACKINGSLIPID,B.DATEPHYSICAL
FROM TABLE3 A,INVENTTRANS B
WHERE
(A.PRK_INVENTTRANSID=B.INVENTTRANSID) AND
(B.TRANSTYPE=3) AND
(B.STATUSRECEIPT=2)
GROUP BY B.TRANSREFID,B.PACKINGSLIPID,B.DATEPHYSICAL
ORDER BY B.TRANSREFID,B.PACKINGSLIPID,B.DATEPHYSICAL

В данном случае TABLE3 - это постоянная таблица, вместо временной
Старый 13.05.2004, 09:24   #7  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Изначально опубликовано axz
А во временной все и дело, потому что если вместо временной использовать постоянную, то результат получается правильный.
Т.е. trud был абсолютно прав. Спасибо, буду иметь в виду.
Старый 13.05.2004, 09:32   #8  
axz is offline
axz
Участник
 
19 / 10 (1) +
Регистрация: 04.12.2003
Цитата:
Изначально опубликовано dn

Т.е. trud был абсолютно прав. Спасибо, буду иметь в виду.
Да, спасибо trud, что пролил свет на это темное дело
Старый 13.05.2004, 10:03   #9  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
PHP код:
tmpFrmVirtual.InventTransId "248661";
tmpFrmVirtual.insert();
tmpFrmVirtual.InventTransId "248661";
tmpFrmVirtual.insert(); 
а нет ли здесь подвоха?
__________________
Чудес не бывает (c), истина где-то рядом (c)...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Подготовка запроса(ламерские вопросы продолжаются) HorrR DAX: Программирование 4 08.07.2008 13:23
Изменить план выполнения запроса Sequel DAX: Администрирование 2 29.05.2008 15:46
Быстродействие запроса Antonuch DAX: Программирование 1 25.01.2008 15:58
Оптимизация запроса oleg_e DAX: Программирование 16 11.01.2008 10:22
Теория: Создание отчета в виде Запроса Arahnid DAX: Программирование 6 14.11.2007 16:37

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

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

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