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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2015, 22:36   #1  
trudel is offline
trudel
Участник
 
52 / 10 (1) +
Регистрация: 17.04.2015
как правильно строить запросы в аксе.
Здравствуйте. Подскажите как правильнее делать, насколько я понял sql запрос создавать в аксапте крайне нежелательно. Запросы можно создавать через Queries или прям в тексте в коде while select... и погнали. Как правильнее? Или как самому удобнее так и делать? И про "a left join b on ..." уже тоже начитался и все же: реализуется он только следующим запросом к таблице b через передачу в Range (в where ) параметров из значений а?
Старый 24.04.2015, 05:12   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от trudel Посмотреть сообщение
Подскажите как правильнее делать
Queries гибче, while select легче читать и проще писать. Поэтому когда можешь, пользуешь x++ select, а когда надо queries.
Цитата:
Сообщение от trudel Посмотреть сообщение
насколько я понял sql запрос создавать в аксапте крайне нежелательно.
Это ты очень важную и правильную вещь понял.

Чтобы легче обучение шло, рекомендую сразу принять мысть что x++ select гораздо ближе к link запросам, чем к sql. Иначе говоря, он лишь внешне напоминает обычный sql.
__________________
Isn't it nice when things just work?
Старый 24.04.2015, 07:41   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Добавлю ещё, что без Query не обойтись если есть завязка на интерфейс. И в смысле вывода результата выборки (x++ select не привяжешь к датасорсу) и в смысле стандартной возможности изменения запроса через пользовательский интерфейс.
Старый 24.04.2015, 07:50   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
И в смысле вывода результата выборки (x++ select не привяжешь к датасорсу)
Да ладно)
Браузер таблиц намекает на обратное))
С ограничениями, конечно, но тем не менее
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 24.04.2015, 07:54   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от trudel Посмотреть сообщение
И про "a left join b on ..." уже тоже начитался и все же: реализуется он только следующим запросом к таблице b через передачу в Range (в where ) параметров из значений а?
А что с left join не так?
outer join в Аксапте не подходит?
__________________
Axapta v.3.0 sp5 kr2
Старый 24.04.2015, 08:39   #6  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Используйте Query, а чтобы не потеряться для анализа используйте QueryBrowser
За это сообщение автора поблагодарили: A_BAS (1).
Старый 24.04.2015, 08:52   #7  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от Russland Посмотреть сообщение
Используйте Query, а чтобы не потеряться для анализа используйте
Удобный инструмент. Только это AOT Query. С Query геренируемыми из кода несколько сложнее и гораздо менее наглядно.
__________________
Isn't it nice when things just work?

Последний раз редактировалось macklakov; 24.04.2015 в 08:56.
Старый 24.04.2015, 09:00   #8  
trudel is offline
trudel
Участник
 
52 / 10 (1) +
Регистрация: 17.04.2015
Цитата:
Сообщение от AndyD Посмотреть сообщение
А что с left join не так?
outer join в Аксапте не подходит?
прямо в RAnge (where) указать, что поля таблицы a "not null" ? пробовал так в Query- не вышло (возможно где-то ошибся) и нагуглил именно такой способ разделения на два запроса.
Старый 24.04.2015, 09:29   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от trudel Посмотреть сообщение
прямо в RAnge (where) указать, что поля таблицы a "not null" ? пробовал так в Query- не вышло (возможно где-то ошибся) и нагуглил именно такой способ разделения на два запроса.
Да, is null или is not null указать нельзя

Но вы бы привели пример запроса, может, другими средствами это решить можно)
__________________
Axapta v.3.0 sp5 kr2
Старый 24.04.2015, 09:54   #10  
trudel is offline
trudel
Участник
 
52 / 10 (1) +
Регистрация: 17.04.2015
Цитата:
Сообщение от AndyD Посмотреть сообщение
Да, is null или is not null указать нельзя

Но вы бы привели пример запроса, может, другими средствами это решить можно)
Разобрался. Спасибо. OUTER JOIN вынес в конец своего запроса и всё получилось.
Не могу сейчас найти вопрос форума, который меня сбил на заморочки, что LEFT join не заменяется outer join-ом, может там какая-то особая ситуация, к сожалению не отыщу теперь.
Старый 24.04.2015, 12:28   #11  
trudel is offline
trudel
Участник
 
52 / 10 (1) +
Регистрация: 17.04.2015
все равно нужна помощь к сожалению.

while select Apole
from a
outer join Bpole
from B
where B.RelationPole == A.RelationPole
join CPole
from C
where C.RelationQQQ == A.RelationQQQ &&
C.RelationTTT== isnull (B.RelationTTT , 0 )

Как в данном случае sql-кий isnull заменить ?
Старый 24.04.2015, 13:19   #12  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от trudel Посмотреть сообщение
все равно нужна помощь к сожалению.

while select Apole
from a
outer join Bpole
from B
where B.RelationPole == A.RelationPole
join CPole
from C
where C.RelationQQQ == A.RelationQQQ &&
C.RelationTTT== isnull (B.RelationTTT , 0 )

Как в данном случае sql-кий isnull заменить ?
По моему, у таблиц созданных из DAX, значения null выключены.
Старый 24.04.2015, 13:51   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от trudel Посмотреть сообщение
все равно нужна помощь к сожалению.

while select Apole
from a
outer join Bpole
from B
where B.RelationPole == A.RelationPole
join CPole
from C
where C.RelationQQQ == A.RelationQQQ &&
C.RelationTTT== isnull (B.RelationTTT , 0 )

Как в данном случае sql-кий isnull заменить ?
А версия Аксапты какая?
Если 2012-я, то можно разрулить при помощи вьюх
__________________
Axapta v.3.0 sp5 kr2
Старый 24.04.2015, 13:54   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от maldini Посмотреть сообщение
По моему, у таблиц созданных из DAX, значения null выключены.
В таблицах и нет NULL'ов
В запросе для C выбирается запись с "нулевым релейшеном", если для A нет связи с B
__________________
Axapta v.3.0 sp5 kr2
Старый 24.04.2015, 14:00   #15  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от trudel Посмотреть сообщение
все равно нужна помощь к сожалению.

while select Apole
from a
outer join Bpole
from B
where B.RelationPole == A.RelationPole
join CPole
from C
where C.RelationQQQ == A.RelationQQQ &&
C.RelationTTT== isnull (B.RelationTTT , 0 )

Как в данном случае sql-кий isnull заменить ?
notexists join
__________________
Возможно сделать все. Вопрос времени
Старый 24.04.2015, 14:06   #16  
trudel is offline
trudel
Участник
 
52 / 10 (1) +
Регистрация: 17.04.2015
NotExists как тут поможет? мне наоборот надо, чтобы запись в С искалась. либо поле из B берется Для ограничения выбора, либо если не нашлось B для A, то берется 0.

А view здесь как ?
Старый 24.04.2015, 14:19   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от trudel Посмотреть сообщение
А view здесь как ?
В 2012-й можно во вьюхе создать Computed Column, в котором указать для расчета функцию IsNull()

Т.е. создать вью на основании соединения таблиц A и B и в запросе использовать эту вьюху. Условие для С будет

X++:
while select view
join C
where C.RelationQQQ == view.RelationQQQ &&
C.RelationTTT == view.ComputedColumn
__________________
Axapta v.3.0 sp5 kr2
Старый 24.04.2015, 14:26   #18  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
notexists join
Цитата:
Сообщение от trudel Посмотреть сообщение
NotExists как тут поможет? мне наоборот надо, чтобы запись в С искалась. либо поле из B берется Для ограничения выбора, либо если не нашлось B для A, то берется 0.

А view здесь как ?
Сорри, я невнимательно вчитался.
Но тогда неясен запрос. Если таблица B связывается с C по INNER JOIN - то тогда какие могут быть NULL-ы?
NULL-ов в АХ нет.
Они могут образовываться только от LEFT OUTER JOIN, но именно эти записи отбираются notexists join-ом
__________________
Возможно сделать все. Вопрос времени
Старый 24.04.2015, 15:00   #19  
trudel is offline
trudel
Участник
 
52 / 10 (1) +
Регистрация: 17.04.2015
Все крутится в отчете и запрос еще соединения содержит, не очень удобно. Нельзя в коде через какой-нибудь == (case B.PoleTTT isnull '' default B.PoleTTT ) ?

а вот так понятнее или только усугубит: таблица A с прицепами для автомобилей. К ней привязана таблица B с автомобилями, именно в таблице B указан параметр определяющий стоимость из таблицы С для прицепа из А. В таблице С ищем стоимость- мы нашли наш прицеп в ней, но необходимо еще учесть параметр из B. Если автомобиль к прицепу не привязали, то берем по нашему прицепу по умолчанию параметр "оранжевый" и стоимость для него.
Старый 24.04.2015, 15:15   #20  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от trudel Посмотреть сообщение
Все крутится в отчете и запрос еще соединения содержит, не очень удобно. Нельзя в коде через какой-нибудь == (case B.PoleTTT isnull '' default B.PoleTTT ) ?

а вот так понятнее или только усугубит: таблица A с прицепами для автомобилей. К ней привязана таблица B с автомобилями, именно в таблице B указан параметр определяющий стоимость из таблицы С для прицепа из А. В таблице С ищем стоимость- мы нашли наш прицеп в ней, но необходимо еще учесть параметр из B. Если автомобиль к прицепу не привязали, то берем по нашему прицепу по умолчанию параметр "оранжевый" и стоимость для него.
Сумбурно конечно ... Такие вещи обычно бьются на 2 запроса. Это и шустрее и лечге потом правится и удобнее для многопользовательской БД.
Поэтому по сути - наверное с ходу не подскажу другой идеи, кроме как разбить запросы.
__________________
Возможно сделать все. Вопрос времени
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Множественные запросы по DataArea и VirtualDataAreaList Dreadlock DAX: Программирование 11 24.07.2012 11:43
Открытая сумма по счету-фактуре - как правильно вычислить? IKA DAX: Программирование 7 21.03.2011 19:46
Запросы / Итоги для ЗПР Prophetic DAX: Программирование 5 02.08.2010 15:13
оптимизируем запросы. SHiSHok DAX: Программирование 18 13.09.2009 21:26
Запросы в Аксапта ibc DAX: Программирование 5 08.08.2005 22:47

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

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

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