24.08.2010, 12:18 | #1 |
Участник
|
пропадают связи между классами наследниками RunBase
Доброго времени суток!
Ax 2009, RU3. Возникла такая проблема. Периодически пропадают связи между классами наследниками RunBase. Пример, Class1 extends RunBaseBatch, Class2 extends Class2. метод new() перекрыт везде кроме Class2. При вызове new Class2() происходит вызов сразу new RunBase(). Подобное происходить может с любым методом. Либо, например, возникает ошибка о несоответствии типов присваиваемых значений переменных, когда переменная объявлена в родительском классе. Ошибки могут возникать в любых классах, системности не прослеживается. Сначала лечилось просто инкрементной компиляцией. В какой-то момент это перестало помогать. Удаляли индексные файлы приложения и проводили глобальную компиляцию, помогало но не надолго. Ошибки возникают вновь. С чем это может быть связано? и чем это можно вылечить окончательно? |
|
24.08.2010, 12:25 | #2 |
Ищущий знания...
|
или это опечатка, или так и не будет работать (т.к. наследует сам себя):
Цитата:
Class2 extends Class2
Цитата:
Class2 extends Class1
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
24.08.2010, 12:35 | #3 |
Ищущий знания...
|
и ещё просьба, приведите кусок кода где выполняется вызов new Class2(). хочется посмотреть в каком контексте он вызывается.
P.S. создал быстренько у себя примерчик такой ситуации, которую вы описываете. Отработало нормально, вызвался метод new() первого класса.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
24.08.2010, 12:50 | #4 |
Участник
|
да опечатка, правильно Class2 extends Class1.
ситуация с вызовом new() может быть любая, и метод может быть любой, new() привел в качестве примера. Ошибка возникает не на новых классах, а на любых, классы могут быть не модифицированы долгое время и отлично работавшие до ошибки Последний раз редактировалось ice; 24.08.2010 в 12:52. |
|
24.08.2010, 12:59 | #5 |
Ищущий знания...
|
в общем то странно.
У меня Axapta 3.0 SP3, воссоздать проблему не получилось. Как не старался, все равно вызывается правильный метод. P.S. отпишитесь плиз, если найдете из-за чего такое, оочень интересна причина
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
24.08.2010, 21:27 | #6 |
Участник
|
У меня на четвёрке бывают подобные случаи, причём не только с RunBase. Решается переопределением метода new() у наследника, компиляцией и его удалением. Видимо глюк какой-то.
|
|
24.08.2010, 21:45 | #7 |
Боец
|
Скорее всего, поможет это:
1. Сервис\Средства разр-ки\Объекты приложения\Обновить AOD 2. Компиляция ваших классов. |
|
24.08.2010, 23:00 | #8 |
----------------
|
Рабочее приложение или разработка?
Какие слои используете, какие изменяете? Как часто делаете глобальную компиляцию и перестроение перекрестных ссылок? |
|
25.08.2010, 09:20 | #9 |
Участник
|
чаще всего происходит на тестовом приложении, бывает и на рабочем. разработка в usr. глобальную компиляцию и перестроение перекрестных ссылок делаем не периодично, примерно 1раз в 1-2 месяца
|
|
25.08.2010, 09:24 | #10 |
Участник
|
|
|
25.08.2010, 09:26 | #11 |
Участник
|
самое странное, что ошибки появляются на классах, которые не изменялись долгое время
|
|
25.08.2010, 13:09 | #12 |
----------------
|
приложение для разработки есть? (там проблем нет?)
модифы переносите проектами? с идентификаторами удалением\пересозданием объектов или как-есть? Случай загадочный, конечно. Обычно такое приключается после правки classDeclaration где-то в родительском классе и лечится инкрементной компиляцией. Не понятно, что может "само" периодически портить уже откомпилированные классы. |
|
25.08.2010, 14:15 | #13 |
Участник
|
Цитата:
Сообщение от Wamr
приложение для разработки есть? (там проблем нет?)
модифы переносите проектами? с идентификаторами удалением\пересозданием объектов или как-есть? Случай загадочный, конечно. Обычно такое приключается после правки classDeclaration где-то в родительском классе и лечится инкрементной компиляцией. Не понятно, что может "само" периодически портить уже откомпилированные классы. Случай действительно загадочный и впервые в моей практике |
|
02.09.2010, 10:34 | #14 |
Ищущий знания...
|
вступил в ряды ice, с непонятным поведением new() :)
Вчера вечером стал очевидцем отказа классом потомком вызывать метод new() своего родителя. Как получилось такое восстановить....
Есть класс наследник от RunBase, назовем его ClassGeneral. В классе ClassGeneral унаследован метод new() и в нем выполняются некие действия. От класса ClassGeneral унаследовано куча классов, в основном отчетные классы. Понадобилось мне создать подобие одного из таких классов, назовем его ClassReport1. Соответственно что бы все заново не переписывать и не мучить кнопки Ctr+C и Ctrl+V воспользовался замечательной функцией дублирования, доступной по правой кнопке мыши. Сдублированный класс переименовал как мне надо, пусть будет ClassReport1_Copy, внес все нужные изменения. Запускаю свой класс и... При инициализации класса ClassReport1_Copy ни в какую не хочет выполняться метод new() класса родителя! (ClassGeneral ). Никакие танцы с бубнами (Глобальная компиляция, инкрементная компиляция класса ClassGeneral, обновление словаря, обновление данных, обновление ADO) не помогают. Так же не помог и экспорт\импорт класса (экспортировал, удалил, импортировал), что меня удивило . Помогло только ручное создание класса-дубликата. Ещё нюанс. Такое явление наблюдается только при дублировании старых классов, которые уже давно были созданы. Попробовал восстановить такое поведение с помощью новой иерархии тестовых классов. Все нормально дублируется. Метод new() класса родителя выполняется как не крути. З.Ы. Ax3.0 SP3 Может кто сможет у себя такое поведение восстановить...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
02.09.2010, 12:12 | #15 |
Участник
|
Тогда резонно предположить, что ошибка скорее всего закралась в какую-то систему кэширования, и процедура дублирования (в отличии от ручного создания) не обновляет информацию в кэше. Причём кэш может сбоить как на сервере так и на клиенте. Для AX2009 клиент создаёт некие файлы вот в этой папке c:\Users\%username%\AppData\Local\. С тройкой работал давно, сейчас уже не вспомню было ли там аналогичное кэширование на клиенте. Попробуйте воспроизвести ошибку под новым профилем с чистым кэшем.
|
|
|
За это сообщение автора поблагодарили: lev (2). |
02.09.2010, 12:37 | #16 |
Участник
|
У меня воспроизводится, когда дублируешь и меняешь класс-предок, к примеру с RunBase на RunBaseBatch и при этом есть еще открытые клиенты. При этом новый класс для методов, переопределенных в новом предке и не перекрытых в нем самом, продолжает вызов этих методов напрямую из RunBase (к примеру, new(), prompt() и т.п.).
Лечилось либо экспортом/удалением/импортом, либо перекрытием этих методов в новом классе, компиляцией и удалением ненужного, либо закрытием всех открытых клиентов, удалением клиентских кэшей, открытием одного клиента и дальше восстановление/компиляция на классе
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: lev (1). |
02.09.2010, 12:47 | #17 |
Участник
|
|
|
02.09.2010, 13:11 | #18 |
Участник
|
Тоже иногда бывает такая проблема. Лечу - Сервис -> Средства разработки -> Объекты приложения -> Переиндексировать. Вроде помогает.
|
|
|
За это сообщение автора поблагодарили: lev (2). |
02.09.2010, 13:14 | #19 |
Ищущий знания...
|
Цитата:
Сообщение от AndyD
У меня воспроизводится, когда дублируешь и меняешь класс-предок, к примеру с RunBase на RunBaseBatch и при этом есть еще открытые клиенты. При этом новый класс для методов, переопределенных в новом предке и не перекрытых в нем самом, продолжает вызов этих методов напрямую из RunBase (к примеру, new(), prompt() и т.п.).
Лечилось либо экспортом/удалением/импортом, либо перекрытием этих методов в новом классе, компиляцией и удалением ненужного, либо закрытием всех открытых клиентов, удалением клиентских кэшей, открытием одного клиента и дальше восстановление/компиляция на классе
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
Теги |
runbase |
|
Похожие темы | ||||
Тема | Ответов | |||
Связи между таблицами 1:N и N:1 | 10 | |||
Связи между таблицами. | 7 | |||
связи между таблицами при установлении прав доступа | 9 |
|