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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.06.2009, 17:11   #1  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
Приветствую, коллеги! Нужна помощь...

Имеется вывод данных в ВОРД, в котором понадобилось кое-что переделать
т.е. пользователь получал окно с файлом, печатал его закрывал - и вуаля.
Теперь понадобилось файл открыть, кое-что с ним сделать и тут же закрыть.

wdApp.Visible := FALSE;
wdDoc := wdApp.Documents.Open(FileName);
....
wdApp.Visible := TRUE;
.....
wdDoc.Close;
CLEAR(wdApp);

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

=======
Теперь то же самое, но с автозакрытием окна Ворда:
========

wdApp.Visible := FALSE;
wdDoc := wdApp.Documents.Open(FileName);
....
wdApp.Visible := TRUE;
....
wdApp.Visible := FALSE;
wdDoc.Close;
CLEAR(wdApp);

Вот тут начинаются непонятки. Окно ворда закрывается, очищение Аутомэйшн стоит.
Но с памяти стабильно остается паразитный процесс winword! Он держит открытым файл, и, соответственно, не дает второй раз запустить
отчет, пока не завершишь задачу.
В чем может быть проблема? Пыталась задейстовать CLEAR дважды (кхе-кхе), wdApp.Quit, wdApp.DocumentActive.Close и т.п., но была посылаема Навом после отработки отчета...
Других способов зачистки процесса не знаю... Кто-нибудь сталкивался с такой проблемой?
Старый 24.06.2009, 15:49   #2  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
Судя по всему, никто не знает...
В общем, проблему удалесь объегорить, создавая каждый раз документ новый по счетчику (т.е. если такой уже есть в директории, прибавляется к названию счетчк)
Соответственно, НАВ не натыкается на оставленный в памяти процесс и ошибки удается избегать.
Я боялась, что таким образом в памяти накопится куча недобитых процессов, но этого не случилось - там все время в результате один.
Короче, проблему удалось решить - не очень красиво, но работает.
Старый 24.06.2009, 22:12   #3  
Apnik is offline
Apnik
Участник
 
8 / 10 (1) +
Регистрация: 04.10.2003
Адрес: Москва
процесс оставлять в памяти не есть гуд..
в свое время писал такой код, но сейчас нет возможности проверить.. если не ошибаюсь, вторая ветка как раз закрывает окно и снимает процесс, в случае, если пользователь в диалоговом окне печати выбрал что-то кроме как печать.. надеюсь понятно, что на протяжении все предыдущей процедуры заполнения документа он остается невидимым..

[codebox] IF wdApp.Dialogs.Item(88).Show = -1 THEN BEGIN
//если отправили на печать, то приложение не закрываем,
//т.к. неизвестно, успело ли уйти на печать
wdDocNew.Close;
IF ERASE(FileName) THEN;
END ELSE BEGIN
SaveChanges := 0;
OriginalFormat := 1;
RouteDoc := FALSE;
wdDocNew.Close;
IF ERASE(FileName) THEN;
IF NOT ISCLEAR(wdApp) THEN
wdApp.Quit(SaveChanges,OriginalFormat,RouteDoc);
END;[/codebox]

а еще, чтобы Нав не конфликтовал с запущенными на машине пользователя процессами (ворда или экселя), использовал CREATE(wdApp,TRUE), где второй параметр указывает, что это новый инстанс приложения.. по-моему так.. пусть гуру поправят
Старый 25.06.2009, 18:01   #4  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
Sova, в Вашем коде не хватает wdApp.QUIT после wdDoc.Close;
Именно этот оператор закрывает приложение.
CLEAR не закрывает приложение.

В коде Apnik как раз и использует данный метод для закрытия Ворда.
Старый 26.06.2009, 13:23   #5  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
Цитата:
Сообщение от .Quattro. Посмотреть сообщение
Sova, в Вашем коде не хватает wdApp.QUIT после wdDoc.Close;
Именно этот оператор закрывает приложение.
CLEAR не закрывает приложение.
Это понятно! Но wdApp.QUIT у меня не отрабатывает, вот в чем дело.
Стабильно выдает ошибку CAL после отработки отчета.

Делать CREATE с флагом TRUE думала, но, боюсь, это каждый раз будет порождать новый паразитный процесс - они же никуда не деваются.

Обязательно посмотрю код, данный выше, спасибо!
Старый 26.06.2009, 14:46   #6  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
Попробовала код с очищением процесса.
Quit теперь отработал без ошибок (возможно, я изначально писала с неверным синтаксисом)
Но invisible процесс в памяти живее всех живых

Я вот теперь думаю - не связано ли это как-то с выводом Ворда в PDF. Т.е. я открываю ВОРД из шаблона в сети, сохраняю клиентскую копию с изменениями,
делаю его видимым, печатаю на принтер Adobe PDF
затем делаю его невидимым и пытаюсь очистить (invisible=FALSE, Close, Clear, Quit....)
Все отрабатывает верно, в итоге, но процесс в памяти все равно остается
Старый 26.06.2009, 16:04   #7  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
да, файл Ворд перед wdApp CLEAR удаляется (ERASE), и в натуре тоже удалятся, т.е. с этим все чисто...
Старый 26.06.2009, 16:08   #8  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
Последовательность должна быть следующая:
CREATE(wdApp, TRUE);
Открытие документа wdDoc := wdApp.Open();
Печать
Закрытие документа - wdDoc.Close
CLEAR(wdDoc)
Закрытие приложения wdApp.Quit
CLEAR(wdApp)

А видимость и сохранение копии на клиентском компьютере для чего? Я в своей последовательности эти пункты специально опустил.
И будьте внимательны - процесс Ворда может висеть и не тот, который убили.
Например, произошла ошибка, и ворд остался невидимым. В следующий раз все отработало правильно и приложение закрыто, но предыдущее то еще в памяти и Вы можете видеть его.
Старый 26.06.2009, 22:09   #9  
Apnik is offline
Apnik
Участник
 
8 / 10 (1) +
Регистрация: 04.10.2003
Адрес: Москва
Sova, если wdApp.Quit отрабатывает, как Вы говорите, то приложения быть не должно. Варианта вижу два. Или он не отрабатывает корректно, но ошибку не выдает (например, Вы умышленно подавляете все диалоги и вопросы Word - это как раз можно проверить), или все же процесс не тот. Понаблюдайте количество процессов word при отладке - в какой момент что в памяти появляется и исчезает.
И, если процесс в памяти действительно остается Ваш, то лучше, на мой взгляд, открывать его без файла данных. Пользователь сможет тогда закрыть пустое окно word сам, обычным крестиком. Я столкнулся как-то с проблемой, что из-за загрузки компа, сети, принтера или чего-то еще, файл не всегда мог успеть уйти на печать в тот момент, когда код закрывает приложение. Соответственно из принтера могло ничего не вылезти.. и никакими delay'ями это нормально не решалось. Поэтому пользователь отправлял документ на печать, шел к принтеру, ждал, забирал документ и закрывал word самостоятельно.
И хочу заметить по поводу отправки на конвертер pdf. Если от пользователя никаких действий не требуется, то видимость включать не нужно, я полагаю. В коде, который я привел, пользователю выдавался стандартный диалог печати - с выбором принтера, количества копий и т.п., но сам word при это не показывался и не мелькал. Если в процессе конвертации от пользователя ничего не требуется, то не нужно ему ничего кроме конечно результата показывать (от этого еще и скорость работы улучшается). Конечно, если у Вас там что-то очень сложное, то запускайте какой-нить информативный прогрессбар, чтобы люди не скучали
 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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