AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.09.2007, 12:32   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Ошибка в методах unpack pack
У меня в диалоге 2 даты: fromdate todate.

При первом открытии формы диалога все хорошо, а при последующих

PHP код:
Ошибка времени выполнения. : Неправильные типы аргументов в операции присвоения значения переменной.
Трассировка стека:
\
Reports\Cat_IASData\Methods\unpack line 9
\Classes\SysReportRun\_unpack line 9
\Classes\RunbaseReportStd\unpack line 24
\Classes\xSysLastValue\getLast line 16
\Classes\RunBase\getLast line 9
\Classes\RunBaseBatch\getLast line 3
\Classes\RunbaseReportStd\getLast line 6
\Classes\RunBase\promptPrim line 10
\Classes\RunBase\prompt line 13
\Classes\RunBaseBatch\prompt line 3
\Classes\RunBaseReport\prompt line 13
\Classes\SysReportRun\run line 6 
Убираю одну дату из окна диалога и программа работает с методами. В чем ошибка?
Старый 02.09.2007, 12:57   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Тулбар-Настройка-Использование данных - сбросить.

Если не помогает, тогда выложите ваш класс.

С Уважением,
Георгий
Старый 02.09.2007, 13:26   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Arahnid Посмотреть сообщение
У меня в диалоге 2 даты: fromdate todate.

При первом открытии формы диалога все хорошо, а при последующих
При любом изменении списка сохраняемых значений, меняйте номер версии.
В unpack по умолчанию распаковывывается только текущая версия (вы можете добавить код для распаковки предыдущих).

У вас скорее всего произошло следующее.
В сохраненных значениях лежит старая версия.
Вы изменили список значений, а версию не изменили.
Теперь Аксапта пытается восстановить старые значения в новый список.
У нее ничего не получается.

В качестве обходного решения - стирайте сохраненные значения.
В качестве правильного решения - всегда изменяйте номер текущей версии при любом изменении списка.
__________________
полезное на axForum, github, vk, coub.
Старый 02.09.2007, 17:04   #4  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Дополню от себя

Цитата:
У вас скорее всего произошло следующее.
В сохраненных значениях лежит старая версия.
Вы изменили список значений, а версию не изменили.
Теперь Аксапта пытается восстановить старые значения в новый список.
У нее ничего не получается.
Такое часто происходит, когда ведётся модификация класса (формы, etc.) и параллельно его использование (тестирование, например)

Цитата:
В качестве обходного решения - стирайте сохраненные значения
В этом случае помогает вручную удаление строки из таблицы, где хранятся упакованные значения. Это sysLastValue таблица.

Резюмируя, вот мой вам совет:
Всякий раз после модификации объекта, использующего unpack pack, возьмите за правило уничтожать записи в таблице sysLastValue (критерий: те строки, что "отвечают" за данный объект). Причём удалять надо строки по всем пользователям.

Данное решение я рассматриваю не как обходное, а как основное. Как правило хорошего тона, я бы сказал. Речь в данном случае идёт о цепочке:
пользователь поработал -> программист изменил код -> пользователь поработал -> .... ->
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню

Последний раз редактировалось Russland; 03.09.2007 в 12:35.
Старый 02.09.2007, 17:27   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Russland Посмотреть сообщение
Данное решение я рассматриваю не как обходное, а как основное.
Нет, конечно.
Меняйте номер версии и не нужно будет заниматься хакерством.
__________________
полезное на axForum, github, vk, coub.
Старый 02.09.2007, 17:40   #6  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Да какое же это хакерство
Пусть меняет номер версии
но не забывает что делать это надо каждый раз когда покапался с пакованными параметрами.
Менял я версии, но почему-то сложилось мнение, что изменение версии не всегда работает стабильно (а именно, приводит к нужному результату).
Хотя давно это было, когда только начинал работать с Аксаптой. Поэтому и сложилось, наверное, такое мнение. Вероятно эта "нестабильность" была связана с тем что забывал перекомпилировать весь класс после изменений в ClassDeclaration.
Значитъ последовательность обязательных действий такова:

1. Изменить номер версии
2. Перекомпилировать весь класс (не F5 в окне ClassDeclaration) а из АОТ
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 02.09.2007, 17:41   #7  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Хотя удаляя sysLastValue на душе спокойней
Точно знаешь что параметры сброшены
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню

