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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2016, 15:39   #21  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Никакого закрытия в библиотеке нет, только Login и получение данных, к сожалению

Последний раз редактировалось vikuss2006; 14.03.2016 в 15:55.
Старый 14.03.2016, 17:30   #22  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от vikuss2006 Посмотреть сообщение
Результат опыта с Эксель
1) запустила только один экземпляр файла, использующего ком библиотеку.
А как именно происходит использование Com в Excel? Это макрос? Можете привести здесь его код?

PS: Кстати, на какой команде в Axapta обращения к COM возникает ошибка?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 15.03.2016, 12:27   #23  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
вот скрипт
Sub test()
' Поправьте эти значения, указав логин, пароль, пароль к секретному ключу и путь к секретному ключу пользователя
Login = Range("Login").Value '"ALGOL1"
pwd1 = Range("Pwd_1").Value '"900"
pwd2 = Range("Pwd_2").Value '"900"
pathToKey = Range("Path").Value '"c:\Keys\ALGOL1_"

Dim o As iFOBSDocIntegrator.DocOperation
Set o = New iFOBSDocIntegrator.DocOperation
If (o Is Nothing) Then
MsgBox "Ошибка! iFOBSDocIntegrator.dll не зарегистрирована в системе."
GoTo Exit1
End If
MsgBox "Проверка параметров Login."
s = o.Login(Login, pwd1, pwd2, pathToKey)
If s <> "" Then
MsgBox "Ошибка! Неправильно определены данные"
GoTo Exit1
End If
MsgBox "Получение списка архивных документов за период"
Call testGetDocInfoList(o)
MsgBox "Получение списка документов, ожидающих первой подписи"
Call testGetDocList(o, DOC_WAIT_SIGN1)
MsgBox "Получение списка документов, ожидающих второй подписи"
Call testGetDocList(o, DOC_WAIT_SIGN2)
MsgBox "Получение списка документов, ожидающих третьей подписи"
Call testGetDocList(o, DOC_WAIT_AUTH)
MsgBox "Получение списка всех введенных документов за период"
Call testGetDocList(o, DOC_ALL_DOCUMENTS)
Exit1:
Set o = Nothing
End Sub

Аксапта вылетает при получении списка через опеределенное время, при очередном запуске job
Старый 15.03.2016, 19:57   #24  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если обернуть вызов в ComDispFunction() не поможет?

X++:
static void test_Com(Args _args)
{
    Com     comApplication;
    str     ret;
    str     s;

    ComDispFunction funcGet;
    COMVariant      varArgStr1;
    COMVariant      varArgStr2;
    COMVariant      varArgStr3;
    COMVariant      varArgStr4;
    ComVariant      varRet;

    ;
    
    try
    {
        comApplication = new COM("iDocIntegrator.DocOperation");
        if(!comApplication)
        {
            info("error");
            return;
        }

        // Вместо прямого вызова, сделать вызов через ComDispFunction
        //ret = comApplication.Login("login", "pass", "pass", "D:\key");

        // Функция
        funcGet = new ComDispFunction(comApplication, "Login", COMDispContext::PropertyGet);

        // Параметры
        varArgStr1 = COMVariant::createFromStr("login");
        varArgStr2 = COMVariant::createFromStr("pass");
        varArgStr3 = COMVariant::createFromStr("pass");
        varArgStr4 = COMVariant::createFromStr("D:\key");
 
        // Возвращаемое значение
        varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR);

        // Выполнение
        funcGet.call(varArgStr1, varArgStr2, varArgStr3, varArgStr4, varRet);
 
        // Результат выполнения
        ret = varRet.bStr();
 
        
        if(!ret)
        {
            // Вместо прямого вызова, сделать вызов через ComDispFunction
            //s = comApplication.GetDocInfoList("20160218", "20160218");

            // Функция
            funcGet = new ComDispFunction(comApplication, "GetDocInfoList", COMDispContext::PropertyGet);

            // Параметры
            varArgStr1 = COMVariant::createFromStr("20160218");
            varArgStr2 = COMVariant::createFromStr("20160218");
            
            // Возвращаемое значение
            varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR);

            // Выполнение
            funcGet.call(varArgStr1, varArgStr2, varRet);
            
            // Результат выполнения
            s = varRet.bStr();
            info(s);
        }
        else
        {
            info(ret);
        }
        comApplication = null;
    }
    catch(Exception::Error)
    {
        comApplication = null;
        throw error("Обработка отменена!");
    }

    comApplication = null;
    
    info('end');
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 16.03.2016, 09:45   #25  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Цитата:
Сообщение от vikuss2006 Посмотреть сообщение
вот скрипт
Sub test()
' Поправьте эти значения, указав логин, пароль, пароль к секретному ключу и путь к секретному ключу пользователя
X++:
bla-bla-bla
Dim o As iFOBSDocIntegrator.DocOperation
bla-bla-bla
s = o.Login(Login, pwd1, pwd2, pathToKey)
--
Это скрипт от разработчиков? Теперь понятно, почему в библиотеке не предусмотрен метод завершения.

