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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.03.2004, 13:22   #1  
ArturK is offline
ArturK
Участник
 
81 / 10 (1) +
Регистрация: 13.08.2003
? Фильтр по enum-полю в select
Вопрос в следующем,

Чтобы отобрать все строковые поля в select я пишу ...="*",
а есть что-то аналогичное для Enum-полей, чтобы можно было отбирать все Enum-поля?
Старый 29.03.2004, 13:33   #2  
YVAS is offline
YVAS
1C
Аватар для YVAS
1C
 
265 / 10 (1) +
Регистрация: 31.07.2003
Re: Фильтр по enum-полю в select
Цитата:
Изначально опубликовано ArturK

Чтобы отобрать все строковые поля в select я пишу ...="*",
Ничего себе, а поподробней можно?
Старый 29.03.2004, 13:46   #3  
ArturK is offline
ArturK
Участник
 
81 / 10 (1) +
Регистрация: 13.08.2003
Ok, поподробнее напишу.

Для строкового поля я пишу так:

PHP код:
Id param.text() ? param.text() : "*";

select from table were table.id like id
Хочется для enum-поля что-то подобное написать (вместо вопросов)

PHP код:
enumId param.text() ? "NoYes::No" : ???? ;

select from table were table.id enumid
Старый 29.03.2004, 14:21   #4  
Andrew Besedin is offline
Andrew Besedin
Участник
 
