Глава 11. Объединение текста СУБД FoxPro версии 2.0 обеспечивает несколько новых команд и функций для объединения текста. Объединение, слияние текста позволяет вам фор- мировать письма, документы и программы. Вы можете комбинировать следу- ющие виды текста: - содержимое полей базы данных; - содержимое переменных в памяти; - содержимое элементов массива; - результаты функций; - выражения и результаты вычислений. Эти элементы называются элементами объединения текста. Например, при формировании письма можно для помещения в начало письма текущей даты использовать функцию DATE( ). Поля базы данных могут использоваться для размещения под датой имени клиента, названия фирмы и адреса. В приветствии имя клиента можно использовать снова. В следующей таблице приводится перечень команд и функций объединения и их использование. -------------------------T-----------------------------------------------¬ ¦ Команда или функция ¦ Использование ¦ +------------------------+-----------------------------------------------+ ¦ \ ¦ \\ ¦ Вывод строк текста. ¦ +------------------------+-----------------------------------------------+ ¦ TEXT ... ENDTEXT ¦ Вывод строк текста. ¦ +------------------------+-----------------------------------------------+ ¦ SET TEXTMERGE ¦ Разрешение или запрещение вычисления полей ¦ ¦ ¦ базы данных, переменных, элементов, функций и ¦ ¦ ¦ формул. ¦ +------------------------+-----------------------------------------------+ ¦ SET TEXTMERGE ¦ Задает ограничители, окружающие поля базы ¦ ¦ DELIMITERS ¦ данных, элементы, функции и формулы. ¦ +------------------------+-----------------------------------------------+ ¦ _TEXT ¦ Непосредственный вывод \ ¦ \\ и TEXT ... ¦ ¦ ¦ ENDTEXT в файл, открытый с помощью функции ¦ ¦ ¦ нижнего уровня. ¦ +------------------------+-----------------------------------------------+ ¦ _PRETEXT ¦ Задает символьное выражение, предшествующее ¦ ¦ ¦ строкам слитого текста. ¦ L------------------------+------------------------------------------------ Слияние текста с компонентами объединения текста Для слияния текста с компонентами объединения текста (полями, перемен- ными, функциями и т.д.) эти компоненты должны вычисляться. Например, если вы используете для помещения в начало письма даты функцию DATE( ), то эта функция должны вычислять и выводить данные. Для тех компо- нентов объединения текста, которые должны вычисляться, необходимо соб- людение трех условий: - TEXTMERGE должно быть в состоянии ON; - вычисляемые компоненты должны окружаться текущими ограничителями TEXTMERGE DEL[IMITERS; - компоненты должны размещаться внутри TEXT ... ENDTEXT или на строке, начинающейся с \ или \\. Команда SET TEXTMERGE В начале работы TEXTMERGE по умолчанию установлено в значение OFF. Для разрешения вычисления компонентов слияния текста используйте команду SET TEXTMERGE ON. Предположим, вы открываете базу данных CUSTOMER, чтобы использовать ее поля для формирования письма. Когда TEXTEMRGE установлено в значение ON, а поле окружается ограничителями объедине- ния текста, содержимое полей объединяется с письмом. Если TEXTMERGE установлено в значение ON, компоненты объединения текста не вычисляют- ся и выводятся в литеральном виде (вместе с окружающими ограничителя- ми). В приведенном нами выше примере с письмом объединяются имена по- лей и их ограничители, а не их содержимое. Ограничители объединяемого текста Компоненты объединения текста должны окружаться ограничителями объеди- няемого текста, что позволяет отличить компоненты от текста, который их окружает. Когда вы запускаете FoxPro, по умолчанию в качестве огра- ничителей используются угловые скобки << и >>. Предположим, вы открыли базу данных CUSTOMER и используете ее поля для формирования письма. Когда поля окружаются ограничителями объединяемого текста (и TEXTMERGE установлено в значение ON), содержимое полей выводится и сливается с письмом. Если поля не заключены в ограничители, то с письмом объединя- ются имена полей, а не их содержимое. Команда SET TEXMERGE DELIMITERS позволяет вам задавать различные символы объединяемого текста или восстановить ограничители, используемые по умолчанию. TEXT ... ENDTEXT и \ ¦ \\ Кроме описанных выше требований, компоненты текста для вычисления должны помещаться в ограничители TEXT ... ENDTEXT, либо вычисляется строка, начинающаяся с \ или \\. В следующем примере показывается, как используются SET TEXTMERGE, ог- раничители объединяемого текста и TEXT ... ENDTEXT для выполнения сли- яния текста. Открывается база данных CUSTOMER. TEXTMERGE устанавлива- ется в значение ON, что разрешает вычисление функций и полей, ис- пользуемых в данном примере. Команда SET TEXTMERGE DELIMITERS TO восстанавливает ограничители объединяемого текста в используемые по умолчанию угловые скобки << и >>. Команда TEXT начинает вычисление компонентов объединяемого текста. В данном примере весь вывод направляется на экран. Вслед за полями CONTACT, COMPANY и полем адреса вычисляется и выводится DATE( ). Функции ALLTRIM( ), PROPER( ) и UPPER( ) удаляют начальные и конечные пробелы и переводят содержимое полей в верхний регистр. В приветствии поле поле CONTACT используется снова. Затем содержимое письма выводит- ся на экран. Для перемещения по базе данных используется цикл SCAN ... ENDSCAN. Для приостановки выполнения программы перед перемещением к следующей записи используется команда WAIT WINDOW. CLEAR ------------------------ Очистить экран SET TEXTMERGE ON ------------- Разрешить вычисление полей, функций и т.д. SET TEXT DELIMITERS TO ------ Восстановить используемые по умолчанию ограничители << и >> SELECT 0 USE customer SCAN ----------------------- Проход по базе данных TEXT ----------------------- Начать объединение текста и компонентов объединяемого текста <> <> <> <> <> <>, <> <> Dear <>, Thank you for your interest in our рroduct. The literature you requested is on its way! Sinserely, Fox Software ENDTEXT WAIT WINDOW ----------------- Пауза перед следующей записью CLEAR ----------------------- Очистка экрана ENDSCAN --------------------- Переход к следующей записи USE ------------------------- Закрытие базы данных Первая запись дает следующий вывод: 04/11/91 N. Baker Detatech Inc. 480 Village St. Suite 102 San Rolfos, CA 10514 Dear N. Baker, Thank you for your interest in our рroduct. The literature you requested is on its way! Sinserely, Fox Software Если данный пример модифицировать таким образом, что TEXTMERGE уста- новлено в значение OFF, или удалено TEXT ... ENDTEXT, то вывод выгля- дит следующим образом: <> <> <> <> <> <>, <> <> Dear <>, Thank you for your interest in our рroduct. The literature you requested is on its way! Sinserely, Fox Software \ ¦ \\ Для задания начала и конца вставляемого текста в предыдущем примере использовались ограничители TEXT ... ENDTEXT. Для задания того, где происходит вставка текста, может также использоваться одиночная (\) и двойная (\\) обратная косая черта. Одиночная и двойная обратная косая черта позволяют объединять текст без использования TEXT ... ENDTEXT. Если первым символом программы или командного окна является одиночная обратная косая черта \, то содержимое строки вычисляется таким же об- разом, как если бы строка помещалась между ограничителями TEXT и ENDTEXT. Перед вычислением строки выводятся символ перевода строки и возврата каретки. Если в начале строки используется двойная обратная косая черта, то перед выводом строки символы перевода строки и возвра- та каретки не выводятся. Приведем уже знакомый вам пример, где TEXT ... ENDTEXT заменено на \ и \\. Вывод здесь идентичен. Заметим, что \\ используется для размещения содержимого полей STATE (штат) и ZIP (ин- декс) на той же строке, что и поле ADDRESS (адрес). CLEAR ------------------------ Очистить экран SET TEXTMERGE ON ------------- Разрешить вычисление полей, функций и т.д. SET TEXT DELIMITERS TO ------ Восстановить используемые по умолчанию ограничители << и >> SELECT 0 USE customer SCAN ----------------------- Проход по базе данных \<> \ \<> \<> \<> \<> \<>, \\ <> \\ <> \ \Dear <>, \ \Thank you for your interest in our рroduct. \The literature you requested is on its way! \ \Sinserely, \ \Fox Software \ WAIT WINDOW ----------------- Пауза перед следующей записью CLEAR ----------------------- Очистка экрана ENDSCAN --------------------- Переход к следующей записи USE ------------------------- Закрытие базы данных _PRETEXT \ и \\ допускают использование _PRETEXT. _PRETEXT позволяет вам вырав- нивать строки и вставлять что-либо перед ними. Когда в _PRETEXT запи- сывается символьное выражение, оно выводится перед текстом или компо- нентами объединения текста. Для создания полей отступа в шаблонах программ в _PRETEXT можно записать символы табуляции. Объединение текста и поля примечаний Для организации вложенного объединения текста можно использовать поля примечаний (memo). Если поле примечания содержит имена полей базы дан- ных, переменные в памяти, функции или выражения, заключенные в текущие ограничители объединяемого текста, то они вычисляются и выводятся с содержимым поля комментария. Имя поля комментария также должно заклю- чаться в ограничители объединяемого текста. В следующем примере поле примечания NOTES в базе данных CLIENTS в прикладной программе ORGANIZER замещается функциями DATE( ) и TIME( ), заключенными в ис- пользуемые по умолчанию ограничители объединяемого текста. После этого поле примечания вычисляется. SELECT 0 USE CLIENTS CLEAR REPLACE notes WITН '<> <>' \<> USE Попробуйте использовать данный пример, удалив ограничители объединяе- мого текста вокруг функций в поле примечания, а затем - удалив ограни- чители, в которые заключено имя поля примечания. Вывод на экран, в окна и в файлы По умолчанию вывод при объединении текста направляется на экран. С по- мощью использования параметров команды SET TEXTMERGE вывод на экран можно подавить и направить его в окна и файлы. Направить вывод в фай- лы, открытые с помощью функций FCREATE( ) и FOPEN( ) позволяет систем- ная переменная _TEXT. Вывод на экран Если вывод после объединения текста направляется на экран, то вы може- те подавить вывод на экран, включив в команду SET TEXTMERGE параметр NOSНOW. Чтобы вновь разрешить вывод на экран, используйте в команде SET TEXTMERGE параметр SНOW. Если вывод направляется на экран, то сле- дующая команда его подавляет: SET TEXTMERGE NOSНOW Вывод на экран будет подавлен, пока вы не дадите команду: SET TEXTMERGE SНOW Вывод в окно Вывод объединения текста можно направить в окно. Включение в команду SET TEXTNERGE ключевого слова WINDOW позволяет направить вывод в за- данное окно. Вывод объединяемого текста можно направить в окно, кото- рое не является активным или отображаемым. После того, как вывод нап- равлен в окно, для его подавления и разрешения можно использовать па- раметры команды SET TEXTMERGE NOSНOW и SНOW. В следующем небольшом примере программы создается активное окно с именем DATETIME, а объеди- нение текста используется для вывода в окне текущего времени и даты. Дата и время посылаются в окно перед тем, как оно становится отобража- емым или активным. Затем команда ACTIVATE WINDOW DATETIME активизирует окно и выводит его на экран. DEFINE WINDOW datetime FROM 2,2 TO 10,41 FLOAT CLOSE SET TEXTMERGE ON WINDOW datetime \ \Текущая дата: \\ <> \ \\Время: \\ <> ACTIVATE WINDOW datetime Вывод в файлы Вывод включаемого текста можно также направить в файл. Объединяемый текст можно посылать в файл следующими двумя способами: - Включить имя файла, в который будет направляться вывод, в часть <имя_файла> команды SET TEXTMERGE. - Сохранить описатель файла, открытого с помощью функций FCREATE( ) или FOPEN( ) в системной переменной в памяти _TEXT. Когда вы включаете имя файла в команду SET TEXTMERGE, то файл открывается, как файл ниж- него уровня, а его описатель записывается в переменную _TEXT. Работать с файлом можно с помощью файловых функций нижнего уровня. Более под- робно о функциях нижнего уровня работы с файлами рассказывается в дан- ном руководстве в главе "Ввод-вывод в файлы на нижнем уровне". Чтобы закрыть файл, открытый с помощью команды SET TEXTMERGE, вы може- те дать команду SET TEXTMERGE без указания имени файла, или включить описатель файла в вызов функции FCLOSE( ). Если файл открывается с по- мощью функций FCREATE( ) или FOPEN( ), и вы сохраняете его описатель в переменной _TEXT, то вывод объединяемого текста направляется на экран, если вы дали команду SET TEXTMERGE ON. Программы и шаблоны программ Мощным средством объединения текста является генерация программ. Поск- ольку программы FoxPro представляют собой текстовые файлы, с помощью объединения текста можно создавать программы. Компонентами объединения текста могут быть команды и функции. В следующем примере показывается, как шаблон программы можно создать с помощью возможностей объединения текста FoxPro, ее команд и функций. В программе GENSCRN показаны две процедуры, которые генерируют текст экранной программы из информации, записанной в базе данных. Первая процедура создает код программы для реализации "кнопок", а вторая - селективных кнопок (многопозиционных переключателей). После того, как создается файл, в который записывается сгенерированный текст экрана, процедуры, аналогичные приведенным ниже, выводят текст экранной программы также в этот файл. Эти процедуры используют поля базы данных работы с экраном для подстановки информации для генерируе- мых GENSCRN команд. В двух приведенных ниже процедурах поля базы дан- ных работы с экранами заключены в используемые по умолчанию ограничи- тель объединяемого текста (<< и >>). Например, <>, <<НPOS>>, <> и т.д. представляют собой поля базы данных работы с экраном. Содержимое этих полей используется для создания команд. * * GENPUSН - генерация "кнопок" * * Описание: * Генерация кода для вывода на экран "кнопок", также как * они изображаются на конструируемом экране (экранах). * PROCEDURE genрush \@ <>,<<Нрos>> GET <> ; ------------¬ \ PICTURE, <> ; ¦ \ SIZE <<Нeight>>,<>,<> ; +---------------¬ \ DEFAULT <> ¦ ¦ * -------------------------------------------- ¦ * GENRADBUT - Генерация селективных кнопок ¦ * Описание: ¦ * Генерация кода для вывода селективных кнопок ¦ * (как они изображаются на конструируемых экранах). ¦ * ¦ PROCEDURE genradbut ¦ \@ <>,<<Нрos>> GET <> ; ---------------------¬ ¦ \ PICTURE <> ; ¦ ¦ \ SIZE <<Нeight>>,<>,<> ; +---¬ ¦ \ DEFAULT <> ¦ ¦ ¦ ----------------------------------------------------- ¦ ¦ ¦ ¦ Приведем пример кода экранной программы, которая создает данные ¦ ¦ пр ¦ ¦ @ 3,38 GET gethelр ; -----------------¬ ¦ ¦ PICTURE "@*VN \<Нelр" ; ¦ ¦ ¦ SIZE 1,8,1 ; +----¬ ¦ ¦ DEFAULT 1 ; ¦ ¦ ¦ ¦ -------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ @ 5,38 GET gethelр ; -----------------¬ +-----------------------¦--- PICTURE "@*НT \!OК" ; ¦ ¦ ¦ SIZE 1,8,5 ; +----- ¦ DEFAULT 1 ; ¦ L--¬ -------------------------------- ¦ ¦ ¦ @ 1,18 GET unittyрe ; -----------------------------------------------¬¦ PI SIZE 1,15,0 ; +- DEFAULT 1 ; ¦ ---------------------------------------------------------------