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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.05.2011, 15:12   #1  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
непонятное поведение поля enum NoYes
Есть таблица со всеми льготами
EmplID, NumOfbenefits, и разные поля в которых есть дополнительные характеристики

Нужно созадть табличку в которой в одной строке будут все льготы для сотрудника.
Создала табличку типа EmplID, Benefit1, характеристики для Benefit1, Benefit2, характеристики для Benefit2 ну и так до 27...
поля Benefit1 типа Enum, EnumType NoYes
В классе запускается цикл. Внутри цикла для каждого benefits

X++:
select BenefitTbl where BenefitTbl .emplId == MyTbl.EmplId
         && BenefitTbl .BenefitTypeId == '01';
//если есть такая льгота то 
        if (BenefitTbl != NULL)
        {
            MyTbl.Benefit1= NoYes::Yes;
                 
        }
        else
        {
            MyTbl.Benefit1= NoYes::No;
        }
и это повторяется для всех benefits только со сменой номера .

Вопрос 1: Почему-то в enum поля не всегда правильно записывается значение. С дебагером захожу внутрь цикла - т.е. должно быть Yes -1, a в БД - 0
Есть какая-то хитрость?
Вопрос 2: Можно ли это как-то оптимизировать. Муторно очень всё копировать
Спасибо
Старый 25.05.2011, 15:15   #2  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
1) после записи значения не забываете делать MyTbl.update() ?
2) вместо "if (BenefitTbl != NULL)" лучше писать "if (BenefitTbl)" или "if (BenefitTbl.recid)"

Последний раз редактировалось Zabr; 25.05.2011 в 15:17.
Старый 25.05.2011, 15:15   #3  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
попробуйте убрать
X++:
if (BenefitTbl != NULL)
и оставить
X++:
if (BenefitTbl)
__________________
С уважением, Александр.
Старый 25.05.2011, 15:17   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от samolalex Посмотреть сообщение
попробуйте убрать
X++:
if (BenefitTbl != NULL)
и оставить
X++:
if (BenefitTbl)
а ещё лучше:
X++:
if (BenefitTbl.RecId != 0)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 25.05.2011, 15:31   #5  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Нужно созадть табличку в которой в одной строке будут все льготы для сотрудника.
Создала табличку типа EmplID, Benefit1, характеристики для Benefit1, Benefit2, характеристики для Benefit2 ну и так до 27...
поля Benefit1 типа Enum, EnumType NoYes
Ужасное решение. Просто ужасное. НЕ делайте так никогда.
Надо было создать табличку с полями EmplId/BenefitType/BenefitDescription. В BenefitType записать все возможные типы льгот (создать соответствующий Enum или использовать таблицу льгот, если она есть), в BenefitDescription - то, что относится по типу к EmplId. А дальше на EmplTable создаёте закладку, на которой отображаете льготы для конкретного человека.
Если надо всё-таки в одну строку выводить (именно выводить, а не хранить!!!) - нарисуйте соответствующую формочку. Но я не вижу в этом особого смысла.
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: Ivanhoe (1).
Старый 25.05.2011, 15:33   #6  
Krasher is offline
Krasher
Участник
Аватар для Krasher
 
48 / 37 (2) +++
Регистрация: 14.05.2005
Я бы ещё бы проверил, что присутствует select forupdate MyTbl..., присутствуют операторы открытия/закрытия транзакции ttsbegin/ttscommit..., ну и разумеется MyTbl.update();
Старый 25.05.2011, 16:08   #7  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Вопрос 2: Можно ли это как-то оптимизировать. Муторно очень всё копировать
Спасибо
Оптимизация простая - сделать по-другому. Поясните что и зачем вы делаете, тогда, возможно, получите дельный совет
__________________
Ivanhoe as is..
Старый 25.05.2011, 16:14   #8  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от pitersky Посмотреть сообщение
Ужасное решение. Просто ужасное. НЕ делайте так никогда.
Надо было создать табличку с полями EmplId/BenefitType/BenefitDescription. В BenefitType записать все возможные типы льгот (создать соответствующий Enum или использовать таблицу льгот, если она есть), в BenefitDescription - то, что относится по типу к EmplId. А дальше на EmplTable создаёте закладку, на которой отображаете льготы для конкретного человека.
Если надо всё-таки в одну строку выводить (именно выводить, а не хранить!!!) - нарисуйте соответствующую формочку. Но я не вижу в этом особого смысла.
Всё это уже есть. просто наши HR хотят всё видеть сразу. Поэтому создаётся такая никому не нужная таблица в классе, который будет по ночам обноблять в batch.
поэтому кажется forupdate несколько не в тему
в начале есть
delete_from MyTbl;

и в конце каждой итерации MyTbl.insert();

Попробую заменить
if(BenefitTbl != NULL) на if (BenefitTbl.RecId != 0)
Хотя с дебагером заходит в if , но значение почему-то не меняет
Старый 25.05.2011, 16:22   #9  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Оптимизация простая - сделать по-другому. Поясните что и зачем вы делаете, тогда, возможно, получите дельный совет

писала выше. HR заказали форму в которой будут показаны все льготы всех сотрудников включая характеристики некоторых льгот или галочку (есть/нет)
их не устраивает лазить по каждому отдельному сотруднику, подозреваю что это будет некая отчётность для поставщиков (машина, сотовый, комп и т.д.)

посему решено создать подтаблицу и её показывать в форме
Старый 25.05.2011, 16:28   #10  
Krasher is offline
Krasher
Участник
Аватар для Krasher
 
48 / 37 (2) +++
Регистрация: 14.05.2005
Вот собственно и первое предложение по оптимизации. Вместо delete_from и потом нового её заполнения, почему не использовать .update() только того, что изменилось?
Старый 25.05.2011, 16:31   #11  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Всё это уже есть. просто наши HR хотят всё видеть сразу.
Мне кажется, что это не тот случай, когда надо под HR прогибаться (извините за слэнг). Полученная таблица крайне ненаглядна и неудобна в работе. Могу предположить, что утром это копипастят в Excel и дальше работают автофильтрами, отбирая нужное. Если это так, то может проще нарисовать им нужную выгрузку, а не плодить лишние таблицы?
Цитата:
Сообщение от Krasher Посмотреть сообщение
Вот собственно и первое предложение по оптимизации. Вместо delete_from и потом нового её заполнения, почему не использовать .update() только того, что изменилось
С точки здения быстродействия update хуже, потому что обновляемую запись надо сначала найти. В то же время delete_from работает очень быстро. Если не жалко RecId, то лучше пересоздавать
__________________
С уважением,
Вячеслав
Старый 25.05.2011, 16:33   #12  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от pitersky Посмотреть сообщение
Если это так, то может проще нарисовать им нужную выгрузку, а не плодить лишние таблицы?
а как это сделать?
Старый 25.05.2011, 16:35   #13  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от pitersky Посмотреть сообщение
С точки здения быстродействия update хуже, потому что обновляемую запись надо сначала найти. В то же время delete_from работает очень быстро. Если не жалко RecId, то лучше пересоздавать

подозреваю что HR не заботит проблема с RecID
а искать то что надо обновить кажется ещё непригляднее
Старый 25.05.2011, 16:38   #14  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от timaluhs Посмотреть сообщение
а как это сделать?
А что тут сложного? Делаете цикл по EmplTable (это строка выгрузки), внутри него делаете вывод в Excel данных по каждому типу льгот (делая запросы к таблице льгот по типу и EmplId)
__________________
С уважением,
Вячеслав
Старый 25.05.2011, 16:53   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
а как это сделать?
Точно также как вы делали вставку в таблицу, только вместо инициализации полей таблицы найденными значениями, отправляйте эти значения в excel или лучше во временную таблицу ADORecordset, а уже её заполненную одним махом в excel (так будет быстрее )
Есть ещё конечно вариант с OLAP и RS, но это не обязательно
Программное добавление столбцов в отчёт

И на будущее, если необходимо сделать в таблице 27 столбцов одного типа, отличающихся только индексом, то используйте расширенный тип данных основанный на масиве полей (стандартный пример - тип Dimension)

