Анимация
JavaScript
|
Главная Библионтека
Рис. 7.16. Для поля key customer выбираем пару значений соответственно "Группировка/Заголовки столбцов". Поле summa будет давать нам информацию о сумме покупок по конкретному счету, поэтому групповой операцией для него станет функция агрегирования SUM(), а в перекрестной таблице оно будет представлять собой искомое значение (см. рис. 7.16). В итоге у нас получится следующий результат. Account 101 102 103 104 10000 12300 13000 55000 70000 52000 Обратите внимание на полученное выражение. Ключевые слова TRANSFORM и PIVOT не поддерживаются в стандарном SQL. Поэтому следующий ниже запрос или ему подобные вы можете построить только в Access. TRANSFORM SUM(Account.summa) AS Sum summa SELECT Account.account FROM Account GROUP BY Account.account PIVOT Account.key customer; До сих пор мы рассматривали типы запросов, которые легко создать как визуально, так и в окне режима SQL. Но есть несколько типов запросов, которые невозможно создать с помощью Конструктора. В меню Запросы есть пункт Запрос SQL, который дает нам доступ к трем командам. Команда объединения позволяет нам создавать запрос, который будет создавать результирующий набор данных на основе результатов двух запросов. Например: SELECt first,second FROM tableone UNION SELECT first,second FROM tabletwo В вышеприведенном примере две таблицы имеют поля одинакового типа (непременное условие), поэтому поочередное выполнение двух запросов и объединение их результатов с помощью оператора UNION дает нам вполне легкое решение, которое и выполняется достаточно сделать выборку. Иногда бывает очень жаль потраченных усилий. Таким образом, если мы выбрали для поля account значение "Группировка", то значением строки "Перекрестная таблица" лучше выбрать "Заголовки строк" или "Заголовки столбцов", либо вообще не выводить его, но при этом обязательно добавить еще одно поле, в котором значение строки "Групповая операция" должно быть "Группировка". В нашем примере, как видно из рис. 7.16, мы выбрали значение "Заголовки строк". быстро. В случае отсутствия поля подходящего типа в одной из таблиц запрос можно переписать следующим образом (предполагается, что поле second имеет тип Long): SELECT first,second From tableone UNION SELECT first,0 FROM tabletwo Как видите, достаточно просто подставить константу подходящего типа. Следующую команду - К серверу (в англоязычной версии Pass-Through) мы рассмотрим в главе Команда Управление позволяет нам создавать SQL выражения, которые относятся к DDL разделу SQL. С помощью Jet SQL нельзя создавать базы данных, но можно создавать таблицы и индексы, а также изменять структуры таблиц и удалять таблицы и индексы. До сих пор мы использовали визуальные средства и режим SQL для создания запросов. Но очень часто, особенно если вы обращаетесь к базе данных Access из среды приложения, написанного на другом языке, например на Visual Basic или Visual C++, вам придется использовать объекты доступа к данным (DAO). Типичный запрос с использованием этих объектов выглядит следующим образом: Dim db As Database, qd AS QueryDef, mySQL As String Set db = DBEngine.Workspaces(0).Databases(0) mySQL = "SELECT * FROM Account WHERE account=102" Set qd =db.CreateQueryDef("Mywritebyhandquery",mySQL) После выполнения данной процедуры появится запрос, который будет храниться в той базе данных, для которой эта процедура будет текущей. В целом создание запросов с помощью DAO мало отличается от написания запросов с помощью SQL режима. Главной составной частью является второй аргумент метода CreateQueryDef - строка SQL. Для того чтобы обратиться к ранее созданному запросу в программе, можно обратиться к коллекции QueryDefs. Вы можете переписать свойство SQL объекта типа QueryDef, то есть фактически переписать содержание запроса, узнать дату последней модификации запроса и т. д. При этом мы просто обращаемся к свойствам и методам объекта QueryDef. В следующем примере для уже существующего объекта переписывается свойство SQL, и с помощью окна сообщений выводится дата последней модификации этого объекта, которая, естественно, будет совпадать с текущей системной датой. Dim db As DATABASE, qd As QueryDef, mySQL As String Set db = DBEngine.Workspaces(0).Databases(0) Set qd = db.QueryDefs("Simplequery") qd.SQL = "SELECT * FROM account WHERE date write >> " & "#01/06/96#" MsgBox(Str(qd.LastUpdated)) В расположенном ниже примере создается запрос определения данных с помощью метода CreateQueryDef, затем он запускается на выполнение. В итоге в текущей базе данных появляется новая таблица FROMQUERY. Dim db As DATABASE, qd As QueryDef, mySQL As String Set db = DBEngine.Workspaces(0).Databases(0) Set qd = db.CreateQueryDef("DLquery", "CREATE TABLE fromquery (mama TEXT(20), slava LONG)") qd.Execute Последним способом, который позволяет нам выполнять запросы в Access, являются макрокоманда RunSQL или метод RunSQL объекта DoCmd. В табл. 7.4 представлены все виды запросов, которые мы можем запустить с помощью метода RunSQL и ее макроэквивалента RunSQL. В дальнейшем мы будем говорить только о методе RunSQL. Таблица 7.4. Запросы, доступные для метода RunSQL converted to PDF by HupBaH9I Тип запроса Инструкция SQL
Синтаксис использования метода RunSQL выглядит так: DoCmd.RunSQL инструкцияSQL Инструкция SQL - это строковое выражение, которое содержит правильное SQL выражение. При этом вы можете обращаться к другой базе данных. Максимальная длина строки - 32768 символов. В следующем примере требуется наличие формы с названием "Моя форма", которая имеет следующие объекты: • Несвязанное текстовое поле txtField1. • Несвязанное текстовое поле txtField2. • Командная кнопка cmbInsert3. В методе для события Click запишем следующий код, предполагая, что данные, которые мы занесем в поля txtField1 и txtField2, должны попасть в новую запись таблицы "Моя Таблица": Sub cmbInsert3 Click() Dim SQLstr As String, SQLstr1 As String SQLstr = "INSERT INTO [Моя Таблица] (Фамилия, Имя) " SQLstr1 = "VALUES ([txtField1],[txtField2])" DoCmd.RunSQL SQLstr & SQLstr1 End Sub Как вы видите, нам совершенно не нужно иметь отдельный запрос добавления, достаточно написать четыре строчки кода. Теперь пользователь будет добавлять новые записи там, где это выглядит вполне логично, а не экспериментируя с запросами на вкладке Запросы в контейнере базы данных. Данные строчки являются не более, чем примером, никто не пытается призывать вас отказаться от обычного ввода данных посредством использования связанных полей в форме и соответственно от всех средств, которые предоставляет это мощное средство работы с данными. В этой главе мы пытались показать, насколько удобно использовать SQL - структурный язык запросов, который на текущий момент является самым распространенным средством работы с базами данных. Бесспорно и в Visual FoxPro и в Access вы можете при желании обойтись без SQL, но будет ли это разумно? Чем больше вы используете SQL, тем легче вам переходить с одной СУбД на другую. А многие средства быстрой разработки приложений, такие как Delphi или Visual Basic, просто немыслимо использовать без SQL. В этой главе мы не стали рассматривать использование SQL в Visual Basic, но можете считать, что вы уже знаете достаточно, для того чтобы работать с этим средством разработки приложений. Visual Basic использует DAO для работы с базами данных. Следовательно, вы можете использовать объект QueryDef для работы. Можете не откладывать на завтра, а начинать прямо сейчас. Visual Basic, начиная с версии 4.0, имеет еще более гибкое и, в некотором плане, работающее быстрее с данными средство - RDO, но об этом речь впереди. В следующей главе мы расширим набор SQL команд, а также рассмотрим вопросы работы с внешними данными. 7.6. Работа с данными в локальной сети 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 |