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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.03.2013, 14:31   #1  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
Использование условия if и запроса к базе данных
Добрый день!
Подскажите, пожалуйста, искал по форуму и документации, не могу найти ошибку. Есть кусок кода для Axapta 4.0:

if (salestable.salesid == (select salesid
from salestable
join wmspickingroute
where salestable.salesid == wmspickingroute.transrefid
&& salestable.SalesStatus == salesstatus::completeleft
&&( wmspickingroute.expeditionstatus == wmsexpeditionstatus::started
|| wmspickingroute.expeditionstatus == wmsexpeditionstatus::activated)))

Компилятор выдает синтактическую ошибку, до этого работал только в sql, поэтому не могу понять что не правильно с синтаксисом.
Старый 07.03.2013, 14:43   #2  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
X++:
if (salestable.salesid == (select salesid
from salestable
join wmspickingroute
where salestable.salesid == wmspickingroute.transrefid
&& salestable.SalesStatus == salesstatus::completeleft
&&( wmspickingroute.expeditionstatus == wmsexpeditionstatus::started
|| wmspickingroute.expeditionstatus == wmsexpeditionstatus::activated)))
так проще ошибку найти
Старый 07.03.2013, 14:46   #3  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
X++:
    if (salestable.salesid == (select salesid from salestable
                                    where salestable.SalesStatus == salesstatus::completeleft
                               join wmspickingroute
                                    where wmspickingroute.transrefid       == salestable.salesid &&
                                         (wmspickingroute.expeditionstatus == wmsexpeditionstatus::started ||
                                          wmspickingroute.expeditionstatus == wmsexpeditionstatus::activated)).SalesId)
может так?
Старый 07.03.2013, 14:49   #4  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
salestable.salesid - наверно salestable должна быть по другому названа, акса может запарится
wmspickingroute.transrefid == salestable.salesid
чего тут сравнивать
Старый 07.03.2013, 14:49   #5  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
как то так

X++:
if (localsalestable.salesid == (select salesid from salestable
                                    where salestable.SalesStatus == salesstatus::completeleft
                               join wmspickingroute
                                    where wmspickingroute.transrefid       == salestable.salesid &&
                                         (wmspickingroute.expeditionstatus == wmsexpeditionstatus::started ||
                                          wmspickingroute.expeditionstatus == wmsexpeditionstatus::activated)).SalesId)
Старый 07.03.2013, 14:53   #6  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
Спасибо, за помощь. То есть в аксапте не нужно указывать по какому полю связывать таблицы? достаточно что они указаны в источнике данных?
Старый 07.03.2013, 14:58   #7  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
не понял, вам нужно найти записи в wmspickingroute с нужным SalesId?
Старый 07.03.2013, 15:00   #8  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
X++:
if (localsalestable.salesid == (select salesid from salestable
                                    where salestable.SalesStatus == salesstatus::completeleft
                               join wmspickingroute
                                    where wmspickingroute.transrefid       == localsalestable.salesid &&
                                         (wmspickingroute.expeditionstatus == wmsexpeditionstatus::started ||
                                          wmspickingroute.expeditionstatus == wmsexpeditionstatus::activated)).SalesId)
как то так наверно, сразу не сообразил
Старый 07.03.2013, 15:02   #9  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от kadet Посмотреть сообщение
Добрый день!
Подскажите, пожалуйста, искал по форуму и документации, не могу найти ошибку. Есть кусок кода для Axapta 4.0:

if (salestable.salesid == (select salesid
from salestable
join wmspickingroute
where salestable.salesid == wmspickingroute.transrefid
&& salestable.SalesStatus == salesstatus::completeleft
&&( wmspickingroute.expeditionstatus == wmsexpeditionstatus::started
|| wmspickingroute.expeditionstatus == wmsexpeditionstatus::activated)))

