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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.02.2004, 15:15   #1  
bolt is offline
bolt
Участник
 
10 / 10 (1) +
Регистрация: 17.02.2004
Angry Внутренняя ошибка номер 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  
PT is offline
PT
Участник
Аватар для PT
 
22 / 10 (1) +
Регистрация: 11.08.2004
Адрес: Сибирь
У меня сейчас возникла такая-же проблема при вызове отчета.
Не знаю, что и делать...
Старый 02.11.2005, 10:37   #3  
Hezl is offline
Hezl
Участник
Аватар для Hezl
 
138 / 16 (1) ++
Регистрация: 21.04.2004
Адрес: Moscow, Russia
Отчет строится с помощью стандартного построителя отчетов? Или используется вывод во внешний файл (Excel, Word и т.д.)?
Старый 02.11.2005, 12:33   #4  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
Цитата:
Сообщение от PT
У меня сейчас возникла такая-же проблема при вызове отчета.
Не знаю, что и делать...
было такое. в getFromDialog() пытались обратиться к "неинициализированному" контролу.
__________________
С уважением, Вячеслав.
Старый 25.09.2006, 13:20   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
:( Грабля на пути универсального запроса к любой таблице
Добрый день, уважаемые коллеги,

Тестируя некую процедуру, получил аналогичную ошибку.

Процедура моя делает следующее (ни много, ни мало):
- пробегает в цикле по списку всех таблиц 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));
}
Но мне надо, чтобы фрагмент от "момента A" до "момента B" (см. в коде выше) был оформлен в виде отдельного метода, в который в качестве параметра будет передаваться DictTable-переменная.
Создаем второй джоб, где всё это имитируется. Забегая вперед, отмечу что в классе, откуда выдран этот фрагмент у меня происходит то же самое, что и в 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);
    }
}
Джоб 2 работает через "пень-колоду", т.е. на каких-то таблицах всё проходит гладко, а на других вылетает. Я делал так: по мере отлова очередной "плохой" таблицы, на которой джоб валился, включал в цикл по таблицам "пропуск" этой таблицы в виде оператора: if (m_tableId == 8) continue; Очередную свалившуюся таблицу и поле, на котором это произошло, можно наблюдать в самой последней строке инфолога.

Итак, вопрос мой, думаю, понятен. Что же это такое и как бы это победить?
Заранее благодарю всех откликнувшихся.

P.S. Параметр метода processTable(DictTable _dictTable) я уже менял и так, и сяк: и tableId передавал как int, и tableName как str (с соответствующими модификациями внутренностей метода) - результат один и тот же и пока неудовлетворительный...

Еще заметил, что если подставить в оператор val = common.(fieldId2Ext(fieldId, k)) литеральную константу, соответствующую сбойному fieldId, то всё опять работает! Что же это за фигня такая... Ощущение такое, что "гадость" тянется в метод через параметр и всё, что с ним так или иначе связано внутри, несёт на себе этот "гадкий" след...
Миниатюры
Нажмите на изображение для увеличения
Название: error_25_2.jpg
Просмотров: 428
Размер:	16.6 Кб
ID:	2110  
Изображения
 
За это сообщение автора поблагодарили: Poleax (1).
Старый 25.09.2006, 13:33   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Возможно это связано с тем, что используется операция смещения (к примеру, в fieldId2ext), и при входе в другую функцию смещение каким-то образом выносит нас за пределы области видимости.
Старый 25.09.2006, 13:52   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Возможно это связано с тем, что используется операция смещения (к примеру, в fieldId2ext), и при входе в другую функцию смещение каким-то образом выносит нас за пределы области видимости.
Извиняюсь, я немножко неправ насчёт литеральной константы в val = common.(fieldId2Ext(fieldId, k)).
Если сделать, например, val = common.(fieldId2Ext(2, k)), то в отладчике действительно возникает ошибка, связанная со смещением (см. рисунок).

