запросов MS Access с помощью Excel VBA, SQL между датами запроса. Sql запрос в access vba


запросов MS Access с помощью Excel VBA, SQL между датами запроса

all--

Я пытаюсь использовать запрос SQL, чтобы вытащить записи из БД Access в UserForm ListBox Excel VBA, используя следующий код:

Sub FillLBBillIDs() 'build bill ID list box with bill IDs available in database, based on client and/or date range '<---------------------------------------------------Dimension all variables Dim con As Object, cmd As Object, rst As Object Dim Path As String, CName As String Dim FromDate As Date, ToDate As Date Dim X As Long, Y As Long '<---------------------------------------------------Define Default Variables X = 0 CName = AuditParametersFRM.CBOCxName.Value FromDate = AuditParametersFRM.DTPFrom.Value ToDate = AuditParametersFRM.DTPTo.Value '<---------------------------------------------------Define Access connection Set con = CreateObject("ADODB.Connection"): Set cmd = CreateObject("ADODB.Command"): Set rst = CreateObject("ADODB.RecordSet"): Path = Sheets("AuditTool").Range("B2").Value '<---------------------------------------------------Open Access connection con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Path & ";Persist Security Info=False;" con.ConnectionTimeout = 0: con.CommandTimeout = 0: con.Open: cmd.CommandTimeout = 0: Set cmd.ActiveConnection = con '<---------------------------------------------------Find all bill IDs in the database which match the selected client and '<---------------------------------------------------are within the consolidated date range rst.Open "SELECT DISTINCT AdHocReport.[BillID] FROM AdHocReport WHERE AdHocReport.[CxName] = '" & CName & "' AND AdHocReport.[ConsolidationDate] BETWEEN #" & FromDate & "# AND #" & ToDate & "#", con, 1, 3 On Error Resume Next rst.MoveLast rst.MoveFirst Y = 0 Y = rst.RecordCount AuditToolFRM.LBBillIDs.Clear If Not Y = 0 Then Do Until rst.EOF '<---------------------------------------------------Build the listbox with the acquired information With AuditToolFRM.LBBillIDs .AddItem .List(X, 0) = rst![BillID] X = X + 1 End With rst.MoveNext Loop End If rst.Close On Error GoTo 0 con.Close End Sub

Этот код работает отлично, если я использую больше, чем аргумент, таким образом:

rst.Open "SELECT DISTINCT AdHocReport.[BillID] FROM AdHocReport WHERE AdHocReport.[CxName] = '" & CName & "' AND AdHocReport.ConsolidationDate > #" & FromDate & "#", con 1, 3

Я прошел через все соответствующие вопросы на этом сайте, и не может найти что-нибудь, что работает. Есть идеи?

Заранее благодарен!

12/08/2017 12:54

Я сделал больше испытаний, и кажется, что больше, чем запрос не работает либо; он вытягивает все записи, соответствующие первым критериям, игнорируя второй, даже если круглые скобки заключают в себе вторую. Это говорит мне, что проблема определенно находится в дате части запроса. Любая помощь очень ценится!

stackoverrun.com

Как создать временную таблицу из запроса SELECT в Access VBA?

Если вы взглянули на строке, которую вы используете, полученную Debug.Print sqlstr в коде или ?sqlstr из окна командной строки вы увидите

TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)]SELECT [Deal Data ECM].[Deal Type]FROM [Deal Data ECM]WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))GROUP BY [Deal Data ECM].[Deal Type]PIVOT [Deal Data ECM].[Deal Region];

Тогда вы могли бы заметить, что нет никаких мест между один пункт и следующий.

добавляющие возвращается, где есть пробелы делает его немного eaiser увидеть

TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)]SELECT [Deal Data ECM].[Deal Type]FROM [Deal Data ECM]WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))GROUP BY [Deal Data ECM].[Deal Type]PIVOT [Deal Data ECM].[Deal Region];

Попробуйте добавить пробел перед каждой закончившейся "

sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)] " & _ "SELECT [Deal Data ECM].[Deal Type] " & _ "FROM [Deal Data ECM] " & _ "WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y')) " & _ "GROUP BY [Deal Data ECM].[Deal Type] " & _ "PIVOT [Deal Data ECM].[Deal Region]; "

Однако, так как вы хотите создать таблицу вы необходимо добавить цель. Добавляя INTO положение между выбрать и из

sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)] " & _ "SELECT [Deal Data ECM].[Deal Type] " & _ "INTO YourNewTable " & _ "FROM [Deal Data ECM] " & _ "WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y')) " & _ "GROUP BY [Deal Data ECM].[Deal Type] " & _ "PIVOT [Deal Data ECM].[Deal Region]; "

Примечание: Каждый раз, когда вы выполняете это, вы будете удалить старую таблицу. Также обратите внимание, вы должны использовать DoCmd.RunSQL

