Глава 7. Создание форм MS Word для отображения и печати объектов


Основные сведения

В ONTARIO1 предусмотрен гибкий механизм создания и настройки выходных форм с использованием стандартных средств MS Office и SQL. Формы для экспорта и печати являются стандартными документами MS Word 97, которые имеют именованные поля, заполняемые системой при вызове метода объекта <Экспорт формы в MS Word> или <Печать формы через MS Word>, соответственно. Создание форм не требует программирования новых классов и сводится только к разработке форм документа средствами MS Word и написанию SQL-процедур, заполняющих поля формы.

Для создания формы и последующего использования ее в системе необходимо выполнить следующие основные этапы:

Создание формы документа MS Word

Для рекомендуемого упорядоченного хранения объектов, связанных с формами экспорта, в папке <Система> существует папка <Формы экспорта в MS Word> и вложенные в нее папки <Файлы форм экспорта в MS Word> и <Процедуры экспорта в MS Word> для хранения файлов и процедур экспорта, соответственно. Создание формы документа средствами MS Word. Форма документа в системе является объектом класса <Файл>, который хранится в БД. Такой способ представления формы дает возможность редактировать и форматировать текст
формы по собственному усмотрению в оперативном режиме не прибегая к программированию. Это делает систему вывода стандартизованных фирменных печатных форм наиболее гибкой для конечного заказчика и пользователя.

Для создания новой формы Вы можете использовать, например, следующую последовательность действий.

Запустите MS Word и создайте новый пустой документ. Сохраните документ под именем, соответствующим его назначению, например <Форма приходной накладной.doc>. Теперь можете закрыть Word и создать в ONTARIO System, в папке <Система\Формы экспорта в MS Word\Файлы форм экспорта в MS Word> новый объект класса <Файл>. Выберете режим создания на основе существующего файла и сохраните только что созданный файл в базе данных.

create_new_msword_formfile.jpg (19798 bytes)

Рис. 1. Создание файла формы на основе существующего

Теперь Вы можете двойным щелчком мыши запустить файл на редактирование и начать заполнение формы, использую средства MS Word. Форма документа состоит из элементов статического текста и заполняемых системой на основе формируемых процедурой значений
текстовых полей и таблиц. Для создания полей активируйте панель инструментов <Формы>. Статический тест не изменяется в процессе заполнении полей формы системой. Это различные постоянные печатные атрибуты документа, например, <НАКЛАДНАЯ> или <место
печати>. Значения текстовых полей являются переменными величинами, заполняемыми системой. Для их создания в документе нажмите кнопку <Текстовое поле> панели <Формы> и поместите поле в документ.

edit_new_msword_formfile.jpg (8070 bytes)

Рис. 2. Пример создания заполняемых полей в документе

Далее, двойным щелчком мыши запустите редактирование свойств текстового поля и заполните <Текст по умолчанию> предполагаемым именем (идентификатором) переменной, значение которой в дальнейшем будет сформировано SQL-процедурой и помещено в это поле
системой. Имя должно описываться символами латинского алфавита, допускается применение цифр и символа подчеркивания. Например, поле, заполняемое номером документа может называться <DocNo>.

text_field_parameters.jpg (19364 bytes)

Рис. 3. Определение имени переменной заполняемого поля

Таким образом, можно сформировать все поля документа, которые необходимо заполнять при экспорте и печати через MS Word. В качестве примера рассмотрите любой из прилагаемых файлов в установочном комплекте ONTARIO System 1. Документ может содержать в своем составе одну и более таблиц, заполнение которых также производится системой при экспорте данных. Для этого создайте таблицу с нужным
количеством столбцов (колонок) и двумя строками средствами Word и разместите ее в нужном месте документа. В первой строке таблицы разместите текст заголовков и назначьте строку заголовками таблицы. Вторую строку следует оставить пустой - именно эта область таблицы
будет заполняться данными. Если Вы планируете выводить какие-либо итоги, то создайте третью строку и заполните ее текстом и полями, в которые будут помещены значения итоговых величин. Отформатируйте таблицу по своему усмотрению. На этом создание формы
отображения завершается.

