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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.08.2004, 09:32   #1  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Сложные SQL запросы
Что то я не понимаю одной вещи - можно ли в Аксапте программно сделать запрос, выбирающий данные сразу из нескольких таблиц (по JOIN) и если да, то как осуществляется работа с результатом?? Например у меня есть две связанные по ItemID таблицы (InventTable и InventItemBarcode), мне желательно в один запрос извлечь все штрих-коды (InventItemBarcode.ItemBarcode) и названия номенклатур из связанной InventTable для этих штрих-кодов. На SQL запрос реализующий такое выглядит примерно так (за корректность синтаксиса не ручаюсь):

SELECT IT.ItemName, IIT.ItemBarcode FROM InventTable as IT, InventItemBarcode as IIT WHERE IIT.ItemId = IT.ItemId


(для более корректного результата лучше использовать JOIN, но это не суть вопроса)

Как такое провернуть в аксапта и (самое главное) как потом итерировать по строкам результата, чтобы в итерации были доступны и InventTable.ItemName и InventItemBarcode.ItemBarcode??
Старый 19.08.2004, 09:56   #2  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
что-то типа этого

PHP код:
static void Job36(Args _args)
{
    
Query                   q;
    
QueryRun                qr;
    
InventTable             it;
    
InventItemBarCode       iibr;
    
QueryBuildDataSource    qbds;
    ;
    
= new Query();
    
qbds q.addDataSource(tablenum(InventTable));
    
qbds qbds.addDataSource(tablenum(InventItemBarCode));
    
qbds.addLink(fieldnum(InventTable,ItemId),fieldnum(InventItemBarCode,ItemId));
    
qbds.joinmode(JOINMODE::INNERJOIN);
    
qr = new QueryRun(q);
    while (
qr.next())
    {
        
it  qr.get(tablenum(InventTable));
        
iibr qr.get(tablenum(InventItemBarCode));
        
info(strfmt("%1 %2",it.ItemName,iibr.ItemBarCode);
        break;
    }

Старый 19.08.2004, 10:01   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вообще-то, ответом на такие вопросы является отправка читать мануал.

PHP код:
static void Job_Test(Args _args)
{
    
InventTable        inventTable;
    
InventItemBarcode    inventItemBarcode;
    ;

    while 
select inventTable
        join inventItemBarcode
        where inventTable
.ItemId == inventItemBarcode.ItemId
    
{
        
info(inventTable.ItemName+' = '+inventItemBarcode.ItemBarcode);
    }

Просто прочитай HELP по команде SELECT
Старый 19.08.2004, 10:09   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да можно и попроще, без Query:
PHP код:
while select ItemId
    from  inventTable
    where inventTable
.ItemId    like "А*"
    
join  configId
        from  configTable
        where configTable
.ItemId == inventTable.ItemId
{
    
info(strfmt("%1 %2",inventTable.ItemId,configTable.configId));

C Уважением,
Георгий
Старый 19.08.2004, 10:27   #5  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Просто прочитай HELP по команде SELECT
Дык... читал language guide неоднократно. Как всегда объяснений минимум, примеров таких запросов нет вообще.

Теперь, внимание, вопрос №1:
как правильно итерировать по такому селекту без while select:

select inventTable join inventItemBarcode where inventTable.ItemId == inventItemBarcode.ItemId

1. while ( inventTable ) // ???
{
...
next inventTable;
next inventItemBarcode
}
или достаточно будет написать
2. while ( inventTable ) // ???
{
...
next inventTable;
}

Ответ смогу найти сам через Job, интересно другое - что случится, если в InventTable не найдется номенклатруры соответствующей данному штрих-коду (реально такая ситуация возможна, inner join в SQL насколько я помню должен просто вернуть пустую inventTable.itemName)? видимо запрос надо переписать как

select inventItemBarcode join inventTable where inventTable.ItemId == inventItemBarcode.ItemId

и правильно итерировать без while select, так:

while ( inventItemBarcode )
{
...
next inventTable;
next inventItemBarcode
}

Вопрос ответа на который нет в мануале...
Старый 19.08.2004, 10:33   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
А мне понравилось вот это
Цитата:
(для более корректного результата лучше использовать JOIN, но это не суть вопроса)
Результат либо корректный (правильный), либо нет.

Цитата:
реально такая ситуация возможна, inner join в SQL насколько я помню должен просто вернуть пустую inventTable.itemName
неправильно помните.
Старый 19.08.2004, 10:36   #7  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
ой, гоню в последнем речь идет про outer join
Старый 19.08.2004, 10:39   #8  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
[quote[Результат либо корректный (правильный), либо нет.[/quote]

не совсем так. тут я говорю про разницу поведения inner join и outer join, которые в общем ведут себя похоже, но если в таблице InventTable отсутствует сопоставление с каким бы то ни было штрих-кодом мне нужен результат outer join
Старый 19.08.2004, 10:58   #9  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Всем спасибо, всё просто круто.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: SQL Server, Heart of Dynamics AX Blog bot DAX Blogs 0 13.07.2007 18:00
aEremenko: Диагностика проблем при установке Microsoft Dynamics Ax 4.0 на Microsoft SQL Server 2005 Blog bot DAX Blogs 0 28.10.2006 16:01
Сложные запросы в RLS Ruff DAX: Администрирование 12 30.08.2005 18:02
SQL запросы в контроле доступа на уровне записей SDA DAX: Программирование 2 15.10.2004 09:55
Сложные while select-запросы или вложенные циклы Atani DAX: Программирование 10 03.02.2004 13:46
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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