|
Программирование >> Разработка пользовательского интерфейса
этого поля в .F. В таком случае данные поля этого типа будут выводиться только при прямом обращении к ним. По умолчанию имеет значение .T.. Доступно для чтения и записи. MaxRecords N Устанавливает максимальное значение, которое выбирается в представлении. По умолчанию равно 1, то есть выбираются все записи. Если установить это значение равным 0, то не будут выводиться никакие результаты. Доступно для чтения и записи. C Правило проверки вводимых данных уровня записи. Доступно для чтения и записи. C Сообщение, выводимое на экран при нарушении правил проверки ввода уровня записи. Доступно для чтения и записи. L Eсли установлено в .T., то изменения будут посылаться в исходные таблицы. Доступно для чтения и записи. N Равно 1, если представление использует только локальные таблицы. Равно 2, если представление использует внешние таблицы. Доступно только для чтения. C Возвращает строку запроса, который выбирает данные для представления. Доступно только для чтения. C Разделенный пробелом список таблиц, участвующих в выборке представления Доступно только для чтения. UpdateType N Равняется 1, если старые данные в исходных таблицах модифицируются, 2 - если данные вначале удаляются, а затем добавляются. Доступно для чтения и записи. WhereType N Определяет, по какому принципу будет происходить поиск записи в исходных таблицах при модификации данных в представлении. 1 - Только по ключевым полям. Можно использовать DB KEY из Foxpro.h 2 - По ключевым полям и полям, разрешенным для изменений. Можно использовать DB KEYANDUPDATABLE из Foxpro.h 3 - По ключевым и измененным полям. Используйте DB KEYANDMODIFIED из Foxpro.h 4 - Используется только для внешних представлений. Сравнение проводится по полю TIMESTAMP, если оно поддерживается во внешнем представлении. RuleExpression RuleText SendUpdates SourceType SQL Tables К открытому в текущий момент представлению для установки его свойств применяется функция CURSORSETPROP(). И, соответственно, функция CURSORGETPROP() для чтения свойств представления. Обращаем внимание, что эти две функции работают с любыми курсорами, открытыми в любой рабочей области. Курсоры могут отображать как данные из представлений, так и данные из таблиц. При этом таблицы могут быть свободными, то есть не принадлежать никакой из баз данных. Многие свойства можно изменять как с помощью функции DBSETPROP(), так и с помощью функции CURSORSETPROP(). Есть некоторые свойства, которые характерны только для курсора, такие как Database, которое доступно только для чтения и указывает полный путь к базе данных, служащей контейнером для объекта, данные из которого отображает курсор. Если в свойствах полей представления не указаны ключевые и разрешенные для модификации поля, то можно указать их для уже активного курсора. Например, вы можете проверить для активного курсора представления с помощью функции CURSORGETPROP() наличие ключевого поля и в случае отсутствия установить: USE Account and customer If LEN(ALLT(CURSORGETPROP( keyfieldlist ))) = 0 =CURSORSETPROP( keyfieldlist ,; account.account,customer.name customer ) ENDIF Аналогичным способом мы можем проверить наличие полей, разрешенных для модификации и переустановить их, помня при этом, что сначала мы должны иметь ключевые поля для каждой таблицы, участвующей в построении представления. Таким образом мы можем дописать предыдущий пример: USE Account and customer IF LEN(ALLT(CURSORGETPROP( keyfieldlist )))=0 =CURSORSETPROP( keyfieldlist ,; account,name customer ) ELSE IF LEN(ALLT(CURSORGETPROP( updatablefieldlist ) = 0 =CURSORSETPROP( updatablefieldlist ,; key customer,selled,summa,; name customer,address ) ENDIF ENDIF Но это еще не все, так как необходимо установить свойство UpdatenameList, которое служит для связи между полями в представлении и полями в исходных таблицах. И помимо этого обязательно установите свойство SendUpdates. В итоге для рассматриваемого случая мы получаем следующую процедуру: USE Account and customer IF LEN(ALLT(CURSORGETPROP( keyfieldlist )))=0 =CURSORSETPROP( keyfieldlist ,; account,name customer ) ELSE IF LEN(ALLT(CURSORGETPROP( updatablefieldlist )=0 =CURSORSETPROP( updatablefieldlist ,; key customer,selled,summa,; name customer,address ) =CURSORSETPROP( updatenamelist ,; key customer account.key customer,; selled account.selled,summa account.summa,; name customer customer.name customer,; address customer.address ) ENDIF ENDIF =CURSORSETPROP( SendUpdates ,.T.) В следующем примере программным путем создается представление c помощью запроса к двум таблицам: Account и Customer. C помощью функции DBSETPROP() назначаются свойства установки ключевого поля и свойства, устанавливающие возможность модификации полей в исходных таблицах. IF NOT DBUSED( auto store ) OPEN DATABASE auto store ENDIF CREATE SQL VIEW Account and customer ; AS SELECT Account.*, Customer.name customer, ; Customer.address; FROM auto store!account , auto store!customer ; WHERE Customer.key customer = Account.key customer; AND Account.selled = .f. =DBSETPROP( account and customer.account ,; FIELD , KeyField ,.T.) =DBSETPROP( account and customer.name customer ,; FIELD , KeyField ,.T.) =DBSETPROP( account and customer.date write ,; FIELD , Updatable ,.T.) =DBSETPROP( account and customer.selled ,; FIELD , Updatable ,.T.) =DBSETPROP( account and customer.summa ,; FIELD , Updatable ,.T.) = DBSETPROP( account and customer.address ,; FIELD , Updatable ,.T.) USE Account and customer =CURSORSETPROP( SendUpdates ,.T.) =CURSORSETPROP( WhereType ,3) GO 3 REPLACE selled WITH .T. SKIP -1 SELECT Account BROWSE В Visual FoxPro существует понятие буферизации, установку которой контролирует свойство Buffering. Значение этого свойства можно менять с помощью функции CURSORSETPROP() и читать с помошью функции CURSORGETPROP(). Свойство Buffering может принимать пять значений: 1. - отсутствие какой-либо буферизации. 2. - пессимистическая буферизации записи. При этом значении блокируется редактируемая запись. Блокировка автоматически снимается, и изменения записываются на диск, как только пользователь переходит на другую запись или закрывает таблицу. Другим способом записи изменений на диск может служить использование функции TABLEUPDATE(). 3. - оптимистическая буферизация записи. Запись блокируется только в то время, когда она записывается на диск. Для представлений эта блокировка является значением по умолчанию. 4. - пессимистическая буферизация таблицы. Как только вы начинаете редактирование, блокируется вся таблица. При этом запись на диск может произойти только при вызове функции TABLEUPDATE() или закрытии таблицы. 5. - оптимистическая буферизация таблицы. Таблица блокируется в момент записи изменений на диск. Для записи изменений на диск надо либо вызвать функцию TABLEUPDATE(), либо закрыть таблицу. 7.5. Запросы в Microsoft Access В этом параграфе вы изучите методику построения разнообразных типов запросов в Access. Узнаете о возможностях визуального инструментария и способах использования для построения запросов макрокоманд и объектов DAO. Запросы, без преувеличения, являются главным инструментом работы с данными в Access. Бесспорно, вы можете создать одну таблицу с огромным количеством полей, с помощью Мастера изготовить форму для работы с ней и посчитать, что приложение готово. При этом можно сказать, что существует определенный круг задач, для которых такая технология вполне приемлема. Но мы будем рассматривать другие, более распространенные случаи и задачи, которые лучше решать с помощью запросов. И уже на основе запросов в дальнейшем мы будем строить формы. Access предоставляет нам несколько способов создания запросов. Самый распространенный -создание запросов с помощью Конструктора запросов. Количество видов запросов, которые мы можем создавать с помощью Конструктора, впечатляет и резко выделяет Access среди других продуктов. Из Конструктора запросов легко перейти в режим редактора SQL либо в табличный режим, где мы можем просмотреть результаты запросов. Режим редактора выражений SQL мы будем рассматривать как второй способ создания запросов. Некоторые профессионалы на начальном этапе изучают Конструктор запросов методом от противного . То есть пишут запрос вручную, а потом выходят в режим Конструктора. Новичкам имеет смысл почаще делать обратную операцию, то есть создавать запросы в Конструкторе и переходить в режим редактора, для того чтобы лучше изучить синтаксис SQL. Третий способ - это программный способ создания запросов с помощью объектов доступа к данным (DAO). Для этого используется объект QueryDef, который и хранит в себе описание SQL запроса. Последний способ - создание строки запроса и выполнение его с помощью команды DoCmd.RunSQL. Этот способ достаточно популярен, при этом база данных становиться более компактной, так как описание запроса хранится в виде строки кода, а не в виде описания объекта. Его недостатком является то, что мы не можем получить таким образом объект Recordset. В то же время, этот способ прекрасно годится для создания и выполнения запросов действий (Update, Delete, Insert), так как часто приходится скрывать от пользователя суть динамики изменения наборов данных. Хранение запросов модификации в базе данных, если мы не хотим, чтобы пользователь без необходимости запускал эти запросы, заставляет нас думать об
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |