|  02.09.2007, 12:32 | #1 | 
| Участник | Ошибка в методах unpack pack 
			
			У меня в диалоге 2 даты: fromdate  todate. При первом открытии формы диалога все хорошо, а при последующих PHP код: 
			 | 
|  | 
|  02.09.2007, 12:57 | #2 | 
| Модератор | 
			
			Тулбар-Настройка-Использование данных - сбросить. Если не помогает, тогда выложите ваш класс. С Уважением, Георгий | 
|  | 
|  02.09.2007, 13:26 | #3 | 
| Участник | Цитата: В unpack по умолчанию распаковывывается только текущая версия (вы можете добавить код для распаковки предыдущих). У вас скорее всего произошло следующее. В сохраненных значениях лежит старая версия. Вы изменили список значений, а версию не изменили. Теперь Аксапта пытается восстановить старые значения в новый список. У нее ничего не получается. В качестве обходного решения - стирайте сохраненные значения. В качестве правильного решения - всегда изменяйте номер текущей версии при любом изменении списка. | 
|  | 
|  02.09.2007, 17:04 | #4 | 
| MCTS | 
			
			Дополню от себя  Цитата: 
		
			У вас скорее всего произошло следующее. В сохраненных значениях лежит старая версия. Вы изменили список значений, а версию не изменили. Теперь Аксапта пытается восстановить старые значения в новый список. У нее ничего не получается. Цитата: 
		
			В качестве обходного решения - стирайте сохраненные значения
		
	 Резюмируя, вот мой вам совет: Всякий раз после модификации объекта, использующего unpack pack, возьмите за правило уничтожать записи в таблице sysLastValue (критерий: те строки, что "отвечают" за данный объект). Причём удалять надо строки по всем пользователям. Данное решение я рассматриваю не как обходное, а как основное. Как правило хорошего тона, я бы сказал. Речь в данном случае идёт о цепочке: пользователь поработал -> программист изменил код -> пользователь поработал -> .... -> 
				__________________  В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню Последний раз редактировалось Russland; 03.09.2007 в 12:35. | 
|  | 
|  02.09.2007, 17:27 | #5 | 
| Участник | 
			
			Нет, конечно. Меняйте номер версии и не нужно будет заниматься хакерством. | 
|  | 
|  02.09.2007, 17:40 | #6 | 
| MCTS | 
			
			Да какое же это хакерство Пусть меняет номер версии но не забывает что делать это надо каждый раз когда покапался с пакованными параметрами. Менял я версии, но почему-то сложилось мнение, что изменение версии не всегда работает стабильно (а именно, приводит к нужному результату). Хотя давно это было, когда только начинал работать с Аксаптой. Поэтому и сложилось, наверное, такое мнение. Вероятно эта "нестабильность" была связана с тем что забывал перекомпилировать весь класс после изменений в ClassDeclaration. Значитъ последовательность обязательных действий такова: 1. Изменить номер версии 2. Перекомпилировать весь класс (не F5 в окне ClassDeclaration) а из АОТ 
				__________________  В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню | 
|  | 
|  02.09.2007, 17:41 | #7 | 
| MCTS | 
			
			Хотя удаляя sysLastValue на душе спокойней Точно знаешь что параметры сброшены 
				__________________  В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню Последний раз редактировалось Russland; 03.09.2007 в 12:35. | 