119 / 15 (1) ++
Регистрация: 25.01.2002
Привет!
Так?
PHP код:
static void Job11(Args _args)
{
    
LedgerTable ledgerTable;

    while 
select ledgerTable
        where ledgerTable
.AccountPlType <= maxint()
    {
        print 
ledgerTable.AccountPlType;
    }
    
pause;

__________________
Успехов!
Андрей Беседин
Старый 29.03.2004, 14:45   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано ArturK
Для строкового поля я пишу так:

PHP код:
Id param.text() ? param.text() : "*";

select from table were table.id like id
Хочется для enum-поля что-то подобное написать (вместо вопросов)
В seelct'е? описательные текст перечисления?
1.
Не стоит. Поскольку придется учитывать разные языки.
Причем учитывать хитро, поскольку клиент и сервер приложений могут быть запущены с разными языками.

2.
Не стоит. Поскольку Аксапта позволяет изменять текстовые метки пользователям. И ваше условие может не сработать, если пользователь поменяет какой-либо текст

3.
Не стоит. Поскольку вы закладываете какой-то смысл в текст метки, вместо того, чтобы пользоваться нормальными реляционными средствами. Если некоторые перечисления у вас имеют специальный смысл, то сделайте таблицу, в которую занесите эти перечисления. Не закладывайте в код программы "магические" константы.
Старый 29.03.2004, 17:51   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если нужны не текст перечисляемого типа, а именно значение, то почему не написать условие "больше или равно нулю" ("0..") или от 0 до 255 (других значений ведь быть не может)
Старый 30.03.2004, 10:10   #7  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Редкостный изврат.
Енум - это ПО ОПРЕДЕЛЕНИЮ - ПЕРЕЧИСЛЕНИЕ !
Какой диапазон может быть в перечислении?

Цитата:
Цитата из ArturK
PHP код:
Id param.text() ? param.text() : "*";

select from table were table.id like id
Для сравнения перечисления необходимо его перечислить. IMHO.
PHP код:
select table 
    where table
.id == EnumName::Element1
       
|| table.id == EnumName::Element2
       
|| table.id == EnumName::Element4
Старый 30.03.2004, 10:10   #8  
ArturK is offline
ArturK
Участник
 
81 / 10 (1) +
Регистрация: 13.08.2003
Цитата:
Изначально опубликовано Владимир Максимов
Если нужны не текст перечисляемого типа, а именно значение, то почему не написать условие "больше или равно нулю" ("0..") или от 0 до 255 (других значений ведь быть не может)
Да, я знаю что можно написать "... > 0" и получить все значение enum-типа, но вопрос в другом.

У меня может быть два условия,
первое, когда берутся все значения
и второе, когда только одно значение.

Хочется реализовать это в одном select`e,
а не писать

PHP код:
if(если нужно одно значение)
{
     
select ... where enum_fild значение
}
else
{
     
select ... where enum_fild 0


Вот как такую конструкцию совместить в одном select`e и не использовать if?
Старый 30.03.2004, 10:19   #9  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Изначально опубликовано ArturK
PHP код:
if(если нужно одно значение)
{
     
select ... where enum_fild значение
}
else
{
     
select ... where enum_fild 0


для таких дел есть логические операторы && и ||
PHP код:
    select ... 
        
where (если нужно одно значение) && enum_fild == EnumName::Element1
Старый 30.03.2004, 10:38   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
PHP код:
     select ... where enum_fild >= (Мин.значение) && enum_field<=(Макс.значение
Если нужно отобрать одно значение, то присваиваешь и Мин.значение и Макс.значение одну и ту же величину.

А если нужно отобрать все, то

Мин.значение = 0
Макс.значение = 255

Enum не могут принимать значения больше 255. Это системное ограничение.
Старый 30.03.2004, 10:44   #11  
Джон is offline
Джон
Участник
 
39 / 10 (1) +
Регистрация: 05.08.2003
Цитата:
Изначально опубликовано ta_and
PHP код:
select ... 
        
where (если нужно одно значение) && enum_fild == EnumName::Element1
ИМХО, условие другое:

PHP код:
select ... 
where ( ! если нужно одно значение) || enum_fild == EnumName::Element1
Старый 30.03.2004, 11:13   #12  
Anais is offline
Anais
Участник
Аватар для Anais
 
182 / 10 (1) +
Регистрация: 16.06.2003
Адрес: Москва
Re: Редкостный изврат!
Цитата:
Изначально опубликовано ta_and
Редкостный изврат!
Енум - это ПО ОПРЕДЕЛЕНИЮ - ПЕРЕЧИСЛЕНИЕ !
Какой диапазон может быть в перечислении?
Та ну?!

А между тем в исходных кодах аксапты за милую душу встречаются запросы по перечислимому полю с выборкой типа Value >= X или X1 <= Value <= X2. В логику некоторых "родных" перечислимых типов заложено смысловое значение диапазонов. Простейший пример - перечислимый тип прав доступа
Так что зря вы так на перечислимые типы-то...
__________________
Улыбаемся и машем, парни! Улыбаемся и машем...
Старый 30.03.2004, 11:16   #13  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
:) Прошу прощения. поторопился...
Видел же, что-то тут не так... но не стал проверять...
Конечно правильно так:
Цитата:
Изначально опубликовано Джон
PHP код:
select ... 
where ( ! если нужно одно значение) || enum_fild == EnumName::Element1
Старый 30.03.2004, 11:19   #14  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Изначально опубликовано Anais
В логику некоторых "родных" перечислимых типов заложено смысловое значение диапазонов.
Что позволено Юпитеру, то не позволено Быку.

Все равно редкостный изврат.
От таких программерских решений просто тошнит.

Посмотрите на енум LedgerTransTxt. Вам хорошо?
Старый 30.03.2004, 11:29   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
ArturK
Кстати, если все-таки будешь делать такое универсальное условие проверь 2 предложенных варианта с точки зрения быстродействия. Исходя из логики работы MS SQL лично мне кажется, что BETWEEN должен работать быстрее чем ИЛИ. Но это надо бы проверить. В смысле быстродействия с Axapta ничего заранее не ясно.
Старый 30.03.2004, 11:34   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано ArturK
Хочется реализовать это в одном select`e,
а не писать

PHP код:
if(если нужно одно значение)
{
     
select ... where enum_fild значение
}
else
{
     
select ... where enum_fild 0


(Нудным, монотонным голосом робота Вернера)
Для сложных случаев используйте Query.
Тогда вы сможете указать Range(...).value(значение) или оставить Range(...).value(SysQuery::valueEmptyString())

Кроме того, query можно создать в AOT, а в коде писать одну строчку q = new Query(querystr(myQuery)). Так вам меньше придется программировать.

постарайтесь не использовать select
Старый 30.03.2004, 12:26   #17  
Anais is offline
Anais
Участник
Аватар для Anais
 
182 / 10 (1) +
Регистрация: 16.06.2003
Адрес: Москва
Цитата:
Изначально опубликовано Владимир Максимов
В смысле быстродействия с Axapta ничего заранее не ясно.
В предложенном примере Axapta при трансляции запроса просто отбросит часть ( ! если нужно одно значение)
И, если ( ! если нужно одно значение) = true, то отбросит эту часть в where вообще, как константную. А если ( ! если нужно одно значение) = false, то на сервер пойдет условие
where enum_fild == EnumName::Element1;
__________________
Улыбаемся и машем, парни! Улыбаемся и машем...
Старый 30.03.2004, 12:38   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Axapta ... отбросит часть
А вот на это рассчитывать не стоит, по-моему
В лучшем случае, это сделает оптимизатор sql
Старый 30.03.2004, 13:37   #19  
Anais is offline
Anais
Участник
Аватар для Anais
 
182 / 10 (1) +
Регистрация: 16.06.2003
Адрес: Москва
Цитата:
Изначально опубликовано mazzy

А вот на это рассчитывать не стоит, по-моему
В общем случае и с учетом того, что я не видела сорсов ядра и строю свои выводы только на экстраполяции полученного опыта - да, Вы правы.

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

В лучшем случае, это сделает оптимизатор sql
Не соглашусь. В свою трассу запросов к БД Аксапта кладет запросы именно в таком виде, как я написала. Ни разу (!) не встретила иного варианта.
__________________
Улыбаемся и машем, парни! Улыбаемся и машем...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно сделать lookup по полю типа Base Enum? Hidden DAX: Программирование 25 04.10.2017 13:06
Фильтр по пустому Dimension[x] в select Yprit DAX: Программирование 3 05.03.2008 15:11
Фильтр в Lookup по полю другой таблицы gefr DAX: Программирование 6 12.03.2007 13:06
Фильтрация по полю Enum в Query Cooper DAX: Программирование 8 04.07.2004 09:21
Фильтр по полю типа Enum, в котором чиловое значение? slava DAX: Программирование 1 08.05.2002 10:26
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:44.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.