| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Импорт в АХ через ODBC
			 
			
			Здравствуйте, с недавних пор начал программировать в АХ и возникли проблемы ,а спросить не у кого (нет рядом программиста АХ). Суть вопроса: Нужно получить данные из внешней базы и записать в базу АХ создал кнопку на форме ProdTable, создал метод на кнопке который получает данные 
		
		
		
		
		
		
		
	X++: void method1() { ProdTable ProdTabl; ProdBOM ProdBom; LoginProperty LP = new LoginProperty(); OdbcConnection myConnection; Statement myStatement; ResultSet myResult,myResultLine; Str s; str 50 CRProdid,Item; real LostQty,DifQty; prodTableChangeQtySched PQS = new prodTableChangeQtySched(); ProdTabl = ProdTable; ProdBom = ProdBOM; LP.setDSN("TransferConnection"); info(ProdTabl.collectrefprodid); try { myConnection = new OdbcConnection(LP); myStatement = myConnection.createStatement(); myResult = myStatement.executeQuery( strfmt("Select excontrolqty,primor,collectrefprodid from ShiftReportPourHeader " + "Where DataAreaId = '%1' and collectrefprodid = '%2'", curext(),ProdTable.collectrefprodid)); while (myResult.next()) { s = int2str(myResult.getInt(2)); CRProdid=myResult.getString(3); info(s); myResultLine = myStatement.executeQuery(strfmt("Select CAST(LostQty AS numeric(15, 8)) AS exp1,CAST(DiffectQty AS numeric(15, 8)) AS exp1,ItemId from ShiftReportPourLine " + "Where primor = '%1'",s)); //***************************************** // LostQty ,DiffectQty - типа float while (myResultLine.next()) { Item=myResultLine.getString(3); LostQty=myResultLine.getReal(1); info(num2str(LostQty,6,3,1,1)); ttsbegin; select forupdate * from Prodbom where Prodbom.ProdId==CRProdid && Prodbom.ItemId==Item; info('Go'); Prodbom.ScrapConst =LostQty; ttscommit; ttsbegin; info('go2'); Prodbom.update(); ttscommit; } info('go2'); ProdTabl.QtySched=myResult.getReal(1); PQS.parmProdTable(ProdTable); myStatement.executeUpdate(strfmt("Update ShiftReportPourHeader Set posted = 1 Where primor = %1 (1 = 0)", s)); } } catch { throw("Check DSN settings (username/password)."); } } 1 (X) Невозможно выполнить требуемую операцию с базой данных. Операция закончилась неудачно. (!) [Microsoft][SQL Native Client]Invalid Descriptor Index 2 (X) Невозможно считать запись из (). База данных SQL обнаружила ошибку. (!) [Microsoft][SQL Native Client]Invalid Descriptor Index У меня есть предположение что это проблема именно с типом данных LostQty и DiffectQty. Пытался проверить по средством выставления info потому что debager не работает(хотя включен может из за того что метод на кнопке). Так же пытался перевести в тип numeric тоже самое.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Для того чтоб работал дебагер: Сервис\Параметры\Разработка\Режим отладки = "Когда есть точки останова". импорт лучше делать в классе, а из формы его вызвать через MenuItem
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ещё один. 
		
		
		
		
		
		
			Когда пишите код на панели есть кнопочка X++. Сейчас глядя на этот код, мысль только одна: "Щас мозг взорвётся". 
				__________________ 
		
		
		
		
	Энергия молодых и неравнодушных способна изменить мир к лучшему.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Для того чтоб работал дебагер: Сервис\Параметры\Разработка\Режим отладки = "Когда есть точки останова".
		
	 
 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Когда пишите код на панели есть кнопочка X++
		
	 
X++: void method1() { ProdTable ProdTabl; ProdBOM ProdBom; LoginProperty LP = new LoginProperty(); OdbcConnection myConnection; Statement myStatement; ResultSet myResult,myResultLine; Str s; str 50 CRProdid,Item; real LostQty,DifQty; prodTableChangeQtySched PQS = new prodTableChangeQtySched(); ProdTabl = ProdTable; ProdBom = ProdBOM; LP.setDSN("TransferConnection"); info(ProdTabl.collectrefprodid); try { myConnection = new OdbcConnection(LP); myStatement = myConnection.createStatement(); myResult = myStatement.executeQuery( strfmt("Select excontrolqty,primor,collectrefprodid from ShiftReportPourHeader " + "Where DataAreaId = '%1' and collectrefprodid = '%2'", curext(),ProdTable.collectrefprodid)); while (myResult.next()) { s = int2str(myResult.getInt(2)); CRProdid=myResult.getString(3); info(s); myResultLine = myStatement.executeQuery(strfmt("Select CAST(LostQty AS numeric(15, 8)) AS exp1,CAST(DiffectQty AS numeric(15, 8)) AS exp1,ItemId from ShiftReportPourLine " + "Where primor = '%1'",s)); while (myResultLine.next()) { Item=myResultLine.getString(3); LostQty=myResultLine.getReal(1); info(num2str(LostQty,6,3,1,1)); ttsbegin; select forupdate * from Prodbom where Prodbom.ProdId==CRProdid && Prodbom.ItemId==Item; info('Go'); Prodbom.ScrapConst =LostQty; ttscommit; ttsbegin; info('go2'); Prodbom.update(); ttscommit; } info('go2'); ProdTabl.QtySched=myResult.getReal(1); PQS.parmProdTable(ProdTable); myStatement.executeUpdate(strfmt("Update ShiftReportPourHeader Set posted = 1 Where primor = %1 (1 = 0)", s)); } if(!s) throw ('Нет данных для импорта'); } catch { throw("Check DSN settings (username/password)."); } }  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			работаете через АОС? если да то ндо ещё на АОСе включить отладку.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ну а с ошибками то что делать? В чем проблема?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			работаете через АОС? если да то ндо ещё на АОСе включить отладку.
		
	 
 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			если я правильно понял "LP.setDSN("TransferConnection")" - это настроенное odbc подключение? 
		
		
		
		
		
		
			оно нормально работает? тест выполняли? ещё вопросик, какая у Вас версия Аксапты? 
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 X++: Item=myResultLine.getString(3); LostQty=myResultLine.getReal(1);  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: AXbeginer (1). | |
| 
			
			 | 
		#11 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			и все таки надо ловить дабагером ошибку, в каком месте она вылетает... 
		
		
		
		
		
		
			иногда дебагер не славливает точку останова на кнопке формы... сделайте этот метод в классе (как вам советовали), и вызывайте метод из формы, тогда дебагер точно словит точку останова... 
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Я не заметил строк 
		
		
		
		
		
		
			X++: LP.setUsername('Usr'); LP.setPassword('Pwd'); Но попробовать можно. Возможно ругаеться на запрос. Место X++: strfmt("Select excontrolqty,primor,collectrefprodid from ShiftReportPourHeader " + "Where DataAreaId = '%1' and collectrefprodid = '%2'", curext(),ProdTable.collectrefprodid)); X++: strfmt("Select ShiftReportPourHeader.excontrolqty, ShiftReportPourHeader.primor, ShiftReportPourHeader.collectrefprodid from ShiftReportPourHeader " + "Where ShiftReportPourHeader.DataAreaId = '%1' and ShiftReportPourHeader.collectrefprodid = '%2'", curext(),ProdTable.collectrefprodid)); И ещё dns точно создан. Из описанного выше у вас код выполняется на клиенте. Но если вы что-то упустили или не дописали и он выполняется на сервере, то dns нужно создавать на сервере. Да и с дебагером лучше всё же разберитесь. Лучше на код положить, чем на дебагер. 
				__________________ 
		
		
		
		
		
			Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 01.10.2009 в 09:19.  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Поймайте дебаггером строку, на которой вылетает - можно будет дать более точные рекомендации. Сейчас слишком много вариантов))  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			если я правильно понял "LP.setDSN("TransferConnection")" - это настроенное odbc подключение? 
оно нормально работает? тест выполняли? ещё вопросик, какая у Вас версия Аксапты? X++: strfmt("Select ShiftReportPourHeader.excontrolqty, ShiftReportPourHeader.primor, ShiftReportPourHeader.collectrefprodid from ShiftReportPourHeader " + "Where ShiftReportPourHeader.DataAreaId = '%1' and ShiftReportPourHeader.collectrefprodid = '%2'", curext(),ProdTable.collectrefprodid)); Цитата: 
	
		
			дебаггер в 40 может не отрабатывать на методах элементов форм (в частности, кнопочек) по точке останова.
		
	 
Цитата: 
	
		
			класс ResultSet однонаправленный и по строкам и по (как ни странно) столбцам. Если сначала считать значение из 3-го, то потом из первого не считаете ни за что. Читайте последовательно нужные столбцы и будет счастье.
		
	 
Правда осталась проблема с updatequery За пример взял X++:  myStatement.executeUpdate(strfmt("Update ShiftReportHeader Set posted = 1 Where primor = %1 (1 = 0)", s)); | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Хотелось бы еще понять как узнать что запрос вернул пустое значение, ничего не нашел с текущими условиямя. Wasnull не позволяет проверить это, как мне кажется, т.к. он смотрит на отдельные столбцы, а while resaltset.next()  это все таки больше для перебора строк.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| Теги | 
| odbc, импорт, импорт данных, отладчик | 
| 
	
	 | 
	
		
  |