Компилятор выдает синтактическую ошибку, до этого работал только в sql, поэтому не могу понять что не правильно с синтаксисом.
Ваш SELECT всегда возвращает запись в указанную после слова FROM переменную, независимо от того, сколько полей вы указываете. В данном случае будет 2 переменных: salestable и wmspickingroute. Также ваш код не имеет смысла, т.к. SalesId будет всегда совпадать. Попробуйте следующий код:
X++:
select salesid from salestable
join wmspickingroute
    where salestable.salesid   == wmspickingroute.transrefid
    && salestable.SalesStatus == salesstatus::completeleft
    &&( wmspickingroute.expeditionstatus  == wmsexpeditionstatus::started
    || wmspickingroute.expeditionstatus  == wmsexpeditionstatus::activated);
if (mySalesTable.SalesId  == salesTable.SalesId) // Сравниваем 2 переменные указывающие на разные наборы данных
{
    // some code
}
__________________
// no comments
Старый 07.03.2013, 15:18   #10  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
Спасибо, получается данные полученные из выборки - это mysalsetable.salesid? или salestable.salesid?
Старый 07.03.2013, 15:25   #11  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
почему?
Старый 11.03.2013, 07:19   #12  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от kadet Посмотреть сообщение
Спасибо, получается данные полученные из выборки - это mysalsetable.salesid? или salestable.salesid?
salestable.salesid
__________________
// no comments
За это сообщение автора поблагодарили: kadet (1).
Старый 11.03.2013, 08:31   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Проясню некоторые моменты.
kadet, пример использования ключевого слова select, который вы привели в своём вопросе, является сокращённой его версией. Пример полного синтаксиса привёл dech. В полном варианте select не возвращает выбранные значения во внешние переменные, а инициализирует поля табличных переменных, входящих в состав запроса. Эти табличные переменные необходимо заранее объявить. Для сокращённого синтаксиса (select ...).field объявлять табличные переменные не нужно (!), он работает с именами таблиц. Но в результате, при сокращённой форме записи, например, невозможно приджойнить таблицу саму к себе (альясы не предусмотренны), а в полной версии select для этого можно использовать две табличных переменных с разным именем но одного типа.

Последний раз редактировалось S.Kuskov; 11.03.2013 в 09:39.
За это сообщение автора поблагодарили: kadet (1).
Старый 11.03.2013, 12:18   #14  
kadet is offline
kadet
Участник
 
8 / 10 (1) +
Регистрация: 07.03.2013
Спасибо, теперь понял почему, правда пошел другим путем, использовал joinChild().
Но теперь получется задвоение строк в Grid, т.к. использую OuterJoin. А мне нужен LEFT JOIN. Искал как обойти эту проблему - нашел только для Отчета, а данный код спользуется в Форме. Не подскажите, как сделать динимаческую группировку, или как решить эту проблему?
Старый 11.03.2013, 12:30   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kadet Посмотреть сообщение
Спасибо, теперь понял почему, правда пошел другим путем, использовал joinChild().
Но теперь получется задвоение строк в Grid, т.к. использую OuterJoin. А мне нужен LEFT JOIN. Искал как обойти эту проблему - нашел только для Отчета, а данный код спользуется в Форме. Не подскажите, как сделать динимаческую группировку, или как решить эту проблему?
Вы сейчас о чём? Какие формы? Какие группировки? Выше речь шла о Select. Для нового вопроса лучше создайте новую тему.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
В аксапте раскодировка данных полученных encodeURIComponent из ajax запроса Murlin DAX: Программирование 4 07.11.2012 01:06
Создание снимков изменений в базе данных Ace of Database DAX: Программирование 17 01.11.2011 12:34
Ошибка при доступе к подключению к базе данных Ark DAX: Администрирование 11 01.06.2009 08:17
пользовательский запрос к базе данных Nikolaich DAX: Функционал 3 19.01.2009 17:20
Разрешение на доступ к базе данных nicko DAX: Администрирование 3 18.05.2004 18:49
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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