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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2011, 09:55   #1  
sobik is offline
sobik
Участник
Аватар для sobik
 
28 / 10 (1) +
Регистрация: 30.08.2010
Проблема с Insert'ом в MS SQL 2000. Axapta 3.0 SP3
Здравствуйте. Проблема в следующем. Вставляю из аксаптовского кода строку в таблицу Т базы данных, которая крутится на MS SQL 2000. Соединение работает правильно(выборки из Т и вставка в другие таблицы работает нормально).
Выражение
X++:
    sqlCommand = "Insert into T ... ";
    statement.executeUpdate(sqlCommand);
    i =  statement.getLastError();
отрабатывает без ошибок. В i возварщается 0. После каждой вставки пересчитываю count'ом количества строк - увеличиваются. После закрытия транзакции снова пересчитываю - результат тот, что нужен, строки добавляются. Но только программа завершает работу, то в таблице как-будто отрабатывает какой-то триггер и возвращает все назад.Этот же запрос, если выполнять его через Enterprise Manager SQL 2000 отрабатывает как надо, отката нету.
И это при том, еще раз подчеркну, что в другие таблицы вставка пашет нормально.
Помогите советом или размышлениями.

Последний раз редактировалось sobik; 07.09.2011 в 09:58.
Старый 07.09.2011, 10:28   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Может, вы перед вставкой транзакцию открываете, но не завершаете ее?
__________________
Axapta v.3.0 sp5 kr2
Старый 07.09.2011, 10:29   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,874 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Похоже у вас транзакция остается незакоммиченная.
При закрытии Аксапты, то есть соединения к базе (двухвенка ? ) транзакция откатывается.
Старый 07.09.2011, 10:40   #4  
sobik is offline
sobik
Участник
Аватар для sobik
 
28 / 10 (1) +
Регистрация: 30.08.2010
Извиниие, просто писал код в браузере, а не копировал. С транзакциями все ок. код выглядит так:
X++:
conn.ttsbegin();
sqlCommand = "Insert into T ... ";
    statement.executeUpdate(sqlCommand);
    i =  statement.getLastError();
conn.ttscommit();
Старый 07.09.2011, 10:51   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от sobik Посмотреть сообщение
С транзакциями все ок.
На всякий случай проверьте чему после закрытия транзакции равно значение conn.ttsLevel().
Старый 07.09.2011, 11:23   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
таблица T в БД Axapta или где-то рядом?
а может где-то есть код, который удаляет из таблицы T?

включите MS SQL Profiler.
Запустите тест, закройте аксу, анализируйте лог.
Старый 07.09.2011, 12:01   #7  
sobik is offline
sobik
Участник
Аватар для sobik
 
28 / 10 (1) +
Регистрация: 30.08.2010
Таблица Т - в посторонней БД, которая крутится на МС СКЛ 2000.
Насчет кода - я тоже так подозревал, но если этот же запрос выполнить на enterprise manager ms sql 2000, то запись не удалится.
Старый 07.09.2011, 12:28   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
"другие таблицы", в которые "вставка пашет нормально" на каком сервере находятся?
можно весь код с созданием соединения показать?
Старый 07.09.2011, 13:16   #9  
sobik is offline
sobik
Участник
Аватар для sobik
 