*добавлено:
Как отработает вот такой скрипт?
X++:
Sub test()
' Поправьте эти значения, указав логин, пароль, пароль к секретному ключу и путь к секретному ключу пользователя
Login = Range("Login").Value '"ALGOL1"
pwd1 = Range("Pwd_1").Value '"900"
pwd2 = Range("Pwd_2").Value '"900"
pathToKey = Range("Path").Value '"c:\Keys\ALGOL1_"

Dim o As iFOBSDocIntegrator.DocOperation
Set o = New iFOBSDocIntegrator.DocOperation
If (o Is Nothing) Then
MsgBox "Ошибка! iFOBSDocIntegrator.dll не зарегистрирована в системе."
GoTo Exit1
End If
MsgBox "Проверка параметров Login."
s = o.Login(Login, pwd1, pwd2, pathToKey)
If s <> "" Then
MsgBox "Ошибка! Неправильно определены данные"
GoTo Exit1
End If
MsgBox "Получение списка архивных документов за период"
Call testGetDocInfoList(o)
Exit1:
Set o = Nothing
End Sub
И меня одного смущает тот момент, что разработчики проверяют работоспособность скриптом, когда им говорят о COM вызове? Что включено в метод getDocInfoList и куда уходят параметры при вызове метода ТС?
Все это оставляет ощущения быдлоразработчиков (отмахнулись, мол скрипт наш работает, а остальное Ваши проблемы)...

Последний раз редактировалось terraByteG; 16.03.2016 в 10:10.
Старый 16.03.2016, 09:59   #26  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Цитата:
Сообщение от terraByteG Посмотреть сообщение
Это скрипт от разработчиков? Теперь понятно, почему в библиотеке не предусмотрен метод завершения.
Мне не понятно, можете пожалуйста объяснить
Старый 16.03.2016, 10:18   #27  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Цитата:
Сообщение от vikuss2006 Посмотреть сообщение
Мне не понятно, можете пожалуйста объяснить
Имя переменных. Конечно это придирки, но отдавать это клиентам, не желая потратить 2 секунды и придерживаться правил хорошего тона, чтобы не стыдно было. А то сделали на отъе***
Это мое ИМХО. Предположу, что даже не задумывались, для возможности удобного и безошибочного использования клиентами их библиотеки, положить в нее не только вход, но и выход. На все ответят скриптом...
Когда писал свою выгрузку из Аксапты в Эксель, вторым что я сделал после инициализации документа - метод CloseDocument().
Старый 17.03.2016, 12:56   #28  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если обернуть вызов в ComDispFunction() не поможет?

