                     |
4 June, 2000
Владимир Трухин
ведущий инженер-программист
ОАО "Воткинская ГЭС"
Fax: +7 (34241) 63297
E-mail: vlt@gesvt.permenergo.ru
vlt@votges.ru
Создание
отчёта в формате MS Word.
Красивый и
наглядный отчёт это здорово,
но ещё лучше – это красивый и
наглядный отчёт, который можно
сохранить в файл для
последующего редактирования.
Проблема
Каждый,
кто использует Visual FoxPro,
несомненно, использует его мощные
средства для создания отчётов.
Отчёт можно вывести на экран,
принтер и даже в файл без особого
труда.
Однако
существует небольшая проблема.
При выводе отчёта в файл теряется
форматирование, которое
применялось для придания отчёту
наглядности и расстановки
акцентов.
Для
решения этой проблемы можно
привлечь механизм OLE Automation. В
качестве OLE сервера прекрасно
подойдёт MS Word. Всё бы хорошо, но в
этом случае придётся написать
изрядное количество кода, чтобы
запрограммировать внешний вид
отчёта. А сколько надо будет
положить труда, чтобы выполнить
какие-либо изменения в этом
отчёте.
Решение
Значительно
упростить процесс создания
такого отчёта возможно при
условии, что механизм OLE Automation
будет применяться не ко всему
отчёту, а только к той его части,
которая содержит данные.
Внешний
вид отчёта, включая расположение
и форматирование элементов,
создаётся как документ MS Word
средствами самого MS Word. Таким
образом, специальные поля,
представляющие собой выражения
Visual FoxPro, могут быть вставлены в
тело документа. Начало и конец
поля ограничиваются специальными
предопределёнными символами.
В
результате получается некоторый
шаблон отчёта. Приложение,
написанное на Visual FoxPro, используя
OLE Automation, должно открыть файл
этого шаблона, найти поля с
выражениями и заместить поля
шаблона результатами вычисления
выражений. Поскольку все поля
данных – это выражения Visual FoxPro, то
использование механизма OLE можно
свести к созданию одного класса,
управляющего шаблоном и
создающего файл отчёта.
Таким
образом, Устраняются оба
недостатка: отпадает
необходимость в написании
длинного кода и у пользователя
появляется возможность свободно
модифицировать внешний вид
отчёта, включая порядок
расположения полей. С другой
стороны, пользователь может
добавлять в отчёт собственные
поля, содержащие корректные
выражения Visual FoxPro.
Структура
класса, который будет управлять
отчётом, может выглядеть
следующим образом:
Определение
класса WordReport:
**************************************************
*-- Class:
WordReport
*-- ParentClass: Custom
*-- BaseClass: Custom
DEFINE CLASS WordReport AS custom
Name = "WordReport"
*--
Имя файла шаблона
TemplateFile = ''
*--
Имя файла отчёта
ReportFile = ''
*-- объект приложения MS Word
PROTECTED WordApplication
*--
объект документа MS Word
PROTECTED WordDocument
*--
Ссылка на объект приложения MS
Word
Reference = .F.
*--
Создание документа из шаблона
PROCEDURE create
LOCAL loApp, loDoc
loApp=this.WordApplication
loDoc=this.WordDocument
loDoc.SaveAs(this.ReportFile)
local lcFoundText, lcCommand
loApp.Selection.Find.Execute('\<*\>',,,.T.,,,.T.,1)
lcFoundText=loApp.Selection.Text
DO WHILE
SUBSTR(lcFoundText,1,1)='<' AND ;
SUBSTR(lcFoundText,LEN(lcFoundText),1)='>'
lcCommand=loApp.Selection.Text
lcCommand=SUBSTR(lcCommand,1,LEN(lcCommand)-1)
lcCommand=SUBSTR(lcCommand,2)
loApp.Selection.Text=EVALUATE(lcCommand)
loApp.Selection.Find.Execute('\<*\>',,,.T.,,,.T.,1)
lcFoundText=loApp.Selection.Text
ENDDO
loDoc.Save()
ENDPROC
*--
Показать окно MS Word
PROCEDURE show
LPARAMETERS nStyle
LOCAL loApp
loApp=this.WordApplication
loApp.Visible=.T.
ENDPROC
*--
Спрятать окно MS Word
PROCEDURE hide
LOCAL loApp
loApp=this.WordApplication
loApp.Visible=.F.
ENDPROC
*--
Печатать отчёт
PROCEDURE print
LPARAMETERS cText
LOCAL loApp
loApp=this.WordApplication
IF loApp.Visible
loApp.Dialogs(88).Show()
ELSE
this.Show()
loApp.Dialogs(88).Show()
this.Hide()
ENDIF
ENDPROC
PROCEDURE
reference_access
RETURN THIS.WordApplication
ENDPROC
PROCEDURE
reference_assign
LPARAMETERS vNewVal
ENDPROC
PROCEDURE
Init
LPARAMETERS lcTempaleName,
lcReportName
this.TemplateFile=lcTempaleName
this.ReportFile=lcReportName
this.WordApplication=CREATEOBJECT('Word.Application')
LOCAL loApp
loApp=this.WordApplication
this.WordDocument=loApp.Documents.Open(this.TemplateFile)
ENDPROC
PROCEDURE
Destroy
LOCAL loApp
loApp=this.WordApplication
loApp.Quit()
ENDPROC
ENDDEFINE
*
*-- EndDefine: WordReport
**************************************************
Пример
Это
пример создания отчёта с полями,
содержащими переменные и функции,
определяемые в приложении:
Выражения
date()
– стандартная функция Visual FoxPro,
возвращающая текущую дату
GetEmployeeList()
– функция
определённая пользователем,
формирующая список сотрудников
из набора записей в таблице “EMPLLIST.DBF”.
gcFoot
– переменная определённая
пользователем. Формирует строку
для подписи отчёта.
Файл
шаблона отчёта
Employees
List
<date()>
<gcFoot>
|
Использование класса WordReport
PROCEDURE MAIN
LOCAL lcTemplate, lcReport
* To set the file of the template
lcTemplate='EmplTamp.doc'
* To set the file of the report
lcReport='EmployeeList.doc'
* To define a variable for a signature of the
report
PUBLIC gcFoot
* To assign a value
gcFoot='This list includes the employees, '+;
'which help the customers to cope with their
problems.'+;
CHR(13)+CHR(13)+;
'David Lickin,'+CHR(13)+;
'Personnel Manager'
* To construct the report
LOCAL loReport
loReport=CREATEOBJECT('WordReport',
lcTemplate, lcReport)
loReport.Show()
loReport.Create()
* To print the report
loReport.Print()
loReport.Hide()
DO WHILE MESSAGEBOX('Print is complete?',;
4+32+256,;
'WordReport Class')=7
ENDDO
RETURN
* Function of records processing of the table
'EMPLLIST.DBF'
FUNCTION GetEmployeeList()
* To verify existence of the table file
IF !FILE('EMPLLIST.DBF')
RETURN 'There is no file EMPLLIST.DBF'
ELSE
* To open the table
USE ('EMPLLIST.DBF') IN 0 SHARED ALIAS
EMPLLIST
ENDIF
IF !USED('EMPLLIST')
RETURN 'The list is inaccessible'
ENDIF
LOCAL lcList
lcList=''
* To generate string(line) of the employees
list
DO WHILE !EOF('EMPLLIST')
lcList= lcList+;
PADR(ALLT(empllist.FIRST_NAME)+' '+;
ALLT(empllist.LAST_NAME),30,' ')+;
' - '+empllist.TITLE+;
CHR(13)
SKIP IN EMPLLIST
ENDDO
* To delete the last line feed character
lcList=SUBSTR(lcList,1,len(lcList)-1)
* To enclose the table of the list
USE IN EMPLLIST
* To return string of the list in the
processing function
* of the report template
RETURN lcList
Полученный
файл отчёта
Employees
List
06.15.00
- Steven
Buchanan - Sales Manager
- Michael Suyama
- Sales Representative
- Robert King -
Sales Representative
- Laura Callahan
- Inside Sales Coordinator
- Anne Dodsworth
- Sales Representative
- Albert
Hellstern - Business Manager
- Tim Smith -
Mail Clerk
- Caroline
Patterson - Receptionist
- Justin Brid -
Marketing Director
- Xavier Martin
- Marketing Associate
- Laurent
Pereira - Advertising Specialist
- Nancy Davolio
- Applications Developer
- Andrew Fuller
- Entry Clerk
- Janet
Leverling - Applications
Developer
- Margaret
Peacock - Sales Manager
This
list includes the employees,
which help the customers to
cope with their problems.
David Lickin,
Personnel Manager
|
Заключение
Предложенный
способ создания отчёта позволяет
располагать поля с выражениями
Visual FoxPro в документе MS Word,
используя такие элементы
форматирования как таблицы и
вертикальный текст. Возможно
размещение выражения Visual FoxPro в
каждой ячейке таблицы. Можно
найти много других способов
расположения и форматирования
полей. Где бы ни были размещены
поля, они будут замещены данными с
сохранением форматирования,
применённого в шаблоне, после
формирования отчёта.
Другими
словами, предложенная технология
это автоматизация OLE-автоматизации.
Демонстрационный
пример и текст статьи в формате MS
Word (zip-файл,31KB)
Главная
страница | Технологии | Продукция | Материалы | Специалисты | Партнёры
Запись
в Гостевую Книгу |
Просмотр Гостевой Книги
|