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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.11.2006, 17:07   #1  
Nikolaich is offline
Nikolaich
Участник
 
238 / 10 (1) +
Регистрация: 15.12.2004
знатокам select
Коллеги - подскажите плиз почему не работает нижеприведенная конструкция:

почему не джойнится тока единственная запись ???
то есть при обработке у меня выскакивает throw errror

static void Job1(Args _args)
{
salesTable salesTable;
custInvoiceJour custInvoiceJour;
container cont;
;

while select salesTable
where salesTable.SalesStatus == SalesStatus::Invoiced
join firstonly firstfast custInvoiceJour
order by invoiceId desc
where custInvoiceJour.SalesId == salesTable.SalesId
{
if (! confind(cont, salesTable.salesId))
{
info(salesTable.salesID);
cont += salesTable.SalesId;
}
else
throw error('Повтор !!! ' + salesTable.SalesId);
}
}
Старый 28.11.2006, 17:19   #2  
eugene egorov is offline
eugene egorov
Участник
Аватар для eugene egorov
 
273 / 97 (4) ++++
Регистрация: 05.06.2002
Адрес: Москва
вместо join firstonly firstfast напиши exists join и будет щастие
__________________
любитель портвейна и снов с прокисшей капустой в усах
Старый 28.11.2006, 17:25   #3  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Потому, что в первую ветку if система никогда не попадет. Контейнер надо инициализировать до проверки
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 28.11.2006, 17:28   #4  
Nikolaich is offline
Nikolaich
Участник
 
238 / 10 (1) +
Регистрация: 15.12.2004
ах если было бы так просто, до exists join я и сам догадался.
В том то и дело что в теле цикла надо потом юзать как данные переменной salesTable так и custInvoiceJour, что при примении exists join невозможно
Старый 28.11.2006, 17:29   #5  
Nikolaich is offline
Nikolaich
Участник
 
238 / 10 (1) +
Регистрация: 15.12.2004
что значит не попадет ? попадет и еще как - запустите код на исполнение
Старый 28.11.2006, 17:42   #6  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от Nikolaich Посмотреть сообщение
что значит не попадет ? попадет и еще как - запустите код на исполнение
Работает. Я понял. У Вас первая запись идет с двойным инвойсом. Попробуйте сделать order by по номеру заказа. У меня в инфолог заказы вывелись
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 28.11.2006, 18:06   #7  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Гм.. а разве join firstonly вообще должно работать? Оно и в нормальном скуле не работает.. вообще в чем смысл даного запроса - найти заказы, по которым более одной накладной?

В скуле если только такую конструкцию придумать, если именно нужен джоин первой записи

select st.*, CustInvJ.* from dbo.salesTable st
inner join (select top 1 * from dbo.CustInvoiceJour) as CustInvJ
on CustInvJ.SalesId = st.SalesId

В Ахапке только вложенным подзапросом наверное
Старый 28.11.2006, 20:07   #8  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Может так ?
Код:
    while select salesTable
    where salesTable.SalesStatus == SalesStatus::Invoiced
    join count(recId) from custInvoiceJour
    group by SalesId
    where custInvoiceJour.SalesId == salesTable.SalesId
    {
PS: у меня работает

Последний раз редактировалось Delfins; 28.11.2006 в 20:09.
Старый 28.11.2006, 20:51   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Хинт firstonly - это внутренняя "фишка" AXAPTA. Это вовсе не аналог TOP 1 в MS SQL.

Работает это примерно так:

AXAPTA посылает обычный SELECT серверу и начинает считывать результат порциями по несколько записей. Если встречается хинт firstonly, то после первой записи процесс чтения останавливается.

Это все работает, если firstonly стоит сразу за select, но после join он не имеет смысла. Поскольку это хинт не собственно отправленной на сервер конструкции SELECT, а способ разбора результата этого запроса. Уже на стороне AXAPTA. И как она будет "выковыривать" первую запись подчиненной таблицы?

В данном случае придется либо отказаться от объединения твух таблиц в одном запросе и делать вложенные запросы, либо отсекать дубли вручную внутри цикла (добавив сортировку по SalesId).
За это сообщение автора поблагодарили: mazzy (5).
Старый 29.11.2006, 08:49   #10  
Алексей Контев is offline
Алексей Контев
Участник
 
118 / 31 (2) +++
Регистрация: 28.12.2001
Адрес: Барнаул
А такой метод не подойдет?
X++:
static void Job150(Args _args)
{
    custInvoiceJour custInvoiceJour;
    while select count(recid) from custInvoiceJour group by salesid
    where custInvoiceJour.InvoiceDate > mkdate(1,10,06)
    {
        if (custInvoiceJour.RecId > 1)
            info(strFmt('%1 %2 ',
                 custInvoiceJour.SalesId,
                 custInvoiceJour.RecId));
    }


}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
2 while select или join? _scorp_ DAX: Программирование 9 23.01.2009 16:02
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
gatesasbait: Reverse keyword on Select Statements Blog bot DAX Blogs 0 08.02.2008 00:10
Fred Shen: Always use recId to know if a select statement returns a record Blog bot DAX Blogs 0 28.10.2006 16:40
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43

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

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

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