Но если на время абстрагироваться от индексов массива и облегчить этот оператор путем придания ему вида: val = common.(fieldId),
то:
val = common.(fieldId) - не работает
а
val = common.(2) - работает...
Миниатюры
Нажмите на изображение для увеличения
Название: error_25_3.jpg
Просмотров: 515
Размер:	17.5 Кб
ID:	2113  
Старый 25.09.2006, 14:45   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ох уж эти локализаторы
Сравните русское название с его английским эквивалентом
Цитата:
Internal error number %1 in script.
В общем ошибка происходит при присвоении значения из common переменной anytype val. Чтобы это обойти можно сделать так
X++:
val = "";
val = common.(fieldId2Ext(fieldId, k));
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Gustav (7), Cathome (1).
Старый 25.09.2006, 15:07   #9  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Хм... Интересно... Похоже, anytype - он вовсе не any.... Присвоение пустой строки и NULL тоже дает ошибку.....
Старый 25.09.2006, 15:21   #10  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Видимо, придется заводить по одной переменной на каждый тип, как-то так:
PHP код:
switch (dictField.baseType())
{
case ( 
Types::String):
valStr common.(fieldId2Ext(fieldIdk));break;

case (
Types::Integer):
valInt common.(fieldId2Ext(fieldIdk));break;

case (
Types::Date):
valDate common.(fieldId2Ext(fieldIdk));break;

case (
Types::Real):
valReal common.(fieldId2Ext(fieldIdk));break;

За это сообщение автора поблагодарили: Gustav (5).
Старый 25.09.2006, 15:29   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Yprit Посмотреть сообщение
Хм... Интересно... Похоже, anytype - он вовсе не any.... Присвоение пустой строки и NULL тоже дает ошибку.....
вах! а у меня проскочило! везде! и в джобе 2, и в классе!

Уфф! AndyD, респектище! Я знал, я ждал, я верил!


2 Yprit: Юр, а где падает джоб 2 с уже пустой строкой? На той же таблице, что и в начале? У меня первый спотыкач был на таблице BankAccountTrans (id=8) на поле Voucher (id=2).

null у меня тоже не канает, только пустая строка работает (у меня Axapta 3.0 CIS SP3)
Старый 25.09.2006, 15:37   #12  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от Gustav Посмотреть сообщение
Юр, а где падает джоб 2 с уже пустой строкой?
Я скорее всего туплю.... Дело в том, что я присваивал val пустую строку не ДО присвоения ей значения поля, а после, т.е.
Код:
val = common.(fieldId2Ext(fieldId, k));
val = "";
Кто бы мне объяснил разницу......
Старый 25.09.2006, 15:42   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Вообще падал вот почему - если неинициализированной переменной anytype присвоить значение типа date, то эта переменная принимает это значение (и тип) и дальнейшая попытка присвоить строковое значение приводит к ошибке 25. Если перед присвоением значения, установить для переменной строковый тип (например, присвоив пустую строку), то все присвоенные значения конвертируются в строку

В общем, переменная anytype может менять тип только с неопреденного (неинициализированного), на определенный (любой из Types). Если она инициализирована, то в дальнейшем работают только привила приведения типов.
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Yprit (1), Logger (3), gl00mie (2).
Старый 25.09.2006, 15:45   #14  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от AndyD Посмотреть сообщение
переменная anytype может менять тип только с неопреденного (неинициализированного), на определенный (любой из Types)
Во! Золотые слова! Респект!
Старый 25.09.2006, 16:09   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
переменная anytype может менять тип только с неопреденного (неинициализированного), на определенный (любой из Types).
А это в документации где-то написано, или данные получены опытным путем?..
Старый 25.09.2006, 16:10   #16  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от AndyD Посмотреть сообщение
Вообще падал вот почему - если неинициализированной переменной anytype присвоить значение типа date, то эта переменная принимает это значение (и тип) и дальнейшая попытка присвоить строковое значение приводит к ошибке 25. Если перед присвоением значения, установить для переменной строковый тип (например, присвоив пустую строку), то все присвоенные значения конвертируются в строку

В общем, переменная anytype может менять тип только с неопреденного (неинициализированного), на определенный (любой из Types). Если она инициализирована, то в дальнейшем работают только привила приведения типов.
Кхе-кхе... Не хочу показаться назойливым, но хотелось бы еще понять, почему при этом, тем не менее, не падает первый джоб...
Старый 25.09.2006, 16:22   #17  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
В продолжение мысли, развитой AndyD: использовать Map (Set, List) с Types::AnyType - смерти подобно (jсобенно - если одно из значений - пустое). Ну в смысле - что работать не будет Не знаю что там написано в документации, но шишки еще болят .

2Gustav: Иногда при таких вопросах приходит на ум светлая мысль - неисповедимы пути Microsoft. Хотя - если быть точным - я не знаю .. Это так.. лирика
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 25.09.2006 в 16:26.
Старый 25.09.2006, 16:24   #18  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Потому что первое поле (AddrTableId) первой таблицы (Address) имеет целочисленный тип, а при приведении к нему, например, строкового типа мы получим 0. В общем приведение будет работать во всех случаях без обшибки, но данные будут неправильные
__________________
Axapta v.3.0 sp5 kr2
Старый 25.09.2006, 16:27   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
А это в документации где-то написано, или данные получены опытным путем?..
Сын ошибок
__________________
Axapta v.3.0 sp5 kr2
Старый 12.08.2008, 16:02   #20  
rINT is offline
rINT
Участник
 
31 / 21 (1) +++
Регистрация: 16.11.2004
В 4-ке видимо есть еще случаи возниковения подобной ошибки, не описанные выше. Попробуйте запустить вложенный джоб. При замена типов ключей мапов ошибка исчезает.
DAX 4.0 SP2
Вложения
Тип файла: xpo Job_TestError25.xpo (670 байт, 284 просмотров)
Теги
query

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: SQL Server, Heart of Dynamics AX Blog bot DAX Blogs 0 13.07.2007 18:00
aEremenko: Диагностика проблем при установке Microsoft Dynamics Ax 4.0 на Microsoft SQL Server 2005 Blog bot DAX Blogs 0 28.10.2006 16:01
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Ошибка SQL в модуле "Расчеты с персоналом" Карбофос DAX: Функционал 5 02.08.2002 12:44
Ошибка SQL в модуле "Расчеты с персоналом" Карбофос DAX: Программирование 0 31.07.2002 17:20
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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