stackoverrun.com

MS Access VBA Ошибка несоответствия типа данных в SQL-запросе

В настоящее время у меня есть следующий запрос SQL Access SQL Query, который является частью функции VBA доступа. Он был построен с помощью previous question, который вы можете посмотреть, чтобы лучше понять, как он работает.

sqlJoinQuery = "SELECT tbl_grp_by.[Field1],tbl_grp_by.[Field2], " & _ "Switch(" & _ "Nz(tbl_grp_by.[maxfield3]) = 0, '0', " & _ "Nz(tbl_grp_by.[maxfield3]) = 1, '>1 million', " & _ "Nz(tbl_grp_by.[maxfield3]) = 2, '0001-0010' " & _ ") as [Field3], " & _ "tbl_grp_by.[" + commonField + "], " & _ "[" + tableName + "].* " & _ "INTO [" + newTableName + "] FROM (" & _ "SELECT Max([" + tableNameTemp + "].[Field1]) as [Field1], " & _ "Max([" + tableNameTemp + "].[Field2]) as [Field2], " & _ "Max(Switch(" & _ "Nz([" + tableNameTemp + "].[Field3]) = '0' , 0, " & _ "Nz([" + tableNameTemp + "].[Field3]) = '>1 million' , 1, " & _ "Nz([" + tableNameTemp + "].[Field3]) = '0001-0010', 2 " & _ "))as [maxField3], " & _ "[" + tableNameTemp + "].[" + commonField + "] as [" + commonField + "] " & _ "FROM [" + tableNameTemp + "] " & _ "INNER JOIN [" + tableName + "] " & _ "ON [" + tableNameTemp + "].[" + commonField + "] = [" + tableName + "].[" + commonField + "] " & _ "GROUP BY [" + tableNameTemp + "].[" + commonField + "] " & _ ") as tbl_grp_by " & _ "INNER JOIN [" + tableName + "] " & _ "ON [" + tableName + "].[" + commonField + "] = tbl_grp_by.[" + commonField + "]"

Приведенные выше результаты запроса доступа в этом SQL-строку:

SELECT tbl_grp_by.[Field1], tbl_grp_by.[Field2], Switch(Nz(tbl_grp_by.[maxfield3]) = 0, '0', Nz(tbl_grp_by.[maxfield3]) = 1, '>1 million', Nz(tbl_grp_by.[maxfield3]) = 2, '0001-0010') AS [Field3], tbl_grp_by.[Finding ID], [Issue_Management_Findings].* INTO [region_Issue_Management_Findings] FROM (SELECT Max([temp2_temp_Issue_Management_Findings].[Field1]) AS [Field1], Max([temp2_temp_Issue_Management_Findings].[Field2]) AS [Field2], Max(Switch(Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0', 0, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '>1 million', 1, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0001-0010', 2))AS [maxField3], [temp2_temp_Issue_Management_Findings].[Finding ID] AS [Finding ID] FROM [temp2_temp_Issue_Management_Findings] INNER JOIN [Issue_Management_Findings] ON Nz([temp2_temp_Issue_Management_Findings].[Finding ID]) = Nz([Issue_Management_Findings].[Finding ID]) GROUP BY [temp2_temp_Issue_Management_Findings].[Finding ID]) AS tbl_grp_by INNER JOIN [Issue_Management_Findings] ON Nz([Issue_Management_Findings].[Finding ID]) = Nz(tbl_grp_by.[Finding ID])

Так [Field3] кодируется при макс() во внутреннем запросе, и что не более декодируется во внешнем запросе.

Однако, когда я запускаю его я получаю следующее сообщение об ошибке:

Run-time error '3464': Data type mismatch in criteria expression

Если я копирую мой SQL запрос из отладочного вывода в ближайшем окне и вставьте его в ручном запросе SQL (после запуска моего кода VBA до точки останова, когда SQL-запрос должен быть запущен), то я получаю следующее сообщение об ошибке:

Data type mismatch in criteria expression

Если бы я только запустить вложенный запрос в моей строке выше SQL для отладки:

