Автоматическая блокировка
В Visual FoxPro может осуществляться автоматическая или ручная блокировка данных. При использовании определенных команд FoxPro попытается автоматически заблокировать записи или всю таблицу (табл. 20.1).
Таблица 20.1. Команды, автоматически блокирующие таблицу или записи
Команда | Что блокируется | ||
ALTER TABLE | Вся таблица | ||
APPEND | Вся таблица | ||
APPEND BLANK | Заголовок таблицы | ||
APPEND FROM | Вся таблица | ||
APPEND FROM ARRAY | Заголовок таблицы | ||
APPEND MEMO | Текущая запись | ||
BLANK | Текущая запись | ||
BROWSE | Текущая запись и все записи из одноименных полей в связанных таблицах | ||
CHANGE | Текущая запись и все записи из одноименных полей в связанных таблицах | ||
DELETE | Текущая запись | ||
DELETE NEXT 1 | Текущая запись | ||
DELETE <n> | Если п больше 1, автоматически блокируется вся таблица | ||
DELETE RECORD <n> | Автоматически блокирует п записей | ||
DELETE SQL | Текущая запись | ||
EDIT | Текущая запись и все записи из одноименных полей в связанных таблицах | ||
GATHER | Текущая запись | ||
INSERT | Вся таблица | ||
INSERT SQL | Заголовок таблицы | ||
MODIFY MEMO | Когда начинается редактирование записи, автоматически блокирует ее | ||
READ | Текущая запись | ||
RECALL | Текущая запись | ||
RECALL NEXT 1 | Автоматически блокирует указанную запись | ||
RECALL RECORD <n> | Блокирует п записей | ||
RECALL <n> | Если п больше 1, автоматически блокируется вся таблица | ||
REPLACE | Текущая запись | ||
REPLACE NEXT 1 | Автоматически блокирует указанную запись | ||
REPLACE RECORD <n> | Блокирует п записей | ||
SHOW GETS | Текущая запись | ||
TABLEUPDATE() | Вся таблица | ||
UPDATE | Вся таблица | ||
UPDATE SQL | Вся таблица |
Замечание
Все команды с автоматической блокировкой снимают ее после выполнения.
Блокировка при буферизации
В Visual FoxPro вы можете выбрать пессимистический и оптимистический режимы буферизации, которые определяют, как и когда будет осуществляться блокировка данных. В зависимости от типа решаемых задач вы можете выбрать один из типов буферизации данных (табл. 20.3).
Таблица 20.3. Типы буферизации данных
Значение | Описание | ||
1 | Буферы не используются | ||
2 | Пессимистичная блокировка записей. Visual FoxPro блокирует запись сразу же после начала редактирования данных и освобождает блокировку только после перехода на следующую запись или при выполнении ФУНКЦИИ TABLEUPDATE ( ) | ||
3 | Оптимистичная блокировка записей. Позволяет редактировать текущую запись в других сеансах работы и блокирует запись только при переходе на следующую запись или выполнении функции tableupdate () | ||
4 | Пессимистичная блокировка таблицы. Блокируются все редактируемые записи, но их обновление в базе данных осуществляется только при вызове функции tableupdate () | ||
5 | Оптимистичная блокировка таблицы. Позволяет редактировать записи в других сеансах работы и блокирует записи только при обновлении записей в базе данных с помощью функции tableupdate () |
При выборе любого типа буферизации данных вы можете отказаться от выполненных изменений с помощью функция tablerevert ().
Для установки типа буферизации вы можете использовать функциюCURSORSETPROP() , свойство BufferMode формы и свойство BufferModeOverride курсора, используемого в среде окружения формы.
Свойство BufferMode формы может принимать одно из значений, описанных в табл. 20.4.
Таблица 20.4. Значения свойства BufferMode
Значение | Описание | ||
0 | Записи блокируются с момента начала редактирования, и значения полей записываются в базу данных при переходе к следующей записи | ||
1 | Пессимистичная блокировка записей | ||
2 | Оптимистичная блокировка записей |
Для определения свойства Buf ferModeOverride откройте окно конструктора формы, выполните команду Data Envirofiment (Среда окружения) из меню View (Вид). Далее в окне Data Environment (Среда окружения) выберите таблицу, нажмите правую кнопку мыши и из контекстного меню выберите команду Properties (Свойства). Откроется окно свойств, в котором выберите свойство BufferModeOverride (рис. 20.3) и установите одно из возможных значений (табл. 20.5).
Таблица 20.5. Значения свойства Buf ferModeOverride
Значение | Описание |
0 | Буферы не используются |
1 | Использует тип блокировки, заданный свойством BufferMode формы |
2 | Пессимистичная блокировка записей |
3 | Оптимистичная блокировка записей |
4 | Пессимистичная блокировка таблицы |
5 | Оптимистичная блокировка таблицы |
CURSORSETPROP(Bu f ?ering, типБуферизации,
псевдонимТаблицы | номерРабочейОбласти])
Для определения текущего типа буферизации воспользуйтесь свойством
BufferModeOverride курсора или функцией CURSORGETPROP().
Рис. 20.3. Определение значения свойства Buf ferModeOverride курсора
Рис. 20.4. Определение типа блокировки в диалоговом окне Work Area Properties
При работе в интерактивном режиме вы можете установить тип блокировки в диалоговом окне Work Area Properies (Свойства рабочего пространства) (рис. 20.4), которое открывается при нажатии кнопки Properties (Свойства) в диалоговом окне Data Session (Данные сеанса).
Блокировка таблицы
Для установки блокировки изменений таблицы вы должны использовать функцию flock, которая имеет следующий синтаксис:
FLOCK([рабочаяОбласть] | [псевдонимТаблицы])
Функция блокировки проверяет текущий статус рабочей области или таблицы. Если в результате теста определяется, что таблица не заблокирована, она блокируется, и пользователь может продолжать с ней работать. Функция при этом возвращает логическое значение .т. (Истина) и таблица становится доступной пользователю, выполнившему блокировку, на чтение и запись. Остальным пользователям таблица базы данных доступна только на чтение. Если таблица уже заблокирована другим пользователем, заблокировать таблицу не удается и функция возвращает значение .f. (Ложь). Для блокировки таблицы в текущей области псевдоним можно не указывать.
В приведенном ниже примере для блокировки таблицы customer используется команда flocko. Если таблица успешно заблокирована, команда replace all обновляет все записи в ней. После этого команда unlock снимает блокировку файла. Если файл невозможно заблокировать (такая ситуация возникает, если файл уже заблокирован другим пользователем), появится сообщение об ошибке.
SET EXCLUSIVE OFF
SET REPROCESS TO 0
USE Customer IF FLOCK()
REPLACE ALL cLastName WITH UPPER(cLastName)
UNLOCK
ELSE
WAIT "Файл занят, подождите" WINDOW NOWAIT
ENDIF
Если вы редактируете две или более связанных командой set relation таблиц, вам необходимо блокировать каждую связанную таблицу самостоятельно, так как блокировка одной из связанных таблиц не блокирует связанные с ней таблицы. Возможны ситуации, когда вы изменяете данные только в одной таблице, а другие используются для отображения дополнительной информации и их не требуется блокировать.
Блокировка записей
По возможности рекомендуется использовать блокировку отдельных записей, а не таблицы в целом. Заблокированная запись может изменяться только установившим блокировку пользователем, остальные пользователи имеют к ней доступ только на чтение. Результат изменения записи будет виден другим пользователям только после снятия блокировки с записи.
Для блокировки записей используются взаимозаменяемые функции lock и rlock, синтаксис которых отличается только наименованием функции:
RLOCK([ рабочаяОбласть I псевдонимТаблицы]
| [номераЗаписей, рабочаяОбласть
| псевдонимТаблицы])
Для указания таблицы, записи которой вы собираетесь блокировать, можно использовать номер рабочей области или псевдоним таблицы. Если не указаны ни рабочая область, ни псевдоним, функция lock будет блокировать текущую запись таблицы, открытой в рабочей области.
Для блокировки группы записей предварительно выполните команду set multilocks on и с помощью аргумента номераЗаписей укажите номера блокируемых записей. Номера записей задаются в символьном виде и разделяются запятыми. Например, для блокировки третьей и пятой записи таблицы необходимо указать "3 , 5".
Замечание
Для определения номеров записей используйте функцию recno ().
При успешной блокировке возвращается значение .т. (Истина) и заблокированные записи становятся доступными на чтение и запись пользователю, установившему блокировку. Остальные пользователи могут только просматривать заблокированные записи. При блокировке группы записей функция возвращает значение .т. только в том случае, если удалось заблокировать все указанные записи. Тем не менее записи, которые удалось блокировать, останутся заблокированными.
Если запись или таблица уже заблокированы другим пользователем, блокировка не будет выполнена и функция возвратит значение .f. (Ложь).
Совет
Для блокировки группы записей вы можете поочередно устанавливать указатель записи на блокируемую запись и выполнять команду lock.
Для выбора режима блокировки одной или группы записей используется команда set multilocks, которая имеет следующий синтаксис:
SET MULTILOCKS ON | OFF
Опция on разрешает блокировку группы записей, а опция off разрешает блокировку только одной записи.
Замечание
Переключение установки multilocks из on в off или из off в on приводит к снятию блокировки всех записей во всех открытых таблицах.
Использование буферов
Одним из мощных средств организации многопользовательской работы в Visual FoxPro является буферизация данных, которая позволяет лучше использовать локальные ресурсы и снижает нагрузку на сеть. При буферизации все сделанные вами изменения хранятся в оперативной памяти на рабочей станции и не обновляются на файл-сервере, пока вы не выполните соответствующую команду.
В Visual FoxPro используются два типа буферизации: буферизация таблиц и записей. При буферизации записей после завершения редактирования записи (при изменении позиции указателя записи или при вызове функции tableupdate) все изменения записываются в базу данных. При буферизации таблиц измененные данные сохраняются в базе данных только при закрытии таблицы или вызове функции tableupdate ().
Использование транзакций
Под транзакцией в системах управления базами данных понимают логическую единицу работы, которая представляет собой последовательность нескольких операций, в процессе выполнения которых сохраняется целостное состояние базы данных. В процессе выполнения транзакции обновляемые данные временно хранятся в памяти или на локальном диске. Действительные изменения совершаются только после завершения транзакции. Ес.ш что-либо препятствует обновлению данных, все изменения отменяются и поэтому ваши данные остаются без изменения.
Для управления транзакциями используется три команды, представленные в табл. 20.7.
Таблица. 20.7. Команды, используемые для управления транзакциями
Команда | Назначение | ||
BEGIN TRANSACTION | Инициирует транзакцию | ||
ROLLBACK | Осуществляет откат, то есть аннулирует все выполненные в течение транзакции действия | ||
END TRANSACTION | Завершает транзакцию и сохраняет все выполненные действия в базе данных |
В некоторых случаях вам может понадобиться использовать вложенные транзакции, при этом каждая из них должна начинаться командой begin transaction и завершаться командой end transaction. Выполнение команды rollback действует только на транзакцию, внутри которой она выполняется. Команды begin и end transaction могут находиться в разных функциях или процедурах.
Многопользовательская работа в локальной сети
В однопользовательской системе с данными работает только один человек, и ему нет необходимости думать о разделении доступа к файлам. Однако с появлением пользователей, желающих получить доступ к одним и тем же данным, планирование разделения доступа к базе становится актуальным.
В многопользовательских приложениях необходимо обеспечить доступ к данным тем пользователям, которым он действительно нужен. При разработке сетевых приложений по управлению базами данных необходимо предусмотреть разрешение конфликтов, возникающих при попытке двух и более пользователей одновременно изменить одни и те же данные. Visual FoxPro предлагает несколько вариантов решения этой проблемы, позволяя пользователю использовать перед изменением таблиц или записей автоматические или ручные методы их блокировки. При доступе к записям таблицы блокировка запрещает кому-либо изменять заблокированную область, пока пользователь не завершит свои изменения и не разблокирует эти данные.
Эта глава ознакомит вас с концепциями разделения данных в сетевой среде и организацией интерфейса при совместной работе нескольких пользователей.
Обнаружение и устранение конфликтов
При совместной работе с базой данных возможны конфликты, когда один или более пользователей пытаются заблокировать уже заблокированную другим пользователем запись. Возможны и взаимоблокировки, когда пользователь заблокировал одну запись или таблицу и пытается заблокировать вторую, которая уже заблокирована вторым пользователем. В то же время второй пользователь пытается заблокировать запись, заблокированную первым пользователем. Система буферизации записей и таблиц FoxPro упрощает разработку многопользовательских приложений и устранение возникающих конфликтов.
При попытке заблокировать уже заблокированную запись FoxPro выдает сообщение об ошибке. Для определения возникновения ошибки вы можете воспользоваться функцией tableupdate(), которая возвращает значение .f. при неудачной попытке сохранения данных. Кроме того, вы можете написать программу обработки ошибок и указать ее в команде on error. Для определения причины, по которой не удалось записать данные в базу данных, вы можете использовать значения кодов ошибок. Для определения кодов ошибок используются функции ERROR ( ) или AERROR ( ) .
При использовании буферизации данных в программе обработки ошибок вы можете определить, какие поля были изменены, каким было исходное значение поля и каким оно стало. Для определения изменения поля используется функция getfldstate (), которая по заданному номеру поля возвращает одно из значений, описанных в табл. 20.6.
Таблица 20.6. Значения, возвращаемые функцией getfldstate ()
Значение | Состояние | ||
1 | Значение поля не изменялось | ||
2 | Значение поля было изменено или поле было удалено | ||
3 | Значение поля во вновь добавленной записи не изменялось | ||
4 | Значение поля во вновь добавленной записи было изменено или поле было удалено | ||
NULL | Конец таблицы |
Полная блокировка таблицы и блокировка изменений
В некоторых случаях, например при изменении структуры данных, вам необходимо осуществить полную блокировку таблицы для получения исключительных прав на нее. В этом случае другим пользователям запрещается чтение, запись и изменение структуры указанной таблицы и они не смогут получить к ней доступ. Вы не можете установить полную блокировку, если эта таблица уже открыта или для нее уже установлена блокировка.
В большинстве случаев вам достаточно ограничить изменение данных таблицы, т. е. установить блокировку изменений, которая запрещает запись, изменение структуры указанной таблицы, наложение блокировки изменений другими пользователями.
Для открытия таблицы в режиме полной блокировки используется команда set exclusive on. После выполнения данной команды все открываемые таблицы будут находиться в режиме полной блокировки. Для снятия режима полной блокировки используйте команду set exclusive off. При этом полная блокировка открытых таблиц будет снята только после их закрытия. Для установки полной блокировки отдельной таблицы может быть использована опция exclusive в команде открытия таблицы use. Если таблица открыта в монопольном режиме, необходимость блокировки таблицы или ее записей отсутствует. После закрытия таблицы блокировка автоматически снимается.
Ниже приведены два примера установки полной блокировки таблицы. В первом примере используются две команды, а во втором — таблица открывается в режиме исключительного использования одной командой:
SET EXLUSIVE ON
USE CUSTOMER
ИЛИ
USE CUSTOMER EXCLUSIVE
Некоторые команды, список которых приведен ниже, могут использоваться только в режиме полной блокировки:
ALTER TABLE;
INDEX;
INSERT [BLANK];
MODIFY STRUCURE;
PACK;
REINDEX;
ZAP.
Если вы попробуете применить одну из этих команд, не открыв таблицу для исключительного использования, FoxPro выдаст предупреждающее сообщение Exclusive Open of File Required.
Сеансы работы с данными
В Visual FoxPro для многопользовательской работы вы можете использовать сеансы работы с данными, которые представляют собой среду окружения, связанную с формой или набором форм. С помощью сеансов работы с данными вы можете открывать одну и ту же форму на разных рабочих станциях или даже на одном компьютере (рис. 20.1), при этом каждая из них будет использовать отдельную копию данных.
Для управления сеансом работы с данными предназначено свойство DataSession (Окно данных) формы, которое можно установить равным 1 или 2. Если вы установите свойство DataSession равным 1, любые изменения, выполненные вами в форме, будут отображаться во всех остальных открытых формах. Это обычный режим работы. Для открытия копии среды окружения установите значение 2, при этом изменения в данной форме не будут отображаться в других формах. Количество открытых сеансов ограничивается только доступной оперативной памятью и местом на жестком диске.
Для выбора сеанса работы вы можете выполнить любое из следующих действий:
открыть окно Data Session (Окно данных), используя одноименную команду из меню Windows (Окно), и из раскрывающегося списка Current session (Текущий сеанс) выбрать требуемый сеанс работы (рис. 20.2);
выполнить в командном окне команду SET DATASESSION TO номерСеанса.
Рис. 20.1. Открытие сеансов работы на одном компьютере
Рис. 20.2. Выбор сеанса работы
Снятие блокировок таблиц и записей
В большинстве случаев при переходе от одной записи к другой блокировка снимается. Однако если вы заблокировали запись командами блокировки, ее необходимо разблокировать, чтобы к ней могли получить доступ другие пользователи. В табл. 20.2 описаны команды, используемые для снятия блокировок.
Таблица 20.2. Команды снятия блокировки записей и таблиц
Команда | Описание | ||
CLOSE | Снимает все блокировки записей и таблиц | ||
CLOSE ALL | Снимает все блокировки записей и таблиц | ||
END TRANSACTION | Снимает все автоматически установленные блокировки | ||
QUIT | Снимает все блокировки записей и таблиц | ||
UNLOCK | Снимает все блокировки записей и таблиц в текущей рабочей области | ||
UNLOCK ALL | Снимает все блокировки записей и таблиц во всех рабочих областях | ||
USE | Снимает все блокировки записей и таблицы | ||
SET MULTILOCKS OFF | Позволяет автоматическое снятие текущей блокировки при создании новой | ||
FLOCK ( ) | Перед блокировкой файла снимает все блокировки находящихся в нем записей | ||
TABLEUPDATE() | Прежде чем обновить таблицу, снимает все блокировки |
Наиболее часто для снятия блокировок таблиц и записей используется команда unlock, которая имеет следующий синтаксис:
UNLOCK [RECORD номерЗаписи] [IN < рабочаяОбласть | псевдонимТаблицы >] [ALL]
Команда unlock без параметров сбрасывает блокировку текущей записи или таблицы.
При снятии блокировки таблицы опция record не используется, задается только псевдоним таблицы. Если псевдоним не указан, снимается блокировка с текущей таблицы. Для разблокировки всех открытых таблиц используется опция ALL.
Для снятия блокировки с записи укажите опцию record и номер записи.
Замечание
Блокировка записи или таблицы может сниматься только пользователем, установившим данную блокировку. Таблицы, открытые в режиме полной блокировки, с помощью команды unlock разблокировать нельзя.
Типы блокировок
В Visual FoxPro вы можете использовать два типа блокировок: блокировку таблицы и записи. Блокировка таблицы запрещает доступ другим пользователям ко всей таблице, пока вы редактируете одну или несколько записей. Применение блокировки записи не допускает изменения записи кем-либо кроме пользователя, установившего блокировку.
По возможности следует использовать блокировку записи, потому что она запрещает изменение только одной записи, а не всей таблицы. Например, пока вы редактируете запись о покупателе Иванове, кто-нибудь может работать с записью о покупателе Петрове. И вы оба можете совершать изменения, не мешая друг другу и не беспокоясь за действия другого.
Установка режима повторных попыток блокировки данных
Если запись или таблица уже заблокированы, вам не удастся с первого раза установить блокировку. В этом случае вы можете использовать команду set reprocess, которая задает количество дополнительных попыток заблокировать таблицу (или запись) или время, на протяжении которого будут выполняться дополнительные попытки блокировки.
Команда set reprocess имеет следующий синтаксис:
SET REPROCESS TO числоПопыток [SECONDS] | TO AUTOMATIC
Если команда содержит опцию seconds, аргумент числоПопыток задает время в секундах, иначе — количество попыток. Аргумент числоПопыток может принимать целые значения в диапазоне от 1 до 32 000, по умолчанию его значение равно 0.
При использовании опции то automatic, а также если значение аргумента числопопыток равно 0, Visual FoxPro будет пытаться выполнять блокировку записи или таблицы до бесконечности. Во время выполнения попыток блокировки будет выводиться сообщение о том, что идет процесс блокировки. Пользователь может прервать процесс установки блокировки нажатием клавиши <Esc>.
При установке set reprocess to -i Visual FoxPro также будет пытаться выполнять блокировку записи или таблицы до бесконечности. Но в этом случае пользователь не может прервать попытки заблокировать запись или таблицу.
Замечание
Успешная блокировка записи или таблицы, уже заблокированной другим пользователем, возможна только после того, как пользователь, установивший блокировку, снимет ее. Поэтому рекомендуется снимать блокировку сразу же после завершения операции, для выполнения которой требовалась блокировка.
Импорт данных
В настоящем разделе мы обсудим импорт данных из форматов других приложений в таблицу Visual FoxPro. Для импорта данных воспользуемся услугами мастера:
Чтобы запустить мастера импорта данных в таблицу Visual FoxPro, в меню Tools (Сервис) выберите команду Wizards (Мастера), а затем Import (Импорт).
Совет
Для запуска мастера импорта вы также можете воспользоваться командой Import (Импорт) из меню File (Файл). В этом случае на экране открывается диалоговое окно Import (Импорт), в котором необходимо нажать кнопку Import Wizard (Мастер импорта).
На первом шаге импорта данных с помощью мастера (рис. 21.17) вы указываете формат импортируемого файла, используя список File Type (Тип файла). С помощью кнопки Locate (Определить) вы задаете в поле Source File (Файл источника) имя исходного файла. Затем установкой соответствующей опции необходимо указать, в новую таблицу вы импортируете файл или в существующую, и задать имя таблицы.
Завершив установку параметров, нажмите кнопку Next (Далее).
Рис. 21.17. Первый шаг работы мастера: выбор типа импортируемого файла
Рис. 21.18. Просмотр содержимого импортируемого файла
На втором шаге работы мастера вам необходимо указать, создается свободная таблица или таблица, входящая в базу данных. Установите соответствующую опцию. Если импортируемая таблица будет размещена в базе данных, то укажите ее название и расположение.
На следующих трех шагах вы можете просмотреть содержимое импортируемого файла, указать, в какой строке находятся наименования полей и с какой строки начать импортировать данные (рис. 21.18), задать разделители полей, определить заголовки и типы создаваемых полей (рис. 21.19).
Рис. 21.19. Определение заголовков и типов полей
Рис. 21.20. Задание форматов отображения данных
На шестом шаге работы мастера импорта задаются форматы отображения дат, кодовых страниц, денежных единиц и чисел (рис. 21.20).
После завершения установок на последнем шаге работы мастера нажмите кнопку Finish (Готово), и на основе данных импортируемого файла будет создана таблица Visual FoxPro.
Использование данных из Visual FoxPro в Microsoft Word
Данные, содержащиеся в таблицах Visual FoxPro, можно использовать в других приложениях Windows. Например, в Microsoft Word вы можете подготовить этикетки для наклейки на конверты и рассылки своим клиентам, используя для этого данные, размешенные в таблице customer.
Для слияния данных из Visual FoxPro и Microsoft Word необходимо использовать мастер. Чтобы его запустить, в меню Tools (Сервис) выберите команду Wizards (Мастера) и в появившемся подменю — Mail Merge (Составление писем). Слияние данных осуществляется с помощью мастера за несколько шагов:
На первом шаге мастер предлагает выбрать таблицу и поля, используемые для слияния (рис. 21.21). Перенесите необходимые поля в список Selected fields (Выбранные поля) и нажмите кнопку Next (Далее).
Рис. 21.21. Выбор таблицы и полей
На втором шаге необходимо указать, с каким редактором вы будете работать далее. По умолчанию установлена опция Microsoft Word. Нажмите кнопку Next (Далее) для перехода к следующему шагу (рис. 21.22).
Рис. 21.22. Выбор текстового редактора
Рис. 21.23. На данном шаге вы можете выбрать созданный ранее документ
На третьем шаге мастер предлагает поместить данные в новый или уже существующий документ (рис. 21.23). При установке опции Use existing document (Существующий документ) становится доступной кнопка File (Файл), открывающая диалоговое окно Open (Открыть) для выбора ранее подготовленного документа.
Если вы хотите разместить данные во вновь создаваемом документе. то на четвертом шаге мастера необходимо определить тип создаваемою файла (рис. 21.24), установив одну из опций списка Select a document type (Выбор типа документа). В табл. 21.3 описаны опции списка Select a document type (Выбор типа документа) и типы создаваемых файлов.
Таблица 21.3. Опции списка Select a document type
Опция | Тип создаваемого документа | ||
Form Letter | Письмо | ||
Label | Этикетка | ||
Envelope | Конверт | ||
Catalog | Каталог |
Выбрав необходимую опцию, нажмите кнопку Next (Далее) для перехода к последнему шагу мастера.
Рис. 21.24. Выбор типа создаваемого документа
На последнем шаге работы мастера следует нажать кнопку Finish (Готово). Если установлен драйвер ODBC, то все завершится успешно. Запустится Microsoft Word и откроется документ Word, в котором будет установлена связь с выбранными данными. Обратите внимание на имеющуюся в окне панель инструментов, предназначенную для работы с таблицей базы данных.
Рис. 21.25. Microsoft Word с установленной связью с выбранными данными
Разместите текст в документе. Для вставки полей установите курсор в требуемое место, нажмите на панели инструментов кнопку Добавить поле слияния и выберите из раскрывающегося списка то поле, которое нужно. Поясняющий текст вставляется непосредственно в область ввода (рис. 21.25).
Нажмите на панели инструментов кнопку Объединить. Откроется окно Слияние (рис. 21.26), в котором вы можете указать параметры слияния. В нашем примере выберите из списка Назначение опцию Новый документ и оставьте остальные параметры без изменения. Возможность отбора записей не представляет большого интереса, так как средства создания запроса в Visual FoxPro намного богаче. Для окончательного объединения данных нажмите кнопку Объединить.
Результат слияния данных приведен на рис. 21.27.
Рис. 21.26. Диалоговое окно Слияние
Рис. 21.27. Документ, полученный в результате слияния
Использование объектно-ориентированного программирования
В Visual FoxPro для управления OLE-объектами можно использовать объектно-ориентированное программирование.
Замечание
Для создания OLE-объекта в Visual FoxPro предназначена команда CREATEOBJECT.
Команда Insert Object
Для размещения в поле таблицы Visual FoxPro OLE-объекта со связью с помощью команды Insert Object (Вставить объект) выполните следующие действия:
Откройте таблицу Goods в режиме Browse (Обзор).
Перейдите в поле типа General (Общий) и дважды щелкните на нем для его открытия.
Выберите в меню Edit (Правка) команду Insert Object (Вставить объект).
В диалоговом окне Вставка объекта установите опцию Создать из файла.
Нажмите кнопку Обзор.
В открывшемся диалоговом окне Обзор выберите необходимый файл и нажмите кнопку Открыть.
В диалоговом окне Вставка объекта установите флажок Связь (рис. 21.9) и нажмите кнопку ОК.
Если необходимо вставить объект в виде значка, установите флажок В виде значка. В результате этих действий в окне просмотра поля типа General (Общий) появится значок файла (рис. 21.10).
Чтобы изменить размещенный OLE-объект с использованием OLE-сервера, откройте окно просмотра OLE-объекта и дважды щелкните кнопкой мыши на значке.
Рис. 21.9. Установлен флажок Связь
Рис. 21.10. Связывание OLE-объекта в виде значка
Команда Paste Special
Для размещения в поле типа General (Общий) OLE-объекта со связью с помощью команды Paste Special (Специ&чьная вставка), выполните следующие действия:
Откройте приложение-сервер и запомните связываемый объект во временном буфере Windows.
Откройте окно редактирования поля типа General (Общий).
В меню Edit (Правка) выберите команду Paste Special (Специальная вставка). На экране открывается диалоговое окно Специальная вставка (рис. 21.11). Объект, находящийся во временном буфере Windows, описан в диалоговом окне как Источник. В списке Как перечислены допустимые форматы для этого объекта.
Рис. 21.11. Диалоговое окно Специальная вставка
Чтобы связать объект с его оригиналом на сервере, установите опцию Вставить связь.
Выберите из списка Как формат объекта. Ссылка на объект запоминается в поле типа General (Общий). При каждом изменении оригинала объекта на сервере объект, выводимый в приложении Visual FoxPro, будет автоматически обновляться. Если в момент изменения оригинала приложение Visual FoxPro не открыто, обновление произойдет при первом же открытии приложения Visual FoxPro.
Нажмите кнопку ОК для закрытия диалогового окна Специальная вставка.
Ссылка на OLE-объект, запоминаемая в поле типа General (Общий), содержит имя файла (включая путь к нему) оригинала объекта на сервере. Если вы измените имя этого файла, перенесете или удалите его, связь разрывается. Для восстановления связи необходимо воспользоваться командой Links (Связи) из меню Edit.
Совет
Для изменения объекта в поле типа General (Общий) со связанного на внедренный необходимо удалить объект из поля с помощью команды Cut (Вырезать) из меню Edit (Правка), а после этого вставить объект обратно в поле, но без связывания.
Если OLE-объект был размещен со связью, диалоговое окно Связи позволяет изменить или удалить установленную связь (рис. 21.12). Для его просмотра откройте требуемую таблицу, перейдите в поле со связанным объектом и в меню Edit (Правка) выберите команду Links (Связи).
Рис. 21.12. Диалоговое окно Связи
В списке Связи представлены все связи объекта в табличном виде с указанием пути и имени файла источника, а также типа объекта и режима обновления связи.
В диалоговом окне размещены кнопки, назначение которых описано в табл. 21.1.
Таблица 21.1. Назначение кнопок диалогового окна Связи
Кнопка | Назначение |
Обновить сейчас | Обновляет выделенную связь |
Открыть источник | Открывает исходный файл для выделенной связи |
Сменить источник | Заменяет исходный файл для выделенной связи, с помощью диалогового окна Смена источника |
Разорвать связь | Разрывает указанную связь. В результате объект становится статическим, не допускающим изменения или обновления |
Передача данных из Visual FoxPro в другие приложения
Используя команды Export (Экспорт) и Import (Импорт) из меню File (Файл), можно осуществлять обмен данными между Visual FoxPro и текстовыми файлами, а также наиболее популярными базами данных и электронными таблицами.
Рис. 21.14. Диалоговое окно Export
Для экспорта данных из таблицы Visual FoxPro выполните команду Export (Экспорт) из меню File (Файл). Открывается диалоговое окно Export (Экспорт) (рис. 21.14), в котором из списка Туре (Тип) вам необходимо выбрать тип экспортируемого формата. Допустимые типы форматов приведены в табл. 21.2.
Таблица 21.2. Типы экспортируемых форматов
Тип | Кодовое обозначение | Назначение | |||
Visual FoxPro 3.0 (DBF) | Копирование одной таблицы в другую | ||||
FoxPro для Windows 2.x (DBF) | FOX2X | Экспорт в формат FoxPro для Windows 2.x | |||
FoxBASE+ (DBF) | FOXPLUS | Экспорт в формат FoxBASE+ | |||
dBASE IV (DBF) | Экспорт в формат dBASE IV | ||||
Delimited Text | Экспорт в текстовый файл с разделителями | ||||
Microsoft Excel 5.0 (XLS) | XL5 | Экспорт в формат электронной таблицы Microsoft Excel 5.0 | |||
Microsoft Excel 2.0, 3.0, and 4.0 (XLS) | XLS | Экспорт 8 формат электронных таблиц Microsoft 2.0, 3.0 и 4.0 | |||
Lotus 1-2-3 2.x (WK1) | WK1 | Экспорт в формат электронной таблицы Lotus 1-2-3 2.x | |||
Lotus 1-2-3 1-A (WKS) | WKS | Экспорт в формат электронной таблицы Lotus 1-2-3 1-А | |||
Symphony 1.10 (WR1) | WR1 | Экспорт в формат электронной таблицы Symphony 1.10 | |||
Symphony 1.01 (WRK) | WRK | Экспорт в формат электронной таблицы Symphony 1.01 | |||
MultiPlan 4.01 (MOD) | MOD | Экспорт в формат электронной таблицы MultiPlan 4.01 | |||
Data Interchange Format (DIF) | DIF | Экспорт в текстовый файл, используемый приложением VisiCalc | |||
System Data Format (SDF) | SDF | Экспорт в стандартный текстовый файл | |||
Symbolic Link Format | SYLK | Экспорт в текстовый файл, используемый электронной таблицей MultiPlan |
В поле ввода From (Из) диалогового окно Export (Экспорт) необходимо указать имя экспортируемой таблицы, а в поле То (В) — имя файла, в который будет записываться результат экспорта.
После того как вы указали имя исходной таблицы, становится доступной кнопка Options (Параметры), при нажатии на которой открывается диалоговое окно Export Options (Параметры экспорта) (рис. 21.15). В этом диалоговом окне для выбора записей таблицы, экспортируемых в выходной файл, вы можете использовать кнопки Scope (Граница), For (Для), While (Пока).
Рис. 21.15. Диалоговое окно Export Options
С помощью кнопки Fields (Поля) можно открыть диалоговое окно Field Picker (Выбор поля), в котором выбрать поля исходной таблицы для экспорта (рис. 2I.16).
Рис. 21.16. Диалоговое окно Field Picker
Передача данных в Microsoft Excel с помощью OLE
В рассматриваемом примере используем данные из таблицы Cntcust для построения диаграммы распределения клиентов по городам в программе Microsoft Excel с помощью OLE-объектов.
В меню File (Файл) выберите команду New (Новый), установите опиик Program (Программа) и нажмите кнопку New file (Новый файл). Откроется новое окно редактирования программ.
Для установления связи с Microsoft Excel, передачи в него данных и построения диаграммы введите следующие команды:
* Создание OLE-объекта
objExcelSheet=CreateObject("Excel.Sheet")
objExcelSheet.Application.Visible=.T.
objExcelSheet = objExcelSheet.Sheets[1]
* Передача данных из таблицы CntCust в Excel SELECT CNTCUST
nRow=0
SCAN
nRow=nRow+1
objExcelSheet.Cells(nRow,1).Value= CntCust.Город
objExcelSheet.Cells{nRow,2).Value=CntCust.Количество
ENDSCAN
objChart = objExcelSheet. ChartObjects.Add(100, 100, 400, 200)
* Выделение данных и создание диаграммы objExcelSheet.
ChartObjects(1).Chart.;
chartwizard(objExcelSheet.Range(objExcelSheet.Cells(1,1),;
objExcelSheet.Cells(nRow,2)),; -4100,4,1,0,1,1,"","","","")
* Копирование диаграммы в буфер обмена Windows objExcelSheet.ChartObjects(1).Select
obj ExcelSheet.ChartObj ects(1) .Copy
* Закрытие сервера objExcelSheet.application.quit release
objExcelSheet
Проверьте синтаксис и запустите программу на выполнение. Результат выполнения программы представлен на рис. 21.13.
Замечание
Наиболее простым способом формирования команд для выполнения действий над OLE-объектами является запись соответствующего макроса на сервере-приложении и использование текста этого макроса в Visual FoxPro.
Рис. 21.13. Создание диаграммы с помощью OLE
Редактирование OLE-объекта
Большинство OLE-объектов можно редактировать. Для этого откройте окно редактирования поля типа General (Общий), содержащее, например, такие OLE-объекты, как электронная таблица Microsoft Excel, документ Word или рисунок Paint, и дважды щелкните мышью. Откроется приложение-сервер для редактирования объекта.
Для редактирования точечных рисунков выберите команду Растровый рисунок Object (Объект) в меню Edit (Правка), а затем команду Изменить или Открыть, которые доступны в окне редактирования поля типа General (Общий). Для редактирования документа Word в меню Edit (Правка) появляется команда Документ Object, а для редактирования электронной таблицы — Лист Object (Объект).
Связывание и внедрение объектов, экспорт и импорт данных
В Visual FoxPro имеется возможность хранить в таблицах сами объекты или связь с объектами, которые созданы в приложении, поддерживающем механизм связывания и внедрения (OLE). Основное отличие между связыванием и внедрением состоит в том, каким образом данные запоминаются и обновляются после того, как их поместили в базу данных.
При связывании данные обновляются, когда изменяется исходный файл. Связанные данные запоминаются в исходном файле; в базе данных сохраняются только сведения о месте расположения исходного файла.
Внедренные объекты сохраняются в базе данных. Если установить на внедренный объект указатель и дважды щелкнуть мышью, откроется приложение, в котором объект был создан. В нем можно редактировать внедренный объект, при этом измененные данные записываются в базу данных.
Объект, который внедряется или связывается, называется OLE-объектом. Исходное приложение, в котором был создан OLE-объект, называется приложением-сервером, а приложение, в которое внедряется или с которым связывается OLE-объект, — приложением-клиентом.
Связывание OLE-объекта
Чтобы связать OLE-объект с основной копией объекта на сервере, можно воспользоваться командой Insert Object (Вставка объекта) или Paste Special (Специальная вставка) из меню Edit (Правка). Рассмотрим оба варианта.
Удаление OLE-объекта
Чтобы удалить OLE-объект из поля типа General (Общий), выполните команду Clear (Очистить) из меню Edit (Правка).
Visual FoxPro и OLE-объекты
В Visual FoxPro OLE-объекты могут храниться и отображаться только в полях типа General (Общий). Для внедрения OLE-объекта в таблицу Visual FoxPro выполните следующие действия:
Создайте в таблице, предназначенной для хранения OLE-объекта, поле типа General.
Откройте таблицу в режиме Browse (Обзор) (рис. 21.1), выполнив команду Browse (Обзор) из меню View (Вил) или нажав кнопку Browse (Обзор) окна проекта. Откроется окно просмотра таблицы.
Замечание
Если поле типа General (Общий) пусто, то при просмотре таблицы в нем появляется пометка gen. Если поле содержит OLE-объект, то пометка принимает вид Gen.
Рис. 21.1. Просмотр в режиме Browse таблицы, содержащей поля типа General
Для вставки OLE-объекта дважды щелкните на поле типа General (Общий), содержащем значение gen. Откроется окно редактирования этого поля (рис. 21.2).
В меню Edit (Правка) выберите команду Insert Object (Вставить объект). Откроется диалоговое окно Вставка объекта (рис. 21.3).
Это диалоговое окно содержит две опции, предоставляющие два варианта включения OLE-объекта:
Создать новый — позволяет создать новый OLE-объект и вставить его в поле;
Создать из файла — позволяет разместить в поле таблицы OLE-объект из файла.
Рис. 21.2. Окно редактирования поля типа General
Рис. 21.3. Диалоговое окно Вставка объекта
При установке опции Создать новый выберите из предложенного списка Тип объекта сервер, который хотите использовать для создания объекта, и нажмите кнопку ОК. Откроется приложение, в котором создайте объект, после чего вернитесь в Visual FoxPro.
Для использования существующего объекта установите опцию Создать из файла. Диалоговое окно примет другой вид. Воспользовавшись кнопкой Обзор, найдите необходимый файл и вставьте его содержимое в поле таблицы.
Замечание
В Visual FoxPro для хранения сложных текстов можно использовать поле типа General (Общий), внедрив в него или связав с ним документ текстового процессора.
Внедрение нового OLE-объекта
Рассмотрим процедуру внедрения нового OLE-объекта на примере поля glmage таблицы Goods:
В окне проекта установите курсор на таблицу Goods базы данных sales. Данная таблица содержит поле gimage типа General (Общий), в котором вы предполагаете разместить изображение товара.
Чтобы открыть окно просмотра, выполните команду Browse (Обзор) из меню View (Вид) или нажмите кнопку Browse (Обзор) окна проекта.
Для вставки OLE-объекта установите курсор на поле типа General (Общий) и дважды щелкните на нем. Откроется окно редактирования поля.
Выполните команду Insert Object (Вставить объект) из меню Edit (Правка).
В открывшемся диалоговом окне Вставка объекта в списке Тип объекта перечислены все OLE-серверы, установленные в вашей системе. В качестве примера выберите Рисунок Paintbrush.
Нажмите кнопку ОК. Visual FoxPro откроет указанное вами приложение и разместит его меню и панели инструментов в своем главном окне.
Создайте изображение товара, которое будет использовано в качестве нового OLE-объекта (рис. 21.4).
Закройте сервер OLE. Для этого щелкните в любом месте окна вне области редактирования, после чего созданный вами объект будет размещен в поле типа General (Общий) (рис. 21.5).
Если вам потребуется внести изменения во встроенный OLE-объект, откройте таблицу в режиме Browse (Обзор) и дважды щелкните на требуемом значении. В результате откроется окно редактирования поля типа General (Общий). Для редактирования изображения используется команда Точечный рисунок Object (Объект) из меню Edit (Правка).
Рис. 21.4. Создание изображения товара
Рис. 21.5. Размещение в поле таблицы нового OLE-объекта
Данная команда имеет собственное меню, которое содержит опции Изменить и Открыть, определяющие режим редактирования изображения (см. рис. 21.5). При выборе опции Изменить меню и панели инструментов OLE-сервера внедряются непосредственно в Visual FoxPro (см. рис. 21.4). При выборе опции Открыть открывается приложение OLE-сервера (рис. 21.6), в котором вы можете редактировать изображение поля типа General (Общий).
Рис. 21.6. Открытое приложение OLE-сервера для редактирования изображения
Внедрение OLE-объекта из файла
Для внедрения в поле таблицы OLE-объекта из файла выполните следующие действия.
Откройте таблицу в режиме Browse (Обзор).
Установите курсор на поле типа General (Общий) и дважды щелкните кнопкой мыши. Откроется окно редактирования поля.
В меню Edit (Правка) выберите команду Insert Object (Вставить объект).
В открывшемся диалоговом окне Вставка объекта установите опцию Создать из файла. Окно примет вид, представленный на рис. 21.7.
Рис. 21.7. Диалоговое окно Вставка объекта при установленной опции Создать из файла
Рис. 21.8. Вставленный видеоклип в поле типа General
Нажмите кнопку Обзор.
В открывшемся диалоговом окне Обзор выберите файл, содержащий необходимый объект. Для установки требуемого типа объекта необходимо использовать список Тип файлов, расположенный в нижней части диалогового окна. Выбрав файл, нажмите кнопку Открыть.
Возвратившись в диалоговое окно Вставка объекта, нажмите кнопку ОК. OLE-объект будет размещен. На рис. 21.8 показан вставленный видеоклип в поле типа General (Общий).
Именованное соединение
Удобным средством для работы с удаленными данными является именованное соединение, которое хранится в базе данных и на которое можно ссылаться по имени при создании удаленного представления. Вы также можете устанавливать свойства именованного соединения для оптимизации связи между Visual FoxPro и удаленным источником данных. При активизации удаленного представления его соединение становится каналом, ведущим к удаленному источнику данных.
Для создания именованного соединения выполните любое из следующих действий:
в диспетчере проектов из списка Databases (Базы данных) выберите раздел Connections (Соединения) (рис. 22.4), затем нажмите кнопку New (Новый), чтобы вызвать конструктор соединений;
откройте базу данных и используйте команду create connection, чтобы открыть конструктор соединений;
используйте команду create connection (Создать соединение) с именем соединения в качестве параметра.
Рис. 22.4. Раздел Connections списка Database
Использование команды CREATE SQL VIEW
Для создания удаленных представлений данных вы можете использовать команду create sql view, синтаксис которой приведен ниже:
CREATE SQL VIEW [имяПредставления] [REMOTE]
[CONNECTION имяСоединения
|CONNECTION имяИсточникаДанных]
Для создания удаленного представления данных необходимо указать признак удаленного представления с помощью ключевого слова remote. Имя удаленного соединения или источника данных задается с помощью параметра CONNECTION.
Вы также можете задать определение представления с помощью SQL-выражения, им может быть любой допустимый оператор sql select, который не следует заключать в кавычки.
Например, чтобы создать удаленное представление данных для таблицы Goods, расположенной в базе данных Microsoft SQL Server и для которой определено соединение SQLServer, вы можете использовать следующие команды:
OPEN DATABASE SALES
CREATE SQL VIEW SQLServerGoods
CONNECTION SQLServer
AS SELECT * FROM GOODS
Использование конструктора представлений
Для создания удаленного представления с помощью конструктора представлений в диспетчере проектов из списка Databases (Базы данных) выберите раздел Remote Views (Удаленные представления), а затем нажмите кнопку New (Новый). На экране появится диалоговое окно выбора источника данных Select Connection or Data Source (Выбрать соединение или источник данных) (рис. 22.16).
Выберите источник данных или соединение, введите идентификатор и пароль доступа к базе данных. Далее, как и при создании локального представления данных, выберите используемые в представлении данных таблицы и поля выбранных таблиц (рис. 22.17).
При создании удаленных представлений данных необходимо обратить внимание на вкладку Update Criteria (Критерии обновления), в которой задаются условия обновления представлений.
Рис. 22.16. Диалоговое окно Select Connection or Data Source
Рис. 22.17. Выбор полей представления данных
На этой вкладке из списка Table (Таблица) выбирается таблица, для которой определяются установки вкладки Update Criteria (Критерии обновления). Флажок Send SQL updates (Отправить SQL-обновление) указывает, должны ли данные в действительности обновляться на диске.
Область SQL WHERE clause includes (Включение в запрос операторов предложения WHERE) содержит опции, позволяющие задать способ формирования предложения where (табл. 22.7).
Таблица 22.7. Опции области SQL WHERE clause includes
Опция | Назначение | ||
Key fields only (Только ключевые поля) | Указывает, что предложение where, используемое для обновления удаленных таблиц, включает только поля, входящие в список Field name (Имя поля) | ||
Key and updateable fields (Ключевые и доступные для изменения поля) | Указывает, что предложение where, используемое для обновления удаленных таблиц, включает поля, входящие в список Field name (Имя поля), а также все обновляемые поля | ||
Key and modified fields (Ключевые и модифицированные поля) | Указывает, что предложение where, используемое для обновления удаленных таблиц, включает поля, входящие в список Field name (Имя поля), и все остальные изменившиеся поля | ||
Key and timestamp (Ключевые поля и отметки времени) | Указывает, что предложение where, используемое для обновления удаленных таблиц, включает первичные поля, входящие в список Field name (Имя поля), а также сравнение по отметкам времени |
В области Update using (Строка обновления) задается способ обновления полей на сервере базы данных (табл. 22.8).
Таблица 22.8. Опции области Update using
Опция | Назначение | ||
SQL DELETE then INSERT | Указывает, что сначала исходная запись таблицы базы данных будет удалена, а затем будет добавлена новая запись | ||
SQL UPDATE | Указывает, что запись таблицы базы данных будет модифицироваться |
Использование мастера удаленных представлений
Мастер удаленных представлений создает представления с использованием удаленных данных (ODBC). Предлагая ответить на ряд простых вопросов, мастер помогает вам выполнить процедуру в несколько этапов; при этом вы должны задать базы данных, таблицы и поля, которые хотите использовать в своем представлении. Перед этим вы должны создать базу данных, в которой будет сохранено представление, а также определить источник данных или соединение.
Для запуска мастера удаленных представлений в меню Tools (Сервис) выберите команду Wizards (Мастера), а затем опцию Query (Запрос), потом в открывшемся диалоговом окне Wizard Selection (Выбор мастера) выберите значение Remote View Wizard (Мастер удаленного представления) (рис. 22.9).
Рис. 22.9. Выбор мастера удаленных представлений
На первом шаге вы выбираете источник данных из списка имеющихся источников данных или созданных вами именованных соединений (рис. 22.10).
Рис. 22.10. Выбор источника данных
Если удаленный источник данных требует идентификации пользователя, то на экране открывается диалоговое окно ввода имени пользователя и пароля (рис. 22.11).
Рис. 22.11. Ввод имени пользователя и пароля
Введите имя пользователя и пароль входа в базу данных. После этого откроется диалоговое окно выбора полей (рис. 22.12), помещаемых в создаваемое представление. Вы можете выбирать поля из нескольких таблиц или представлений базы данных, с которой вы соединились. Вначале выберите одну таблицу и перенесите поля выбранной таблицы в список Selected Fields (Выбранные поля), а затем выберите поля из другой таблицы или другого представления.
Рис. 22.12. Выбор полей удаленного представления
Если вы выберете более одной таблицы, вам необходимо определить отношения между таблицами (рис. 22.13). Для этого выберите нужные поля из приведенных списков и нажмите кнопку Add (Добавить).
Рис. 22.13. Определение отношения между таблицами
На следующих двух шагах создания удаленного представления укажите порядок сортировки информации и фильтр для ограничения выбираемых данных.
Комбинирование в представлении локальных и удаленных данных
Актуальной задачей при разработке приложений, использующих удаленные данные, является комбинирование в представлении локальных и удаленных данных. В Visual FoxPro данная задача решается достаточно просто. Прежде всего, вы должны создать удаленные представления для данных, которые будут использоваться совместно с локальными.
Рис. 22.20. Комбинирование данных из таблиц Visual FoxPro и Microsoft SQL
Рис. 22.21. Просмотр комбинированных данных
Затем в диспетчере проектов выберите раздел Local Views (Локальные представления) и нажмите кнопку New (Новый), чтобы открыть конструктор представлений. Добавьте в новое представление любую комбинацию таблиц, локальных и удаленных представлений. Например, вы можете объединить в одном представлении данные из локальной таблицы Ordsaied и удаленного представления данных Microsoft SQL, содержащего список товаров. На рис. 22.20 вы видите комбинированное представление в окне конструктора представлений, а на рис. 22.21 — то же представление в режиме просмотра.
Для создания комбинированного представления вы можете использовать также команду create sql view. Например, чтобы создать локальное представление, комбинирующее информацию из локальной таблицы ordsaiem и удаленной таблицы customer (расположенной на сервере базы данных SQLServer), используйте следующий код:
OPEN DATABASE SALES
CREATE SQL VIEW localORDSALEM_remoteCUSTOMER;
AS SELECT * FROM SQLSERVERCUSTOMER, ORDSALEM
WHERE SQLSERVERCUSTOMER.iCdCustomer =
ORDSALEM. iCdCus tomer
Конструктор соединений
Окно конструктора соединений (рис. 22.5) позволяет вам задать параметры именованного соединения в интерактивном режиме.
Область Specify data source (Определить источник данных) содержит опции Data source, userid, password (Источник данных, идентификатор пользователя, пароль) и Connection string (Строка соединения), определяющие способ соединения с источником данных. При выборе первой опции в области отображаются поля ввода (табл. 22.1).
Таблица 22.1. Назначение полей ввода области Specify data source
Поле | Назначение | ||
Data source (Источник данных) | Имя источника данных из списка установленных источников данных ODBC | ||
Userid (Идентификатор пользователя) | Идентификатор пользователя для выбранного источника данных | ||
Password (Пароль) | Пароль пользователя | ||
Database (База данных) | Имя базы данных |
Рис. 22.5. Окно конструктора соединений
При выборе опции Connection string (Строка соединения) вместо приведенных выше полей ввода отображается только одно поле ввода Connect string (Строка соединения), в котором можно ввести строку соединения с источником данных.
Кнопка Verify Connection (Проверить соединение) предназначена для проверки соединения с указанным источником данных. Кнопка New Data Source (Новый источник данных) позволяет определить новый источник данных непосредственно из конструктора соединений.
Область Display ODBC login prompts (Отображение окна доступа к ODBC-источнику) содержит опции, определяющие, когда будет открываться диалоговое окно Data Source Login (Доступ к источнику данных) (табл. 22.2).
Таблица 22.2. Опции области Display ODBC login prompts
Наименование | Назначение | ||
When login info is not specified (Когда параметры доступа не определены) | Диалоговое окно Data Source Login (Доступ к источнику данных) открывается только в том случае, если заданный идентификатор пользователя и пароль не найдены в определении именованного соединения | ||
Always (Всегда) | Указывает, что Visual FoxPro всегда открывает для пользователя диалоговое окно Data Source Login (Доступ к источнику данных), в котором можно выбрать другой регистрационный идентификатор и другой пароль из числа хранящихся в именованном соединении | ||
Never (Никогда) | Указывает, что Visual FoxPro никогда не открывает диалоговое окно входа в базу данных |
В области Data processing ( Обработка данных) определяются свойства, связанные с обработкой данных соединения (табл. 22.3).
Таблица 22.3. Опции области Data processing
Наименование | Назначение |
Asynchronous execution (Асинхронное выполнение) |
Задает признак асинхронного соединения |
Display warnings (Показывать предупреждения) | Задает признак отображения не перехватываемых предупреждений |
Batch processing (Пакетная обработка данных) | Задает пакетный режим обработки данных |
Automatic transactions (Автоматические транзакции) |
Задает автоматическую обработку транзакций |
Packet size (Размер пакета данных) | Задает размер пакета данных, передаваемого от сервера базы данных |
Для определения значений параметров области Data processing (Обработка данных) вы можете использовать функцию dbsetprop ().
Область Timeout intervals (Интервалы времени) содержит опции, устанавливающие временные параметры обработки данных (табл. 22.4).
Таблица 22.4. Опции области Timeout intervals
Наименование | Назначение |
Connection (sec) (Соединение) |
Задает интервал тайм-аута соединения в секундах |
Query (sec) (Запрос) | Задает интервал тайм-аута запроса в секундах |
Idle (min) (Холостой режим) | Задает интервал тайм-аута холостого режима в минутах. Активные соединения по истечении этого интервала времени де-активизируются |
Wait time (ms) (Время ожидания) |
Задает промежуток времени в миллисекундах, по истечении которого Visual FoxPro может определить, завершено ли выполнение оператора SQL |
Для определения значений параметров области Data processing (Обработка данных) вы можете использовать функцию dbsetprop ().
По умолчанию для именованного соединения задается имя Connect 1. При закрытии окна конструктора соединений открывается диалоговое окно Save (Сохранить) (рис. 22.6), предлагающее ввести подходящее имя соединения.
Рис. 22.6. Ввод имени соединения
Все созданные вами именованные соединения отображаются в разделе Connections (Соединения) списка Database (База данных). Например, на рис. 22.7 приведены именованные соединения с источниками данных Access, Microsoft SQL Server и Microsoft Excel.
Для изменения параметров именованного соединения выберите требуемое соединение и нажмите кнопку Modify (Модифицировать). Откроется окно конструктора соединений, в котором вы можете изменить любые параметры соединения.
Рис. 22.7. Именованные соединения
Настройка параметров удаленных представлений и соединений в диалоговом окне Options
Прежде чем запускать мастера удаленных представлений, вы можете установить опции для принимаемых по умолчанию параметров удаленных представлений и соединений, используя вкладку Remote Data (Удаленные данные) диалогового окна Options (Параметры) (рис. 22.8).
Область Remote view defaults (Удаленное представление по умолчанию) содержит параметры (табл. 22.5), используемые по умолчанию при создании удаленных представлений:
Таблица 22.5. Параметры удаленного представления
Параметр | Описание | ||
Share connection (Совместное подключение) | Указывает, что в новых представлениях будет использоваться текущее совместно используемое соединение | ||
Fetch memo (Выборка Memo-поля) | Указывает, что Memo-поле не будет выбираться из источника данных до тех пор, пока оно не будет активизировано в представлении данных | ||
SQL updates: Criteria (Критерии SQL-обновления) | Задает критерий обновления данных | ||
SQL updates: Method (Метод SQL-обновления) | Задает метод обновления данных | ||
Records to fetch at a time (Выборка записей за промежуток времени)_ | Задает количество записей, возвращаемых за один раз из удаленного источника данных | ||
Maximum records to fetch (Максимальная выборка записей за промежуток времени) | Ограничивает общее число записей, возвращаемых в представлении | ||
Use memo for fields (Использовать перевод символьных данных в Meмо-поля) >= | Задает условие преобразования длинных символьных полей в Memo-поля в выводе представления | ||
Records to batch update (Количество обновляемых одновременно записей) | Задает число записей, подлежащих обновлению в одной команде |
Рис. 22.8. Настройка параметров удаленных представлений и соединений
Область Connection defaults (табл. 22.6) содержит параметры, используемые при создании именованных соединений:
Таблица 22.6. Параметры именованного соединения
Параметр | Описание | ||
Asynchronous execution (Асинхронное выполнение) | Задает признак асинхронной обработки | ||
Display warnings (Показывать предупреждения) | Задает режим выдачи предупреждающих сообщений | ||
Batch processing (Пакетная обработка) | Обеспечивает пакетную обработку. Если установить этот переключатель, Visual FoxPro не будет возвращать результаты вызова sqlexec () до тех пор, пока не поступят все отдельные результирующие наборы | ||
Automatic transactions (Автоматические транзакции) | Определяет, каким образом соединение управляет ходом транзакций в удаленной таблице | ||
Show login (Показывать окно приглашения) | Отображает диалоговое окно ввода регистрационного приглашения только в том случае, если в определении соединения или представления не задана информация регистрации | ||
Connection timeout (sec) (Ожидание соединения) | Задает интервал времени (в секундах), в течение которого допускается ожидание установки соединения с удаленным сервером. Если в течение этого времени соединение не устанавливается, Visual FoxPro генерирует ошибку | ||
Idle timeout (min) (Холостой режим) | Задает интервал времени (в минутах), в течение которого допускается простаивание, прежде чем соединение будет прекращено. Если в течение этого времени не был сделан запрос к серверу, Visual FoxPro разрывает соединение. Однако если сделать запрос к серверу по истечении интервала тайм-аута для соединения, Visual FoxPro автоматически попытается его восстановить | ||
Query timeout (sec) (Ожидание запроса) | Задает интервал времени (в секундах), в течение которого допускается ожидание от сервера ответа на запрос. Если сервер тратит на обработку больше заданного числа секунд, Visual FoxPro генерирует ошибку | ||
Wait time (ms) (Время ожидания завершения запроса) | Задает интервал времени (в миллисекундах) между проверками на завершение запроса |
Настройка представления с помощью словаря базы данных
Так как сведения о представлении хранятся в словаре базы данных, вы можете определить для него следующие свойства:
заголовок поля;
комментарии для представления его полей;
значения полей, принимаемые по умолчанию;
правила проверки достоверности данных на уровне поля и записи.
Для определения свойств полей представления данных в окне конструктора представления перейдите на вкладку Fields (Поля) и нажмите кнопку Properties (Свойства). Откроется диалоговое окно View Field Properties (Показать свойства поля) (рис. 22.22).
Раскрывающийся список Field (Поле) в этом диалоговом окне содержит перечень всех полей представления. Для определения свойств поля необходимо сначала выбрать его из этого списка.
В области Field validation (Проверка достоверности данных поля) вы можете задать условия проверки достоверности данных на уровне поля при вводе данных (табл. 22.9).
Рис. 22.22. Определение свойств полей представления данных
Таблица 22.9. Опции области Field validation
Поле | Назначение | ||
Rule (Правило) | Задает правило проверки достоверности данных на уровне поля | ||
Message (Сообщение) | Задает сообщение об ошибке, которое будет выдаваться, если введенные данные не согласуются с правилом уровня поля | ||
Default value (Значение по умолчанию) | Задает для поля значение по умолчанию |
Для удаленных данных правило проверки достоверности данных на уровне поля задается средствами сервера базы данных. Вы можете задать локальное правило для:
уменьшения времени отклика системы;
уменьшения загрузки сетевых ресурсов;
проверки данных перед их пересылкой удаленному источнику данных.
Visual FoxPro не сравнивает локальное и удаленное правило проверки дос-товерности данных.
В области Display (Отобразить) вы можете задать условия проверки достоверности данных на уровне поля при отображении и вводе данных (табл. 22.10).
Таблица 22.10. Опции области Display
Поле | Назначение | ||
Format (Формат) | Задает формат отображения данных. Этот формат используется в окне Browse, отчетах и формах | ||
Input mask (Маска ввода) | Задает маску ввода данных | ||
Caption (Описание) | Задает описательное имя поля. Название изображается в качестве заголовка столбца при просмотре таблицы. Оно может включать до 128 символов |
Если вы планируете использовать представление данных в формах, то можете использовать опции области Map field type to classes (Установить соответствие между типами полей и классами) для задания типа объекта управления, создаваемого в форме при размещении данного подя.
Для удаленных представлений данных вы можете определить тип и размер поля представления данных. Используйте для этого опции области Data mapping (Соответствие типов данных).
Поле редактирования Comment (Комментарий) содержит описательный комментарий о данном поле. Все, что вы здесь введете, при выборе поля будет отображено в качестве описания в нижней части диспетчера проектов.
Замечание
Для определения свойств полей представления данных вы можете использовать функцию DBSETPROP ( ) .
Определение источника данных ODBC
После установки драйвера ODBC вы можете определить для него один или несколько источников данных ODBC.
Для добавления источника данных ODBC выполните следующие действия:
Выберите в Панели управления Windows папку Администрирование и в ней пиктограмму Источники данных (ODBC).
Далее в диалоговом окне ODBC Data Source Administrator (Администрирование источника данных ODBC) (рис. 22.1) нажмите кнопку Add (Добавить).
На экране появится диалоговое окно Create New Data Source (Создать новый источник данных) (рис. 22.2). Выберите нужный драйвер из представленного в диалоговом окне списка и нажмите кнопку Готово.
В следующем диалоговом окне (рис. 22.3) установите необходимые значения параметров соединения и нажмите кнопку ОК.
Рис. 22.1. Диалоговое окно ODBC Data Source Administrator
Рис. 22.2. Диалоговое окно Create New Data Source
Замечание
Вид диалогового окна настройки параметров соединения зависит от типа источника данных. Тем не менее для всех источников данных необходимо в поле ввода Name (Имя) указать имя источника данных, которое в дальнейшем используется для ссылки на источник данных. Поле ввода Description (Описание) содержит краткое описание источника данных. Если при определении значений остальных полей возникнут проблемы, обратитесь к администратору базы данных, к которой вы собираетесь определить доступ.
Рис. 22.3. Диалоговое окно определения параметров соединения
Особенности использования удаленных представлений данных для электронных таблиц Microsoft Excel
При использовании ODBC-драйвера Microsoft Excel для создания удаленного представления данных создается таблица Visual FoxPro или курсор. Эта таблица содержит выбранные данные из электронной таблицы Microsoft Excel. Однако если ячейка таблицы содержит текст, в таблице Visual FoxPro он отображается в виде Memo-поля (рис. 22.18).
Это связано с тем, что ODBC-драйвер передает текстовые данные в виде строки длиной 255 символов. Так как Visual FoxPro не может отображать в текстовом поле более 254 символов, любые текстовые данные помещаются в Memo-поле. Приемлемым решением этой проблемы является создание новых текстовых полей и копирование в них информации из Memo-полей командой, аналогичной следующей:
REPLACE ALL sqlchar WITH TRIM(sqlmemo)
Замечание
При обновлении данных в многоуровневом представлении изменения отражаются в том представлении, на котором основано представление верхнего уровня. Если нужно обновить базовые таблицы многоуровневого представления, то необходимо применить команду tableupdate для каждого представления многоуровневой структуры.
Рис. 22.18. Просмотр представления данных для электронной таблицы Microsoft Excel
Замечание
Visual FoxPro автоматически выполняет команду tableupdate при закрытии представления. При этом представления верхнего уровня закрываются первыми, поэтому вам придется обновлять представления с каждого верхнего уровня на каждый последующий нижний уровень. После закрытия последнего (самого нижнего уровня) представления базовые таблицы для данных представлений будут содержать полный список всех выполненных обновлений.
Совместно используемые соединения
При создании удаленных представлений вы можете воспользоваться совместно используемыми соединениями. В этом случае одно активное соединение используется как информационный канал для нескольких удаленных представлений.
При совместном использовании активного соединения:
уменьшается нагрузка на ресурсы системы;
уменьшается количество связей на удаленном сервере;
уменьшаются накладные расходы на связи с серверами.
Для определения разделяемого соединения воспользуйтесь любым из приведенных ниже способов.
В диспетчере проектов выберите в меню Tools (Сервис) команду Options (Параметры). Откройте вкладку Remote Data (Удаленные данные), установите флажок Share Connection (Совместное подключение), расположенный в области Remote View Defaults (Значение по умолчанию для удаленных представлений), и нажмите ОК.
В окне конструктора представлений в меню Query (Запрос) выберите команду Advanced Options (Дополнительные параметры) и в открывшемся диалоговом окне Advanced Options (Дополнительные параметры) установите флажок Share Connection (Совместное подключение) (рис. 22.19).
Используйте команду create sql view с ключевым словом share.
Рис. 22.19. Диалоговое окно Advanced Options
Создание удаленного представления данных
После того как был определен источник данных или именованное соединение, можно создать удаленное представление. Для этого выполните следующие действия:
откройте базу данных и вызовите мастера удаленных представлений;
в диспетчере проектов из списка Databases (Базы данных) выберите раздел Remote Views (Удаленные представления), затем нажмите кнопку New (Новый) для вызова конструктора представлений;
используйте команду create sql view с предложением remote и/или CONNECTION.
Рассмотрим каждый из этих вариантов создания удаленного представления данных на примерах использования электронной таблицы Microsoft Excel и базы данных Microsoft SQL Server.
Удаленные представления данных
Информация, используемая в разрабатываемом приложении, может находиться не только в таблицах Visual FoxPro, но и в электронных таблицах Microsoft Excel, в текстовом виде, в файлах базы данных Paradox или же на сервере базы данных типа SQL Server. Такие данные называются удаленными данными, несмотря на то, что они могут находиться даже на одном компьютере с Visual FoxPro.
Для доступа к удаленным данным используется стандартный протокол доступа к базам данных (ODBC). Все базы данных, а также электронные таблицы имеют драйверы ODBC, с помощью которых вы можете соединяться с ними и получать доступ к их содержимому.