Анимация
JavaScript
|
Главная Библионтека "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), так как часто приходится скрывать от пользователя суть динамики изменения наборов данных. Хранение запросов модификации в базе данных, если мы не хотим, чтобы пользователь без необходимости запускал эти запросы, заставляет нас думать об Выбрать в меню Вставка команду Запросы. При этом надо помнить, что меню Access изменяется в зависимости от того, какой объект активен в данный момент. Если, например, вы находитесь в режиме редактирования таблицы, то меню Вставка не содержит пункт Запросы. Выполнить шаги 3 и 4 из предыдущей последовательности действий. При использовании второго способа можно еще более облегчить свой труд. Для этого, находясь на странице Таблицы Контейнера базы данных, выберите таблицу, которую собираетесь использовать в запросе, как это показано на рис. 7.6. После этого выберите команду Запросы меню Вставка. Вы попадете в Конструктор запросов с уже выбранной таблицей, графический образ которой будет присутствовать в верхней половине Конструктора. DTiuiMH I з/шйы I ЕЕ .....II.....!......ИМШИШ I I I -1-tsmrr Рис. 7.6. Здесь необходимо отметить, что запросы можно создавать не только к таблицам, но и к уже существующим запросам. Если есть необходимость, то вы можете комбинировать табличные данные и данные уже существующего запроса в новом запросе. В диалоговом окне Добавление таблицы присутствуют три вкладки: Таблицы, Запросы и Таблицы и Запросы. С их помощью вы можете ограничить необходимые вам объекты только таблицами, только запросами, либо, напротив, включить в список как таблицы, так и запросы (рис. 7.7). ограничении доступа. Поэтому логичней хранить запрос в строчках кода. Для создания запросов с помощью Конструктора необходимо выполнить одну из следующих последовательностей действий: 1. Перейти на страницу Запросы в Контейнере базы данных. 2. Нажать кнопку Создать. 3. В появившемся диалоге выбора таблиц выбрать нужные таблицы. 4. Связать таблицы, если они не связаны, постоянно хранимой связью, зарегистрированной в базе данных. Либо 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 [ 76 ] 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |