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