Откройте запрос в режиме конструктора, отредактируйте, а затем извлеките результаты - PullRequest
0 голосов
/ 24 апреля 2018

Просто интересно, может ли кто-нибудь помочь мне с этой проблемой.Я делаю макрос в Excel, который открывает запрос в режиме конструктора, чтобы я мог его редактировать.Затем запустите запрос и извлеките результаты.К сожалению, я получаю сообщение об ошибке, которое говорит, что этот набор записей не редактируется.Код ниже.

'connect to Access Database
Application.StatusBar = "Connecting to Access database..."
Const DbLoc As String = "I:\Ben\New Stores\Reports\Scratch Reporting DB.accdb"
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim recCount As Long
Set db = OpenDatabase(DbLoc)
Set objAccess = CreateObject("Access.Application")
With objAccess
    .opencurrentdatabase (DbLoc)
    .docmd.openquery "OOS by DC5"
    .docmd.openquery "Today2"
    .docmd.openquery "Today2_intrans"
    .docmd.openquery "Today7"
    .docmd.openquery "Today7_InTrans"
    .docmd.openquery "OOS by Dept_Final", acViewDesign
End With

Set rs1 = db.OpenRecordset("OOS by DC5", dbOpenSnapshot)
Set rs2 = db.OpenRecordset("Today7_InTrans", dbOpenSnapshot)
Set rs3 = db.OpenRecordset("Today7", dbOpenSnapshot)
Set rs4 = db.OpenRecordset("OOS by Dept_Final", dbOpenSnapshot)

'copy recordset to spreadsheet
Application.StatusBar = "Writing Access data to spreadsheet..."
If rs1.RecordCount = 0 Then
MsgBox "No data retrieved from database", vbInformation + vbOKOnly, "No Data"
GoTo Subexit
Else
rs1.MoveLast
recCount = rs1.RecordCount
rs1.MoveFirst
End If
ws11.Range("A1").CopyFromRecordset rs1
ws11.Range("B" & recCount + 1).Formula = "=SUM(B1:B" & recCount & ")"
ws11.Range("C" & recCount + 1).Formula = "=SUM(C1:C" & recCount & ")"
ws18.Range("A1").CopyFromRecordset rs2
ws19.Range("A1").CopyFromRecordset rs3
ws8.Range("A1").CopyFromRecordset rs4

Примечание;это фрагмент всего макроса, поэтому мои переменные здесь не объявлены.Спасибо за вашу помощь заранее!

SQL ДО

SELECT [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17935] AS Expr1, [OOS by Dept2].[18363] AS Expr2, [OOS by Dept2].[18455], [OOS by Dept2].[18584] AS Expr3, [OOS by Dept2].[18593] AS Expr4, [OOS by Dept2].[18638] AS Expr5, [OOS by Dept2].[18649], [OOS by Dept2].[18695] AS Expr6, [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18810] AS Expr7, [OOS by Dept2].[18919], [OOS by Dept2].[18990] AS Expr8, [OOS by Dept2].[19720]
FROM [OOS by Dept2] LEFT JOIN [dept name] ON [OOS by Dept2].MaxOfDept = [dept name].Dept
GROUP BY [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17935], [OOS by Dept2].[18363], [OOS by Dept2].[18455], [OOS by Dept2].[18584], [OOS by Dept2].[18593], [OOS by Dept2].[18638], [OOS by Dept2].[18649], [OOS by Dept2].[18695], [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18810], [OOS by Dept2].[18919], [OOS by Dept2].[18990], [OOS by Dept2].[19720];

SQL ПОСЛЕ

SELECT [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17052], [OOS by Dept2].[18220], [OOS by Dept2].[18272], [OOS by Dept2].[18455], [OOS by Dept2].[18614], [OOS by Dept2].[18633], [OOS by Dept2].[18645], [OOS by Dept2].[18649], [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18919], [OOS by Dept2].[19720]
FROM [OOS by Dept2] LEFT JOIN [dept name] ON [OOS by Dept2].MaxOfDept = [dept name].Dept
GROUP BY [OOS by Dept2].MaxOfDept, [dept name].[Department Name], [OOS by Dept2].[17052], [OOS by Dept2].[18220], [OOS by Dept2].[18272], [OOS by Dept2].[18455], [OOS by Dept2].[18614], [OOS by Dept2].[18633], [OOS by Dept2].[18645], [OOS by Dept2].[18649], [OOS by Dept2].[18696], [OOS by Dept2].[18712], [OOS by Dept2].[18919], [OOS by Dept2].[19720];

Константа SQL

SELECT [OOS by Dept2].MaxOfDept, [dept name].[Department Name]
FROM [OOS by Dept2] LEFT JOIN [dept name] ON [OOS by Dept2].MaxOfDept = [dept name].Dept
GROUP BY [OOS by Dept2].MaxOfDept, [dept name].[Department Name];

1 Ответ

0 голосов
/ 24 апреля 2018

Я думаю, что-то вроде этого должно работать для вас

Добавьте эти строки в начало вашего объявления

Const QDF_MODIFY    As String = "OOS by Dept_Final"

Const BASIC_FIELDS  As String = "SELECT dept2.MaxOfDept, deptname.[Department Name]<INSERT FIELDS> "
Const BASIC_SQL As String = "FROM [OOS by Dept2] AS dept2 LEFT JOIN [dept name] AS deptname ON dept2.MaxOfDept = deptname.Dept "
Const GROUPBY_FIELDS As String = "GROUP BY dept2.MaxOfDept, deptname.[Department Name] <INSERT FIELDS> "

Добавьте эти строки в раздел объявлений

' Add these lines to top
Dim qdf  As DAO.QueryDef
Dim qdf2 As DAO.QueryDef

Dim strNewFields As String
Dim strNewSQL As String
Dim iField  As Integer

Удалить эту строку

'.docmd.openquery "OOS by Dept_Final", acViewDesign

Ater End With Добавьте этот код, чтобы изменить свой SQL

' Change these to Querydef qdf2 references
Set qdf2 = db.QueryDefs("OOS by Dept2")
' Zero based index - ignore first field MaxOfDept
For iField = 1 To qdf2.Fields.Count - 1
    strNewFields = strNewFields & ", dept2.[" & qdf2.Fields(iField).Name & "]"
Next
qdf2.Close

' Insert new fields and rebuild SQL
strNewSQL = Replace(BASIC_FIELDS, "<INSERT FIELDS>", strNewFields)
strNewSQL = strNewSQL & BASIC_SQL
strNewSQL = strNewSQL & Replace(GROUPBY_FIELDS, "<INSERT FIELDS>", strNewFields)
Debug.Print strNewFields

' Replace the SQL
Set qdf = db.QueryDefs(QDF_MODIFY)
qdf.SQL = strNewSQL
qdf.Close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...