X++:
static void test_Com(Args _args)
{
    Com     comApplication;
    str     ret;
    str     s;

    ComDispFunction funcGet;
    COMVariant      varArgStr1;
    COMVariant      varArgStr2;
    COMVariant      varArgStr3;
    COMVariant      varArgStr4;
    ComVariant      varRet;

    ;
    
    try
    {
        comApplication = new COM("iDocIntegrator.DocOperation");
        if(!comApplication)
        {
            info("error");
            return;
        }

        // Вместо прямого вызова, сделать вызов через ComDispFunction
        //ret = comApplication.Login("login", "pass", "pass", "D:\key");

        // Функция
        funcGet = new ComDispFunction(comApplication, "Login", COMDispContext::PropertyGet);

        // Параметры
        varArgStr1 = COMVariant::createFromStr("login");
        varArgStr2 = COMVariant::createFromStr("pass");
        varArgStr3 = COMVariant::createFromStr("pass");
        varArgStr4 = COMVariant::createFromStr("D:\key");
 
        // Возвращаемое значение
        varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR);

        // Выполнение
        funcGet.call(varArgStr1, varArgStr2, varArgStr3, varArgStr4, varRet);
 
        // Результат выполнения
        ret = varRet.bStr();
 
        
        if(!ret)
        {
            // Вместо прямого вызова, сделать вызов через ComDispFunction
            //s = comApplication.GetDocInfoList("20160218", "20160218");

            // Функция
            funcGet = new ComDispFunction(comApplication, "GetDocInfoList", COMDispContext::PropertyGet);

            // Параметры
            varArgStr1 = COMVariant::createFromStr("20160218");
            varArgStr2 = COMVariant::createFromStr("20160218");
            
            // Возвращаемое значение
            varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR);

            // Выполнение
            funcGet.call(varArgStr1, varArgStr2, varRet);
            
            // Результат выполнения
            s = varRet.bStr();
            info(s);
        }
        else
        {
            info(ret);
        }
        comApplication = null;
    }
    catch(Exception::Error)
    {
        comApplication = null;
        throw error("Обработка отменена!");
    }

    comApplication = null;
    
    info('end');
}
Опять ошибка:
<?xml version="1.0" encoding="windows-1251"?><ERROR>Access violation at address 1105C5CF in module 'libeay32.dll'. Write of address 0889E338</ERROR>
Старый 18.03.2016, 16:04   #29  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от vikuss2006 Посмотреть сообщение
Опять ошибка:
<?xml version="1.0" encoding="windows-1251"?><ERROR>Access violation at address 1105C5CF in module 'libeay32.dll'. Write of address 0889E338</ERROR>
А Вы не могли бы на время тестирования отключить антивирус, если он у Вас есть? Может быть, он блокирует библиотеку?

И еще, думаю, не принципиально, но все-таки, первой командой в примере Excel идет выборка списка документов.

X++:
MsgBox "Получение списка архивных документов за период"
Call testGetDocInfoList(o)
И только потом конкретный документ. Может, Вам сделать то же самое?

X++:
XML xml;

(...)

xml = comApplication.GetDocInfoList()
info(xml)
PS: А Вы не узнавали у разработчиков, почему их библиотека не выгружается из памяти при работе с Excel? Вроде бы прямое обнуление идет

Set o = Nothing
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 21.03.2016, 10:43   #30  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А Вы не могли бы на время тестирования отключить антивирус, если он у Вас есть? Может быть, он блокирует библиотеку?

И еще, думаю, не принципиально, но все-таки, первой командой в примере Excel идет выборка списка документов.

X++:
MsgBox "Получение списка архивных документов за период"
Call testGetDocInfoList(o)
И только потом конкретный документ. Может, Вам сделать то же самое?

X++:
XML xml;

(...)

xml = comApplication.GetDocInfoList()
info(xml)
PS: А Вы не узнавали у разработчиков, почему их библиотека не выгружается из памяти при работе с Excel? Вроде бы прямое обнуление идет

