У меня есть подчиненная форма, настроенная на представление таблицы, которую я пытаюсь обновить с помощью данных из SQL Server, основываясь на параметрах, заданных выбором пользователей.
Обычно я достигаю этого с помощью хранимых процедур и имеюVBA вызывает их через ADO, но эти данные отличаются тем, что RecordSource необходимо иметь возможность изменять / редактировать непосредственно в таблице данных.
У меня есть таблица данных, которую я в настоящее время использую для отображения данных, и этоиспользует следующий код:
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sp As ADODB.Command
Set db = New ADODB.Connection
Set rs = New ADODB.Recordset
Set sp = New ADODB.Command
Set ps = frmName
db.Open dbString
db.CursorLocation = adUseClient
With sp
.ActiveConnection = db
.CommandText = "x04_ch_sl_ptsTable"
.CommandType = adCmdStoredProc
.Parameters.Append sp.CreateParameter("@tmName", adVarChar, adParamInput, 4, tmName)
End With
sp.Parameters.Append sp.CreateParameter("@wkEnd", adDBTimeStamp, adParamInput, , wkEnd)
Set rs = sp.Execute
Set ps.subFormDataViewer.Form.Recordset = rs
Exit Sub
End If
db.Close
Можно ли это изменить, чтобы сделать набор данных обновляемым?
Это пока единственный способ, которым я смог добиться того, чего хочу, ноиз-за очевидных проблем с безопасностью и внедрением я не хочу идти по этому пути:
ps.subFormDataViewer.Form.RecordSource = " SELECT p.ps_dateClaim as [Date], p.ps_id as [ID], p.ps_empid as [Employee ID], e.hc_fullName as [Employee], p.ps_pts as [Claimed] " & _
" FROM (([ODBC;DRIVER=SQL Server;SERVER=<REDACTED>;Integrated_Security=SSPI;DATABASE=<REDACTED>].prod_pts as p " & _
" INNER JOIN [ODBC;DRIVER=SQL Server;SERVER=<REDACTED>;Integrated_Security=SSPI;DATABASE=<REDACTED>].hc_employee as e " & _
" ON p.ps_empid = e.hc_empid) " & _
" WHERE (p.ps_dateClaim = #" & wkEnd & "#" & _
" AND (e.hc_teamName = '" & tmName & "'); "
Я пробовал следующие методы ADO безуспешно:
With sp
Set .ActiveConnection = db
.CommandText = " SELECT t.Date, t.TeamName, t.Reference, t.Status, t.Reason, t.Checked " & _
" FROM testTbl as t" & _
" WHERE t.TeamName = @tmName "
.Parameters.Append .CreateParameter(, adVarChar, adParamInput, 4, tm)
Set rs = .Execute
End With
With sp
Set .ActiveConnection = db
.CommandText = " SELECT t.Date, t.TeamName, t.Reference, t.Status, t.Reason, t.Checked " & _
" FROM testTbl as t" & _
" WHERE t.TeamName = ? "
Set rs = .Execute(, Array(tm))
End With
(2-й пример производит данные, но набор записей не может быть обновлен, поскольку он распознает каждое поле как «выражение»)
Мне удалось этого добитьсяс DAO:
Dim db as DAO.Database
Dim rs as DAO.Recordset
Dim qd as DAO.QueryDef
Dim dbSQL as string
dbSQL = " SELECT t.Date, t.TeamName, t.Reference, t.Status, t.Reason, t.Checked " & _
" FROM testTbl as t" & _
" WHERE t.TeamName = tmName1 "
Set qd = db.CreateQueryDef("", dbSQL)
With qd
.Parameters!tmName1 = tm
End With
Set rs = qd.OpenRecordset
Set ps.subFormDataViewer.Form.Recordset = rs