Распечатать страницу

Просмотр и редактирование таблиц VFP

« Назад

Помимо команды DISPLAY | LIST [[FIELDS] FieldList] …, таблицу можно просмотреть, употребив команду BROWSE, EDIT или CHANGE. Также эти команды позволяют изменять значения полей таблицы.

Команда

BROWSE [FIELDS FieldList] [FONT cFontName [, nFontSize]]
                   [STYLE cFontStyle] [FOR lExpression1 [REST]] [FORMAT]
                   [FREEZE FieldName] [KEY eExpression1 [, eExpression2]]
                   [LAST | NOINIT] [LOCK nNumberOfFields] [LPARTITION]
                   [NAME ObjectName] [NOAPPEND] [NOCAPTIONS] [NODELETE]
                    [NOEDIT | NOMODIFY] [NOLGRID] [NORGRID] [NOLINK]
                   [NOMENU] [NOOPTIMIZE] [NOREFRESH] [NORMAL] [NOWAIT]
                   [PARTITION nColumnNumber [LEDIT] [REDIT]]
                   [PREFERENCE PreferenceName] [SAVE] [TIMEOUT nSeconds]
                   [TITLE cTitleText] [VALID [:F] lExpression2 [ERROR cMessageText]]
                   [WHEN lExpression3] [WIDTH nFieldWidth] [WINDOW WindowName1]
                   [IN [WINDOW] WindowName2 | IN SCREEN]
                   [COLOR SCHEME nSchemeNumber]

открывает окно просмотра и редактирования текущей таблицы.

Опции и параметры (см. также табл. 1.6 и 1.7):

FIELDS FieldList – задает отображаемые поля. В список можно включить поля связанных таблиц; имени такого поля должны предшествовать псевдоним таблицы и точка. Кроме того, в списке могут присутствовать вычисляемые поля, представляющие результаты некоторого выражения. Пример с вычисляемыми полями рассмотрен в разд. 15.18.2. Порядок вывода полей определяется последовательностью их имен в списке FieldList. Если опция FIELDS FieldList опущена, то отображаются все поля текущей таблицы. При задании имени поля употребляется следующий синтаксис:

FieldName1;
        
         [:R];

                   [:nColumnWidth];
                   [:V = lExpression1 [:F] [:E = cMessageText]];
                  [:P = cFormatCodes];
                   [:B = eLowerBound, eUpperBound [:F]];
                   [:H = cHeadingText];
                   [:W = lExpression2];
                   [, FieldName2 [:R]...]

Опции имеют следующий эффект:

:R – указывает, что поле доступно только для чтения.

:nColumnWidth – задает ширину столбца, в котором поле отображается.

:V = lExpression1 [:F] [:E = cMessageText] – задает проверку, выполняемую при изменении поля в момент перемещения курсора на другое поле (или при переходе в другое окно, или при закрытии окна). Если lExpression1 вычисялется со значением .T., то данные признаются правильными, переход разрешается; если – со значением .F. или 0, то курсор остается на поле, в первом случае генерируется ошибка, во втором – нет.

Сообщение об ошибке выводится, если SET NOTIFY установлен в ON. Причем, если SET STATUS BAR установлен в ON, сообщение выводится в статус-строку, а если в OFF – в WAIT-окно. Если SET BELL установлен в ON, то при генерации ошибки прозвучит звуковой сигнал.

Опция не выполняется для memo-полей. По умолчанию lExpression1 вычисляется, если поле изменено. Если задать вдобавок опцию :F, то V-проверка будет выполняться всякий раз, когда поле покидается.

Опция :E = cMessageText заменяет выдаваемое по умолчание сообщение об ошибке на cMessageText.

Можно использовать иное, отличное от системного окно для оповещение об ошибке. Для этого V-процедура должна при обнаружении ошибки возвращать 0 и выдавать собственное сообщение.

Пример. В поле InputDate таблицы Authors разрешается вводить даты, не превышающие текущую. При нарушении этого правила V-функция CheckDate( ) информирует об ошибке. Покинуть редактируемое поле можно лишь при исправлении ошибки или по клавише Esc, закрыв таблицу.

select Authors

browse fields ;

Author ;

:h = "Автор", ;

InputDate ;

    : 20 ;

:h = "Дата ввода" ;

:v = CheckDate( ) 

function CheckDate( )

if InputDate > Date( ) then

MessageBox("Введенная дата больше текущей!")

return 0

endif

endFunc

:P = cFormatCodes – задает способ форматирования отображаемых и вводимых данных. Может содержать приведенные в табл. 15.15 символы.

Таблица 15.15

Возможные символы cFormatCodes

Символ

Описание

!

Обеспечивает преобразование строчных букв в прописные

#

Разрешает ввод цифр, пробелов и знаков + и –

$

Фиксированная позиция знака валюты (в качестве знака берется $); знак проставляется перед полем с данными

$$

Плавающая позиция знака валюты, определяемая числом присутствующих в поле цифр

,

Задает положение разделителя в целой части числа, вид которого устанавливается SET SEPARATOR

.

Задает положение десятичной точки, вид которой устанавливается  SET POINT

9

То же, что и #

A

Разрешает ввод только букв алфавита

L

Разрешает ввод только логических констант .T. и .F.

N

Разрешает ввод только букв алфавита и цифр

U

Разрешает ввод только букв алфавита и преобразовывает их в прописные

W

Разрешает ввод только букв алфавита и преобразовывает их в строчные

X

Разрешает ввод любых символов

Y

Требует ввода Y или y и N или n соответственно вместо логических констант .T. и .F.

Пример. Таблица Test.dbf имеет поля всех типов. Имена полей соответствуют именам представляемых полями типов данных.

Форматная строка '99,999.99', употребленная для поля Numeric, ограничивает диапазон вводимых чисел от –9,999.99 до 99,999.99, предусматривает также отображение разделителя в целой части числа, задает положение десятичной точки и число выводимых после нее знаков.

Форматная строка 'AAAAA', применяемая с полем Character, разрешает ввод только букв алфавита, как строчных, так и прописных. Число введенных букв не может быть более 5.

Форматная строка '!!!!!!!', использованная с полем CharacterB, разрешает ввод любых символов, однако строчные буквы алфавита будут преобразованы в прописные.

Форматирование поля Currency обеспечивает отображение знака валюты (в фиксированной позиции); ограничивает диапазон ввода данных (от –999.99 до 9999.99) и задает положение десятичной точки и точность.

Пример:

select Test

browse fields;

Numeric :p = '99,999.99', ;

Character :p = 'AAAAA', ;

CharacterB :p = '!!!!!!!', ;

Logical :p = 'Y', ;

         Currency :p = '$####.##'

На рис. 15.16 приведен возможный результат выполнения приведенного кода.

230.1.-Пример-форматирования-данных

Рис. 15.16. Пример форматирования данных

:B = eLowerBound, eUpperBound [:F] – ограничивает диапазон изменения вводимых данных. При его нарушении генерируется ошибка. По умолчанию данные проверяются только при изменении значения поля. Однако если для поля вдобавок использовать опцию :F, то проверка будет выполняться всякий раз, когда поле покидается.

Пример. Задаются границы для полей Numeric и Date с постоянно действующей проверкой. В качестве верхней границы поля Date берется величина, возвращаемая встроенной функцией DATE( ).

set status bar off

select test

&& Числовое поле имеет тип Numeric (9, 2)

browse fields ;

Numeric :b = 0, 50000 :f :h = 'Числовое поле', ;

Date :b = {^200-01-01}, Date( ) :f :h = Дата'

set status bar on

При нарушении границы числового поля возникнет приведенное на рис. 15.17 сообщение.

230.2.-Нарушена-граница-числового-поля

Рис. 15.17. Нарушена граница числового поля

:H = cHeadingText – задает заголовок поля взамен определенного по умолчанию.

:W = lExpression2 – задает W-проверку, выполняемую при попытке позиционироваться на поле и состоящую в вычислении lExpression2. Если lExpression2 вычисляется со значением .T., то перемещение на поле разрешается, и запрещается – в противном случае. Операндами lExpression2 могут быть и пользовательские функции.

Пример. Заданная W-проверка не позволяет перемещаться на поле InputDate таблицы Authors, когда его значение меньше {^2000-01-01}, устанавливая тем самым дату запрета редактирования поля.

if not Used('Authors') then

wait 'Нужно открыть таблицу Authors' window

return

endif

set century on

select Authors

browse fields ;

Author ;

:h = "Автор", ;

InputDate ;

h = "Дата ввода" ;

                   :w = CheckDate( )

function CheckDate( )

local lowerDate

lowerDate = {^2000-01-01}

if InputDate < lowerDate then

    MessageBox("Редактирование дат меньших " ;

+ Transform(lowerDate) + " запрещено!")

return .F.

endif

endFunc

FONT cFontName [, nFontSize], STYLE cFontStyle – аналогичны одноименным опциям команды SET PRINTER FONT, рассмотренной в в разд. 4.1.2.2.

REST – предотвращает перемещение файла с текущей записи к первой строке окна просмотра, когда оно открывается с опцией FOR. Если текущая запись не удовлетворяет lExpression1, то файл позиционируется на ближайшей к ней записи, этому условию удовлетворяющей.

FORMAT – предписывает использование формат-файла, открытого командой SET FORMAT. Из этого файла извлекается следующая информация:

- список отображаемых полей;

- значения опций VALID, WHEN и RANGE;

- размеры полей (задаются опцией PICTURE);

- SAY-выражения (для вычисляемых полей).

Замечание. Команда SET FORMAT включена для совместимости с прежними версиями. Файл, открытый SET FORMAT, закрывается командой CLOSE FORMAT.

FREEZE FieldName – разрешает редактирование единственного поля FieldName таблицы. Все остальные поля будут доступны только для просмотра.

KEY eExpression1 [, eExpression2] – ограничивает число выводимых записей, отображая записи с ключом равным eExpression1, или, если задан параметр eExpression2, записи с ключами в диапазоне от eExpression1 до eExpression2 включительно. Просматриваемая таблица должна быть проиндексирована, тип eExpression1 и eExpression2 должен совпадать с типом контролирующего индекса.

Пример:

select Authors

set order to Author

&& Отображаем записи, в которых фамилии авторов которых

&& начинаются с букв Л, М и Н

browse last key 'Л', 'Н'

То же задает опция FOR, например:

browse last for Between(Author, 'Л', 'Н')

При ее использовании, однако, нет необходимости в качестве управляющего устанавливать индекс Author.

LAST | NOINIT – конфигурация Browse-окна автоматически, если SET RESOURCE установлен в ON, сохраняется в файле FoxUser.dbf (или ином указанном SET RESOURCE файле). Опция LAST | NOINIT обеспечивает открытие Browse-окна с той же конфигурацией, что имело последнее Browse-окно. Исключение составляет опция PREFERENCE, значение которой не восстанавливается.

При употреблении LAST | NOINIT иные Browse-опции должны быть опущены. При закрытии Browse-окна в результате нажатия Ctrl+Q изменения в настройках Browse-окна в файле ресурсов не сохраняются.

Замечания:

1. Имя текущего файла ресурсов устанавливается командой

SET RESOURCE TO [FileName]

2. Функция SYS(2005) возвращает имя используемого файла ресурсов.

3. NOINIT обеспечивает dBASE-совместимость.

LOCK nNumberOfFields – задает, если nNumberOfFields > 0, число полей, которые можно просматривать без прокрутки в левой части Browse-окна. Отрицательное значение nNumberOfFields употребляется для указания числа зафиксированных, постоянно присутствующих в окне полей. Так, если nNumberOfFields = –1, то при любых перемещениях по полям в окне будет присутствовать первое отображаемое поле.

При положительном значении nNumberOfFields Browse-окно всегда имеет две части, даже если опция PARTITION опущена.

LPARTITION – обеспечивает при открытии Browse-окна позиционирование курсора на первом поле левой части окна. По умолчанию он размещается на первом поле правой части окна.

NAME ObjectName – создает ссылку Browse-окна на объект. Это позволяет манипулировать открытым Browse-окном, используя свойства элемента управления Grid, например:

select Books

browse name oBooks nowait

&& Отображаем таблицу без линий сетки

oBooks.GridLines = 0

&& Можем изменить и иные свойства объекта oBooks;

&& их перечень см. в файле справки, тема Grid control

NOAPPEND – запрещает интерактивное добавление записей в просматриваемую таблицу путем нажатия Ctrl+Y или выбора Append Record из меню Table. Наличие NOAPPEND не препятствует добавлению записей из процедур, связанных с VALID, WHEN или ON KEY LABEL.

NOCAPTIONS – обеспечивает отображения имени поля в качестве заголовка столбца таблицы, даже если для поля указан альтернативный заголовок. Действует только при просмотре таблиц видов или баз данных.

NODELETE – не разрешает интерактивное проставление (снятие) пометки удаления записи в просматриваемой таблице путем нажатия Ctrl+ T или выбора Toggle Delete из меню Table, или в результате щелчка мышью по ячейке для пометке удаления записи.

NOEDIT | NOMODIFY – запрещает редактирование записей таблицы, но сохраняет возможность их добавления и проставления (снятия) пометки удаления.

NOLGRID – удаляет линии сетки в левой части Browse-окна.

NORGRID – удаляет линии сетки в правой части Browse-окна.

NOLINK – разъединяет части Browse-окна. По умолчанию при прокрутке одной части прокручивается и вторая. Опция NOLINK позволяет прокручивать их независимо.

NOMENU – удаляет меню Table из системного меню, предотвращая тем самым доступ к Browse-окну посредством меню.

NOOPTIMIZE – отключает рашмор-оптимизацию.

NOREFRESH – запрещает обновление Browse-окна. Если опция не задана, то Browse-окно обновляется через промежуток времени, устанавливаемый SET REFRESH. Опция полезна с файлами, имеющими статус "только для чтения"; при ее употреблении улучшается производительность.

NORMAL – открывает Browse-окно с заданными по умолчанию установками, такими, как цвет, размер, положение, заголовок, управляющие опции (GROW, FLOAT, ZOOM и др.). Если опция опущена Browse-окно открывается в пользовательском окне, Browse-окно наследует определенные для пользовательского окна установки.

PARTITION nColumnNumber – разбивает Browse-окно на левую и правую части, размещая разделительную полосу в столбце с номером nColumnNumber Browse-окна. В каждой части отображаются все поля таблицы или все поля, определенные опцией FIELDS FieldList.

Пример:

select Authors

&& Отображаем левую часть окна в режиме редактирования

&& Результат приведен на рис. 15.18

browse partition 50 Ledit

230.3.-Две-части-Browse-окна

Рис. 15.18. Две части Browse-окна;
левая часть отображена в режиме редактирования

LEDIT | REDIT – обеспечивает отображение левой | правой части Browse-окна в режиме редактирования.

PREFERENCE PreferenceName – сохраняет опции и параметры Browse-окна в файле ресурсов FoxUser.dbf (или ином указанном SET RESOURCE файле) для последующего использования. В отличие от опции LAST | NOINIT, обеспечивающей воспроизведение последней конфигурации Browse-окна, опция PREFERENCE позволяет восстанавливать конфигурацию окна просмотра, ассоциированную с именем PreferenceName. При закрытии окна PreferenceName-конфигурация обновляется.

Имя PreferenceName не должно превышать 10 символов и должно быть построено по общепринятым правилам.

