При использовании MSDataShape OLE DE провайдера и провайдера OLE DB для Jet (или ACE) тогда действительно возможно создать обновляемый набор записей ADO и APPEND
вычисляемый столбец на основе заданной функциитакие как COUNT()
.Полученный в результате SQL-esque код будет выглядеть примерно так:
SHAPE {SELECT ContactID, ContactName FROM Contact}
APPEND ({SELECT ContactID, OrderID FROM Orders}
RELATE ContactID TO ContactID
) As rsDetails, COUNT(rsDetails.OrderID) AS CountOfOrder
Вот краткое «подтверждение концепции»: вставьте следующее в любой модуль VBA (например, используйте Excel), ссылки не требуются, создайте новый.mdb в вашем временном каталоге создает таблицы с данными, чтобы доказать, что набор записей является обновляемым, значение ContactName
изменилось, и набор записей снова открылся, чтобы показать, что оно действительно изменилось:
Sub ShapeAppendCount()
On Error Resume Next
Kill Environ$("temp") & "\DropMe.mdb"
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & _
Environ$("temp") & "\DropMe.mdb"
Dim jeng
Set jeng = CreateObject("JRO.JetEngine")
jeng.RefreshCache .ActiveConnection
Set .ActiveConnection = Nothing
End With
Dim con
Set con = CreateObject("ADODB.Connection")
With con
.ConnectionString = _
"Provider=MSDataShape;" & _
"Data Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & _
Environ$("temp") & "\DropMe.mdb"
.CursorLocation = 3
.Open
.Execute _
"CREATE TABLE Contact (" & _
"ContactID INTEGER NOT NULL UNIQUE, " & _
"ContactName VARCHAR(20) NOT NULL);"
.Execute _
"CREATE TABLE Orders (" & _
"ContactID INTEGER NOT NULL REFERENCES Contact (ContactID), " & _
"OrderID INTEGER NOT NULL UNIQUE);"
.Execute _
"INSERT INTO Contact (ContactID, ContactName)" & _
" VALUES (1, 'OneDayWhen');"
.Execute _
"INSERT INTO Orders (ContactID, OrderID)" & _
" VALUES (1, 1);"
.Execute _
"INSERT INTO Orders (ContactID, OrderID)" & _
" VALUES (1, 2);"
Dim rs
Set rs = CreateObject("ADODB.Recordset")
With rs
.CursorType = 2 ' adOpenDynamic
.LockType = 4 ' adLockBatchOptimistic
.Source = _
" SHAPE {SELECT ContactID, ContactName FROM Contact} " & _
"APPEND ({SELECT ContactID, OrderID FROM Orders} " & _
"RELATE ContactID TO ContactID) As rsDetails, " & _
" COUNT(rsDetails.OrderID) AS CountOfOrder"
Set .ActiveConnection = con
.Open
.Fields("ContactName").Value = "Pink Cat"
.UpdateBatch
MsgBox .GetString
.Close
End With
With rs
.Source = _
"SELECT ContactID, ContactName FROM Contact"
Set .ActiveConnection = con
.Open
MsgBox .GetString
.Close
End With
End With
End Sub