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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.09.2003, 14:38   #1  
Novice is offline
Novice
Участник
 
40 / 10 (1) +
Регистрация: 28.05.2003
str2Enum в Axapta 3.0
Добрый день!


Подскажите, не получается сделать селект, в котором бы не имело значение для enum поля. Пытаюсь сделать следущее:

PHP код:
ItemCalcType calcType;
;

select BOMCalcTrans
         where BOMCalcTrans
.CalcType == str2enum(calcType,"*"); 
В результате BOMCalcTrans = null.
Помогите исправить запрос. Спасибо.
Старый 08.09.2003, 15:25   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
попытка
Предполагаю, что Вам нужно следущее
PHP код:
ItemCalcType calcType;
;

select BOMCalcTrans
         where  value 
== '*' || BOMCalcTrans.CalcType == str2enum(calcTypevalue); 
Старый 08.09.2003, 15:48   #3  
Novice is offline
Novice
Участник
 
40 / 10 (1) +
Регистрация: 28.05.2003
Спасибо за ответ.

Но если предволожить, что value имеет тип char, то этот запрос не пройдет. Может я вас не так понял?
Старый 08.09.2003, 16:21   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Одно из двух
У меня все работает на InventTrans-е (нет тестовых данных в BOMCalcTrans)
PHP код:
static void Job1(Args _args)
{
    
str 20          value "Заказ";
    
InventTrans     invTrans;
    
InventTransType invTranstype;
    ;

    
select count(RecIdfrom invTrans
             where value 
== '*' || invTrans.TransType == str2enum(invTranstypevalue);

    
info(int2str(invTrans.RecId));

Старый 08.09.2003, 16:30   #5  
Novice is offline
Novice
Участник
 
40 / 10 (1) +
Регистрация: 28.05.2003
Да, работает
Но только для строк с типом заказ. Если напписать:


PHP код:
    select firstonly invTrans
             where value 
== '*' || invTrans.TransType == str2enum(invTranstypevalue)
                && 
invTrans.ItemId == "id равное строке с типом например "перенос""
то invTrans = null;
Старый 08.09.2003, 16:42   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
&& vs ||
естественно
PHP код:
select firstonly invTrans
             where 
(value == '*' || invTrans.TransType == str2enum(invTranstypevalue))
                && 
invTrans.ItemId == "id равное строке с типом например "перенос""
Старый 08.09.2003, 16:59   #7  
Novice is offline
Novice
Участник
 
40 / 10 (1) +
Регистрация: 28.05.2003
эээ, возможно я что-то не понимаю...

Надо что бы была возможность выбрать все записи примерно так:

PHP код:
void function(TransType _transType)
....
    while 
select  invTrans
             where invTrans
.StatusIssue == statusIssue::Sold
                
&& invTrans.TransType   == _transType
     
{
     }

И если _transType равен ""то тогда этот тип не важен для запросаВсеравночто для ItemId написать 
ItemId like 
"*" 
Совсем не могу обяснять
Старый 08.09.2003, 17:49   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Enum
Для начала следует понять, что такое _transType равен "", ведь InventTransType может иметь только целочисленные значения (0-255)

Возможные варианты решения:
1. В метод передаётся строка с текстом Enum-а (см. предыдущие постинги)
2. В метод передается int, который интерпретируется как Enum, если значения в диапазоне 0-255 и как отсутствие ограничений, если вне диапазона. Следовательно в select делается проверка на int-значение, а не "*"
Старый 08.09.2003, 17:59   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
enum'ы не надо проверять на строки. Поскольку строки enum'ов на разных языках могут быть разными. Так например, запрос warmr про заказы не будет работать, если пользователь зайдет под английским интерфейсом.

enum - это число. И проверять надо числа. Строковое представление енума предназначено только для человека, а не компьютера.

Чиатйте best practice.
Старый 08.09.2003, 18:00   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
wamr, точно.
я не видел последнее сообщение, когда писал свое.
Старый 08.09.2003, 18:08   #11  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
еще варианты
1. Передавать 2 параметра boolean (есть ограничение?) и InventTransType (какое ограничение)
2. Передавать ограничение в виде QBE (range.value()) и использовать Query & QueryRun вместо select-а

Эти варианты более предпочтительны
Старый 08.09.2003, 18:13   #12  
Novice is offline
Novice
Участник
 
40 / 10 (1) +
Регистрация: 28.05.2003
О, отлично!
И как же мне сделать запрос, если скажем _transType = 0 ?
Скажим, если бы я хотел выбрать стоку по itemId и itemId был бы входным параметром функции, то я бы написал следущее:
PHP код:
void function(ItemId _itemId)
....
    ;
    
_itemId _ItemId _itemId "*";

    while 
select  invTrans
             where invTrans
.StatusIssue == statusIssue::Sold
                
&& invTrans.ItemId   like _itemId
     
{
     } 
Старый 08.09.2003, 18:17   #13  
Novice is offline
Novice
Участник
 
40 / 10 (1) +
Регистрация: 28.05.2003
Не успел прочитать про Query. Нат, к сожелинию в моем случае это не подходит, хотя это было бы идеальным выходом из ситуации. Я помню, что в 2.5 версии можно было написать
PHP код:
while select  invTrans
             where invTrans
.StatusIssue == statusIssue::Sold
                
&& invTrans.ItemId   == str2enum("*"
и все работло... возможно, это ложная память и относится она какраз к QueryRun(у)
Старый 08.09.2003, 18:26   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
не извращайтесь и пользуйтесь запросами (query)
они как раз для таких случаев с динамическими фильтрами и предназначены.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 12.04.2007 16:10
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 22.11.2006 15:20
Axapta Lessons: Integrating Microsoft Axapta with Microsoft Office and Microsoft SharePoint Blog bot DAX Blogs 0 28.10.2006 18:22
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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