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