|
25.05.2011, 15:12 | #1 |
newborn in DAX
|
непонятное поведение поля 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; } Вопрос 1: Почему-то в enum поля не всегда правильно записывается значение. С дебагером захожу внутрь цикла - т.е. должно быть Yes -1, a в БД - 0 Есть какая-то хитрость? Вопрос 2: Можно ли это как-то оптимизировать. Муторно очень всё копировать Спасибо |
|
25.05.2011, 15:15 | #2 |
Участник
|
1) после записи значения не забываете делать MyTbl.update() ?
2) вместо "if (BenefitTbl != NULL)" лучше писать "if (BenefitTbl)" или "if (BenefitTbl.recid)" Последний раз редактировалось Zabr; 25.05.2011 в 15:17. |
|
25.05.2011, 15:15 | #3 |
Участник
|
попробуйте убрать
X++: if (BenefitTbl != NULL) X++: if (BenefitTbl)
__________________
С уважением, Александр. |
|
25.05.2011, 15:17 | #4 |
Ищущий знания...
|
Цитата:
X++: if (BenefitTbl.RecId != 0)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
25.05.2011, 15:33 | #5 |
Участник
|
Я бы ещё бы проверил, что присутствует select forupdate MyTbl..., присутствуют операторы открытия/закрытия транзакции ttsbegin/ttscommit..., ну и разумеется MyTbl.update();
|
|
25.05.2011, 15:31 | #6 |
северный Будда
|
Цитата:
Надо было создать табличку с полями EmplId/BenefitType/BenefitDescription. В BenefitType записать все возможные типы льгот (создать соответствующий Enum или использовать таблицу льгот, если она есть), в BenefitDescription - то, что относится по типу к EmplId. А дальше на EmplTable создаёте закладку, на которой отображаете льготы для конкретного человека. Если надо всё-таки в одну строку выводить (именно выводить, а не хранить!!!) - нарисуйте соответствующую формочку. Но я не вижу в этом особого смысла.
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: Ivanhoe (1). |
25.05.2011, 16:14 | #7 |
newborn in DAX
|
Цитата:
Сообщение от pitersky
Ужасное решение. Просто ужасное. НЕ делайте так никогда.
Надо было создать табличку с полями EmplId/BenefitType/BenefitDescription. В BenefitType записать все возможные типы льгот (создать соответствующий Enum или использовать таблицу льгот, если она есть), в BenefitDescription - то, что относится по типу к EmplId. А дальше на EmplTable создаёте закладку, на которой отображаете льготы для конкретного человека. Если надо всё-таки в одну строку выводить (именно выводить, а не хранить!!!) - нарисуйте соответствующую формочку. Но я не вижу в этом особого смысла. поэтому кажется forupdate несколько не в тему в начале есть delete_from MyTbl; и в конце каждой итерации MyTbl.insert(); Попробую заменить if(BenefitTbl != NULL) на if (BenefitTbl.RecId != 0) Хотя с дебагером заходит в if , но значение почему-то не меняет |
|
25.05.2011, 16:31 | #8 |
северный Будда
|
Мне кажется, что это не тот случай, когда надо под HR прогибаться (извините за слэнг). Полученная таблица крайне ненаглядна и неудобна в работе. Могу предположить, что утром это копипастят в Excel и дальше работают автофильтрами, отбирая нужное. Если это так, то может проще нарисовать им нужную выгрузку, а не плодить лишние таблицы?
С точки здения быстродействия update хуже, потому что обновляемую запись надо сначала найти. В то же время delete_from работает очень быстро. Если не жалко RecId, то лучше пересоздавать
__________________
С уважением, Вячеслав |
|
25.05.2011, 16:33 | #9 |
newborn in DAX
|
|
|
25.05.2011, 16:38 | #10 |
северный Будда
|
А что тут сложного? Делаете цикл по EmplTable (это строка выгрузки), внутри него делаете вывод в Excel данных по каждому типу льгот (делая запросы к таблице льгот по типу и EmplId)
__________________
С уважением, Вячеслав |
|
25.05.2011, 16:53 | #11 |
Участник
|
Точно также как вы делали вставку в таблицу, только вместо инициализации полей таблицы найденными значениями, отправляйте эти значения в excel или лучше во временную таблицу ADORecordset, а уже её заполненную одним махом в excel (так будет быстрее )
Есть ещё конечно вариант с OLAP и RS, но это не обязательно Программное добавление столбцов в отчёт И на будущее, если необходимо сделать в таблице 27 столбцов одного типа, отличающихся только индексом, то используйте расширенный тип данных основанный на масиве полей (стандартный пример - тип Dimension) Последний раз редактировалось S.Kuskov; 25.05.2011 в 17:18. |
|
25.05.2011, 16:35 | #12 |
newborn in DAX
|
Цитата:
подозреваю что HR не заботит проблема с RecID а искать то что надо обновить кажется ещё непригляднее |
|
25.05.2011, 16:08 | #13 |
Участник
|
Оптимизация простая - сделать по-другому. Поясните что и зачем вы делаете, тогда, возможно, получите дельный совет
__________________
Ivanhoe as is.. |
|
25.05.2011, 16:22 | #14 |
newborn in DAX
|
Цитата:
писала выше. HR заказали форму в которой будут показаны все льготы всех сотрудников включая характеристики некоторых льгот или галочку (есть/нет) их не устраивает лазить по каждому отдельному сотруднику, подозреваю что это будет некая отчётность для поставщиков (машина, сотовый, комп и т.д.) посему решено создать подтаблицу и её показывать в форме |
|
25.05.2011, 16:28 | #15 |
Участник
|
Вот собственно и первое предложение по оптимизации. Вместо delete_from и потом нового её заполнения, почему не использовать .update() только того, что изменилось?
|
|
26.05.2011, 10:15 | #16 |
Участник
|
Цитата:
Цитата:
Поствьте точку останова не на инструкции присваивания, а непосредственно на строке с MyTbl.insert() и посмотрите на значения полей именно в тот момент. |
|
26.05.2011, 10:55 | #17 |
newborn in DAX
|
Цитата:
Сообщение от S.Kuskov
Судя по всему при написании подобного кода использовалась технология Copy/Past .
Вполне могли где-нибудь забыть исправить наименование поля. Поствьте точку останова не на инструкции присваивания, а непосредственно на строке с MyTbl.insert() и посмотрите на значения полей именно в тот момент. как всегда на дурацкие ошибки уходит куча времени а как можно узнать какой сейчас до какого RecID мы уже добрались и насколько актуальна проблема зашкаливания. DAX 2009 Последний раз редактировалось timaluhs; 26.05.2011 в 11:05. |
|
26.05.2011, 11:23 | #18 |
Ищущий знания...
|
Цитата:
про зашкаливания. в АХ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 |
newborn in DAX
|
Цитата:
Попытки открыть таблицу не удались - выкидывает меня в Help права у меня админские, я в этой копии - "адын савсем адын" понятно что волноваться пока рановато |
|
26.05.2011, 11:42 | #20 |
Ищущий знания...
|
Цитата:
т.е. Правая кнопка мыши --> Надстройки (AddIns) --> обозреватель таблиц
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|