В ONTARIO1 предусмотрен гибкий механизм создания и настройки выходных форм с использованием стандартных средств MS Office и SQL. Формы для экспорта и печати являются стандартными документами MS Word 97, которые имеют именованные поля, заполняемые системой при вызове метода объекта <Экспорт формы в MS Word> или <Печать формы через MS Word>, соответственно. Создание форм не требует программирования новых классов и сводится только к разработке форм документа средствами MS Word и написанию SQL-процедур, заполняющих поля формы.
Для создания формы и последующего использования ее в системе необходимо выполнить следующие основные этапы:
Для рекомендуемого упорядоченного хранения
объектов, связанных с формами экспорта, в папке
<Система> существует папка <Формы экспорта в
MS Word> и вложенные в нее папки <Файлы форм
экспорта в MS Word> и <Процедуры экспорта в MS Word>
для хранения файлов и процедур экспорта,
соответственно. Создание формы документа
средствами MS Word. Форма документа в системе
является объектом класса <Файл>, который
хранится в БД. Такой способ представления формы
дает возможность редактировать и форматировать
текст
формы по собственному усмотрению в оперативном
режиме не прибегая к программированию. Это
делает систему вывода стандартизованных
фирменных печатных форм наиболее гибкой для
конечного заказчика и пользователя.
Для создания новой формы Вы можете использовать, например, следующую последовательность действий.
Запустите MS Word и создайте новый пустой документ. Сохраните документ под именем, соответствующим его назначению, например <Форма приходной накладной.doc>. Теперь можете закрыть Word и создать в ONTARIO System, в папке <Система\Формы экспорта в MS Word\Файлы форм экспорта в MS Word> новый объект класса <Файл>. Выберете режим создания на основе существующего файла и сохраните только что созданный файл в базе данных.
Рис. 1. Создание файла формы на основе существующего
Теперь Вы можете двойным щелчком мыши
запустить файл на редактирование и начать
заполнение формы, использую средства MS Word. Форма
документа состоит из элементов статического
текста и заполняемых системой на основе
формируемых процедурой значений
текстовых полей и таблиц. Для создания полей
активируйте панель инструментов <Формы>.
Статический тест не изменяется в процессе
заполнении полей формы системой. Это различные
постоянные печатные атрибуты документа,
например, <НАКЛАДНАЯ> или <место
печати>. Значения текстовых полей являются
переменными величинами, заполняемыми системой.
Для их создания в документе нажмите кнопку
<Текстовое поле> панели <Формы> и поместите
поле в документ.
Рис. 2. Пример создания заполняемых полей в документе
Далее, двойным щелчком мыши запустите
редактирование свойств текстового поля и
заполните <Текст по умолчанию> предполагаемым
именем (идентификатором) переменной, значение
которой в дальнейшем будет сформировано
SQL-процедурой и помещено в это поле
системой. Имя должно описываться символами
латинского алфавита, допускается применение
цифр и символа подчеркивания. Например, поле,
заполняемое номером документа может называться
<DocNo>.
Рис. 3. Определение имени переменной заполняемого поля
Таким образом, можно сформировать все поля
документа, которые необходимо заполнять при
экспорте и печати через MS Word. В качестве примера
рассмотрите любой из прилагаемых файлов в
установочном комплекте ONTARIO System 1. Документ может
содержать в своем составе одну и более таблиц,
заполнение которых также производится системой
при экспорте данных. Для этого создайте таблицу с
нужным
количеством столбцов (колонок) и двумя строками
средствами Word и разместите ее в нужном месте
документа. В первой строке таблицы разместите
текст заголовков и назначьте строку заголовками
таблицы. Вторую строку следует оставить пустой -
именно эта область таблицы
будет заполняться данными. Если Вы планируете
выводить какие-либо итоги, то создайте третью
строку и заполните ее текстом и полями, в которые
будут помещены значения итоговых величин.
Отформатируйте таблицу по своему усмотрению. На
этом создание формы
отображения завершается.
Рис. 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>.
Рис. 5. Пример создания объекта, соответствующего процедуре экспорта
В папке <Система\Формы экспорта в MS Word>
создайте новый объект класса <Форма экспорта>.
Заполните его поля соответствующими объектами:
файлом документа и процедурой экспорта, после
чего сохраните. В дальнейшем все эти параметры
можно будет изменить при
редактировании созданного объекта.
Рис. 6. Создание объекта класса <Форма экспорта>
Перейдите в папку <Классы> и выберите класс объекта, с которым Вы собираетесь связать существующую форму экспорта. Таких форм может быть несколько. Для этого выберете из контекстного меню операцию <Установка форм экспорта в MS Word>.
Рис. 7. Привязка к классам объектов <Форма экспорта>
При выборе операции <Экспорт формы просмотра в MS Word> или <Печать формы из MS Word> из контекстного меню объекта этого класса будет произведен экспорт или печать данного объекта. Если к классу привязано более одной формы, то ее выбор формы будет доступен пользователю из диалогового окна.
Рис. 8. Выбор формы экспорта
Для того, чтобы пользователь мог воспользоваться имеющимися в системе формами экспорта при попытке экспортировать или распечатать объект средствами MS Word, необходимо задать пользователям или группам права доступа <на чтение> для соответствующих объектов класса <Форма экспорта>.
Рис. 9. Установка прав доступа для форм экспорта
При этом следует помнить, что изначально пользователи не имеют никаких прав на создаваемые в системе формы. Права определяются уже после их создания политикой безопасности, проводимой системным администратором.
Разграничение прав доступа к формам экспорта позволяет также для одних и тех же классов объектов разным пользователям назначать разные формы печати. Так, например, кладовщик может распечатать стандартную форму накладной, в то время как бухгалтер будет использовать форму с выделенным НДС. При этом они будут иметь представление о том, что у документа есть только одна форма печати, соответствующая специфике их работы.