| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Проблема с Insert'ом в MS SQL 2000. Axapta 3.0 SP3
			 
			
			Здравствуйте. Проблема в следующем. Вставляю из аксаптовского кода строку в таблицу Т базы данных, которая крутится на MS SQL 2000. Соединение работает правильно(выборки из Т и вставка в другие таблицы работает нормально). 
		
		
		
		
		
		
		
		
			Выражение X++:     sqlCommand = "Insert into T ... ";
    statement.executeUpdate(sqlCommand);
    i =  statement.getLastError();И это при том, еще раз подчеркну, что в другие таблицы вставка пашет нормально. Помогите советом или размышлениями. Последний раз редактировалось sobik; 07.09.2011 в 09:58.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Может, вы перед вставкой транзакцию открываете, но не завершаете ее?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Похоже у вас транзакция остается незакоммиченная. 
		
		
		
		
		
		
		
	При закрытии Аксапты, то есть соединения к базе (двухвенка ? ) транзакция откатывается.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Извиниие, просто писал код в браузере, а не копировал. С транзакциями все ок. код выглядит так: 
		
		
		
		
		
		
		
	X++: conn.ttsbegin(); sqlCommand = "Insert into T ... "; statement.executeUpdate(sqlCommand); i = statement.getLastError(); conn.ttscommit();  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 
			
			таблица T в БД Axapta или где-то рядом? 
		
		
		
		
		
		
		
	а может где-то есть код, который удаляет из таблицы T? включите MS SQL Profiler. Запустите тест, закройте аксу, анализируйте лог.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Таблица Т - в посторонней БД, которая крутится на МС СКЛ 2000.  
		
		
		
		
		
		
		
	Насчет кода - я тоже так подозревал, но если этот же запрос выполнить на enterprise manager ms sql 2000, то запись не удалится.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 
			
			"другие таблицы", в которые "вставка пашет нормально" на каком сервере находятся? 
		
		
		
		
		
		
		
	можно весь код с созданием соединения показать?  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вас интерисует работает ли соединение нормально? Да, нормально. Вот код:  
		
		
		
		
		
		
		
	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(); it - итератор по сету с целочислеными значениями, которые нужны для вставки.  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			попробуйте транзакцию внутрь цикла всунуть
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	aLL woRk aNd nO JoY MAKes jAck a dULL Boy  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			как видите, в первом случае из без этого сработало, но тем не менее,чем черт не шутит
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			в первом случае вставлялся меньший объем данных
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	aLL woRk aNd nO JoY MAKes jAck a dULL Boy  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вы выдрали куски кода из контекста. А что там было ДО и ПОСЛЕ неизвестно. Вас же просили проверить что возвращает 
		
		
		
		
		
		
		
	conn.ttsLevel() по окончании всей процедуры. После команды conn.ttscommit()  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			conn.ttsLevel() возвратил 0.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
	
	 | 
	
		
  |