edit_table_msword_formfile.jpg (9445 bytes)

Рис. 4. Пример создания таблицы документа

Создание процедур запроса параметров и формирования полей формы

Процедуры, как правило, являются частью или дополнением к уже существующим серверным частям модулей ONTARIO System 1 и позволяют клиентскому приложению системы сформировать, считать и заполнить поля и таблицы формы отображения MS Word конкретными значениями. Рекомендуется соблюдать соглашение об именованиях процедур и в стиле <Имя класса>_<название экспорта/печати объекта>
Например, стандартная печатная форма накладной может именоваться <TDBOInInv_DefaultExport>.

Процедуры автоматически вызываются ядром системы при инициировании пользователем действий с экспортом/печатью объекта средствами MS Word. В качестве единственного параметра процедуры получают OID этого объекта. Параметры, поля и таблицы, формируемыми процедурами, во время экспорта формы располагаются в буферных таблицах WFFields и WFTables, откуда они считываются клиентским
приложением или могут быть извлечены процедурой формирования в случае предварительного запроса параметров.

Процедура формирования полей

Процедура должна сформировать для клиентского приложения набор переменных (полей), значения которых будут в соответствии с их именами и именами полей документа выведены в форме отображения MS Word. Для формирования полей и таблиц определен следующий интерфейс API:

create procedure TDBOWordForm_AddField
  @Name varchar( 32 ),
  @VType int = null,
  @Caption varchar( 128 ) = null,
  @Format varchar( 255 ) = "",
  @IntVal int = null,
  @StrVal varchar( 255 ) = null,
  @FloatVal float = null,
  @MoneyVal money = null,
  @DateVal datetime = null

Создает новое поле с именем @Name, которое должно совпадать с одним из полей ранее созданного документа-формы MS Word. Необходимо задать имя поля @Name, а также одно из значений @<тип>Val. Тип значения @VType можно не указывать, он определяется на основе
значений @<тип>Val. Подробнее типы полей описаны ниже в таблице 1. Параметр @Format задает формат отображения значения поля в документе. Подробнее описание форматов приведено в Приложении 3. Параметр @Caption не используется.

create procedure TDBOWordForm_AddTable
  @TableName varchar( 32 ),
  @TableNo int,
  @Caption varchar( 128 ) = null

Определяет таблицу для экспорта данных. Название @TableName необходимо только для дальнейшего формирования ячеек таблицы и не связано с именем какого-либо поля в документе Word. Номер таблицы @TableNo определяет порядковый номер таблицы, с которой
она связана в документе Word. Нумерация может быть произвольной, например, начиная с 1. Параметр @Caption не используется.

create procedure TDBOWordForm_AddCell
  @Name varchar( 32 ),
  @Col int = null,
  @Row int = null,
  @Format varchar( 255 ) = "",
  @IntVal int = null,
  @StrVal varchar( 255 ) = null,
  @FloatVal float = null,
  @MoneyVal money = null,
  @DateVal datetime = null

Добавляет в таблицу ячейку с координатами @Col-номер колонки (начиная с 1) и @Row-номер строки (начиная с 1). Остальные параметры заполняются так же, как и при создании поля процедурой TDBOWordForm_AddField.

Значения полей отображения формы. Табл. 1.

Значение @VType

Тип параметра

Поле хранения в таблице WFFields

Примечание

0 целое IntVal В @Format может быть указана маска формата (*)
1 строка StrVal
2 число FloatVal В @Format может быть указана маска формата (*)
3 деньги MoneyVal В @Format может быть указана маска формата (*)
4 дата DateVal

(*) - описание форматов приводится в Приложении 3

Пример процедуры формирования приходной накладной:

create procedure TDBOInInv_DefaultExport
  @OID int
as
declare @CIntVal int,
        @CStrVal varchar( 255 ),
        @CFloatVal float,
        @CMoneyVal money,
        @CDateVal datetime,
        @CCol int,
        @CRow int,
        @Subj1ID int,
        @FirmID int,
        @CurrFmt varchar( 128 )

select @CStrVal = SourceDoc from Docs where DocID = @OID
execute TDBOWordForm_AddField @Name = "DocNo", @StrVal = @CStrVal

