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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.01.2005, 09:42   #1  
Roman. ~RVS is offline
Roman. ~RVS
Участник
Аватар для Roman. ~RVS
 
26 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
? COMOfficeDocument_RU как дождаться конца работы в документе?
Задача вот какая: создаётся из под аксапты документ, после чего в аксапте нужно дождаться окончания работы в офисном документе и продолжить выполнение своего кода.

делал бесконечным циклом со sleep(100); и с выходом по условию, что m_ComApplication.toString() == "" или m_ComDocument.toString() == "".

для вордовых документах это как-то работает, но на экселе - нет. это условие срабатывает, когда редактируешь ячейку. (на каком-то из офисов это срабатывало и в ворде при нажатии на крестик, когда выводился запрос о сохранении - бред какой-то, простите)

проверка на существование ссылок на самих com-объектов тоже ничего хорошего не дала - даже после закрытия документа оно продолжает куда-то ссылаться (хоть там уже и методов нет), в null не сбрасывается.

может кто с подобным сталкивался? или идеи какие?...
__________________
Best wishes,
Roman. ~RVS
Старый 21.01.2005, 10:26   #2  
Gad is offline
Gad
Участник
 
136 / 18 (1) ++
Регистрация: 21.05.2003
Адрес: Москва
Re: COMOfficeDocument_RU как дождаться конца работы в документе?
Цитата:
Изначально опубликовано Roman. ~RVS
Задача вот какая: создаётся из под аксапты документ, после чего в аксапте нужно дождаться окончания работы в офисном документе и продолжить выполнение своего кода.
Я наверное чего то не понимаю, но в чем проблема. Пишите код вывода в Office, за ним дальнейший код.
Старый 21.01.2005, 10:34   #3  
Gad is offline
Gad
Участник
 
136 / 18 (1) ++
Регистрация: 21.05.2003
Адрес: Москва
X++
ComExcelDocument excel;
;

try
{
excel = new ComExcelDocument();
excel.newFile(Template, false);

excel.insertValue(ComExcelDocument_RU::numToNameCell(1, 2), value1);
excel.insertValue(ComExcelDocument_RU::numToNameCell(3, 4), value2);
excel.insertValue(ComExcelDocument_RU::numToNameCell(5, 6), value3);

excel.visible(true);
excel.finalize();
}
catch (Exception::Error)
{
excel.closeDocument();
excel.finalize();
}
//Код который исполняется после вывода

Старый 21.01.2005, 10:40   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Я так понял, Вам в аксапте надо узнать, когда пользователь закрыл документ ворда или экселя.
Надо ловить событие Document_Close() у COM-объекта Application для ворда и событие Application.WorkbookBeforeClose() у COM-объекта Application для экселя.
Нужно копать в этом направлении.
Я лично в Аксапте еще ни разу event'ы от COM-объектов не перехватывал.
Старый 21.01.2005, 10:40   #5  
Roman. ~RVS is offline
Roman. ~RVS
Участник
Аватар для Roman. ~RVS
 
26 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
Поясняю:
нужно дождаться, пока пользователь поработает с документом и внесёт в него какие-нибудь изменения.

у меня ещё остаётся запасной вариант (некрасивый, тормозной, и я его не пробовал):
- создать документ, всё в него внести,
- сохранить
- снова открыть через командную строку с помощью сформированного специально для этого .bat файла, в котором будет файловая сигнализация, что документ отработал.

нужно такую вещь для создания документов, в которые пользователь может вносить произвольные исправления и последующего АВТОМАТИЧЕСКОГО складирования этих самых документов.
Старый 21.01.2005, 10:43   #6  
Roman. ~RVS is offline
Roman. ~RVS
Участник
Аватар для Roman. ~RVS
 
26 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
Цитата:
Изначально опубликовано Ace of Database
Я так понял, Вам в аксапте надо узнать, когда пользователь закрыл документ ворда или экселя.
Надо ловить событие Document_Close() у COM-объекта Application для ворда и событие Application.WorkbookBeforeClose() у COM-объекта Application для экселя.
Нужно копать в этом направлении.
Отлично! мысль-то хорошая, а как?! Я бы с радостью покопался, да у меня даже идей нет, как привязать к комовскому событию какой-нибудь метод аксапты...
Старый 21.01.2005, 10:54   #7  
monk is offline
monk
Участник
 
67 / 12 (1) ++
Регистрация: 14.10.2002
В Axapta есть ActiveX, который позволяет отображать документы Excel в форме Axapta.
Может это подойдет
Старый 21.01.2005, 15:02   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Наверное, события без формы не получатся:
http://erpkb.com/Axapta/PoluchenieUv...shnixSobytijax

