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:33   #5  
Krasher is offline
Krasher
Участник
Аватар для Krasher
 
48 / 37 (2) +++
Регистрация: 14.05.2005
Я бы ещё бы проверил, что присутствует select forupdate MyTbl..., присутствуют операторы открытия/закрытия транзакции ttsbegin/ttscommit..., ну и разумеется MyTbl.update();
Старый 25.05.2011, 15:31   #6  
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, 16:14   #7  
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:31   #8  
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   #9  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от pitersky Посмотреть сообщение
Если это так, то может проще нарисовать им нужную выгрузку, а не плодить лишние таблицы?
а как это сделать?
Старый 25.05.2011, 16:38   #10  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от timaluhs Посмотреть сообщение
а как это сделать?
А что тут сложного? Делаете цикл по EmplTable (это строка выгрузки), внутри него делаете вывод в Excel данных по каждому типу льгот (делая запросы к таблице льгот по типу и EmplId)
__________________
С уважением,
Вячеслав
Старый 25.05.2011, 16:53   #11  
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.
Старый 25.05.2011, 16:35   #12  
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:08   #13  
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:22   #14  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Оптимизация простая - сделать по-другому. Поясните что и зачем вы делаете, тогда, возможно, получите дельный совет

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

посему решено создать подтаблицу и её показывать в форме
Старый 25.05.2011, 16:28   #15  
Krasher is offline
Krasher
Участник
Аватар для Krasher
 
48 / 37 (2) +++
Регистрация: 14.05.2005
Вот собственно и первое предложение по оптимизации. Вместо delete_from и потом нового её заполнения, почему не использовать .update() только того, что изменилось?
Старый 26.05.2011, 10:15   #16  
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:55   #17  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Судя по всему при написании подобного кода использовалась технология Copy/Past .

Вполне могли где-нибудь забыть исправить наименование поля.
Поствьте точку останова не на инструкции присваивания, а непосредственно на строке с MyTbl.insert() и посмотрите на значения полей именно в тот момент.
именно так оно и было, Спасибо
как всегда на дурацкие ошибки уходит куча времени

а как можно узнать какой сейчас до какого RecID мы уже добрались и насколько актуальна проблема зашкаливания.
DAX 2009

Последний раз редактировалось timaluhs; 26.05.2011 в 11:05.
Старый 26.05.2011, 11:23   #18  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от timaluhs Посмотреть сообщение
а как можно узнать какой сейчас до какого RecID мы уже добрались и насколько актуальна проблема зашкаливания.
DAX 2009
в АОТ в узле System Documentation \ Tables таблице SystemSequences, в ней поле NextVal это то значение которое у вас сейчас в системе. В поле MaxValue максимально допустимое значение. Сравните и поймете насколько вы приблизились к максимуму.

про зашкаливания. в АХ2009 (и в АХ 4.0) recId теперь 64 битное (а не 32 как было в трешке ), поэтому не думаю что оно у вас скоро зашкалит

P.S. про RecId уже обсуждалось aEremenko: Дефрагментация RecID
выдержка из ссылки по сути:
Цитата:
"Ситуация в DAX 4.0

Версия 4.0 содержит 64-битный пул RecID, RecID базируется на новом типе int64. Также, в DAX 4.0, можно сегментировать RecID в разрезе таблиц. Этого более чем достаточно для очень крупной компании лет на 100."
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 26.05.2011 в 11:28.
Старый 26.05.2011, 11:37   #19  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Цитата:
Сообщение от lev Посмотреть сообщение
в АОТ в узле System Documentation \ Tables таблице SystemSequences, в ней поле NextVal это то значение которое у вас сейчас в системе. В поле MaxValue максимально допустимое значение. Сравните и поймете насколько вы приблизились к максимуму.
Но посмотреть пока не удалось.
Попытки открыть таблицу не удались - выкидывает меня в Help
права у меня админские, я в этой копии - "адын савсем адын"

Цитата:
Сообщение от lev Посмотреть сообщение
про зашкаливания. в АХ2009 (и в АХ 4.0) recId теперь 64 битное (а не 32 как было в трешке ), поэтому не думаю что оно у вас скоро зашкалит
понятно что волноваться пока рановато
Старый 26.05.2011, 11:42   #20  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Но посмотреть пока не удалось.
Попытки открыть таблицу не удались - выкидывает меня в Help
права у меня админские, я в этой копии - "адын савсем адын"
Таблица открывается как и обычные таблицы в Data Dictionary.
т.е. Правая кнопка мыши --> Надстройки (AddIns) --> обозреватель таблиц
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Теги
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:38.