select @CDateVal = CreationDate from Objs where OID = @OID
execute TDBOWordForm_AddField @Name = "DocDate", @DateVal = @CDateVal

select @CStrVal = Name from Objs O, Docs D where D.DocID = @OID and O.OID = D.Subj1ID
execute TDBOWordForm_AddField @Name = "Store1", @StrVal = @CStrVal

select @CStrVal = Adress from Subjects S, Docs D where D.DocID = @OID and S.SubjectID =
D.Subj1ID
execute TDBOWordForm_AddField @Name = "Address1", @StrVal = @CStrVal

select @Subj1ID = Subj1ID from Docs where DocID = @OID
execute TDBOStore_GetHighestOwner @Subj1ID, @FirmID output
select @CStrVal = Name from Objs where OID = @FirmID
execute TDBOWordForm_AddField @Name = "Subj1", @StrVal = @CStrVal

select @CStrVal = Name from Objs O, Docs D where D.DocID = @OID and O.OID = D.Subj2ID
execute TDBOWordForm_AddField @Name = "Subj2", @StrVal = @CStrVal
select @CStrVal = Adress from Subjects S, Docs D where D.DocID = @OID and S.SubjectID =
D.Subj2ID
execute TDBOWordForm_AddField @Name = "Address2", @StrVal = @CStrVal

select @CStrVal = isnull( Comment, "" ) from Docs where DocID = @OID
execute TDBOWordForm_AddField @Name = "Comment", @StrVal = @CStrVal

select @CurrFmt = C.DisplayFormat
  from Currency C,
       Docs D
  where D.DocID = @OID and
        C.CurrencyID = D.CurrencyID

/* формируем состав накладной */
execute TDBOWordForm_AddTable "Contents", 1
declare CPos insensitive cursor for
  select PosNo = D2T.No,
         PosName = O.Name + char( 13 ) + O.Ext,
         MeasureName = O1.Ext,
         PosAmount = D2T.Amount,
         AmountFmt = M.DisplayFormat,
         PosPrice = D2T.PriceTotal,
         PosSummNDS = D2T.SummTotal
    from Doc2Thing D2T ( index = 1 ),
         Objs O ( index = 1 ),
         Objs O1 ( index = 1 ),
         Measure M ( index = 1 )
    where D2T.DocID = @OID and
          D2T.ThingID = O.OID and
          D2T.MeasureID = O1.OID and
          M.MeasureID = D2T.MeasureID
    order by PosNo
open CPos

declare @PosNo int,
        @PosName varchar( 255 ),
        @MeasureName varchar( 255 ),
        @PosAmount float,
        @PosPrice money,
        @PosSummNDS money,
        @SummTotal money,
        @AmountTotal float,
        @AmountFmt varchar( 128 )

select @CRow = 0,
       @SummTotal = $0,
       @AmountTotal = 0.0
fetch next from CPos into @PosNo, @PosName, @MeasureName, @PosAmount, @AmountFmt, @PosPrice, @PosSummNDS
while ( @@fetch_status != -1 ) begin
  select @CRow = @CRow + 1,
         @SummTotal = @SummTotal + @PosSummNDS,
         @AmountTotal = @AmountTotal + @PosAmount
  select @CCol = 1
  execute TDBOWordForm_AddCell @Name = "Contents", @Col = @CCol, @Row = @CRow, @IntVal = @CRow
  select @CCol = @CCol + 1
  execute TDBOWordForm_AddCell @Name = "Contents", @Col = @CCol, @Row = @CRow, @StrVal = @PosName
  select @CCol = @CCol + 1
  execute TDBOWordForm_AddCell @Name = "Contents", @Col = @CCol, @Row = @CRow, @StrVal = @MeasureName
  select @CCol = @CCol + 1
  execute TDBOWordForm_AddCell @Name = "Contents", @Col = @CCol, @Row = @CRow, @FloatVal = @PosAmount, @Format = @AmountFmt
  select @CCol = @CCol + 1
  execute TDBOWordForm_AddCell @Name = "Contents", @Col = @CCol, @Row = @CRow, @MoneyVal = @PosPrice, @Format = @CurrFmt
  select @CCol = @CCol + 1
  execute TDBOWordForm_AddCell @Name = "Contents", @Col = @CCol, @Row = @CRow, @FloatVal = @PosSummNDS, @Format = @CurrFmt
  fetch next from CPos into @PosNo, @PosName, @MeasureName, @PosAmount, @AmountFmt, @PosPrice, @PosSummNDS