28 / 10 (1) +
Регистрация: 30.08.2010
Вас интерисует работает ли соединение нормально? Да, нормально. Вот код:
X++:
#NMF_WinPackDepartamentsUpdate
boolean checkODBCConnection()
{
    //данные соединения
    LoginProperty makeLoginProperty()
    {
        LoginProperty   loginProperty;

        ;
        loginProperty = new LoginProperty();

        loginProperty.setDSN(#DSN_TEST_NAME);
        loginProperty.setUsername(#SQL_USER_NAME);
        loginProperty.setPassword(#SQL_USER_PASSWORD);
        return loginProperty;
    }
    ;
      // проверяем ODBC соединение
    try
    {
        conn = new OdbcConnection(makeLoginProperty());
        return true;
    }
    catch
    {
        info(#ODBC_USER_ERROR);
        return false;
    }
}
В макросе - параметры соедниния

Вот код, создающий выражение, через которое идут запросы:
X++:
void prepare()
{
    if(this.checkODBCConnection())
    {
         statement      =  conn.createStatement();
    }
    else
    {
        error(#ODBC_CONNECT_ERROR);
    }
}
Вот код, который вставляет правильно:
X++:
 conn.ttsbegin();
    while select organization join structure   where  (organization.NMF_GSMStructureId == structure.StructureId) &&
                                                      (structure.NMF_WinpakAccess == NoYes::Yes)
                                               exists join empltable where (emplTable.RpayHrmOrganistionId == organization.hrmOrganizationId) &&
                                               (emplTable.PayResignedDate_RU == dateNull() || emplTable.PayResignedDate_RU > mkdate(2,9,2011))

    {
        
        SqlCommand      =       strFmt("Insert INTO Account (AccountID,UserId, NodeID, Deleted,UserPriority,AcctName, TimeStamp) VALUES (%1,%2,%3,%4,%5,'%6','%7') ",
                                        0,
                                        1,
                                        0,
                                        0,
                                        0,
                                        Global::strReplace(subStr(organization.description,1,30),"'",""),
                                        currentTime
                                        );
        statement.executeUpdate(SqlCommand);
    }
    conn.ttscommit();
Вот код, который не отрабатывает:

X++:
  conn.ttsbegin();
    while(it.more())
    {

        sqlCommand
        = strFmt("Insert INTO NFTabLayout (AccountId, UserID, NodeID, Deleted, UserPriority, TabName1, TabName2, TabName3, TabName4, TabName5,"+
        "TabOrder, NF1, NF2, NF3, NF4, NF5, NF6, NF7, NF8, TimeStamp) VALUES (%1,%2,%3,%4,%5,'%6','%7','%8','%9','%10',%11,%12,%13,%14,%15,%16,%17,%18,%19,'%20')",
                it.value(),
                1,
                0,
                0,
                0,
                "Особисті данні",
                "Особисті данні",
                "Особисті данні",
                "Особисті данні",
                "Особисті данні",
                1,
                1,
                2,
                3,
                4,
                5,
                6,
                7,
                8,
                currentTime

        );
        statement.executeUpdate(sqlCommand);
        i =  statement.getLastError();
        it.next();
    }
    conn.ttscommit();
Таблицы Account и NFTabLayout находятся на одном и том же сервере, в одной БД.
it - итератор по сету с целочислеными значениями, которые нужны для вставки.
Старый 07.09.2011, 16:05   #10  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
попробуйте транзакцию внутрь цикла всунуть
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
Старый 07.09.2011, 17:55   #11  
sobik is offline
sobik
Участник
Аватар для sobik
 
28 / 10 (1) +
Регистрация: 30.08.2010
как видите, в первом случае из без этого сработало, но тем не менее,чем черт не шутит
Старый 08.09.2011, 12:24   #12  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Сообщение от sobik Посмотреть сообщение
как видите, в первом случае из без этого сработало, но тем не менее,чем черт не шутит
в первом случае вставлялся меньший объем данных
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
Старый 08.09.2011, 17:11   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,652 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вы выдрали куски кода из контекста. А что там было ДО и ПОСЛЕ неизвестно. Вас же просили проверить что возвращает

conn.ttsLevel()

по окончании всей процедуры. После команды conn.ttscommit()
Старый 13.09.2011, 12:57   #14  
sobik is offline
sobik
Участник
Аватар для sobik
 
28 / 10 (1) +
Регистрация: 30.08.2010
conn.ttsLevel() возвратил 0.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX Sustained Engineering: SQL Server 2005 sp3 & SQL Server 2008 with Dynamics AX Blog bot DAX Blogs 0 12.02.2009 06:08
Неизвестный сбой!!! Dynamics AX 4.0 SP2 with MS SQL 2005 MarunYA DAX: Администрирование 6 06.12.2007 12:16
Axapta и MS SQL 2005 mike1 DAX: Администрирование 27 11.03.2006 17:12
Проблема с Debugger'ом в Axapta. Anais DAX: Программирование 14 25.01.2005 11:20
"Скрещивание" Axapta 3, BizTalk 2002 и Commerce Gateway - проблема. demcn DAX: Администрирование 0 18.05.2004 08:45
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:14.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.