Последний раз редактировалось Russland; 03.09.2007 в 12:35.
Старый 24.02.2009, 14:13   #8  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Быть может уже кто-нибудь сделал подобное, но рискну выложить ...

В 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;
}
pack() наследника RunBase приобретает вид
X++:
public container pack()
{
    return [#list];
}
unpack() наследника RunBase приобретает вид
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  
tourist is offline
tourist
Участник
 
21 / 14 (1) ++
Регистрация: 03.05.2006
Цитата:
Сообщение от 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;
}
pack() наследника RunBase приобретает вид
X++:
public container pack()
{
    return [#list];
}
unpack() наследника RunBase приобретает вид
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()]
}
, в этом случае version все равно придется менять, если были изменения в запросе.
Старый 24.02.2009, 18:03   #10  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от tourist Посмотреть сообщение
Небольшой нюанс: такая проверка не спасет, если пакуется query:
В цикле проверки, в случае если оба i-ых элемента окажутся контейнерами, добавить рекурсивный вызов функции проверки по этим элементам.
Запакованный запрос -контейнер из одного элемента типа BLOB, его трудно будет спутать с чем-то другим .
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 24.02.2009 в 18:06.
Старый 24.02.2009, 18:26   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
В цикле проверки, в случае если оба i-ых элемента окажутся контейнерами, добавить рекурсивный вызов функции проверки по этим элементам.
Запакованный запрос -контейнер из одного элемента типа BLOB, его трудно будет спутать с чем-то другим .
Имелось ввиду, что если вы изменили в классе Кверю, а потом при запуске "подсосали" старый вариант Квери, то это будет сложно (невозможно?) проверить обычным сравнением (что вы будете при этом сравнивать в двух кверях? откуда вы знаете, что в сохранённой квере добавил пользователь, а что из класса жёстко прошито?)... Просто подтянется старая, вероятно уже неправильная, Кверя. И результаты работы класса будут просто непредсказуемыми....
__________________
Zhirenkov Vitaly
Старый 24.02.2009, 19:12   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Также следует учитывать тот факт, что typeOf() возвращает только базовые типы, а не типы из Extended Data Types.

Это значит, что если в списке переменных произошла замена одной переменной на другую с разным типом EDT, но основанным на одном и том же базовом типе, то также возможны проблемы. Будете делать проверку через sysDict...()?

В общем случае, проверка на typeOf() может служить дополнительным контролем, но он не заменяет проверки на номер версии.
Старый 24.02.2009, 21:18   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Также следует учитывать тот факт, что typeOf() возвращает только базовые типы, а не типы из Extended Data Types.
да, тоже обратил внимание на это... можно поменять 2 переменные местами в "листе" и всё равно будет всё "работать"

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Это значит, что если в списке переменных произошла замена одной переменной на другую с разным типом EDT, но основанным на одном и том же базовом типе, то также возможны проблемы. Будете делать проверку через sysDict...()?
а вообще, разве можно это реализовать в данном случае? никогда не задумывался об этом, но разве в контейнере хранится расширенный тип исходного помещаемого значения? Мне кажется более вероятным, что только базовый тип хранится: строка и строка, число и число... Хотя я не утверждаю, Аксапты под ругой нет проверить...
__________________
Zhirenkov Vitaly
Старый 25.02.2009, 00:50   #14  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от ZVV Посмотреть сообщение
разве в контейнере хранится расширенный тип исходного помещаемого значения? Мне кажется более вероятным, что только базовый тип хранится: строка и строка, число и число...
Как минимум, для строковых значений хранится длина строки, для enum'ов - тип enum'а. Это упоминалось в теме Axapta и BLOB поля, а более подробно было расписано на стороннем ресурсе, но он сейчас недоступен
За это сообщение автора поблагодарили: ZVV (1).
Теги
pack, runbase, unpack

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
следуюший затык pack/unpack Varmen DAX: Программирование 20 27.02.2009 14:58
Как работают Pack и UnPack ? moid DAX: База знаний и проекты 4 05.03.2007 15:16
Как удалить сохраненные данные методов pack()/unpack() ? djoker DAX: Программирование 23 04.10.2004 17:33
pack\unpack Diman DAX: Программирование 2 30.07.2003 10:05
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:08.