Тема: Использование интерфейса при построении отчетов

День добрый.
Работаем с TDMS 2.0.199 и интерфейсом для MS Word 2003 версии 2.1

Возникла необходимость сформировать и вывести на печать файл.
Принцип действия такой: Пользователь выбирает объект, по которому будет строиться файл-отчет, и в контекстном меню данного объекта выбирает команду "Распечатать отчёт".
Эта команда копирует данные из указанного объекта в другой объект-отчёт и запукает скрипт в этом объекте.
В объекте-отчёте имеется файл типа MS Word в который вставлены поля этого же объекта через вышеуказанный интерфейс.
Так же в файле содержатся дополнительные макросы по форматированию документа и установке параметров печати.

Необходимо открыть Word, запустить макросы, отправить на печать файл, закрыть файл.
Вот тут и возникает проблема. Это скрипт, который запускается в объекте отчёт:

    Set vWord = CreateObject("Word.Application")
    vWord.Visible = True
    
    vFullFileName = ThisObject.WorkFolder + "\" + ThisObject.Files(0).FileName
    ThisObject.Files(0).CheckOut( vFullFileName)
    
    vWord.Documents.Open vFullFileName, , True

    vPrinter = vWord.Application.Run("SelectPrinter")
    vWord.Application.Run "SetAttributes"
    
    vOldPrinter = vWord.ActivePrinter
    vWord.Application.Run "SetPageParam", vPrinter
    vWord.PrintOut False
    vWord.ActivePrinter = vOldPrinter
    vWord.Quit False

Где SetAttributes, SetPageParam, SelectPrinter - макросы.
Всё отрабатывает за исключением того что, поля документа не обновляются. Если в указанном коде закоментировать закрытие Ворда и в открывшемся окне Ворда в главном меню выбрать TDMS -> Обновтить данные из TDMS, возникает ошибка Object required.
При выборе в меню TDMS -> Сохранить в TDMS - ошибка Object variable or With block variable not set.

Я так понимаю Word не подхватил какому объекту принадлежит файл? Какое решение проблемы предложите?

Re: Использование интерфейса при построении отчетов

Почему то после вставки, у меня, текст скрипта в окне отображается не полностью, так что вот он ниже, на всякий случай:

    Set vWord = CreateObject("Word.Application")
    vWord.Visible = True
   
    vFullFileName = ThisObject.WorkFolder + "\" + ThisObject.Files(0).FileName
    ThisObject.Files(0).CheckOut( vFullFileName)
   
    vWord.Documents.Open vFullFileName, , True

    vPrinter = vWord.Application.Run("SelectPrinter")
    vWord.Application.Run "SetAttributes"
   
    vOldPrinter = vWord.ActivePrinter
    vWord.Application.Run "SetPageParam", vPrinter
    vWord.PrintOut False
    vWord.ActivePrinter = vOldPrinter
    vWord.Quit False

Re: Использование интерфейса при построении отчетов

Посмотрел скрипт и Ваше решение. Версия интерфейсов, вероятно, всё же 2.10, а не 2.1  :)

Ваше объяснение ошибок недалеко от истины. Когда приложение "поднимается" таким образом, чаще всего не происходит обработка его startup-событий. Ну и возможны ошибки с блокировками файла, его путём (что менее вероятно, но возможно) и т.п.

Я предлагаю следующее решение:
Вы добавляете команду типа "редактирование" и вызываете её через ExecuteCommand в начале кода скрипта. Далее Вы GetObject уже открытого приложения и вызываете его макрос UpdateDataFromTDMS для явного обновления данных через уже запущенный интерфейс. Далее выполняете свои макросы из файла. После чего лучше корректно завершить работу вызовом SaveAndCloseInTDMS.

Когда получится - Ваш макрос можно будет включить как некое типовое решение для "двушки"  :)

Re: Использование интерфейса при построении отчетов

Действительно, при вызове Word.Application скрипт StartUp MSWord  не отрабатывает.

Я бы посоветовал попробовать его запустить непосредственно из скрипта TDMS - думаю, что покопавшись, это несложно сделать.

P.S. PolyMorph, а как поведёт себя GetObject, если открыто несколько приложений MsWord?

Re: Использование интерфейса при построении отчетов

PolyMorph пишет:

Я предлагаю следующее решение:
Вы добавляете команду типа "редактирование" и вызываете её через ExecuteCommand в начале кода скрипта. Далее Вы GetObject уже открытого приложения и вызываете его макрос UpdateDataFromTDMS для явного обновления данных через уже запущенный интерфейс. Далее выполняете свои макросы из файла. После чего лучше корректно завершить работу вызовом SaveAndCloseInTDMS.

Как вариант можно сделать и так конечно, но после GetObject прийдется перебрать все открытые документы и найти по имени нужный.

Попробую, но все же хочется попробовать и второй вариант:

Действительно, при вызове Word.Application скрипт StartUp MSWord не отрабатывает.
Я бы посоветовал попробовать его запустить непосредственно из скрипта TDMS - думаю, что покопавшись, это несложно сделать.

Вот тут, если можно, поподробнее:  Что за скрипт и где его вызывать, в интерфейсе я такого скрипта не нашел.

Re: Использование интерфейса при построении отчетов

Как-то даже неловко нажимать кнопку "Быстрый ответ"   :)

Рекомендую для работы с третьей версией обновить шаблон до приложенного.

Дальнейшее решение таково:
1. Создать команду на редактирование файлов Word:
Использование интерфейса при построении отчетов

2. Изменить код на следующий:

ThisApplication.ExecuteCommand "CMD00006407", ThisObject

Set vWord = GetObject(, "Word.Application")
vWord.Application.Run "InitDoc"
vWord.Application.Run "UpdateDataFromTDMS"

' распечатка и т.п.

' можно вызвать vWord.Application.Run "SaveAndCloseInTDMS"
vWord.Quit False

Таким образом всё получается. Удачи!

Post's attachments

TDMS.rar 157.52 Кб, 39 скачиваний с 2008-08-29 

You don't have the permssions to download the attachments of this post.