|  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. 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  |