|  01.10.2009, 08:16 | #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 тоже самое. | 
|  | 
|  01.10.2009, 08:28 | #2 | 
| Участник | 
			
			Для того чтоб работал дебагер: Сервис\Параметры\Разработка\Режим отладки = "Когда есть точки останова". импорт лучше делать в классе, а из формы его вызвать через MenuItem
		 | 
|  | 
|  01.10.2009, 08:36 | #3 | 
| Участник | 
			
			Ещё один. Когда пишите код на панели есть кнопочка X++. Сейчас глядя на этот код, мысль только одна: "Щас мозг взорвётся". 
				__________________ Энергия молодых и неравнодушных способна изменить мир к лучшему. | 
|  | 
|  01.10.2009, 08:59 | #4 | 
| Участник | Цитата: 
		
			Для того чтоб работал дебагер: Сервис\Параметры\Разработка\Режим отладки = "Когда есть точки останова".
		
	 | 
|  | 
|  01.10.2009, 09:01 | #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)."); } } | 
|  | 
|  01.10.2009, 09:01 | #6 | 
| Ищущий знания... | 
			
			работаете через АОС? если да то ндо ещё на АОСе включить отладку.
		 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  01.10.2009, 09:03 | #7 | 
| Участник | 
			
			Ну а с ошибками то что делать? В чем проблема?
		 | 
|  | 
|  01.10.2009, 09:05 | #8 | 
| Участник | Цитата: 
		
			работаете через АОС? если да то ндо ещё на АОСе включить отладку.
		
	 | 
|  | 
|  01.10.2009, 09:10 | #9 | 
| Ищущий знания... | 
			
			если я правильно понял "LP.setDSN("TransferConnection")" - это настроенное odbc подключение? оно нормально работает? тест выполняли? ещё вопросик, какая у Вас версия Аксапты? 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  01.10.2009, 09:12 | #10 | 
| Участник | X++: Item=myResultLine.getString(3); LostQty=myResultLine.getReal(1); | 
|  | |
| За это сообщение автора поблагодарили: AXbeginer (1). | |
|  01.10.2009, 09:13 | #11 | 
| Ищущий знания... | 
			
			и все таки надо ловить дабагером ошибку, в каком месте она вылетает... иногда дебагер не славливает точку останова на кнопке формы... сделайте этот метод в классе (как вам советовали), и вызывайте метод из формы, тогда дебагер точно словит точку останова... 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  01.10.2009, 09:14 | #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. | 
|  | 
|  01.10.2009, 11:31 | #13 | 
| Участник | Цитата: Поймайте дебаггером строку, на которой вылетает - можно будет дать более точные рекомендации. Сейчас слишком много вариантов)) | 
|  | 
|  01.10.2009, 14:59 | #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)); | 
|  | 
|  02.10.2009, 08:12 | #15 | 
| Участник | 
			
			Хотелось бы еще понять как узнать что запрос вернул пустое значение, ничего не нашел с текущими условиямя. Wasnull не позволяет проверить это, как мне кажется, т.к. он смотрит на отдельные столбцы, а while resaltset.next()  это все таки больше для перебора строк.
		 | 
|  | 
| Теги | 
| odbc, импорт, импорт данных, отладчик | 
|  | 
| 
 |