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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.09.2003, 16:52   #1  
listener is offline
listener
Участник
 
74 / 11 (1) +
Регистрация: 23.07.2003
Адрес: г. Москва
Произвольный SQL-запрос
Подскажите возможно ли в Axapta создать Произвольный SQL-запрос

SELECT * FROM Table1 JOIN * FROM Table2 WHERE Table1.FieldA = Table2.FieldA
AND ((Table2.FieldB >= Table1.FieldB_Start) AND (Table2.FieldB <= Table1.FieldB_End))

и передать его разультаты, например в FormDataSource.
Заранее благодарен.
Старый 18.09.2003, 18:27   #2  
metal is offline
metal
Юзовские
Дети Юза
 
92 / 10 (1) +
Регистрация: 06.08.2002
Адрес: Украина
Query q =new Query();
q.addDataSource(tablenum(Table1))юaddDataSource(tablenum(Table2));
...
element.quryRun().query(q);

ит.д.
Старый 18.09.2003, 18:54   #3  
listener is offline
listener
Участник
 
74 / 11 (1) +
Регистрация: 23.07.2003
Адрес: г. Москва
Суть вотроса в том, как задать условия.
Старый 18.09.2003, 18:59   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
http://axapta.mazzy.ru/hints/search/
Спасибо Андрею Бобкову за классные замечания.
Старый 19.09.2003, 10:07   #5  
listener is offline
listener
Участник
 
74 / 11 (1) +
Регистрация: 23.07.2003
Адрес: г. Москва
Извиняюсь за настойчивость!
Но мне нужно осуществлять фильтрацию записей Joint Data Sourse не по конкретным значениям полей таблицы, а по значению поля связанной таблицы.
((Table2.FieldB >= Table1.FieldB_Start) AND (Table2.FieldB <= Table1.FieldB_End))
Возможно ли это?
Старый 19.09.2003, 10:41   #6  
Джон is offline
Джон
Участник
 
39 / 10 (1) +
Регистрация: 05.08.2003
Можно:

PHP код:
qu = new query();
qbds qu.addDataSource(tableNum(Table1), "T1");
qbds qbds.addDataSource(tableNum(Table2),"T2");
qbds.joinMode(joinMode::INNERJOIN);
qbds.addLink(fieldnum(Table1FieldA), fieldnum(Table2FieldA));
qr qbds.AddRange(fieldnum(Table2FieldB)); 
qr.value('(T2.FieldB >= T1.FieldB_Start) && (T2.FieldB <= T1.FieldB_End)');
element.quryRun().query(q); 
Вешать Range можно на любое поле, не обязательно FieldB


З.Ы. Код исправил - строку с AddLink промумил.
Старый 19.09.2003, 11:00   #7  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Еще можно использовать QueryBuildDynalink: http://www.axforum.info/forums/showt...ht=addDynalink
Старый 19.09.2003, 12:42   #8  
listener is offline
listener
Участник
 
74 / 11 (1) +
Регистрация: 23.07.2003
Адрес: г. Москва
Большое Спасибо Всем!!!
Все получилось ( воспользовался рекомендацией Джона )
Старый 02.10.2003, 18:11   #9  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Как можно добавить в расширенную фильтрацию через range поля типа Dimension?
Попытка добавить что-то типа
PHP код:
((Dimension[1] == '')||(Dimension[2] == '')) 
не привела к успеху.
Старый 02.10.2003, 23:11   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Не проверил, но...
попробуйте
((Department == '')||(Perpose == ''))
Старый 02.10.2003, 23:15   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Да, опять забыл и опять накололся на этом вопросе!
см. http://axapta.mazzy.ru/hints/emptyqueryrange/

чтобы проверить на пустую строку из программы надо указывать обратные слэши.
При вводе критериев в самой Аксапте слэши указывать не надо.
Старый 03.10.2003, 12:44   #12  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Сергей, спасибо за интересную информацию о задании пустой строки в критериях запроса. Хотя я с этим уже сталкивался, но лишнее напоминание не повредит.
Однако в случае "расширенной фильтрации" через range правила несколько другие.
Небольшая цитата из Best Practice (Advanced query range value expressions):
"As the contents of the Query range value expressions should look like x++, you should be aware that you format the different data types correctly. Do not use strFmt or SysQuery::value/queryValue for this. In x++ you can use the global method date2StrXpp to format a date to the correct x++ format, and use for example int2str to convert an enumerated value to the suitable numeric format."
Хотя про пустую строку здесь не сказано, но опытным путем проверено, что для обычных полей всё работает по-простому.
Проблема возникает именно для полей типа аналитик (когда требуется указывать индекс массива), при этом не имеет значения с чем сравнивать. Пусть к примеру будет не пустая строка, а "004".
p.s. Вариант с подстановкой SQL наименования поля (Dimension2_) тоже не проходит.
Старый 03.10.2003, 23:02   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано mazzy
((Department == '')||(Perpose == ''))
Проверил. Конечно же, здесь я ступил.

Цитата:
Изначально опубликовано dn
... aware that you format the different data types correctly. Do not use strFmt or SysQuery::value/queryValue for this.
О чем здесь говорится? О том, что работайте вручную с региональными настройкам
Поскольку strfmt сначала использует региональные настройки из типа, а затем текущие региональные настройки виндов. А в условиях многоязычности и многолокальности... вовсе не факт, что критерий будет сформирован правильно. В целом согласен. но... ввиду того, что у нас локаль на всех одна, я бы на это не обращал особого внимания. Хотя за совет спасибо - дополню статью.

