Сортировка с помощью ключевого слова order by
Используйте оператор ORDER BY для сортировки записей, полученных с помощью инструкции SELECT, в соответствии со значениями одного или нескольких полей. Оператор ORDER BY указывается в конце инструкции, как показано ниже:
SELECT Toy, Price , InStock
FROM Toylnventory
ORDER BY Toy
Можно проводить сортировку по значениям нескольких полей, указав эти поля в необходимом порядке сортировки:
SELECT Toy, Price
FROM Toylnventory
ORDER BY Price DESC, Toy
По умолчанию сортировка всегда проводится по возрастанию. Для явного указания порядка сортировки используйте ключевое слово DESC (descending— убывание) или ASC (ascending— возрастание), после которого необходимо указать имя соответствующего поля.
Выполнение групповых обновлений и удалений в sql
Инструкции UPDATE и DELETE позволяют изменять или удалять группу записей в источнике данных с помощью одной команды. Эти инструкции работают непосредственно с исходной БД (повышение цены на 10% для товаров определенной категории):
UPDATE Toys
SET Price = Price * 1.1
WHERE Category = ' Trains '
Имя таблицы указывается сразу после слова UPDATE. После этого указывается оператор SET, с помощью которого вы определяете значение одного или нескольких полей в таблице. Необязательный оператор WHERE позволяет задать критерии, ограничивающие записи, к которым будут применяться изменения.
Пример удаляет записи для всех игрушек, которые отсутствуют на складе и не были заказаны:
DELETE FROM Toys
WHERE InStock = 0 And OnOrder = 0
Для удаления значений отдельных полей, а не целых записей, используйте инструкцию UPDATE вместе с оператором SET, определяющим значение поля равным Null .
Инструкции UPDATE и DELETE приводят к необратимым изменениям в базе данных - обязательно создайте резервную копию базы данных.
Converting DAO Code to ADO
DAO |
ADO(ADODB) |
Note |
DBEngine |
None |
|
Workspace |
None |
|
Database |
Connection |
|
Recordset |
Recordset |
|
Dynaset-Type |
Keyset |
Retrieves a set of pointers to the records in the recordset |
Snapshot-Type |
Static |
Both retrieve full records but a Static recordset can be updated. |
Table-Type |
Keyset with adCmdTableDirect Option |
|
Field |
Field |
When referred to in a Recordset |
DAO |
ADO |
Open a Recordset |
|
Dim db as Database Dim rs as DAO.Recordset Set db = CurrentDB() Set rs = db.OpenRecordset("Employees") |
Dim rs as New ADODB.Recordset rs.Open "Employees", CurrentProject.Connection, adOpenKeySet, adLockOptimistic
|
Edit a Recordset |
|
rs.Edit rs("TextFieldName") = "NewValue" rs.Update
|
rs("TextFieldName") = "NewValue"
rs.Update
Update переводит курсор на следующую запись |
1. Создание запроса и размещение его в БД с именем SecondQuarter для всех счетов из таблицы Orders, размещенных позже 3-31-96:
DAO
Public Sub GetOrders()
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Set dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate >#3-31-96#;"
Set qdf = dbs.CreateQueryDef("SecondQuarter", strSQL)
End Sub
ADO
Dim dbs As Database, qdf As QueryDef, strSQL As String
Set dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate >#3-31-96#;"
Set qdf = dbs.CreateQueryDef("SecondQuarter", strSQL)
2. Использование переменной вместо константы типа Дата.
Dim dbs As Database, qdf As QueryDef, strSQL As String
Dim dteStart As Date
dteStart = #3-31-96#
Set dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate> #" & dteStart & "#;"
Set qdf = dbs.CreateQueryDef("SecondQuarter", strSQL)
3. Создание запроса по значению элемента OrderDate на форме Orders. .
Dim dbs As Database, qdf As QueryDef, strSQL As String
Set dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate> #" & Forms!Orders!OrderDate & "#;"
Set qdf = dbs.CreateQueryDef("SecondQuarter", strSQL)
Recordset Property
You cannot use this property with ODBCDirect recordset types in DAO.
Recordset возвращает набор данных на форме, в отчете в списке или поле со списком. Если форма основана на запросе, то объект Recordset формы эквивалентен копии (клону) объекта Recordset запроса. Свойство RecordsetClone позволяет обращаться к текущей записи на форме.
Recordset type |
Based on SQL data |
Based on Jet data |
ADO |
Read/Write |
Read/Write |
DAO |
N/A |
Read/Write |
Следующий пример открывает форму, открывает набор данных и связывает форму с новым набором данных типа Recordset через свойство Recordset открытой формы.
Global rstSuppliers As ADODB.Recordset
Sub MakeRW()
DoCmd.OpenForm "Suppliers"
Set rstSuppliers = New ADODB.Recordset
rstSuppliers.CursorLocation = adUseClient
rstSuppliers.Open "Select * From Suppliers", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Set Forms("Suppliers").Recordset = rstSuppliers
End Sub
Таким образом, свойство Recordset можно использовать для:
-
отображения на подчиненных формах одних и тех же данных, т.е. синхронизации форм.
Set Me.Recordset = Forms!Form1.Recordset
-
использования методов к объекту Recordset, которые не поддерживаются на форме, например, методома Find для поиска записи
-
завершения транзакции на многочисленных формах.
Изменение свойства Recordset формы может повлечь за собой изменение свойств RecordSource, RecordsetType, and RecordLocks. Другие свойства могут автоматически отключиться (Filter, FilterOn, OrderBy, OrderByOn).
Вызов метода Requery (Forms(0).Recordset.Requery) для набора данных на форме может привести к разрыву связей формы с набором. Поэтому, для обновления данных на форме, связанной с набором, установите свойство RecordSource формы самому себе
(Forms(0).RecordSource = Forms(0).RecordSource).
Пример использования свойства Recordset для создания копии объекта Recordset, привязанного к форме.
Sub Print_Field_Names()
Dim rst As DAO.Recordset
Dim fld As Field
Set rst = Me.Recordset
For Each fld in rst.Fields
Debug.Print fld.Name
Next
End Sub
Пример использования свойства Recordset и объекта Recordset для синхронизации набора с текущей записью на форме. Когда наименование компании выбирается из поля со списком, метод FindFirst используется для обращения к записи с указанным наименованием, приводя к отображению на форме найденной записи.
Sub SupplierID_AfterUpdate()
Dim rst As DAO.Recordset
Dim strSearchName As String
Set rst = Me.Recordset
strSearchName = CStr(Me!SupplierID)
rst.FindFirst "SupplierID = " & strSearchName
If rst.NoMatch Then
MsgBox "Record not found"
End If
rst.Close
End Sub
Проверка типа набора записей.
Sub CheckRSType()
Dim rs as Object
Set rs=Forms(0).Recordset
If TypeOf rs Is DAO.Recordset
Then
MsgBox "DAO Recordset"
ElseIf
TypeOf rs is ADODB.Recordset
Then
MsgBox "ADO Recordset"
End If
End Sub