CftClub.ru
Клуб специалистов ЦФТ-Банк

Как можно передать OLE-переменную, из клиент-скрипта?

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
СообщениеСр Июл 25, 2012 21:45    Ответить с цитатой
Полезность: Нет оценки
делалось такое и через ворд, и через ексель

тема тут http://www.cftclub.ru/viewtopic.php?t=1431&highlight=%EF%EE%F2%EE%EA%EE%EC
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru