Obx/Docu/ru/MMerge.odc

Описание системы примерами:  ObxMailMerge

Когда бизнесмен хочет сообщить что-то всем своим клиентам, например, уведомить о новом продукте, он может разослать письма-формы (form letter) всем существующим клиентам. Каждое такое письмо имеет одинаковое содержимое, кроме некоторых отличий, таких как имя и адрес соответствующего клиента. Слияние почты (Mail Merge) - это процесс создания этих писем-форм при помощи шаблонов и баз данных клиентов.

Этот пример показывает, как встроенный текстовый компонент в Блэкбокс может быть использован для реализации простого расширения слияния почты.


Рис.1. Процесс слияния почты

Следующая команда меню  устанавливается в меню Obx, чтобы упростить демонстрацию примера: 
	...
	"Merge..."	""	"ObxMMerge.Merge"	"TextCmds.FocusGuard"
	...

Перед выполнением Obx->Merge..., вам необходимо открыть шаблон. Например, открыть следующий шаблон (Obx/Samples/MMTmpl) и выполнить команду Obx->Merge... Диалоговое окно запросит у вас адрес базы данных: откройте документданных (Obx/Samples/MMData).

В результате создается новый текст, который содержит последовательность писем-форм. Когда вы выполните команду Показать разметку в меню Текст, вы заметите, что индивидуальные письма разделены линейками разделения страниц (самая правая иконка в линейке).     

Теперь давайте обратим более пристальное внимание на то, как выполняется программа. Есть одна команда, называемая Merge, которая осуществляет выборку текстового шаблона, отыскивает символы-заполнители (поля шаблона), затем позволяет пользователю открыть текст базы данных, определяет для каждого поля шаблона соответствующую колонку базы данных, создает новый текст для вывода, добавляет экземпляр шаблона письма для каждой строки текста базы данных, и в конце концов открывается текст в окне.

MODULE ObxMailMerge;

	PROCEDURE TmplFields (t: TextModels.Model): Field;
	PROCEDURE ThisDatabase (): TextModels.Model;
	PROCEDURE MergeFields (f: Field; t: TextModels.Model);
	PROCEDURE ReadTuple (f: Field; r: TextModels.Reader);
	PROCEDURE AppendInstance (f: Field; data, tmpl, out: TextModels.Model);
	PROCEDURE Merge*;

END ObxMailMerge.	

Листинг 2. Структура программы ObxMMerge

Есть пять вспомогательных процедур, которые вызываются командой Merge:

TmplFields анализирует текст шаблона и возвращает список полей текста. Каждое поле описывает символ-заполнитель с его именем и позицией в тексте. Символы-заполнители специфицируются как имена между символами "<" и ">", например <Name>.

ThisDatabase запрашивает у пользователя документ базы данных и возвращает текст, содержащийся в этом документе.

MergeFields определяет каждому полю шаблона соответствующую колонку базы данных. Чтобы это стало возможным, первый ряд текста базы данных должен содержать так называемые мета-сведения. Для автоматического составления стандартных писем - это всего лишь имя колонки, например Name or City. Это имя должно быть идентично имени, используемом в шаблоне.
Каждый ряд разделен символом возврата каретки (0DX), и поля ряда (колонок) разделены табуляцией (09X).

ReadeTuple читает строку текста базы данных, и присваивает значение строки, занятое одним полем базы данных, каждому соответствующему полю шаблона.

AppendInstance прикрепляет копию шаблонного текста в конец выходного файла и затем заменяет все символы-заполнители содержимым соответствующих полей базы данных. Эти подстановки делаются от конца присоедяемого текста к началу, так что из/в-индексы  не становятся недействительными при подстановке. Это и объясняет тот факт, что список полей выстраивается в обратном порядке, последнее поле - первым.   

Заметим, что каждая подстановка получает атрибуты текста от первого перемещенного символа, т.е., если символ-заполнитель "<Name>" в полужирном шрифте замещается строкой "Joe", результирующей заменой будет "Joe".

ObxMMerge не нуждается во вставке масштабирующей линейки, более того, текст шаблона уже содержит такую линейку.


ObxMMergesources

Перевел студент группы 08-302 Забелин И.С.