Set o = Nothing
Попробовала отключать антивирус, и получать список документов после Login, но все равно выскакивает та же ошибка:
Метод 'GetDocInfoList' в COM-объекте класса '{A6103CA4-D33A-48A5-BB08-7893A12BE5D8}' возвратил код ошибки 0x8000FFFF (<неизвестно>), который означает: Вы не вошли в систему!.
Старый 21.03.2016, 10:48   #31  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
И еще, у разработчиков я узнавала, почему библиотека выгружается из памяти, ничего не ответили, единственное, что сказали, и то не разработчики,а техническая поддержка банка, что они не знают, как будет вести себя библиотека при одновременных запусках.
Старый 21.03.2016, 17:58   #32  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
может стоит попробовать Thread t = new Thread();
Старый 22.03.2016, 15:45   #33  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Попробовала создать новый поток, чтобы выполнить подключение библиотеки в отдельном потоке,
t = new Thread();
//t.removeOnComplete(true);
t.run(classnum(FCH_ThreadDemo), identifierstr(run));
Аксапта ругается Ошибка времени выполнения xApplication(Объект), метод initGlobal вызван с неправильными параметрами, хотя я использую учебный пример Аксапты по работе с потоками TutorialThread.
Старый 23.03.2016, 08:39   #34  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Так понимаю, что run - не объявлен как статический...
X++:
t = new Thread();
//t.removeOnComplete(true);
t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run));
Старый 23.03.2016, 08:53   #35  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Цитата:
Сообщение от terraByteG Посмотреть сообщение
Так понимаю, что run - не объявлен как статический...
X++:
t = new Thread();
//t.removeOnComplete(true);
t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run));
class FCH_ThreadDemo
{
}
static client void main()
{
Thread t;
;
t = new Thread();
//t.removeOnComplete(true);
t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run));

}
static client void run(Thread t)
{
;
//sleep(2000);
info("hello");
}

вызов
FCH_ThreadDemo::main();
Старый 23.03.2016, 10:10   #36  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
По-моему в тройке были какие-то проблемы с использованием infologa в потоке.
Threads
Цитата:
Сообщение от db Посмотреть сообщение
... Ошибка связана с попыткой создать формочку для инфолога в потоке. ...
Попробуйте без интерактивных функций
Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо?
Старый 23.03.2016, 10:18   #37  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
X++:
class FCH_ThreadDemo
{
}

static client void main(Args args)
{
Thread t;
container           con;
    ;
    t = new Thread();
    t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run));
    sleep(500);
    info(conPeek(t.getOutputParm(), 1));
    t.removeOnComplete(true);
}

static client void run(Thread t)
{
    t.setOutputParm(['Hello']);
}
Старый 23.03.2016, 10:25   #38  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
По-моему в тройке были какие-то проблемы с использованием infologa в потоке.
В AX 2009 - с этим тоже беда.
Старый 23.03.2016, 10:27   #39  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
По-моему в тройке были какие-то проблемы с использованием infologa в потоке.
Threads


Попробуйте без интерактивных функций
Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо?
Я работаю в АX3.0, убрала info, делаю просто
static client void run(Thread t)
{
int i = 1;
;
i++;
}
Но самое интересное, что в run() ставлю точку останова, и туда вообще не попадаю.
Старый 23.03.2016, 10:36   #40  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Цитата:
Сообщение от terraByteG Посмотреть сообщение
X++:
class FCH_ThreadDemo
{
}

static client void main(Args args)
{
Thread t;
container           con;
    ;
    t = new Thread();
    t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run));
    sleep(500);
    info(conPeek(t.getOutputParm(), 1));
    t.removeOnComplete(true);
}

static client void run(Thread t)
{
    t.setOutputParm(['Hello']);
}
Выдало Информация 0
Теги
com connector, com-объект, thread

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axmfg: Lean manufacturing: Picking activities and kanban line events Blog bot DAX Blogs 0 26.08.2014 21:13
atinkerersnotebook: Using Vendor Requests to Manage On-boarding New Vendors Blog bot DAX Blogs 1 22.10.2013 02:24
atinkerersnotebook: Using Service Management to Track Service Orders Blog bot DAX Blogs 1 25.08.2013 19:16
atinkerersnotebook: Configuring Lean Manufacturing in Dynamics AX 2012 Blog bot DAX Blogs 1 12.08.2013 00:15
dynamicsaxtraining: Vendor returns Blog bot DAX Blogs 0 11.10.2012 00:11

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:36.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.