end
deallocate CPos

execute TDBOWordForm_AddField @Name = "AmountTotal", @FloatVal = @AmountTotal
execute TDBOWordForm_AddField @Name = "SummTotal", @MoneyVal = @SummTotal, @Format = @CurrFmt

declare @RUSCurrFmt varchar( 128 )
select @RUSCurrFmt = "RUS" + @CurrFmt
execute TDBOWordForm_AddField @Name = "SummTotalCapital", @MoneyVal = @SummTotal, @Format = @RUSCurrFmt

select @CMoneyVal = isnull( ( select sum( D2X.TaxSumm )
                                from Doc2Tax D2X ( nolock index = 1 ),
                                     SFolders S
                                where D2X.DocID = @OID and
                                      D2X.TaxID = S.SFID and
                                      S.SFName = "NDS"
                           ), $0 )
execute TDBOWordForm_AddField @Name = "NDSTotal", @MoneyVal = @CMoneyVal, @Format = @CurrFmt
go

Процедура запроса параметров

Эта процедура используется для запроса некоторых параметров, необходимых для дальнейшего заполнения полей формы. Например, это может быть выбор расчетного счета заказчика из нескольких, ввод даты и др. Если дополнительных параметров для заполнения формы не требуется, то процедура не создается.
Процедура запроса параметров имеет такое же название, как и процедура формирования полей, но с символом подчеркивания <_> в конце. Процедура формирует параметры, которые клиентское приложение выводит в стандартном модальном диалоговом окне <ОК-Отмена>. Порядок создания параметров в процедуре явно определяет порядок их вывода в диалоге.

Для формирования параметров определен следующий интерфейс API:

create procedure TDBOWordForm_AddParam
  @Name varchar( 32 ),
  @VType int = null,
  @Caption varchar( 128 ) = null,
  @Format varchar( 255 ) = "",
  @IntVal int = null,
  @StrVal varchar( 255 ) = null,
  @FloatVal float = null,
  @MoneyVal money = null,
  @DateVal datetime = null

Создает новый параметр с именем @Name. Необходимо указать одно из значений @<тип>Val. Для параметров, отображаемых списком (Combo Box) или объектом необходимо явно указывать тип @VType. Параметр @Caption определяет смысловой текст, который выводится перед полем, например <Дата закрытия> перед полем типа <дата>.

Значения полей отображения формы. Табл. 2.

Значение @VType

Тип параметра

Поле хранения в таблице WFFields

Примечание

0 целое IntVal В @Format может быть указана маска формата (*)
1 строка StrVal
2 число FloatVal В @Format может быть указана маска формата (*)
3 деньги MoneyVal В @Format может быть указана маска формата (*)
4 дата DateVal
5 ID объекта IntVal Не имеет практического применения из-за модальности диалога заполнения параметров и может использоваться только в качестве поля отображения информации
6 выпадающий список значений (Combo Box) IntVal в @StrVal – названия пунктов списка через запятую или точку с запятой;
в IntVal – номер пункта “по умолчанию”, начиная от нуля;
возвращает: номер выбранного пункта в IntVal, текст выбранного пункта – в StrVal

(*) - описание форматов приводится в Приложении 3

После закрытия диалогового окна по <ОК>, обновленные значения параметров записываются обратно в таблицу WFFields, где их может считать и проанализировать процедура формирования полей. Для извлечения введенных пользователем значений параметров используется стандартный запрос вида:

select @Variable = <тип>Val
  from WFFields
  where Name = <имя параметра> and SPID = @@SPID and PType = 0

Пример процедуры запроса параметров всех типов:

create procedure TDBOMyClass_Export_
  @OID int
