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