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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.10.2009, 08:16   #1  
AXbeginer is offline
AXbeginer
Участник
 
20 / 10 (1) +
Регистрация: 01.10.2009
Импорт в АХ через 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  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
Для того чтоб работал дебагер: Сервис\Параметры\Разработка\Режим отладки = "Когда есть точки останова". импорт лучше делать в классе, а из формы его вызвать через MenuItem
Старый 01.10.2009, 08:36   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Ещё один.
Когда пишите код на панели есть кнопочка X++.
Сейчас глядя на этот код, мысль только одна: "Щас мозг взорвётся".
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 01.10.2009, 08:59   #4  
AXbeginer is offline
AXbeginer
Участник
 
20 / 10 (1) +
Регистрация: 01.10.2009
Цитата:
Для того чтоб работал дебагер: Сервис\Параметры\Разработка\Режим отладки = "Когда есть точки останова".
Ну так и настроено
Старый 01.10.2009, 09:01   #5  
AXbeginer is offline
AXbeginer
Участник
 
20 / 10 (1) +
Регистрация: 01.10.2009
Цитата:
Когда пишите код на панели есть кнопочка 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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от AXbeginer Посмотреть сообщение
Ну так и настроено
работаете через АОС? если да то ндо ещё на АОСе включить отладку.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 01.10.2009, 09:03   #7  
AXbeginer is offline
AXbeginer
Участник
 
20 / 10 (1) +
Регистрация: 01.10.2009
Ну а с ошибками то что делать? В чем проблема?
Старый 01.10.2009, 09:05   #8  
AXbeginer is offline
AXbeginer
Участник
 
20 / 10 (1) +
Регистрация: 01.10.2009
Цитата:
работаете через АОС? если да то ндо ещё на АОСе включить отладку.
Все так и настроено, не может debager не работать из за того что ОС Vista
Старый 01.10.2009, 09:10   #9  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
если я правильно понял "LP.setDSN("TransferConnection")" - это настроенное odbc подключение?
оно нормально работает? тест выполняли?
ещё вопросик, какая у Вас версия Аксапты?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 01.10.2009, 09:12   #10  
corner77 is offline
corner77
Участник
 
18 / 25 (1) +++
Регистрация: 28.04.2009
X++:
Item=myResultLine.getString(3);
LostQty=myResultLine.getReal(1);
класс ResultSet однонаправленный и по строкам и по (как ни странно) столбцам. Если сначала считать значение из 3-го, то потом из первого не считаете ни за что. Читайте последовательно нужные столбцы и будет счастье.
За это сообщение автора поблагодарили: AXbeginer (1).
Старый 01.10.2009, 09:13   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
и все таки надо ловить дабагером ошибку, в каком месте она вылетает...
иногда дебагер не славливает точку останова на кнопке формы...
сделайте этот метод в классе (как вам советовали), и вызывайте метод из формы, тогда дебагер точно словит точку останова...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 01.10.2009, 09:14   #12  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Я не заметил строк
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));
Точно не помню. Но помойму так должен выглядить select.
И ещё dns точно создан.
Из описанного выше у вас код выполняется на клиенте.
Но если вы что-то упустили или не дописали и он выполняется на сервере, то dns нужно создавать на сервере.
Да и с дебагером лучше всё же разберитесь. Лучше на код положить, чем на дебагер.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.

Последний раз редактировалось miklenew; 01.10.2009 в 09:19.
Старый 01.10.2009, 11:31   #13  
Zodiak is offline
Zodiak
Участник
 
61 / 22 (1) +++
Регистрация: 16.01.2004
Адрес: СПб
Цитата:
Сообщение от AXbeginer Посмотреть сообщение
Все так и настроено, не может debager не работать из за того что ОС Vista
дебаггер в 40 может не отрабатывать на методах элементов форм (в частности, кнопочек) по точке останова. Для уверенности надо явно писать breakpoint вместо точки останова.
Поймайте дебаггером строку, на которой вылетает - можно будет дать более точные рекомендации. Сейчас слишком много вариантов))
Старый 01.10.2009, 14:59   #14  
AXbeginer is offline
AXbeginer
Участник
 
20 / 10 (1) +
Регистрация: 01.10.2009
Цитата:
если я правильно понял "LP.setDSN("TransferConnection")" - это настроенное odbc подключение?
оно нормально работает? тест выполняли?
ещё вопросик, какая у Вас версия Аксапты?
Да это настроенное соединение в источниках данных. работает 100%. Потому ,что уже есть загрузка с участием данного соединения АХ 4.0
X++:
            strfmt("Select ShiftReportPourHeader.excontrolqty, ShiftReportPourHeader.primor, ShiftReportPourHeader.collectrefprodid from ShiftReportPourHeader " +
                   "Where ShiftReportPourHeader.DataAreaId = '%1' and ShiftReportPourHeader.collectrefprodid = '%2'",
                    curext(),ProdTable.collectrefprodid));
не берусь утверждать в силу своего не слишком большого опыта АХ разработок , но мне казалось здесь используется стандартный SQL запрос.
Цитата:
дебаггер в 40 может не отрабатывать на методах элементов форм (в частности, кнопочек) по точке останова.
У меня было такое предположение вы его подтвердили
Цитата:
класс ResultSet однонаправленный и по строкам и по (как ни странно) столбцам. Если сначала считать значение из 3-го, то потом из первого не считаете ни за что. Читайте последовательно нужные столбцы и будет счастье.
Да этот вариант сработал.Спасибо
Правда осталась проблема с updatequery За пример взял
X++:
 myStatement.executeUpdate(strfmt("Update ShiftReportHeader Set posted = 1 Where primor = %1 (1 = 0)", s));
правда убрал (1 = 0) не знаю что это такое
Старый 02.10.2009, 08:12   #15  
AXbeginer is offline
AXbeginer
Участник
 
20 / 10 (1) +
Регистрация: 01.10.2009
Хотелось бы еще понять как узнать что запрос вернул пустое значение, ничего не нашел с текущими условиямя. Wasnull не позволяет проверить это, как мне кажется, т.к. он смотрит на отдельные столбцы, а while resaltset.next() это все таки больше для перебора строк.
Теги
odbc, импорт, импорт данных, отладчик

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Построчный импорт из Excel через COM _and DAX: Программирование 3 05.07.2011 14:05
Построчный импорт из Excel через COM olesh DAX: Программирование 20 23.10.2008 14:01
Чтение данных из SQL Server через ODBC. Не работает в 3-х звенке sukhanchik DAX: Программирование 7 30.05.2005 17:52
Импорт данных из ODBC источника JohNick DAX: Программирование 4 09.04.2004 10:17
А могет ли Акса 2.5 или 3 работать с Ораклом не через ODBC,а через что-нить пошустрее asaev DAX: Администрирование 2 29.03.2004 20:35

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:18.