23.04.2015, 22:36 | #1 |
Участник
|
как правильно строить запросы в аксе.
Здравствуйте. Подскажите как правильнее делать, насколько я понял sql запрос создавать в аксапте крайне нежелательно. Запросы можно создавать через Queries или прям в тексте в коде while select... и погнали. Как правильнее? Или как самому удобнее так и делать? И про "a left join b on ..." уже тоже начитался и все же: реализуется он только следующим запросом к таблице b через передачу в Range (в where ) параметров из значений а?
|
|
24.04.2015, 05:12 | #2 |
NavAx
|
Queries гибче, while select легче читать и проще писать. Поэтому когда можешь, пользуешь x++ select, а когда надо queries.
Это ты очень важную и правильную вещь понял. Чтобы легче обучение шло, рекомендую сразу принять мысть что x++ select гораздо ближе к link запросам, чем к sql. Иначе говоря, он лишь внешне напоминает обычный sql.
__________________
Isn't it nice when things just work? |
|
24.04.2015, 07:41 | #3 |
Участник
|
Добавлю ещё, что без Query не обойтись если есть завязка на интерфейс. И в смысле вывода результата выборки (x++ select не привяжешь к датасорсу) и в смысле стандартной возможности изменения запроса через пользовательский интерфейс.
|
|
24.04.2015, 07:50 | #4 |
Участник
|
Цитата:
Браузер таблиц намекает на обратное)) С ограничениями, конечно, но тем не менее
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
24.04.2015, 07:54 | #5 |
Участник
|
Цитата:
outer join в Аксапте не подходит?
__________________
Axapta v.3.0 sp5 kr2 |
|
24.04.2015, 08:39 | #6 |
MCTS
|
Используйте Query, а чтобы не потеряться для анализа используйте QueryBrowser
|
|
|
За это сообщение автора поблагодарили: A_BAS (1). |
24.04.2015, 08:52 | #7 |
NavAx
|
Удобный инструмент. Только это AOT Query. С Query геренируемыми из кода несколько сложнее и гораздо менее наглядно.
__________________
Isn't it nice when things just work? Последний раз редактировалось macklakov; 24.04.2015 в 08:56. |
|
24.04.2015, 09:00 | #8 |
Участник
|
|
|
24.04.2015, 09:29 | #9 |
Участник
|
Цитата:
Но вы бы привели пример запроса, может, другими средствами это решить можно)
__________________
Axapta v.3.0 sp5 kr2 |
|
24.04.2015, 09:54 | #10 |
Участник
|
Цитата:
Не могу сейчас найти вопрос форума, который меня сбил на заморочки, что LEFT join не заменяется outer join-ом, может там какая-то особая ситуация, к сожалению не отыщу теперь. |
|
24.04.2015, 12:28 | #11 |
Участник
|
все равно нужна помощь к сожалению.
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 |
Участник
|
Цитата:
|
|
24.04.2015, 13:51 | #13 |
Участник
|
Цитата:
Если 2012-я, то можно разрулить при помощи вьюх
__________________
Axapta v.3.0 sp5 kr2 |
|
24.04.2015, 13:54 | #14 |
Участник
|
В таблицах и нет NULL'ов
В запросе для C выбирается запись с "нулевым релейшеном", если для A нет связи с B
__________________
Axapta v.3.0 sp5 kr2 |
|
24.04.2015, 14:00 | #15 |
Administrator
|
Цитата:
__________________
Возможно сделать все. Вопрос времени |
|
24.04.2015, 14:06 | #16 |
Участник
|
NotExists как тут поможет? мне наоборот надо, чтобы запись в С искалась. либо поле из B берется Для ограничения выбора, либо если не нашлось B для A, то берется 0.
А view здесь как ? |
|
24.04.2015, 14:19 | #17 |
Участник
|
В 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 |
Administrator
|
Цитата:
Но тогда неясен запрос. Если таблица B связывается с C по INNER JOIN - то тогда какие могут быть NULL-ы? NULL-ов в АХ нет. Они могут образовываться только от LEFT OUTER JOIN, но именно эти записи отбираются notexists join-ом
__________________
Возможно сделать все. Вопрос времени |
|
24.04.2015, 15:00 | #19 |
Участник
|
Все крутится в отчете и запрос еще соединения содержит, не очень удобно. Нельзя в коде через какой-нибудь == (case B.PoleTTT isnull '' default B.PoleTTT ) ?
а вот так понятнее или только усугубит: таблица A с прицепами для автомобилей. К ней привязана таблица B с автомобилями, именно в таблице B указан параметр определяющий стоимость из таблицы С для прицепа из А. В таблице С ищем стоимость- мы нашли наш прицеп в ней, но необходимо еще учесть параметр из B. Если автомобиль к прицепу не привязали, то берем по нашему прицепу по умолчанию параметр "оранжевый" и стоимость для него. |
|
24.04.2015, 15:15 | #20 |
Administrator
|
Цитата:
Сообщение от trudel
Все крутится в отчете и запрос еще соединения содержит, не очень удобно. Нельзя в коде через какой-нибудь == (case B.PoleTTT isnull '' default B.PoleTTT ) ?
а вот так понятнее или только усугубит: таблица A с прицепами для автомобилей. К ней привязана таблица B с автомобилями, именно в таблице B указан параметр определяющий стоимость из таблицы С для прицепа из А. В таблице С ищем стоимость- мы нашли наш прицеп в ней, но необходимо еще учесть параметр из B. Если автомобиль к прицепу не привязали, то берем по нашему прицепу по умолчанию параметр "оранжевый" и стоимость для него. Поэтому по сути - наверное с ходу не подскажу другой идеи, кроме как разбить запросы.
__________________
Возможно сделать все. Вопрос времени |
|