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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.09.2004, 12:00   #1  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
? Возможности Ranges
Привет, Всем!
Ответьте, пож., на маленький вопрос:
При:
this.query().dataSourceTable( TableNum( InventSum ) ).addRange( FieldNum( InventSum, OnOrder ) ).value( '>0' );
this.query().dataSourceTable( TableNum( InventSum ) ).addRange( FieldNum( InventSum, QuotationIssue ) ).value( '>0' );
Создается запрос:
(OnOrder>0) AND ( QuotationIssue>0)
Вопрос:
Как получить условие по OR?
Заранее спасибо...
Старый 02.09.2004, 12:31   #2  
Лютый is offline
Лютый
Участник
Аватар для Лютый
 
18 / 10 (1) +
Регистрация: 12.07.2004
Адрес: Екатеринбург
Re: Возможности Ranges
s= "((inventSum.OnOrder > 0 || inventSum.QuotationIssue > 0))"
// Обязательное наличие скобок
this.query().dataSourceTable( TableNum( InventSum ) ).addRange( FieldNum( InventSum, recId) ).value( s );
Старый 02.09.2004, 12:52   #3  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Спасибо !!!
Старый 02.09.2004, 13:23   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Re: Re: Возможности Ranges
Цитата:
Изначально опубликовано Лютый
s= "((inventSum.OnOrder > 0 || inventSum.QuotationIssue > 0))"
// Обязательное наличие скобок
Цитата:
The rules for Advanced query range value expressions are as follows:
Enclose the whole expression in parentheses.
Enclose all sub expressions in parentheses.
Use the relational and logical operators known from X++.
Use field name only for fields in the ranges data source.
Use the dataSource.field notation for fields from other data sources
in the query.
(c) Best practices -> Query programming -> Advanced query range value expressions
За это сообщение автора поблагодарили: kashperuk (1).
Старый 02.09.2004, 14:16   #5  
Лютый is offline
Лютый
Участник
Аватар для Лютый
 
18 / 10 (1) +
Регистрация: 12.07.2004
Адрес: Екатеринбург
Вся фишка именно в этих скобках и поле recid -

аксаптовский интерпретатор SQL уберет наружные скобки и сформирует
блок "where" в sql запросе

если скобок не указывать, то это будет воспиринято как то, что вы пытаетесь найти запись по recid.

Внутри блока queryrange "(( ))" следуйте лучшим стандартам на здоровье
Старый 03.09.2004, 11:41   #6  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Re: Re: Возможности Ranges
Цитата:
Изначально опубликовано Лютый
s= "((inventSum.OnOrder > 0 || inventSum.QuotationIssue > 0))"
// Обязательное наличие скобок
this.query().dataSourceTable( TableNum( InventSum ) ).addRange( FieldNum( InventSum, recId) ).value( s );
Такое ощущение, что axapta перестала смотреть внутрь скобок с производить форматирование
У меня:
1) inventSum.OnOrder - ругнется на inventSum. надо просто "OnOrder"
2) || - понимает только OR
3) у меня ругается на лишние скобки ()
4) когда в запросе появляется лишняя пара скобок, то он не выполняется Беда....
При этом пример:
http://www.axforum.info/forums/showt...F7%E5%ED%E8%E5
Выполняется Глюки...

Ax 3 sp3 hf 2

С Уважением,
Георгий
Старый 04.09.2004, 11:46   #7  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
А можно ли пользуясь таким "расширенным" способом фильтрации датасоурсов произвести фильтрацию типа exists join?
У меня стоит задача отфильтровать один датасоурс по ИЛИ следующим образом:
ИЛИ некое поле == конкретное значение,
ИЛИ некое поле exists join в некоей таблице

Ума не приложу как это сделать.
Старый 04.09.2004, 18:50   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Alks
ИЛИ некое поле exists join в некоей таблице
exist join в Аксапте вообще не так делается.
почитайте руководство разработчика, ключевое слово select statement
Старый 05.09.2004, 12:38   #9  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано mazzy

exist join в Аксапте вообще не так делается.
почитайте руководство разработчика, ключевое слово select statement
Да читал, читал, пуская скупую мужскую слезу. Реализация SQL запросов в аксапте сильно извращена, лишена динамичности, и (судя по этому форуму) так же лишена и гибкости.

Перформулирую вопрос по другому:

Мне нужно отфильтровать записи в InventTable специальным образом:
существует некая таблица категорий (или классификатор по другому), где каждый товар может входить в одну категорию, а категория может входить в другую категорию (другими словами - дерево). Для быстрой фильтрации предусмотрена вспомогательная, в целом избыточная по данным таблица взаимосвязей между группами и их подгруппами так, что в SQL фильтр для таблицы товара выглядел бы как дополнительное условие в WHERE:
(InventTable.ClassifierId = SelectedClassifId) OR EXISTS (SELECT ChildId FROM InventClassifierRelations WHERE InventClassifierRelations.ParentId = SelectedClassifId)
Т.е. выражает то условие, которое я описал выше - выбрать товар, только если его родителем является "выбранный узел" классификатора, либо любой узел классификатора, одним из родителей которого является "выбранный узел".
Пробовал добавить на форму InventTable датасоурс к уже заполненному классификатору и настроить датасоурс InventTable так, чтобы он фильтровал записи хотя бы просто по EXISTS JOIN на InventClassifierRelations, ничего не получилось по непонятным для меня причинам - непонятно еще по каким полям пытаются связаться эти датасоурсы.
В общем думаю понятно что я мало чего понимаю, и мне нужен совет как лучше реализовать такую задачу, если оно вообще возможно в аксапте.

P.S.
Заранее прошу не предлагать мне использовать "Абстрактный классификатор" - он не соответствует нашим целям.
Старый 05.09.2004, 18:04   #10  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано Alks
Да читал, читал, пуская скупую мужскую слезу. Реализация SQL запросов в аксапте сильно извращена, лишена динамичности, и (судя по этому форуму) так же лишена и гибкости.
да не переживайте Вы так

Цитата:
Мне нужно отфильтровать записи в InventTable специальным образом:
существует некая таблица категорий (или классификатор по другому), где каждый товар может входить в одну категорию, а категория может входить в другую категорию (другими словами - дерево). Для быстрой фильтрации предусмотрена вспомогательная, в целом избыточная по данным таблица взаимосвязей между группами и их подгруппами так, что в SQL фильтр для таблицы товара выглядел бы как дополнительное условие в WHERE:
(InventTable.ClassifierId = SelectedClassifId) OR EXISTS (SELECT ChildId FROM InventClassifierRelations WHERE InventClassifierRelations.ParentId = SelectedClassifId)
попробуйте переписать запрос как