as
declare @CIntVal int,
        @CStrVal varchar( 255 ),
        @CFloatVal float,
        @CMoneyVal money,
        @CDateVal datetime

select @CIntVal = 777
execute TDBOWordForm_AddParam @Name = "IntVal", @IntVal = @CIntVal, @Caption = "Целое"
select @CStrVal = SourceDoc from Docs where DocID = @OID
execute TDBOWordForm_AddParam @Name = "StrVal", @StrVal = @CStrVal, @Caption = "Строка"
select @CFloatVal = 777.777
execute TDBOWordForm_AddParam @Name = "FloatVal", @FloatVal = @CFloatVal, @Caption = "Вещественное"
select @CMoneyVal = $777.77
execute TDBOWordForm_AddParam @Name = "MoneyVal", @MoneyVal = @CMoneyVal, @Caption = "Валюта"
select @CDateVal = CreationDate from Objs where OID = @OID
execute TDBOWordForm_AddParam @Name = "DateVal", @DateVal = @CDateVal, @Caption = "Дата"
select @CFloatVal = 777.777
execute TDBOWordForm_AddParam @Name = "FloatFmtVal", @FloatVal = @CFloatVal,

                              @Caption = "Вещественное в формате #.##", @Format = "#.##"
select @CIntVal = @OID
execute TDBOWordForm_AddParam @Name = "OIDVal", @VType = 5, @IntVal = @CIntVal, @Caption = "Объект"
execute TDBOWordForm_AddParam @Name = "List", @VType = 6,
                              @StrVal = "первый,второй,третий", @IntVal = 1, @Caption = "Список"
go

После создания процедуры, необходимо также создать в системе соответствующий ей объект класса <Процедура> в папке <Система\Формы экспорта в MS Word\Процедуры экспорта в MS Word>.

create_new_formprocedure.jpg (10132 bytes)

Рис. 5. Пример создания объекта, соответствующего процедуре экспорта

Создание объекта <Форма экспорта> в системе

В папке <Система\Формы экспорта в MS Word> создайте новый объект класса <Форма экспорта>. Заполните его поля соответствующими объектами: файлом документа и процедурой экспорта, после чего сохраните. В дальнейшем все эти параметры можно будет изменить при
редактировании созданного объекта.

new_formexport_as_object.jpg (12763 bytes)

Рис. 6. Создание объекта класса <Форма экспорта>

Привязка созданных объектов <Форма экспорта> к классам объектов

Перейдите в папку <Классы> и выберите класс объекта, с которым Вы собираетесь связать существующую форму экспорта. Таких форм может быть несколько. Для этого выберете из контекстного меню операцию <Установка форм экспорта в MS Word>.

bind_form_with_class.jpg (16155 bytes)

Рис. 7. Привязка к классам объектов <Форма экспорта>

При выборе операции <Экспорт формы просмотра в MS Word> или <Печать формы из MS Word> из контекстного меню объекта этого класса будет произведен экспорт или печать данного объекта. Если к классу привязано более одной формы, то ее выбор формы будет доступен пользователю из диалогового окна.

choice_form_to_export.jpg (10164 bytes)

Рис. 8. Выбор формы экспорта

Назначение прав доступа пользователей к формам экспорта

Для того, чтобы пользователь мог воспользоваться имеющимися в системе формами экспорта при попытке экспортировать или распечатать объект средствами MS Word, необходимо задать пользователям или группам права доступа <на чтение> для соответствующих объектов класса <Форма экспорта>.

setting_up_form_permissions.jpg (19201 bytes)

Рис. 9. Установка прав доступа для форм экспорта

При этом следует помнить, что изначально пользователи не имеют никаких прав на создаваемые в системе формы. Права определяются уже после их создания политикой безопасности, проводимой системным администратором.

Разграничение прав доступа к формам экспорта позволяет также для одних и тех же классов объектов разным пользователям назначать разные формы печати. Так, например, кладовщик может распечатать стандартную форму накладной, в то время как бухгалтер будет использовать форму с выделенным НДС. При этом они будут иметь представление о том, что у документа есть только одна форма печати, соответствующая специфике их работы.


Содержание Глоссарий Предыдущая Следующая