При необходимости можно запретить обновление PreferenceName-конфигурация, выполняемое при закрытии Browse-окна. Для этого нужно выполнить команду SET RESOURCE OFF, закрыть Browse-окно, открыть файл FoxUser.dbf как обычную таблицу, найти в режиме просмотра запись, отвечающую PreferenceName, и проставить .T. в логическом поле READONLY.

При закрытии Browse-окна в результате нажатия Ctrl+Q PreferenceName-конфигурация в файле ресурсов не сохраняется.

TIMEOUT nSeconds – задает время nSeconds в секундах, в течение которого Browse-окно ожидает ввода. Если время истекло, а очередной ввод не выполнен, то Browse-окно автоматически закроется. В командном окне опция TIMEOUT эффекта не имеет.

TITLE cTitleText – задает отличный от известного по умолчанию заголовок Browse-окна. При использовании BROWSE WINDOW заголовок Browse-окна заместит заголовок пользовательского окна.

VALID lExpression2 [:F] ERROR cMessageText – осуществляет проверку значения редактируемой записи. Проверка выполняется, если запись изменена и выполняется попытка перемещения на другую запись. VALID-проверка не выполняется, если изменялись только memo-поля записи.

Если lExpression2 вычисляется со значением .T., то перемещение на другую запись разрешается, если – со значением .F., то курсор остается в текущем поле и генерируется ошибка, если – со значением 0, то положение курсора также не меняется, но ошибка не генерируется.

Сообщение об ошибке выводится, если SET NOTIFY установлен в ON. Причем, если SET STATUS BAR установлен в ON, сообщения выводятся в статус-строку, а если в OFF – в WAIT-окно.

Встроенный генератор сообщений о VALID-ошибках можно заменить на пользовательский, если в качестве lExpression2 использовать вызов функции, возвращающей в случае ошибки 0 и информирующей о ней пользователя.

Нажатие на Esc позволяет закрыть Browse-окно с ошибочными данными, то есть когда lExpression2 возвращает .F. Чтобы этого избежать, можно временно отключить выполняемое по умолчанию действие Esc, например следующим образом:

on key label Esc MessageBox("Клавиша отключена!")

После завершения BROWSE действие Esc следует восстановить:

on key label Esc

Опция [:F] обеспечивает выполнение VALID-проверки всякий раз, когда покидается текущая строка, даже если все ее поля остались неизмененными.

Опция ERROR cMessageText задает сообщение, выдаваемое при ошибке, обнаруженной VALID-проверкой, взамен заданному по умолчанию сообщению.

Пример:

on key label Esc MessageBox("Клавиша отключена!")

set notify on

set status bar off

select Authors

browse title "Авторы";

valid InputDate <= Date( );

error "Неверная дата"

on key Label Esc

WHEN lExpression3 – задает проверку, выполняемую при перемещении к следующей записи. Запись, которая стала текущей, будет доступна для редактирования, если lExpression3 вычисляется со значением .T., и будет доступна только для чтения, если lExpression3 возвращает .F. или 0.

Пример:

select Authors

browse when InputDate > {^2004-01-01}

WIDTH nFieldWidth – задает ширину nFieldWidth, которую будут иметь все столбцы при открытии Browse-окна. После открытия ширина может быть изменена интерактивно. Если аналогичный параметр (:nColumnWidth) задан для отдельного поля, то его значение имеет больший, чем WIDTH nFieldWidth, приоритет.

COLOR SCHEME nSchemeNumber – задает номер цветовой схемы для Browse-окна. На самом деле Browse-окно использует цветовую схему, устанавливаемую на панели управления Windows (Экран – Оформление – Цветовая схема).

Замечание. При нажатии на Esc Browse-окно закрывается; изменения, выполненные в текущем поле, не сохраняются.

Пример:

define window wForBrowse at 10, 10 size 20, 80 ;

in desktop system float close title "Browse" ;

font "Times New Roman", 12

select Authors

&& Заголовок "Авторы" заместит заголовок "Browse"

browse title "Авторы" window wForBrowse save