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 |
|