(либо надо делать адаптер, который будет пихать события в некоторую очередь и поток, который очередь будет просматривать)
Старый 24.01.2005, 14:52   #9  
Roman. ~RVS is offline
Roman. ~RVS
Участник
Аватар для Roman. ~RVS
 
26 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
Цитата:
Изначально опубликовано monk
В Axapta есть ActiveX, который позволяет отображать документы Excel в форме Axapta.
Может это подойдет
Хм. Мрачно просмотрел все доступные ActiveX - не нашел. Ввел руками Word.Application - повалил аксапту...
Старый 24.01.2005, 15:42   #10  
Hezl is offline
Hezl
Участник
Аватар для Hezl
 
138 / 16 (1) ++
Регистрация: 21.04.2004
Адрес: Moscow, Russia
Посмотрите форму RAssetDocuments
Старый 25.01.2005, 09:35   #11  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
События можно точно перехватить в ActiveX - см метод формы controlMethodOverload
и форму SysHelp.
Старый 25.01.2005, 10:32   #12  
Roman. ~RVS is offline
Roman. ~RVS
Участник
Аватар для Roman. ~RVS
 
26 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
Цитата:
Изначально опубликовано sukhanchik
События можно точно перехватить в ActiveX - см метод формы controlMethodOverload
и форму SysHelp.
Это-то понятно. только вот вставлять в аксаптовскую форму документ как-то не очень красиво получается, с учетом, что это делается через ActiveX эксплорера (как мне посоветовали посмотреть в RAssetDocuments) - чисто word или excel доумента в ActiveX нет. А это не то, всё-таки. нет там полноофисного функционала. Да и при каждом открытии диалог выводится, что "многие файлы могут повредить...." и т.д...

в общем, пока подзабил на это дело - не до того. просто в методе ожидания, пока отработает документ вставил вопрос, типа если пользователь доработал в документе, то после того, как он это сделал, в аксапте он жмёт батон и процесс идёт дальше.

тоже не красиво, но хоть как-то работает. 8-)
Старый 28.01.2005, 12:42   #13  
Roman. ~RVS is offline
Roman. ~RVS
Участник
Аватар для Roman. ~RVS
 
26 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
и снова...
и всё-таки может ещё у кого-нибудь какие-то мысли?

второй вариант: можно отслеживать, что файл документа сужествует и что он занят другим процессом. как только файл освободился - работа закончена.

да вот только WinAPI::isFileExist(_fn) говорит, что файла НЕТ, не смотря на то, что он ЕСТЬ, но ЗАНЯТ.

что я делаю не так?

пойти покурить исходники WinAPI?
Старый 28.01.2005, 13:03   #14  
Roman. ~RVS is offline
Roman. ~RVS
Участник
Аватар для Roman. ~RVS
 
26 / 10 (1) +
Регистрация: 08.10.2004
Адрес: Москва
WinAPI::fileExist_RU ведёт себя таким же образом - говорит, что файла нет, если он занят.

в общем, использовал WinAPI::fileLocked() - работа его меня удовлетворила.
Старый 28.01.2005, 16:28   #15  
metal is offline
metal
Юзовские
Дети Юза
 
92 / 10 (1) +
Регистрация: 06.08.2002
Адрес: Украина
Может быть пойти другим путем? Например, не из аксапты отслеживать закрытие офисовского документа, а из этого самого документа по его закрытию дернуть аксапту через ком и сказать ей что документ такой-то юзером изменен и закрыт.

Это просто абстрактная идея. Я таким не занимался.
Старый 01.04.2005, 15:04   #16  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
В свое время тоже стояла такая задача, решил следующим методом в Global :
PHP код:
static int RunWait(str _fileName)
{
    
container   fileName;
    
COM           wsh = new COM("WScript.Shell.1");
    
str               fileExt;
    
int               ret = -1;
    ;

    
fileName str2con(_fileName'.');
    
fileExt conpeek(fileNameconlen(fileName));
    if ((
fileExt == "DOC") || (fileExt == "DOT"))
    {
        
ret wsh.Run('winword.exe ' '"' _fileName '"'1True);
    }
    if (
fileExt == "XLT")
    {
        
ret =  wsh.Run('excel.exe ' '"' _fileName '"'1True);

    }
    return 
ret;

в версии 2.5 работало почему-то через раз, в версии 3 не пробывал!
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Журнал работы пользователей (логи)? Anais DAX: Администрирование 7 26.08.2009 09:15
Ошибка: Сессия работы на сервере AOS прервана... Atani DAX: Программирование 6 09.08.2007 09:28
Использование профилировщика и толкование результатов его работы belugin DAX: Программирование 3 22.11.2005 16:56
Настройка прав доступа для работы с журналами платежей Pismarkina DAX: Администрирование 3 27.05.2005 09:31
Организация работы программистов Андре DAX: Прочие вопросы 34 29.05.2002 13:16
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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