![]() |
#1 |
Участник
|
![]()
Задача вот какая: создаётся из под аксапты документ, после чего в аксапте нужно дождаться окончания работы в офисном документе и продолжить выполнение своего кода.
делал бесконечным циклом со sleep(100); и с выходом по условию, что m_ComApplication.toString() == "" или m_ComDocument.toString() == "". для вордовых документах это как-то работает, но на экселе - нет. это условие срабатывает, когда редактируешь ячейку. (на каком-то из офисов это срабатывало и в ворде при нажатии на крестик, когда выводился запрос о сохранении - бред какой-то, простите) проверка на существование ссылок на самих com-объектов тоже ничего хорошего не дала - даже после закрытия документа оно продолжает куда-то ссылаться (хоть там уже и методов нет), в null не сбрасывается. может кто с подобным сталкивался? или идеи какие?...
__________________
Best wishes, Roman. ~RVS |
|
![]() |
#2 |
Участник
|
Re: COMOfficeDocument_RU как дождаться конца работы в документе?
Цитата:
Изначально опубликовано Roman. ~RVS
Задача вот какая: создаётся из под аксапты документ, после чего в аксапте нужно дождаться окончания работы в офисном документе и продолжить выполнение своего кода. |
|
![]() |
#3 |
Участник
|
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(); } //Код который исполняется после вывода |
|
![]() |
#4 |
Участник
|
Я так понял, Вам в аксапте надо узнать, когда пользователь закрыл документ ворда или экселя.
Надо ловить событие Document_Close() у COM-объекта Application для ворда и событие Application.WorkbookBeforeClose() у COM-объекта Application для экселя. Нужно копать в этом направлении. Я лично в Аксапте еще ни разу event'ы от COM-объектов не перехватывал. |
|
![]() |
#5 |
Участник
|
Поясняю:
нужно дождаться, пока пользователь поработает с документом и внесёт в него какие-нибудь изменения. у меня ещё остаётся запасной вариант (некрасивый, тормозной, и я его не пробовал): - создать документ, всё в него внести, - сохранить - снова открыть через командную строку с помощью сформированного специально для этого .bat файла, в котором будет файловая сигнализация, что документ отработал. нужно такую вещь для создания документов, в которые пользователь может вносить произвольные исправления и последующего АВТОМАТИЧЕСКОГО складирования этих самых документов. |
|
![]() |
#6 |
Участник
|
Цитата:
Изначально опубликовано Ace of Database
Я так понял, Вам в аксапте надо узнать, когда пользователь закрыл документ ворда или экселя. Надо ловить событие Document_Close() у COM-объекта Application для ворда и событие Application.WorkbookBeforeClose() у COM-объекта Application для экселя. Нужно копать в этом направлении. |
|
![]() |
#7 |
Участник
|
В Axapta есть ActiveX, который позволяет отображать документы Excel в форме Axapta.
Может это подойдет |
|
![]() |
#8 |
Участник
|
Наверное, события без формы не получатся:
http://erpkb.com/Axapta/PoluchenieUv...shnixSobytijax (либо надо делать адаптер, который будет пихать события в некоторую очередь и поток, который очередь будет просматривать) |
|
![]() |
#9 |
Участник
|
Цитата:
Изначально опубликовано monk
В Axapta есть ActiveX, который позволяет отображать документы Excel в форме Axapta. Может это подойдет |
|
![]() |
#10 |
Участник
|
Посмотрите форму RAssetDocuments
|
|
![]() |
#11 |
Administrator
|
События можно точно перехватить в ActiveX - см метод формы controlMethodOverload
и форму SysHelp. |
|
![]() |
#12 |
Участник
|
Цитата:
Изначально опубликовано sukhanchik
События можно точно перехватить в ActiveX - см метод формы controlMethodOverload и форму SysHelp. в общем, пока подзабил на это дело - не до того. просто в методе ожидания, пока отработает документ вставил вопрос, типа если пользователь доработал в документе, то после того, как он это сделал, в аксапте он жмёт батон и процесс идёт дальше. тоже не красиво, но хоть как-то работает. 8-) |
|
![]() |
#13 |
Участник
|
и снова...
и всё-таки может ещё у кого-нибудь какие-то мысли?
второй вариант: можно отслеживать, что файл документа сужествует и что он занят другим процессом. как только файл освободился - работа закончена. да вот только WinAPI::isFileExist(_fn) говорит, что файла НЕТ, не смотря на то, что он ЕСТЬ, но ЗАНЯТ. что я делаю не так? пойти покурить исходники WinAPI? |
|
![]() |
#14 |
Участник
|
WinAPI::fileExist_RU ведёт себя таким же образом - говорит, что файла нет, если он занят.
в общем, использовал WinAPI::fileLocked() - работа его меня удовлетворила. |
|
![]() |
#15 |
Юзовские
|
Может быть пойти другим путем? Например, не из аксапты отслеживать закрытие офисовского документа, а из этого самого документа по его закрытию дернуть аксапту через ком и сказать ей что документ такой-то юзером изменен и закрыт.
Это просто абстрактная идея. Я таким не занимался. |
|
![]() |
#16 |
Пенсионер
|
В свое время тоже стояла такая задача, решил следующим методом в Global :
PHP код:
__________________
![]() А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|