Цитата:
Изначально опубликовано dn
Проблема возникает именно для полей типа аналитик (когда требуется указывать индекс массива), при этом не имеет значения с чем сравнивать. Пусть к примеру будет не пустая строка, а "004".
Да. Согласен. Проблема в том, что value устанавливает фильтр для всех аналитик. Забавно.
Попробуйте заимпортировать форму. Посмотрите на критерий.
Попробую завтра подумать/потестить.

Спасибо за интересную задачку.
Вложения
Тип файла: xpo mazdimquery.xpo (10.9 Кб, 402 просмотров)
Старый 05.10.2003, 21:47   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
результат сегодняшних тестирований:
1. у меня тоже не получилось задать фильтр на одну непервую аналитику.
2. однако сама Аксапта легко это делает. Достаточно зайти в бух.проводки и нажать кнопку фильтр.

Значит что-то не так делается при программировании.

Может это действительно баг. Помнится в 2.1 такая же ситуация была с аналитикой в отчете. Когда невозможно было выбрать не первый dimension в поле. в 2.5 это исправили.

Надо будет еще подумать.
Старый 06.10.2003, 10:48   #15  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
?
Наверное, я не могу четко сформулировать проблему... Попробую ещё раз.
Есть два типа фильтрации через range: обычная и расширенная. (Заранее извиняюсь за вольный перевод). При расширенной фильтрации не имееет значения по какому полю накладывается range, а анализируется только его значение, которое должно быть обязательно заключено в круглые скобки.
Как добавить вторую аналитику в запрос с помощью обычной фильтрации я знаю.
PHP код:
  Query q;
  
QueryBuildDataSource qbds;
  
QueryBuildRange qr;
  
FieldId fieldId;
  ;
  
= new query();
  
qbds q.addDataSource(tableNum(Table1), "T1");
  
fieldId fieldnum(Table1Dimension);
  
fieldId fieldId2Ext(fieldId2);
  
qr qbds.AddRange(fieldId);
  
qr.value("ВСП"); 
Вопрос - как сделать это в расширенной???
Старый 06.10.2003, 13:33   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
я понял. Именно "расширенная" фильтрация и не получилась.
Простая работает - согласен.
Старый 01.03.2004, 14:34   #17  
Mechanizm is offline
Mechanizm
Участник
 
54 / 10 (1) +
Регистрация: 01.03.2004
Адрес: Санкт-Петербург
у меня пример уважаемого Джона не работает - второй addDataSource вышибает первый.

(Аксапта 2.5)
Старый 29.06.2006, 08:24   #18  
Antant is offline
Antant
Участник
 
82 / 17 (1) ++
Регистрация: 03.12.2005
?
Хотелось бы узнать как быть, если условие нужно добавить полям с типом даты.

Date2str(date), когда я пытаюсь поставить в Range, у меня вылетает с ошибкой.
Попробовал так:

qbr.value('((Table.ExpDate <= '+int2str(date2num(DateTo))+') && (Table.ExpDate >= '+int2str(date2num(FromDate))+'))');

Но в данном случае выбираются не те данные... выбираются данные примерно на год позже . Вопрос знатокам: что я неправильно делаю?
__________________
И почему никто меня не любит?
Да, я надоедливый
Старый 29.06.2006, 16:31   #19  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от Antant
Хотелось бы узнать как быть, если условие нужно добавить полям с типом даты.
Пример:

PHP код:
query.dataSourceNo(1).findRange(fieldNum (VendTableHistoryDate)).value(SysQuery::range(fromDatetoDate)); 
Старый 29.06.2006, 21:25   #20  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от Antant
Хотелось бы узнать как быть, если условие нужно добавить полям с типом даты.

Date2str(date), когда я пытаюсь поставить в Range, у меня вылетает с ошибкой.
Попробовал так:

qbr.value('((Table.ExpDate <= '+int2str(date2num(DateTo))+') && (Table.ExpDate >= '+int2str(date2num(FromDate))+'))');
во всех этих "кривых" ренжах надо писать обычным синтаксисом x++ (с довесками в виде "лишних" скобок)
даты в коде х++ пишутся в виде дд\мм\гггг , например 01\12\2006, функция которая преобразовывает переменную типа дата к такой строке date2strxpp()

в вашем конкретном случае диапазона дат достаточно
qbr.value(queryrange(dateFrom, dateTo)), что то же самое что и SysQuery::range() из совета oip

Последний раз редактировалось db; 29.06.2006 в 21:27.
Теги
запрос (query), ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как преобразовать запрос в SQL-инструкцию Oloops DAX: Программирование 7 07.07.2008 20:38
Поймать SQL запрос при формировании отчета Qaz Qwerty DAX: Программирование 7 12.06.2008 01:46
SQL мониторинг + прямой запрос к SQL Alex_KD DAX: Программирование 17 29.05.2007 03:58
SQL Запрос Александр Костоусов DAX: Программирование 5 24.09.2004 12:15
Собственный SQL запрос в FormDataSource Alexey DAX: База знаний и проекты 0 20.12.2001 00:35

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

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

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