22.12.2001, 04:48 | #1 |
Смотрящий поверх деревьев (Варварский отморозок)
|
Решение проблемы с Query!
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
24.12.2001, 15:25 | #2 |
Продавец игрушек
|
Руками вкуснее. Это ещё древние знали.
__________________
С уважением, Роман Кошелев. |
|
24.12.2001, 15:28 | #3 |
Смотрящий поверх деревьев (Варварский отморозок)
|
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
24.12.2001, 22:29 | #4 |
Administrator
|
Согласно тому, что написано в Руководстве разработчика, создавать 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 |
Участник
|
ИЛИ в 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 |
Смотрящий поверх деревьев (Варварский отморозок)
|
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
11.01.2002, 12:39 | #7 |
Смотрящий поверх деревьев (Варварский отморозок)
|
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
11.01.2002, 12:53 | #8 |
Продавец игрушек
|
А примерчик можно?
__________________
С уважением, Роман Кошелев. |
|
11.01.2002, 13:12 | #9 |
Смотрящий поверх деревьев (Варварский отморозок)
|
А не пойти бы Вам?
<Зохавано мудератором> за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
11.01.2002, 14:00 | #10 |
Участник
|
Цитата:
Изначально опубликовано PlasticinE
<b>Хорошо, примерчик! </b> qbds.addRange(fieldNum(CustTable, AccountNum)).value('(accountNum like "*50.*)'); Но <i>LIKE</i> работать не хочет! (см. предыдущие сообщения) 1. в SQL запросе используются не *, а %. Попробуй получить строку SQL-запроса после того, как сформироуешь Аксаптовский запрос. 2. я ни разу не испытывал необходимости в Like. Как правило хватало "..". На худой конец, формировал условия <= >=. 3. Удивительно, а зачем тебе первая звездочка? Ты оставил выравнивание счетов вправо? А зачем? Ведь будет гораздо удобнее если указать выравнивание влево. (вправо удобнее для счетов GAAP) Т.е. я не могу ответить на твой вопрос, потому что ни разу так не понадобилось. Ты уверен, что поставил задачу правильно? Ты уверен, что выбрал верное средство для решения? Может есть другой способ решения? |
|
11.01.2002, 15:18 | #11 |
Смотрящий поверх деревьев (Варварский отморозок)
|
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
14.01.2002, 21:57 | #12 |
Участник
|
Я не удержался и попробовал.
Блин. У меня все делает. Все отбирает. За основу взял форму 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ксапта ругается и не может распарсить строку: Есть 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'е датасоурса. |
|
14.01.2002, 22:08 | #13 |
Участник
|
Возвращаясь к исходному вопросу.
Условие ИЛИ в query всегда можно было задать. Для этого надо вставить два критерия на одно и то же поле. См. рисунок. Сделать это можно с помощью кнопки расширено. Следовательно, и в языке тебе надо добавить два range на одно и то же поле и задать два критерия. А задавать два критерия на два поля в одном range, как это сделал AlGol - это изврат IHMO. Ни разу так не пробовал. |
|
15.01.2002, 11:47 | #14 |
Administrator
|
Сергей,
видимо Вы не совсем поняли вопрос. Изначально он стоял так:
Есть таблица 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 |
Участник
|
Спасибо, max.
Я действительно неправильно понял вопрос. Надо подумать. |
|
16.01.2002, 22:10 | #16 |
Участник
|
Немного разгреб дела.
Продолжим разговор? В Аксапте условие "или" по одному полю делается с помощью "," в Range.Value(). Поэтому вопрос по одному полю не стоит. Так? Как в Query можно задать условие "или" по двум полям (Field1=Value1 or Filed2=Value2) аналогичное Цитата:
while select * from table1
where table1.field1 == 15 || table1.field2 == 20 { element.execute(1) } Насколько я понимаю, 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, а где в руководстве об этом написано? Можешь ткнуть? |
|
17.01.2002, 12:56 | #17 |
Administrator
|
Спасибо за подробный ответ.
В руководстве написан примерно такой же способ, как Вы описали (если я правильно понял, два 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 |
Смотрящий поверх деревьев (Варварский отморозок)
|
<Зохавано мудератором>
за неуплату
__________________
It's a dirty job, but someone's got to do it. So? |
|
24.01.2002, 19:25 | #19 |
Участник
|
Цитата:
Вот такая проблема
Но мне кажется (IHMO ), что проблема решается не с того конца. Если по двум разным полям нужем поиск с оператором ИЛИ... скорее всего что-то не так в задаче. Или надо делать вспомогательное поле. А про счета... Есть же диапазон... Чего-то я не понимаю. С другой стороны, каждома пользователю в Аксапте можно определить список счетов, которые ему доступны. Вернее наоборот, каждому счету можно приписать список пользователей. В результате, если работает кассир, то он видит только 50-ые счета (причем только свои). Это с одной строны. С другой стороны, если пользователю нужны счета, в которые входит текст касса, то пусть сделает поиск по слову "Касса" и отфильтрует записи. В результате он получит записей 10-20. Среди этих записей пусть делает выбор руками. Я, конечно понимаю, что это не ответ на исходный вопрос (а можно ли в Аксапте?). Но давать в руки пользователей инструмент, который гарантировано забьет сервер насмерть... Нужно ли это? Еще раз повторюсь, у меня ни разу не возникало желание дать людям подобную функциональность. Мало того, я никогда не слышал от пользователей обоснованных пожеланий на включение такой фукнциональности. Ни в Аксапте не слышал, ни в других системах. |
|
25.10.2002, 17:58 | #20 |
Участник
|
Сделать ИЛИ в query по двум полям проще простого.
Используйте отрицательную логику и ИЛИ превратится в И. Пишите, могу выдать примерчик! |
|