Как можно передать OLE-переменную, из клиент-скрипта?
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
mx12345678 Участник
Вступление в Клуб: 30.01.2012
|
Ср Июл 25, 2012 14:55  Как можно передать OLE-переменную, из клиент-скрипта? |
|
Полезность: Нет оценки
|
Как можно передать OLE-переменную, инициализирующуюся в клиент-скрипте, содержащую объект Word.Application, между несколькими вызовами одной и той же операции?
Дело в том, что функция в Клиент-скрипте
OpenWordDoc(WrdApp, WrdDoc, GetData("REPORTFILE"))
открывает новый объект Word.Application, если ей не передать в параметре WrdApp, сссылку на уже ранее созданный объект приложения Word (Set WrdApp = CreateObject("Word.Application")).
Из-за этого каждый новый документ заявления, создается в своем отдельном Word.Application, и нельзя распечатать все документы с помощью макроса, печатающего все открытые документы.
Код: | Sub Печатать_все_открытые_документы()
For Each aDoc In Documents
aDoc.PrintOut
aDoc.Close SaveChanges:=wdDoNotSaveChanges
Next
End Sub |
Нам нужно срочно распечатать несколько сотен заявлений на выдачу основной карты.
Одно заявление можно распечатать с помощью операции Карты - > Печать в WORD (Alt+W).
Разрабатывать свой новый отчет, выводящий несколько заявлений сразу, в один файл, времени нет.
В ЦФТ есть операция Продукты -> Списочная печать (Ctrl+Shift+W), но в нашей версии она не работает.
Сейчас я переделал операцию Печать в WORD, убрав появление окна, чтобы можно было выделив несколько экземпляров, сразу получить несколько документов в Word.
Но возникла проблема в том, что каждый документ открывается в новом приложении Word.
Или может кто-нибудь подскажет другой подход? |
|
 |
Alexsey Эксперт
Вступление в Клуб: 06.09.2007
|
Ср Июл 25, 2012 15:28  Re: Как можно передать OLE-переменную, из клиент-скрипта? |
|
Полезность: Нет оценки
|
mx12345678 пишет: | Как можно передать OLE-переменную, инициализирующуюся в клиент-скрипте, содержащую объект Word.Application, между несколькими вызовами одной и той же операции?
Дело в том, что функция в Клиент-скрипте
OpenWordDoc(WrdApp, WrdDoc, GetData("REPORTFILE"))
открывает новый объект Word.Application, если ей не передать в параметре WrdApp, сссылку на уже ранее созданный объект приложения Word (Set WrdApp = CreateObject("Word.Application")).
Из-за этого каждый новый документ заявления, создается в своем отдельном Word.Application, и нельзя распечатать все документы с помощью макроса, печатающего все открытые документы.
Код: | Sub Печатать_все_открытые_документы()
For Each aDoc In Documents
aDoc.PrintOut
aDoc.Close SaveChanges:=wdDoNotSaveChanges
Next
End Sub |
Нам нужно срочно распечатать несколько сотен заявлений на выдачу основной карты.
Одно заявление можно распечатать с помощью операции Карты - > Печать в WORD (Alt+W).
Разрабатывать свой новый отчет, выводящий несколько заявлений сразу, в один файл, времени нет.
В ЦФТ есть операция Продукты -> Списочная печать (Ctrl+Shift+W), но в нашей версии она не работает.
Сейчас я переделал операцию Печать в WORD, убрав появление окна, чтобы можно было выделив несколько экземпляров, сразу получить несколько документов в Word.
Но возникла проблема в том, что каждый документ открывается в новом приложении Word.
Или может кто-нибудь подскажет другой подход? |
В свое время делали нечто подобное. Списочная операция.
клиент скрипт:
Код: | '#include ::[RUNTIME].[MSWORD_SCRIPT]
sub FillTable(WrdDoc, CurDateStr)
...заполняем контент документа
end sub
sub CreateOrders(WrdApp, WrdDoc)
WrdApp.Selection.WholeStory 'выделить весь документ
WrdApp.Selection.Copy 'скопировать выделенное
WrdApp.Selection.MoveRight 2,1 'встать в конец выделенной области
count = CInt(GetData("COUNT"))
TableNum=1 'Начать с первой таблицы
for i=1 to count'Цикл по номерам клиента
Client = GetData("Client"&i)
Account = GetData("ACCOUNT"&i)
Summ = GetData("SUM"&i)
if Account<>"" then 'есть открытый счет у клиента
if i>1 then
WrdApp.Selection.InsertBreak 1 'вставить разрыв страницы
WrdApp.Selection.Paste 'Вставить из ClipBoard
end if
Set T = WrdDoc.Tables(TableNum)
T.Cell(2, 3).Range.Text = Client
T.Cell(2, 4).Range.Text = Account
T.Cell(2, 5).Range.Text = Summ
TableNum = TableNum + 1
end if
next
end sub
Public Function Main(LastControl)
On Error Resume Next
if LastControl is OK then
if not OpenWordDoc( WrdApp, WrdDoc, GetData("REPORTFILE")) then
MsgBox("Невозможно открыть шаблон!")
Main = False
Exit Function
end if
FillTable WrdDoc, GetData("CurDate") 'Заполнить все одинакоые данные
call SetBracketsFields(WrdApp, WrdDoc, "CurDate") 'Записать текущую дату
CreateOrders WrdApp, WrdDoc 'Заполнить все распоряжения
WrdApp.Selection.WholeStory 'выделить весь документ
WrdApp.Selection.MoveLeft 2,1 'встать в начало
Call SetWordVisible(WrdApp,WrdDoc)
End If
Main = True ' Результирующее значение валидатора (True или False)
End Function
|
_________________ всегда есть как минимум 2 выхода |
|
 |
maestro Профи
Вступление в Клуб: 12.10.2010
|
Ср Июл 25, 2012 15:54  Re: Как можно передать OLE-переменную, из клиент-скрипта? |
|
Полезность: Нет оценки
|
mx12345678 пишет: |
Но возникла проблема в том, что каждый документ открывается в новом приложении Word.
Или может кто-нибудь подскажет другой подход? |
Другие подходы:
1. Генерация отчета в формате HTML с F1 XSLT-преобразования. (Для тех, кто знаком с XSLT наваять отчетную форму - это 5 сек. Но если не знаком, а сделать надо быстро - то лучше не иди этим путем, т.к. можно утонуть).
2. Слияние. См. тут:http://www.cftclub.ru/viewtopic.php?t=1431&highlight=%D1%EB%E8%FF%ED%E8%E5 |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|