Обновляемый набор записей с полем счета - MS Access - PullRequest
1 голос
/ 23 мая 2011

Я не эксперт по SQL. Может быть, то, что я пытаюсь сделать здесь, даже невозможно.

Я пытаюсь получить обновляемый набор записей, который включает в себя поле, являющееся результатом агрегатной функции.

Я ищу что-то вроде этого:

SELECT Contact.*, Count(OrderID) as CountOfOrders
FROM Contact INNER JOIN Order ON Order.ContactID = Contact.ContactID
WHERE ContactID = 1

1 Ответ

2 голосов
/ 24 мая 2011

При использовании 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...