|
17.02.2004, 15:15 | #1 |
Участник
|
Внутренняя ошибка номер 25 в сценарии SQL
При открытии счета выдается "Внутренняя ошибка номер 25 в сценарии SQL" несколько раз. Файл AxaptaCrash.log содержит следующее: Axapta Crash Dump File for Axapta build 1951.17 (Oct 9 2002 11:51:44)
Dumped : Tue Feb 17 15:09:00 2004 Crash : Exception 0xc0000005 caught (unspecified) in thread 0x464 of process 0x338. ------------------------------------------------------------- --# FV EIP----- RetAddr- FramePtr StackPtr Symbol 0 .V 004a9c02 00000000 0012bac4 0012b51c Mod: ax32[ax32.exe], base: 00400000h Stackdump exit code 487 (Attempt to access invalid address) |
|
02.11.2005, 08:25 | #2 |
Участник
|
У меня сейчас возникла такая-же проблема при вызове отчета.
Не знаю, что и делать... |
|
02.11.2005, 10:37 | #3 |
Участник
|
Отчет строится с помощью стандартного построителя отчетов? Или используется вывод во внешний файл (Excel, Word и т.д.)?
|
|
02.11.2005, 12:33 | #4 |
сибиряк
|
Цитата:
Сообщение от PT
У меня сейчас возникла такая-же проблема при вызове отчета.
Не знаю, что и делать...
__________________
С уважением, Вячеслав. |
|
25.09.2006, 13:20 | #5 |
Moderator
|
Грабля на пути универсального запроса к любой таблице
Добрый день, уважаемые коллеги,
Тестируя некую процедуру, получил аналогичную ошибку. Процедура моя делает следующее (ни много, ни мало): - пробегает в цикле по списку всех таблиц Axapta; - для "живых" таблиц, т.е. существующих в БД и содержащих хотя бы одну запись, создает динамический запрос, который запускается на выполнение; - "внутри запроса" пробегаются все поля самой первой записи и присваивается их значение некоторой anytype-переменной. Само значение этой переменной сейчас не суть важно - тестируется именно корректность присваивания; - по окончании работы в инфологе отображается список живых таблиц (id и name). Вот работающая версия (job 1), которая всё это нормально делает. Время работы джоба зависит от конкретного кол-ва живых таблиц в вашей Аксапте (у меня их около 450 и время выполнения - около минуты). X++: static void KKu_Job_6923_RunQuery_1(Args _args) { Dictionary dictionary = new Dictionary(); TableId tableId; DictTable dictTable; int i; int timeFullStart, timeFullFinish, timeFullTotal; Common common; Query query; QueryBuildDataSource qbds; QueryBuildFieldList qbfl; QueryRun qr; FieldId fieldId; DictField dictField; int row; int j, k; anytype val; ; timeFullStart = timenow(); // цикл по таблицам for (i=1; i<= dictionary.tableCnt(); i++) { tableId = dictionary.tableCnt2Id(i); dictTable = new DictTable(tableId); // момент A // если в очередной таблице нет записей, // то переходим к следующей if (!(new SysDictTable(tableId).recordCount())) continue; info(strfmt('%1 == %2' , tableId, dictTable.name())); query = new Query (); qbds = query.AddDataSource(tableId); qbfl = qbds.fields(); qr = new QueryRun (query); row = 0; while (qr.next()) { row++; if (row > 1) break; // получаем запись common = qr.get(tableId); // цикл по полям таблицы (запроса) for(j=1; j<= qbfl.fieldCount(); j++) { fieldId = qbfl.field(j); dictField = new DictField(tableId, fieldId); // если поле не SQL, то переходим к следующему полю if (!dictField.isSql()) continue; // цикл по элементам массива поля for(k=1; k<= dictField.arraySize(); k++) { val = common.(fieldId2Ext(fieldId, k)); } } } // момент B } timeFullFinish = timenow(); timeFullTotal = timeFullFinish - timeFullStart; info(strfmt('Время выполнения: %1 сек', timeFullTotal)); } Создаем второй джоб, где всё это имитируется. Забегая вперед, отмечу что в классе, откуда выдран этот фрагмент у меня происходит то же самое, что и в job 2. X++: static void KKu_Job_6923_RunQuery_2(Args _args) { Dictionary m_dictionary; TableId m_tableId; DictTable m_dictTable; int i; void processTable(DictTable _dictTable) { Common common; Query query; QueryBuildDataSource qbds; QueryBuildFieldList qbfl; QueryRun qr; TableId tableId; FieldId fieldId; DictField dictField; int row; int j, k; anytype val; ; tableId = _dictTable.id(); // если в очередной таблице нет записей, // то переходим к следующей if (!(new SysDictTable(tableId).recordCount())) return; info(strfmt('========== %1 == %2 ==========' , tableId, _dictTable.name())); query = new Query (); qbds = query.AddDataSource(tableId); qbfl = qbds.fields(); qr = new QueryRun (query); row = 0; while (qr.next()) { row++; if (row > 1) break; // получаем запись common = qr.get(tableId); // цикл по полям таблицы (запроса) for(j=1; j<= qbfl.fieldCount(); j++) { fieldId = qbfl.field(j); dictField = new DictField(tableId, fieldId); // если поле не SQL, то переходим к следующему полю if (!dictField.isSql()) continue; // цикл по элементам массива поля for(k=1; k<= dictField.arraySize(); k++) { info(strfmt(' -- %1 -- %2 -- %3 -- %4', tableId, _dictTable.name(), fieldId, dictField.name())); val = common.(fieldId2Ext(fieldId, k)); info(strfmt(' val = %1' , val)); } } } } //==================================================================== m_dictionary = new Dictionary(); // цикл по таблицам for (i=1; i<= m_dictionary.tableCnt(); i++) { m_tableId = m_dictionary.tableCnt2Id(i); m_dictTable = new DictTable(m_tableId); // if (m_tableId == 8) continue; // if (m_tableId == 24) continue; processTable(m_dictTable); } } Итак, вопрос мой, думаю, понятен. Что же это такое и как бы это победить? Заранее благодарю всех откликнувшихся. P.S. Параметр метода processTable(DictTable _dictTable) я уже менял и так, и сяк: и tableId передавал как int, и tableName как str (с соответствующими модификациями внутренностей метода) - результат один и тот же и пока неудовлетворительный... Еще заметил, что если подставить в оператор val = common.(fieldId2Ext(fieldId, k)) литеральную константу, соответствующую сбойному fieldId, то всё опять работает! Что же это за фигня такая... Ощущение такое, что "гадость" тянется в метод через параметр и всё, что с ним так или иначе связано внутри, несёт на себе этот "гадкий" след... |
|
|
За это сообщение автора поблагодарили: Poleax (1). |
25.09.2006, 13:33 | #6 |
Участник
|
Возможно это связано с тем, что используется операция смещения (к примеру, в fieldId2ext), и при входе в другую функцию смещение каким-то образом выносит нас за пределы области видимости.
|
|
25.09.2006, 13:52 | #7 |
Moderator
|
Цитата:
Если сделать, например, val = common.(fieldId2Ext(2, k)), то в отладчике действительно возникает ошибка, связанная со смещением (см. рисунок). Но если на время абстрагироваться от индексов массива и облегчить этот оператор путем придания ему вида: val = common.(fieldId), то: val = common.(fieldId) - не работает а val = common.(2) - работает... |
|
25.09.2006, 14:45 | #8 |
Участник
|
Ох уж эти локализаторы
Сравните русское название с его английским эквивалентом Цитата:
Internal error number %1 in script.
X++: val = "";
val = common.(fieldId2Ext(fieldId, k));
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Gustav (7), Cathome (1). |
25.09.2006, 15:07 | #9 |
Злыдни
|
Хм... Интересно... Похоже, anytype - он вовсе не any.... Присвоение пустой строки и NULL тоже дает ошибку.....
|
|
25.09.2006, 15:21 | #10 |
Злыдни
|
Видимо, придется заводить по одной переменной на каждый тип, как-то так:
PHP код:
|
|
|
За это сообщение автора поблагодарили: Gustav (5). |
25.09.2006, 15:29 | #11 |
Moderator
|
Цитата:
Уфф! AndyD, респектище! Я знал, я ждал, я верил! 2 Yprit: Юр, а где падает джоб 2 с уже пустой строкой? На той же таблице, что и в начале? У меня первый спотыкач был на таблице BankAccountTrans (id=8) на поле Voucher (id=2). null у меня тоже не канает, только пустая строка работает (у меня Axapta 3.0 CIS SP3) |
|
25.09.2006, 15:37 | #12 |
Злыдни
|
|
|
25.09.2006, 15:42 | #13 |
Участник
|
Вообще падал вот почему - если неинициализированной переменной anytype присвоить значение типа date, то эта переменная принимает это значение (и тип) и дальнейшая попытка присвоить строковое значение приводит к ошибке 25. Если перед присвоением значения, установить для переменной строковый тип (например, присвоив пустую строку), то все присвоенные значения конвертируются в строку
В общем, переменная anytype может менять тип только с неопреденного (неинициализированного), на определенный (любой из Types). Если она инициализирована, то в дальнейшем работают только привила приведения типов.
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Yprit (1), Logger (3), gl00mie (2). |
25.09.2006, 15:45 | #14 |
Злыдни
|
|
|
25.09.2006, 16:09 | #15 |
Участник
|
|
|
25.09.2006, 16:27 | #16 |
Участник
|
Сын ошибок
__________________
Axapta v.3.0 sp5 kr2 |
|
25.09.2006, 16:10 | #17 |
Moderator
|
Цитата:
Сообщение от AndyD
Вообще падал вот почему - если неинициализированной переменной anytype присвоить значение типа date, то эта переменная принимает это значение (и тип) и дальнейшая попытка присвоить строковое значение приводит к ошибке 25. Если перед присвоением значения, установить для переменной строковый тип (например, присвоив пустую строку), то все присвоенные значения конвертируются в строку
В общем, переменная anytype может менять тип только с неопреденного (неинициализированного), на определенный (любой из Types). Если она инициализирована, то в дальнейшем работают только привила приведения типов. |
|
25.09.2006, 16:22 | #18 |
Administrator
|
В продолжение мысли, развитой AndyD: использовать Map (Set, List) с Types::AnyType - смерти подобно (jсобенно - если одно из значений - пустое). Ну в смысле - что работать не будет Не знаю что там написано в документации, но шишки еще болят .
2Gustav: Иногда при таких вопросах приходит на ум светлая мысль - неисповедимы пути Microsoft. Хотя - если быть точным - я не знаю .. Это так.. лирика
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 25.09.2006 в 16:26. |
|
25.09.2006, 16:24 | #19 |
Участник
|
Потому что первое поле (AddrTableId) первой таблицы (Address) имеет целочисленный тип, а при приведении к нему, например, строкового типа мы получим 0. В общем приведение будет работать во всех случаях без обшибки, но данные будут неправильные
__________________
Axapta v.3.0 sp5 kr2 |
|
12.08.2008, 16:02 | #20 |
Участник
|
В 4-ке видимо есть еще случаи возниковения подобной ошибки, не описанные выше. Попробуйте запустить вложенный джоб. При замена типов ключей мапов ошибка исчезает.
DAX 4.0 SP2 |
|
Теги |
query |
|
|