Последний раз редактировалось S.Kuskov; 25.05.2011 в 17:18.
Старый 26.05.2011, 08:44   #16  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Не уверена что excel устроит. Я спрошу у HR. Там ещё должна быть ещё фильтрация по типу льгот, которую они хотят делать по уровню доступа(не знаю как по русски) кто что может видеть. т.е. поставщики машин - только машины и всё что с ними связано, сотовая связь - отдельно, но и т.п. а кто-то может всё.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
И на будущее, если необходимо сделать в таблице 27 столбцов одного типа, отличающихся только индексом, то используйте расширенный тип данных основанный на масиве полей (стандартный пример - тип Dimension)
На самом деле однотипных полей не 27 , штук 15. И для каждого 2 характеристики. То есть создавать типа 3х мерный массив на 15 полей? пока не очень понятно, попробую разобраться
Старый 26.05.2011, 09:20   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Не уверена что excel устроит. Я спрошу у HR. Там ещё должна быть ещё фильтрация по типу льгот, которую они хотят делать по уровню доступа(не знаю как по русски) кто что может видеть. т.е. поставщики машин - только машины и всё что с ними связано, сотовая связь - отдельно, но и т.п. а кто-то может всё.
Вы имеете в виду RLS (record level security)? Права доступа на уровне записей.
Пусть отчёт в Excel формируют сами пользователи под своими правами. Тогда в Excel попадут только те данные, к которым у них есть доступ.
Скрытие поля

Цитата:
Сообщение от timaluhs Посмотреть сообщение
На самом деле однотипных полей не 27 , штук 15. И для каждого 2 характеристики. То есть создавать типа 3х мерный массив на 15 полей? пока не очень понятно, попробую разобраться
Для хранения характеристик можно сделать ещё два масива по 15 элементов, под каждую характеристику свой масив.

Последний раз редактировалось S.Kuskov; 26.05.2011 в 09:27.
Старый 26.05.2011, 10:00   #18  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
а что делать с enum?
С дебагером захожу внутрь цикла - вижу как значение меняется с No на Yes.
захожу в БД - 0, хотя есть поля-enum которые принимают правильное значение
поменяла с if(MyTbl != NULL) на if(MyTbl.RecID != 0) та же петрушка
Старый 26.05.2011, 10:15   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от timaluhs Посмотреть сообщение
В классе запускается цикл. Внутри цикла для каждого benefits
...
и это повторяется для всех benefits только со сменой номера
Судя по всему при написании подобного кода использовалась технология Copy/Past .
Цитата:
Сообщение от timaluhs Посмотреть сообщение
С дебагером захожу внутрь цикла - вижу как значение меняется с No на Yes.
Вполне могли где-нибудь забыть исправить наименование поля.
Поствьте точку останова не на инструкции присваивания, а непосредственно на строке с MyTbl.insert() и посмотрите на значения полей именно в тот момент.
Старый 26.05.2011, 10:43   #20  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от timaluhs Посмотреть сообщение
а что делать с enum?
С дебагером захожу внутрь цикла - вижу как значение меняется с No на Yes.
захожу в БД - 0, хотя есть поля-enum которые принимают правильное значение
поменяла с if(MyTbl != NULL) на if(MyTbl.RecID != 0) та же петрушка
так если if отрабатывает, то проблема то не в нем
можете выложить весь код, который заполняет табличку? так будет проще найти ошибку.

и кстати, посмотрите метод insert() на MyTable возможно там есть какое то переопределение Вашего Enum.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Теги
noyes

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Легкое поведение поля BlockImage в журналах coolibin DAX: Программирование 9 28.11.2008 10:34
Объясните странное поведение enum'ов Deep Dreamer DAX: Программирование 6 09.04.2007 23:44
Непонятное поведение векторных полей в QueryBuildDataSource. Lemming DAX: Программирование 2 12.05.2005 17:43
Непонятное поведение критериев в отчете nicko DAX: Программирование 2 13.04.2005 15:48
Можно ли изменить Enum типа NoYes или PrintMedium? funnut DAX: Программирование 1 08.07.2004 14:21

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

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

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