PHP код:
WHERE EXISTS
(SELECT ChildId FROM InventClassifierRelations
   WHERE InventClassifierRelations
.ParentId SelectedClassifId
         
OR InventTable.ClassifierId SelectedClassifId
посмотрите, как на датасорсах в формах переопределяется метод executeQuery()

все у Вас получится
Старый 05.09.2004, 19:05   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Alks
Да читал, читал, пуская скупую мужскую слезу. Реализация SQL запросов в аксапте сильно извращена, лишена динамичности, и (судя по этому форуму) так же лишена и гибкости.
Эк, вас колбасит то...


Цитата:
Изначально опубликовано Alks
другими словами - дерево
Боже мой! Опять дерево.

Alks, нет у вас Аксапты, нет у вас компьютера.
Пожалуйста, объясните мне на пальцах или на бумажке что же вы хотите!

Для начала попробуйте выполнить руками то, что вы написали в своем сообщении.
Сколько времени у вас это занимает? Почему? Где самая трудоемкая операция? Почему?
Старый 06.09.2004, 05:18   #12  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано mazzy
Эк, вас колбасит то...
Колбасит или не колбасит не знаю, но соверешенно объективно:
1. тут в каких то топиках выяснили что по настоящему сложные запросы в axapta построить нельзя из-за неправильной расстановки скобок в получающихся SQL-селектах, да и нет полного соответствия и той гибкости запросов, который доступен в стандартном SQL
2. нет возможности просто и естественно создать и выполнить "динамически конструируемый" запрос .executeQuery( str SelectStatement ), что меня один раз уже сильно угнетало
Впрочем к сути дела это не относится.

Цитата:
Боже мой! Опять дерево.
Да просто концепция иерархичности (дерева) - один из самых понятных, естественных и удобных аппаратов восприятия окружающей нас действительности. С этим ничего не поделать, и несмотря на то что реляционные СУБД не могут решать задачу поддержки древовидных структур произвольной сложности одновременно соблюдая и эффективность и целостность/неизбыточность данных, деревья нужны и деревья важны.

Цитата:
Alks, нет у вас Аксапты, нет у вас компьютера.
Пожалуйста, объясните мне на пальцах или на бумажке что же вы хотите!
Да есть у меня компьютер и есть у меня аксапта и в этой аксапте уже в соответствии с одной из модификаций проекта, выработанного в плотном сотрудничестве с Коламбусом есть древовидный, 4-уровневый классификатор номенклатуры. Он уже работает как фильтр в самом справочнике. Но реализовывал его я наспех и сейчас есть время переделать его на более грамотный лад с лучшей поддержкой ссылочной целостности, так чтобы перевод товара из одной группы в другую не сопровождался появлением геморроидальных трещин на одном, всем известном месте.
Рассказывать чем являлся старый подход не буду, т.к. смысла не имеет.
Новый подход заключается в ведении таблицы InventClassifier ( ClassifId, ParentId, прочие атрибуты... ), а в таблицу InventTable добавлено поле (ClassifId).
Цель изначально стояла в том, чтобы при выделении группы (элемента классификатора) в таблице товаров отфильтровывались все записи, принадлежащие выделенному элементу, либо какому либо из его подэлементов (подчиненных ему групп). Да и каскадное удаление элементов классификатора тоже сталкивалось бы с многочисленными select-запросами. В старом варианте решения это было просто сделать (даже очень просто), а в новом по понятным причинам - совершенно геморройное это дело становится. Для решения этой задачи я ввожу дополнительную таблицу InventClassifierRelations, тем самым внося в базу избыточность (но уже избыточность в строках, а не столбцах, как ранее), где для каждого элемента классификатора храню сопоставление ( ParentId, ChildId, int Level ) для всех его родителей, на каком бы уровне он внутри них не находился, модифицирую методы insert и delete для InventClassifier. Теперь можно очень быстро - за один запрос отобрать все подгруппы для заданной на любом уровне вложенности. Каскадное удаление резко упрощается. И фильтрация классно бы решалась тем запросом про который я говорил...

В скором времени проверю сообщение Vadik-а и если получится, будет ему тысяча благодарностей.
Старый 06.09.2004, 06:39   #13  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Vadik
попробуйте переписать запрос как
PHP код:
WHERE EXISTS
(SELECT ChildId FROM InventClassifierRelations
   WHERE InventClassifierRelations
.ParentId SelectedClassifId
         
OR InventTable.ClassifierId SelectedClassifId
addRange я знаю что такое - но боюсь даже в "расширенном" (( )) виде условия рэнджа оператор SQL EXISTS не будет доступен.
Старый 06.09.2004, 10:52   #14  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Дерево... Да... Думаю mazzy Вас пошлет... надеюсь по ссылке...

Я с AXAPTA работаю всего полгода, но даже с таким опытом вижу, что Вы себе нажили гемморой на долгие годы вперед. Коламбус, конечно, молодцы, но их цель - это зарабатывание денег, а не объяснение клиентам почему так делать нельзя. И денег на Вас они заработают много...

Ладно, если опустить эмоции, то попробуйте в Вашей таблице InventClassifierRelations для каждого узла дерева делать ссылку на самого себя. Т.е. это будут строки у которых ParentId=ChildId и Level=0

Тогда запрос будет элементарен:

PHP код:
WHERE EXISTS
(SELECT ChildId FROM InventClassifierRelations
   WHERE InventClassifierRelations
.ParentId SelectedClassifId
PS: Мне интересно, как с такой (...) структурой таблицы InventClassifierRelations Вы делаете перемещение узла? Удаление и вставка - это легко, а вот передвинуть ветку со всеми узлами при такой структуре ...
Старый 06.09.2004, 11:41   #15  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Владимир Максимов
Дерево... Да... Думаю mazzy Вас пошлет... надеюсь по ссылке...
Да знаю, знаю. Неоднократно видел его мнение по данному вопросу, и... даже уважаю его.

Цитата:
Я с AXAPTA работаю всего полгода, но даже с таким опытом вижу, что Вы себе нажили гемморой на долгие годы вперед. Коламбус, конечно, молодцы, но их цель - это зарабатывание денег, а не объяснение клиентам почему так делать нельзя. И денег на Вас они заработают много...
Се ля ви, се ля бизнес. Я к сожалению точно так же как и коламбус не могу влиять на требования начальства и бизнес-процессы нашей фирмы, приходится выполнять то что приказывают выполнять.

Цитата:
Ладно, если опустить эмоции, то попробуйте в Вашей таблице InventClassifierRelations для каждого узла дерева делать ссылку на самого себя. Т.е. это будут строки у которых ParentId=ChildId и Level=0
Тогда запрос будет элементарен...
Мне кажется решение Vadik-а более элегантно. Добавлять дополнительные ссылки не надо, а EXISTS всё равно должен сработать правильно (если я правильно понимаю SQL и реляц. алгебру).

Цитата:
PS: Мне интересно, как с такой (...) структурой таблицы InventClassifierRelations Вы делаете перемещение узла? Удаление и вставка - это легко, а вот передвинуть ветку со всеми узлами при такой структуре ...
Вообще то это и есть то место, коим данный метод "жертвует" ради скорости и простоты в других местах. Именно здесь проявляется его "корявая древовидная сущность", но на самом деле всё не так уж и плохо - просто надо удалить все записи в InventClassifierRelations, относящиеся к данному узлу и всем его подузлам (1 операция select и n операций delete, где n - число строк вернувшееся select-ом), изменить данные в таблице InventClassifer и запустить рекурсивную процедуру rebuildClassifierRelations для перемещенного узла (выполняется за m * (1 select + n insert), где m - число подузлов в узле, n - число строк в результате select-а.
У нас размер этого классификатора где то 15 элементов на 1-ом уровне и в среднем по 5-10 элементов на остальных подуровнях, так что не всё так уж и плохо.
А вообще то операция перемещения групп настолько редкая штука, что я её даже не реализовывал еще.
Старый 28.09.2004, 10:54   #16  
gudzon is offline
gudzon
программист
 
1,166 / 324 (13) ++++++
Регистрация: 06.07.2004
Адрес: Москва
Этот ранджес меня доканает...
Подскажите, пжалуста, как реализовать на ранджесах такой запрос:

NOT((SalesLine.SalesType==3)AND (SalesLine.Information==0))
или
NOT(SalesLine.SalesType==3) OR
((SalesLine.SalesType==3)AND (SalesLine.Information==1))
или хотябы так
(SalesLine.SalesType==1) OR
((SalesLine.SalesType==3)AND (SalesLine.Information==1))
и т.д.

Заранее спасибо...
Старый 23.02.2006, 16:39   #17  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Подскажите что может быть за ошибка? Следующий код
X++:
        while (qr.next())
        {
            setupAccount = qr.get(tableNum(setupAccount));
            rangeStr = ' || ((AccountNum='+setupAccount.oldAccount+'))';
        }
        rangeStr = '((AccountNum='+qbr.value()+'))'+rangeStr;
        qbr.value(queryValue(rangeStr));
формирует такой запрос:
Код:
SELECT  FROM LedgerTrans 
WHERE ((TransDate<=31.01.2006)) AND ((Dimension[2] = 13)) 
AND ((((AccountNum=6059)) OR ((AccountNum=6011)))) 
AND ((OperationsTax = Обычн.))
Но запрос ничего не выбирает
Старый 24.02.2006, 17:03   #18  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
?
Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 21
Поясните убогому, что такое 21?
Старый 26.02.2006, 10:01   #19  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Попробуйте еще пару открывающих/закрывающих скобок использовать. И не стоит в данном случае использовать функцию queryValue.

X++:
while (qr.next())
        {
            setupAccount = qr.get(tableNum(setupAccount));
            rangeStr = ' || ((AccountNum='+setupAccount.oldAccount+'))';
        }
        rangeStr = '((AccountNum='+qbr.value()+'))'+rangeStr;
        qbr.value("(" + rangeStr + ")"));
Старый 26.02.2006, 12:13   #20  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
В кавычки номер счета возьмите
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
переделать запрос sql hated8 DAX: Программирование 28 16.01.2009 16:49
palleagermark: Change the appearance of printed report ranges Blog bot DAX Blogs 1 27.05.2008 21:21
palleagermark: Dynamic date ranges in queries Blog bot DAX Blogs 8 07.05.2008 17:03
Проверка возможности калькулирования Migel_84 DAX: Функционал 0 21.02.2006 09:44
Возможности InterCompany George V. Tavrizoff DAX: Функционал 3 30.03.2004 11:50
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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