|  | 
|  24.02.2009, 14:13 | #8 | 
| Мрачный тип | 
			
			Быть может уже кто-нибудь сделал подобное, но рискну выложить ... В RunBase добавляем метод X++: boolean checkContainmentTypes(container a, container b) { int i; if(conlen(a) != conlen(b)) return false; for(i = 1;i<=conlen(a);i++) { if(typeof(conpeek(a,i)) != typeof(conpeek(b,i))) return false; } return true; } X++: public container pack() { return [#list]; } X++: public boolean unpack(container packedClass) { if(this.checkContainmentTypes([#list], packedClass)) [#list] = packedClass; else info(@'Сохраненный набор параметров для данного объекта не совпал по структуре с требуемым - значения восстановлены по умолчанию.'); this.init(); return true; } Не болит голова о мусоре в SysLastValue - его просто не будет, ибо перезатрется . Не болит голова о необходимости чистить SysLastValue - ибо просто не от чего его чистить. P.S. И никакого хакерства и нелепых телодвижений по чистке всякого от всякого P.P.S. И эцилоп не будет бить по ночам ... никогда ... 
				__________________ Мы летаем, кружимся, нагоняем ужасы ... Последний раз редактировалось TasmanianDevil; 24.02.2009 в 14:25. | 
|  | |
| За это сообщение автора поблагодарили: EVGL (2), aidsua (1). | |
|  24.02.2009, 15:40 | #9 | 
| Участник | Цитата: 
		
			Сообщение от TasmanianDevil
			   Быть может уже кто-нибудь сделал подобное, но рискну выложить ... В RunBase добавляем метод X++: boolean checkContainmentTypes(container a, container b) { int i; if(conlen(a) != conlen(b)) return false; for(i = 1;i<=conlen(a);i++) { if(typeof(conpeek(a,i)) != typeof(conpeek(b,i))) return false; } return true; } X++: public container pack() { return [#list]; } X++: public boolean unpack(container packedClass) { if(this.checkContainmentTypes([#list], packedClass)) [#list] = packedClass; else info(@'Сохраненный набор параметров для данного объекта не совпал по структуре с требуемым - значения восстановлены по умолчанию.'); this.init(); return true; } Не болит голова о мусоре в SysLastValue - его просто не будет, ибо перезатрется . Не болит голова о необходимости чистить SysLastValue - ибо просто не от чего его чистить. P.S. И никакого хакерства и нелепых телодвижений по чистке всякого от всякого P.P.S. И эцилоп не будет бить по ночам ... никогда ... Небольшой нюанс: такая проверка не спасет, если пакуется query: X++: public container pack() { return [#currentVersion, #currentList, this.queryRun.pack()] } | 
|  | 
|  24.02.2009, 18:03 | #10 | 
| Мрачный тип | 
			
			В цикле проверки, в случае если оба i-ых элемента окажутся контейнерами, добавить рекурсивный вызов функции проверки по этим элементам. Запакованный запрос -контейнер из одного элемента типа BLOB, его трудно будет спутать с чем-то другим . 
				__________________ Мы летаем, кружимся, нагоняем ужасы ... Последний раз редактировалось TasmanianDevil; 24.02.2009 в 18:06. | 
|  | 
|  24.02.2009, 18:26 | #11 | 
| MCITP |   
			
			Имелось ввиду, что если вы изменили в классе Кверю, а потом при запуске "подсосали" старый вариант Квери, то это будет сложно (невозможно?) проверить обычным сравнением (что вы будете при этом сравнивать в двух кверях? откуда вы знаете, что в сохранённой квере добавил пользователь, а что из класса жёстко прошито?)... Просто подтянется старая, вероятно уже неправильная, Кверя. И результаты работы класса будут просто непредсказуемыми....
		 
				__________________ Zhirenkov Vitaly | 
|  | 
|  24.02.2009, 19:12 | #12 | 
| Участник | 
			
			Также следует учитывать тот факт, что typeOf() возвращает только базовые типы, а не типы из Extended Data Types.  Это значит, что если в списке переменных произошла замена одной переменной на другую с разным типом EDT, но основанным на одном и том же базовом типе, то также возможны проблемы. Будете делать проверку через sysDict...()? В общем случае, проверка на typeOf() может служить дополнительным контролем, но он не заменяет проверки на номер версии. | 
|  | 
|  24.02.2009, 21:18 | #13 | 
| MCITP |   Цитата:  а вообще, разве можно это реализовать в данном случае? никогда не задумывался об этом, но разве в контейнере хранится расширенный тип исходного помещаемого значения? Мне кажется более вероятным, что только базовый тип хранится: строка и строка, число и число... Хотя я не утверждаю, Аксапты под ругой нет проверить... 
				__________________ Zhirenkov Vitaly | 
|  | 
|  25.02.2009, 00:50 | #14 | 
| Участник | Цитата:   | 
|  | |
| За это сообщение автора поблагодарили: ZVV (1). | |
| Теги | 
| pack, runbase, unpack | 
|  | 
|  Похожие темы | ||||
| Тема | Ответов | |||
| следуюший затык pack/unpack | 20 | |||
| Как работают Pack и UnPack ? | 4 | |||
| Как удалить сохраненные данные методов pack()/unpack() ? | 23 | |||
| pack\unpack | 2 | |||
| Русская локализация Axapta 3 ? | 59 | |||
| 
 |