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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.12.2001, 04:48   #1  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
! Решение проблемы с Query!
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 24.12.2001, 15:25   #2  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Руками вкуснее. Это ещё древние знали.
__________________
С уважением, Роман Кошелев.
Старый 24.12.2001, 15:28   #3  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
:(
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 24.12.2001, 22:29   #4  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Согласно тому, что написано в Руководстве разработчика, создавать Query с ИЛИ можно. Только вот если сделать так, как там написано, работает не так .

Может я что-то криво сделал?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 25.12.2001, 15:25   #5  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
ИЛИ в Query
Для применения условия ИЛИ в Query достаточно записать полное выражение с ИЛИ в range.

Пример:
query = new Query();
qbds = query.addDataSource(tableNum(CustTable));
qbds.addRange(fieldNum(CustTable, AccountNum)).value('((accountNum == "00012") || (NameAlias == "РогаИКопыта"))');
Старый 09.01.2002, 17:09   #6  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 11.01.2002, 12:39   #7  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 11.01.2002, 12:53   #8  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
А примерчик можно?
__________________
С уважением, Роман Кошелев.
Старый 11.01.2002, 13:12   #9  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
А не пойти бы Вам?
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 11.01.2002, 14:00   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано PlasticinE
<b>Хорошо, примерчик! </b>

qbds.addRange(fieldNum(CustTable, AccountNum)).value('(accountNum like "*50.*)');
Но <i>LIKE</i> работать не хочет! (см. предыдущие сообщения)

Я конечно могу ошибаться...
1. в SQL запросе используются не *, а %. Попробуй получить строку SQL-запроса после того, как сформироуешь Аксаптовский запрос.
2. я ни разу не испытывал необходимости в Like. Как правило хватало "..". На худой конец, формировал условия <= >=.
3. Удивительно, а зачем тебе первая звездочка? Ты оставил выравнивание счетов вправо? А зачем? Ведь будет гораздо удобнее если указать выравнивание влево. (вправо удобнее для счетов GAAP)

Т.е. я не могу ответить на твой вопрос, потому что ни разу так не понадобилось.
Ты уверен, что поставил задачу правильно? Ты уверен, что выбрал верное средство для решения? Может есть другой способ решения?
__________________
полезное на axForum, github, vk, coub.
Старый 11.01.2002, 15:18   #11  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 14.01.2002, 21:57   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Я не удержался и попробовал.
Блин. У меня все делает. Все отбирает.

За основу взял форму LedgerTransAccountPeriod.
В init формы добавил range.
super();
query = new Query();

query.addDataSource(tablenum(LedgerTable));
ledgerTable_ds.query(query);
crit = ledgerTable_ds.query().dataSourceNo(1).addRange(fieldnum(LedgerTable, AccountNum));

В executeQuery датасоурса устанавливаю value
criteria.value('*10*');

Все работает.

У меня Axapta 2.5. Версия исполнимого файла от международного СП2.

Такая проблема была в версиях 2.1 с неправильноустановленной кодировкой на SQL7.0 или на MSDE.

Может все же кодировка?

Цитата:
Изначально опубликовано PlasticinE

Способ-то, конечно, есть...
Как я уже говорил, это проявляется только при использовании Ranges в Query. При подстановке в значение <i>Range</i> конструкции с <i>LIKE</i> Aксапта ругается и не может распарсить строку:
Есть select в самом X++
Есть query в репозитарии.
Есть query d формах и отчетах.

Query понимают ranges и разбирают "*","?","..","<",">".
select не разбирает ничего.

В query нельзя писать like (Query поймет его как подстроку)

В query можно явно подставить произвольный select как SQL-выражение. Тогда ничего разбираться не будет - что подставишь то и будет передаваться на SQL-сервер. В этом случае надо использовать метасимволы % и _.

По-моему у тебя где-то в терминологии путаница. Или в настройках ODBC с SQL'ем.

Цитата:
Изначально опубликовано PlasticinE

Но... Не я распоряжаюсь КАК вести учет и прочее. И не от меня зависит как будет стоять выравнивание... Вот и приходится работать с тем как есть...
Как вести учет - согласен.
Но выравнивание! А кто ж еще кроме тебя будет определять такие сугубо программисткие вещи?

Цитата:
Изначально опубликовано PlasticinE

Если же вставлять <i>LIKE</i> в обычный <i>SELECT</i>, то все замечательно работает. Но, как вами же, товарищ mazzy (ничего что я так - мне так привычней ), скзано - лучший подход при внедрении <b>Минимум программирования</b>.

При этом минимальней получится добавить 1-2 <i>Range</i> в <i>Query</i>. Чем писать собственный <i>SELECT</i> с последующим разбором того что он выдал ручками...

Или нет?.. (не претендую на высокий класс программирования)
Давай тогда подробнее.
Что делаешь? Какой select и куда? Select Аксапты или Select SQL-я?
Ты вставляешь range каким образом и в какие методы?
На худой конец (это если конец совсем худой) скажи версию SQL, ODBC, кодировку базы на сервере.

Слушай, а ты в каком методе устанавливаешь value?
В ините формы? Если так... Дык, ведь это value будет переинициализировано в init'е датасоурса.
__________________
полезное на axForum, github, vk, coub.
Старый 14.01.2002, 22:08   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Возвращаясь к исходному вопросу.
Условие ИЛИ в query всегда можно было задать. Для этого надо вставить два критерия на одно и то же поле. См. рисунок. Сделать это можно с помощью кнопки расширено.



Следовательно, и в языке тебе надо добавить два range на одно и то же поле и задать два критерия.


А задавать два критерия на два поля в одном range, как это сделал AlGol - это изврат IHMO. Ни разу так не пробовал.
Вложения
Тип файла: img918-1 (55.6 Кб, 995 просмотров)
__________________
полезное на axForum, github, vk, coub.
Старый 15.01.2002, 11:47   #14  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Сергей,
видимо Вы не совсем поняли вопрос. Изначально он стоял так:

Есть таблица T с полями F1 и F2. Как через Query создать запрос, аналогичный запросу SQL
<pre> SELECT * FROM T WHERE T.F1 == 1 OR T.F2 == 2 </pre>т. е. условие изначально накладывается на два <b>разных</b> поля, а не на одно.

AlGol, кажется, дал верный ответ. Теперь проблема в том, что не удается в этом случае создать запрос вида
<pre> SELECT * FROM T WHERE T.F1 LIKE "1*" OR T.F2 LIKE "2*" </pre>

Ждем (PlasticinE, я, а также многие другие) советов.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 15.01.2002, 12:01   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Спасибо, max.

Я действительно неправильно понял вопрос.
Надо подумать.
__________________
полезное на axForum, github, vk, coub.
Старый 16.01.2002, 22:10   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Немного разгреб дела.
Продолжим разговор?

В Аксапте условие "или" по одному полю делается с помощью "," в Range.Value(). Поэтому вопрос по одному полю не стоит. Так?

Как в Query можно задать условие "или" по двум полям (Field1=Value1 or Filed2=Value2) аналогичное
Цитата:
while select * from table1
where table1.field1 == 15 ||
table1.field2 == 20

{
element.execute(1)
}
PlasticinE, так? Я правильно сформулировал?

Насколько я понимаю, Query в Аксапте реализует концепцию QBE - query by example. Пример реализации - конструктор запросов в Access (кстати, в первый раз реализацию QBE я видел в Paradox'е. Там тоже выразить или было достаточно тяжело). В Access'е для того, чтобы добавить условие или надо добавить строчку.

Первое что приходит в голову, это то, что datasource в Аксапте соответствует одной строчке в конструкторе запросов Access'а. Значит, чтобы "добавить вторую строчку" надо добавить datasource.

Развиваем мысль.

Делаем запрос с двумя связанными датасоурсами. Оба датасоурса используют одну и ту же таблицу. В первом датасоурсе Range по Field1, а во втором датасоурсе Range по Field2.
Тип соединения датасорусов outerJoin. Что-нибудь в этом духе.

Нет сил сейчас проверить. Но думаю, что рыть надо примерно в этом направлении.

Недостатки подхода - вместо однопроходного селекта получается двухпроходной (что не очень то и хорошо).
Достоинства - можно работать с Query. Query можно показывать пользователю. Query выполняет разбор условий. Query легко модифицируется.



Альтернатива - подсунуть в query вручную написанный SQL-запрос. Но тогда никаких разборов выполняться не будет. И, видимо, будут проблемы с like (судя по сообщению PlasticinE).


А можно и к вам вопрос?
PlasticinE, AlGol, А в каких случаях может понадобится поиск с ИЛИ, да еще и с использованием Like? Неужто для поиска контрагента по частичному коду ИЛИ частичному названию? Если да, то зачем? Или есть другая задача?


max, а где в руководстве об этом написано? Можешь ткнуть?
__________________
полезное на axForum, github, vk, coub.
Старый 17.01.2002, 12:56   #17  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Спасибо за подробный ответ.
В руководстве написан примерно такой же способ, как Вы описали (если я правильно понял, два DataSource на 0 уровне в Query).

Непосредственно про то, как делать Query с или в Руководстве, конечно, не написано. На вариант решения меня подтолкнула статья Creating Queries - Creating a Query - Sequencing of retrieved records. Там вроде подходящий порядок записей. Проблема в том, что они этот пример для 1 уровня вложенности приводят. Логично было бы предположить, что он и на 0 уровне будет работать, но это не так.

Есть идея, сделать два Data Source, указывающих на одну таблицу, причем один из них будет внедрен (embedded) в другой. Но развивать ее пока нет времени.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 24.01.2002, 17:14   #18  
PlasticinE is offline
PlasticinE
Смотрящий поверх деревьев (Варварский отморозок)
 
243 / 10 (1) +
Регистрация: 06.12.2001
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So?
Старый 24.01.2002, 19:25   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Вот такая проблема
Понял.
Но мне кажется (IHMO ), что проблема решается не с того конца.

Если по двум разным полям нужем поиск с оператором ИЛИ... скорее всего что-то не так в задаче. Или надо делать вспомогательное поле.

А про счета... Есть же диапазон... Чего-то я не понимаю.

С другой стороны, каждома пользователю в Аксапте можно определить список счетов, которые ему доступны. Вернее наоборот, каждому счету можно приписать список пользователей.

В результате, если работает кассир, то он видит только 50-ые счета (причем только свои). Это с одной строны.

С другой стороны, если пользователю нужны счета, в которые входит текст касса, то пусть сделает поиск по слову "Касса" и отфильтрует записи. В результате он получит записей 10-20. Среди этих записей пусть делает выбор руками.

Я, конечно понимаю, что это не ответ на исходный вопрос (а можно ли в Аксапте?). Но давать в руки пользователей инструмент, который гарантировано забьет сервер насмерть... Нужно ли это?

Еще раз повторюсь, у меня ни разу не возникало желание дать людям подобную функциональность. Мало того, я никогда не слышал от пользователей обоснованных пожеланий на включение такой фукнциональности. Ни в Аксапте не слышал, ни в других системах.
__________________
полезное на axForum, github, vk, coub.
Старый 25.10.2002, 17:58   #20  
SIRS is offline
SIRS
Участник
 
14 / 10 (1) +
Регистрация: 05.09.2002
Адрес: Москва
Сделать ИЛИ в query по двум полям проще простого.
Используйте отрицательную логику и ИЛИ превратится в И.
Пишите, могу выдать примерчик!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
Передача query в report, проблемы Андрей К. DAX: Программирование 9 26.06.2008 15:38
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Проблема с составлением Query axaLearner DAX: Программирование 10 01.12.2005 15:00

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

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

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