(SELECT Max([temp2_temp_Issue_Management_Findings].[Field1]) AS [Field1], Max([temp2_temp_Issue_Management_Findings].[Field2]) AS [Field2], Max(Switch(Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0', 0, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '>1 million', 1, Nz([temp2_temp_Issue_Management_Findings].[Field3]) = '0001-0010', 2))AS [maxField3], [temp2_temp_Issue_Management_Findings].[Finding ID] AS [Finding ID] FROM [temp2_temp_Issue_Management_Findings] INNER JOIN [Issue_Management_Findings] ON Nz([temp2_temp_Issue_Management_Findings].[Finding ID]) = Nz([Issue_Management_Findings].[Finding ID]) GROUP BY [temp2_temp_Issue_Management_Findings].[Finding ID])

Затем он работает без ошибок

Обратите внимание, что Issue_Management_Findings это имя существующей таблицы в базе данных.

Кто-нибудь знает, как я могу исправить эти ошибки?

stackoverrun.com

Создание запроса Access VBA

Вопрос: Создание ADODB recordset из запроса access

Доброго времени суток!

Подскажите пожалуйста, можно ли создать рекордсет на основании запроса в Access?

Пробовал вот такой код (один раз сработал, теперь не работает - почему - не могу понять):

Public Sub Расход_план()DoCmd.OpenQuery "Запрос4"Dim ADODBcons As ADODB.RecordsetSet ADODBcons = New ADODB.RecordsetADODBcons.Open "[Запрос4]", CurrentProject.Connection, adUseClient, adLockOptimisticADODBcons.Close Set ADODBcons = NothingEnd Sub

Запрос4 - обычный запрос на выборку в Access

Ошибку выдает следующую (на строке ADODBcons.Open): "Run-time error '-2147217900 (80040e14)': Ошибочная инструкция SQL; предполагалось 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT' или 'UPDATE'."

Я так понимаю, почему-то строка, с ".Open" воспринимается как SQL-запрос, который естесственно неверный. Пробовал открывать какую-нибудь таблицу из этой БД этим кодом - все работает, так что думаю, что причина именно в том, что на основе запроса пытаюсь делать. Но понять, что не так, не могу. Один же раз все-таки сработало... Повторно воспроизвести срабатывание не получилось.

Заранее благодарю за подсказки и помощь.

Ответ: Женя89
Затупил. Теперь во вложении "гранаты той системы".

А по теме - уже разобрался:)

Если обычная БД зачем мучить ADO непонятно. Можно собрать рекордсет очень просто

... Dim db as database Dim rs as recordset Dim strSQL as string strSQL = "SELECT * FROM ваша_таблица" SET db= currentDB SET rs =db.openrecordset(strSQL) ' все, вы открыли рекордсет, можете делать с ним все что угодно rs.close db.close Set rs = nothing Set db = nothing ...

ADO предпочтительней использовать при наличии клиентской интерфейсной части выполненной в аксессе при условии что таблицы и запросы,сохраненные процедуры крутятся на полноценномMS SQL сервере. То есть при полноценном клиент серверном приложении.

forundex.ru

sql - Запуск запроса параметра в Access VBA

Я пытаюсь запустить следующий запрос в функции VBA. Я продолжаю получать "Слишком мало параметров. Ожидаемый 1."

strSQL = "Parameters [Report Date] DateTime;" & vbCrLf & _ "SELECT SCF.code AS [Stock Code], " & vbCrLf & _ "SCF.desc AS [Description], " & vbCrLf & _ "SCF.grp AS [Product Group]," & vbCrLf & _ "SCF.qCurr AS [Closing Stock], " & vbCrLf & _ "SCF.abp AS [Avg Price], " & vbCrLf & _ "Sum(([Closing Stock]*[Avg Price])) AS [STOCK VALUE], " & vbCrLf & _ "MaxDate.tDate AS [Last Transaction Date], " & vbCrLf & _ "Sum(IIf(([Last Transaction Date]>[Report Date]),([Closing Stock]*[Avg Price]),0)) AS [After Report Date], " & vbCrLf & _ "DateDiff(""d"",[Last Transaction Date],[Report Date]) AS [Days since Last Transaction], " & vbCrLf & _ "[Report Date]" & vbCrLf & _ "INTO [FinReport] " & vbCrLf & _ "FROM SCF RIGHT JOIN MaxDate ON MaxDate.parent = SCF.this " strSQL = strSQL & _ "WHERE (SCF.qCurr <> 0) " & vbCrLf & _ "GROUP BY SCF.code, " & vbCrLf & _ "SCF.desc, " & vbCrLf & _ "SCF.grp, " & vbCrLf & _ "SCF.qCurr, " & vbCrLf & _ "SCF.abp, " & vbCrLf & _ "MaxDate.tDate" & vbCrLf & _ "ORDER BY MaxDate.tDate;" Set qdf = db.CreateQueryDef("", strSQL) qdf.Parameters("[Report Date]").Value = Form_IO_Form.ReportDate_TB.Value qdf.Execute

Я проверил, что все поля (кроме, конечно, [Дата отчета]) существуют, и запрос выполняется сам по себе в качестве запроса доступа (всплывающее окно запрашивает [Дата отчета]).

Помогите!

Редактировать 1: как запрошено здесь файл DB в виде ZIP. Это файл Access 2007..accdb Файл DB

задан 147 28 мая '12 в 13:51 источник поделиться

qaru.site