Как установить значения параметров запроса SQL INSERT через VBA в Microsoft Access? Vba access sql запросы


Microsoft Access. Работа с SQL запросами из VBA

Запросы SQL к базе данных являются важным этапом проектирования. Практически нет ни одного случая, чтобы разработчики их не использовали.

Они нужны для фильтрации и сортировки данных, для редактирования и удаления записей. Часто используют запросы и в коде программы. Поэтому изучите эти простые примеры для работы с записями базы данных через VBA

В этом примере мы создадим 2 запроса SQL и сохраним их в базе данных. Первый запрос будет создан для выборки некоторых значений из таблицы, а второй для удаления значений из списка калькулятора.

 

На этой форме в Access 2016 показано, как можно выбрать запрос и его изменить. Для этого используйте иконку Конструктор запросов.

Public Function funCreateQueries() As Boolean

    Dim dbs As Database, sSQL As String

    On Error GoTo 999 'Переходим по ошибке

    funCreateQueries = False  'Возвращаем результат при ошибке

    subDeleteQuery "ЗапросСписокКалькулятора" 'Удяляем старый запрос

    subDeleteQuery "ЗапросУдалитьСписок" 'Удяляем старый запрос

    dbs = appAccess.CurrentDb 'Выбираем базу данных

    With dbs

        sSQL = "SELECT Выражение, Итог FROM Калькулятор ORDER BY " & _

                       "Пункт DESC;"

        .CreateQueryDef("ЗапросСписокКалькулятора", sSQL) 'запрос на выборку

        sSQL = "DELETE Калькулятор.* FROM Калькулятор;"

        .CreateQueryDef("ЗапросУдалитьСписок", sSQL) 'запрос на удаление

    End With

    funCreateQueries = True 'Возвращаем результат

    Exit Function 'Выходим из программы

999:

    MsgBox Err.Description 'Сообщаем об ошибке

    Err.Clear() 'Очищаем поток от ошибок

blog.leadersoft.ru

Как послать запрос к базе на VBA Access | Info-Comp.ru

Данный урок посвящен SQL запросам к базе данных, на VBA Access. Мы рассмотрим, как на VBA осуществляется запросы insert, update, delete к базе данных, а также научимся получать конкретное значение из запроса select.

Те, кто программируют на VBA Access и, работая при этом с базой данных SQL сервера, очень часто сталкиваются с такой простой и нужной задачей как посыл SQL запроса к базе данных, будь то insert, update или простой SQL запрос select. А так как мы начинающие программисты мы тоже должны уметь это делать, поэтому сегодня займемся именно этим.

Мы уже затрагивали тему получения данных с SQL сервера, где как раз на VBA писали код для получения этих данных, например в статье про Выгрузку данных в текстовый файл из MSSql 2008 или также немного затрагивали в материале Выгрузка данных из Access в шаблон Word и Excel но так или иначе там мы рассматривали это поверхностно а сегодня предлагаю поговорить об этом чуть более подробней.

Примечание! Все примеры ниже рассмотрены с использованием ADP проекта Access 2003 и базы данных MSSql 2008. Если Вы не знаете что вообще такое ADP проект то это мы рассматривали в материале Как создать и настроить ADP проект Access

Исходные данные для примеров

Допустим, у нас есть таблица test_table, которая будет содержать номера и названия месяцев в году (запросы выполнены с использованием Management Studio)

CREATE TABLE [dbo].[test_table]( [id] [int] NOT NULL, [name_mon] [varchar](50) NULL ) ON [PRIMARY] GO

Как я уже сказал, мы будем использовать ADP проект, настроенный на работу с MSSql 2008, в котором я создал тестовую форму и добавил кнопку start с подписью «Выполнить», которая нам понадобится для тестирования нашего кода, т.е. весь код мы будем писать в обработчике события «Нажатие кнопки».

Запросы к базе insert, update, delete на VBA

Чтобы долго не тянуть сразу приступим, допустим, нам нужно добавить строку в нашу тестовую таблицу (код прокомментирован)

Private Sub start_Click() 'Объявляем переменную для хранения строки запроса Dim sql_query As String 'Записываем в нее нужный нам запрос sql_query = "insert into test_table (id, name_mon) values ('6', 'Июнь')" 'Выполняем его DoCmd.RunSQL sql_query End Sub

В данном случае запрос послался с использованием текущих параметров подключения к базе данных. Можем проверить, данные добавились или нет

Как видим, данные вставились

Для того чтобы удалить одну строку пишем вот такой код

Private Sub start_Click() 'Объявляем переменную для хранения строки запроса Dim sql_query As String 'Записываем в нее запрос на удаление sql_query = "delete test_table where id = 6" 'Выполняем его DoCmd.RunSQL sql_query End Sub

Если мы проверим, то увидим, что нужная строка удалилась.

Для обновления данных записываем в переменную sql_query запрос update, надеюсь, смысл понятен.

Запрос select к базе на VBA

Здесь дела обстоят чуть интересней, чем с остальными конструкциями SQL.

Первое, допустим, нам нужно получить все данные из таблицы, и, к примеру, мы их обработаем и выведем в сообщении, а Вы, конечно же, можете использовать их для других целей, для этого мы пишем вот такой код

Private Sub start_Click() 'Объявляем переменные 'Для набора записей из базы Dim RS As ADODB.Recordset 'Строка запроса Dim sql_query As String 'Строка для вывода итоговых данных в сообщении Dim str As String 'Создаем новый объект для записей set RS = New ADODB.Recordset 'Строка запроса sql_query = "Select id, name_mon from test_table" 'Выполняем запрос с использованием текущих настроек подключения проекта RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic 'Циклом перебираем записи While Not (RS.EOF) 'Заполняем переменную для вывода сообщения str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline 'переход к следующей записи RS.MoveNext Wend 'Вывод сообщения msgbox str End Sub

Здесь мы уже используем циклы VBA Access для того чтобы перебрать все значения в нашем наборе записей.

Но, достаточно часто бывает необходимо получить не все значения из набора записей, а всего лишь одно, например, название месяца по его коду. И для этого использовать цикл как-то накладно, поэтому мы можем просто написать запрос, который вернет всего одно значение и обращаться именно к нему, например, получим название месяца по коду 5

Private Sub start_Click() 'Объявляем переменные 'Для набора записей из базы Dim RS As ADODB.Recordset 'Строка запроса Dim sql_query As String 'Строка для вывода итогового значения Dim str As String 'Создаем новый объект для записей set RS = New ADODB.Recordset 'Строка запроса sql_query = "Select name_mon from test_table where id = 5" 'Выполняем запрос с использованием текущих настроек подключения проекта RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic 'Получаем наше значение str = RS.Fields(0) msgbox str End Sub

Для универсальности здесь мы уже обратились не по имени ячейки, а по ее индексу, т.е. 0, а это самое первое значение в Recordset, в итоге мы получили значение «Май».

Как видите все достаточно просто. Если Вам достаточно часто требуется получать конкретное значение из базы (как в последнем примере) то рекомендую вывести весь код в отдельную функцию (Как написать функцию на VBA Access 2003) с одним входящим параметром, например, код месяца (если рассматривать наш пример) и просто где необходимо вывести это значение, вызывать нужную нам функцию с нужным параметром и все, этим мы значительно уменьшим код VBA и улучшим восприятие нашей программы.

На сегодня это все. Удачи!

Похожие статьи:

info-comp.ru

SQL средствами VBA в СУБД Access 2003 и 2007

SQL запросы средствами VBA в СУБД Access 2003 и 2007

2016-10-20

Автор: Владимир Ткаченко

Источник: Обучение в интернет

В данной статье рассмотрим формирования запросов с использованием SQL в VBA для базы данных Microsoft Access 2003, 2007.

Известно, что SQL запросы в VBA могут быть сформированы с применением следующих технологий доступа к данным: DAO, RDO, ODBC, ADO.NET, ADO, OLE DB и др. Технологии ADO (ActiveX Data Objects) и OLE DB (Object Linking and Embedding, Database) пришли на смену DAO/RDO и ODBC (Open Database Connectivity) соответственно.

Так как мы рассматриваем локальную Microsoft Access 2003, 2007, то применим технологию DAO для реализации SQL запросов в VBA. Следует отметить, что DAO (Data Access Objects) – это объектно-ориентированный интерфейс (API) доступа к данным локальных БД типа Access.

В качестве объектных переменных используем конкретный тип объекта из объектной модели "Database" и новый создаваемый объект "QueryDef". Поскольку используются объектные переменные, то их надо не только объявить в программе VBA, но и присвоить (установить) им определенные значения.

Назначим им соответствующий объект с помощью специального оператора Set. Так как мы будем работать с объектами открытой БД Access, то объектной переменной Database присваиваем ссылку на текущую базу данных CurrentDb. Для создания объекта "QueryDef" (создания нового запроса) используем метод CreateQueryDef.

Для формирования запроса "Запр_гр" с использованием SQL в VBA запустим БД "sql_training_st1_cross-tab.mdb" и создадим новый объект: модуль.

В окне Code введем следующую процедуру:Private Sub Запр_Гр ()Dim oMyDb As DatabaseDim oMyQuery As QueryDefSet oMyDb = CurrentDbSet oMyQuery = oMyDb.CreateQueryDef("Запр_гр", "SELECT * FROM Группы;")End Sub

Скриншот кода программы модуля Module_Request представлен на рис. 1.

Рис. 1. SQL запрос Module_Request средствами VBA в СУБД Access

Для запуска программы надо щелкнуть на пиктограмме "Run Sub", затем на команде "Сохранить". После этого в окне БД в "Области переходов" в категории "Запросы" появится новый объект - запрос "Запр_гр", а в категории "Модули" - объект: "Module_Request". После создания запроса на выборку необходимо выполнить этот запрос, дважды щелкнув на объекте "Запр_гр" в "Области переходов". Результаты выполнения команды представлены на рис. 2.

Рис. 2. Отображение SQL запрос Module_Request средствами VBA в СУБД Access

Таким образом, созданный запрос "Запр_гр" на выборку с использованием SQL в VBA для базы данных Microsoft Access 2003, 2007 будет постоянно отображаться в "Области переходов".

www.lessons-tva.info

access - SQL-запрос VBA Access issue

Я получаю сообщение об ошибке при попытке выполнить этот код, я думаю, что у меня проблема в запросе sql, а строка "Service = Dlookup ..." вы можете помочь! Большое спасибо

Private Sub btnConnexion_Click() Dim Categ As Integer Dim Service As String Dim IdProf As Integer Dim db As DAO.Database Dim qdf As DAO.QueryDef Dim strSQL As String Set db = CurrentDb 'vérification que l'utilisater a bien entrer e login et le mot de passe Me.txtlogin.SetFocus If IsNull(Me.txtlogin) Then MsgBox "svp entrer votre login ", vbInformation, "login required " Me.txtlogin.SetFocus ElseIf IsNull(Me.txtmdp) Then MsgBox "svp entrer votre mots de passe ", vbInformation, "mdp required " Me.txtmdp.SetFocus Else 'vérification que le login et le mdp sont corrects If (IsNull(DLookup("login", "dbo_Authentification", "login='" & Me.txtlogin.Value & "'"))) Or _ (IsNull(DLookup("mdp", "dbo_Authentification", "mdp='" & Me.txtmdp.Value & "'"))) Then MsgBox "login ou mdp incorrect" Else 'récupération de l'IdCatégorie dans Categ, pour préciser les sessions des acteurs selon leurs catégories professionneles Categ = DLookup("IdCategorie", "dbo_Professionnel", "IdProfessionnel = " & DLookup("IdCompte", "dbo_Authentification", "login='" & Me.txtlogin.Value & "'")) 'DoCmd.Close If Categ = 3 Then DoCmd.OpenForm "role" Else DoCmd.OpenForm "ListingPatients" 'Service récupère le service du professionnel authentifié pour l'afficher à l'entete du formulaire "ListingPatients" Service = DLookup("IntituleServ", "dbo_Service", "IdService = " & DLookup("IdProfessionnel", "dbo_Professionnel", "IdProfessionnel = " & DLookup("IdCompte", "dbo_Authentification", "login='" & Me.txtlogin.Value & "'"))) Forms![ListingPatients]![txtIntituleServ] = Service strSQL = "SELECT dbo_Patient.*, dbo_Service.IntituleServ, dbo_HospitalisatAcuelle.lit, dbo_Professionnel.IdProfessionnel, dbo_HospitalisatAcuelle.DateEntree, dbo_HospitalisatAcuelle.DateSortie FROM dbo_Service INNER JOIN ((dbo_Professionnel INNER JOIN dbo_Authentification ON dbo_Professionnel.IdProfessionnel = dbo_Authentification.IdCompte) INNER JOIN (dbo_Patient INNER JOIN (dbo_HospitalisatAcuelle INNER JOIN dbo_DonneePatientActuelles ON dbo_HospitalisatAcuelle.IdHosp = dbo_DonneePatientActuelles.IdHosp) ON dbo_Patient.IdPatient = dbo_DonneePatientActuelles.IdPatient) ON dbo_Professionnel.IdProfessionnel = dbo_HospitalisatAcuelle.IdProfessionnel) ON dbo_Service.IdService = dbo_Professionnel.Idservice WHERE (((dbo_HospitalisatAcuelle.DateEntree)<=Now()) AND ((dbo_HospitalisatAcuelle.DateSortie)>Now())) OR (((dbo_HospitalisatAcuelle.DateSortie) Is Null) AND dbo_Service.IntituleServ = '" & Service & "') ;" End If End If End If End Sub

Так что, когда я выполняю этот код, я получаю сообщение об ошибке «Недопустимое использование» в строке «Service = ...» и запрос SQL dosen't вернуть состояние, когда! спасибо очень много

Таким образом, после добавления Nz, я думаю, что проблема Null решается

Service = Nz(DLookup("IntituleServ", "dbo_Service", "IdService = " & DLookup("IdService", "dbo_Professionnel", "IdProfessionnel = " & DLookup("IdCompte", "dbo_Authentification", "login='" & Me.txtlogin.Value & "'"))), "inconnu") Forms![ListingPatients]![txtIntituleServ] = Service

Но я до сих пор есть проблема с запросом SQL, я думаю, что Бесполезный «т поставить правильный синтаксис SQL запроса интегрирующий в коде VBA, вы можете взглянуть на эту строку:

strSQL = "SELECT dbo_Patient.*, dbo_Service.IntituleServ, dbo_HospitalisatAcuelle.lit, dbo_Professionnel.IdProfessionnel, dbo_HospitalisatAcuelle.DateEntree, dbo_HospitalisatAcuelle.DateSortie FROM dbo_Service INNER JOIN ((dbo_Professionnel INNER JOIN dbo_Authentification ON dbo_Professionnel.IdProfessionnel = dbo_Authentification.IdCompte) INNER JOIN (dbo_Patient INNER JOIN (dbo_HospitalisatAcuelle INNER JOIN dbo_DonneePatientActuelles ON dbo_HospitalisatAcuelle.IdHosp = dbo_DonneePatientActuelles.IdHosp) ON dbo_Patient.IdPatient = dbo_DonneePatientActuelles.IdPatient) ON dbo_Professionnel.IdProfessionnel = dbo_HospitalisatAcuelle.IdProfessionnel) ON dbo_Service.IdService = dbo_Professionnel.Idservice WHERE (((dbo_HospitalisatAcuelle.DateEntree)<=Now()) AND ((dbo_HospitalisatAcuelle.DateSortie)>Now())) OR (((dbo_HospitalisatAcuelle.DateSortie) Is Null)) ;" strSQL = strSQL & "WHERE [dbo_Service]![IntituleServ] = ' " & Service & " ' " DoCmd.OpenQuery(strSQL)

Спасибо,

stackoverrun.com

sql - Как установить значения параметров запроса SQL INSERT через VBA в Microsoft Access?

Вся суть подформы заключается в том, что она контролируется источником записи и дочерними и основными полями ссылки. Скажем, форма - это компания, а подчиненная форма - Employees, источником записи для подформы может быть:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees

Дочерние и основные поля ссылок будут CompanyID. Когда вы перейдете через основную форму, будут отображаться только те записи, которые относятся к текущей компании. Скажем, вы хотите отобразить только тех сотрудников, которые находятся в техническом положении, вы можете изменить источник записи во время выполнения:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees WHERE Position = "Technical"

Или, если это всегда будет фильтр в форме, добавьте combobox, скажем, в основную форму и используйте это в качестве второго основного мастер-ссылки, так что у вас есть:

Link Master Fields: CompanyID; cboPosition Link Child Fields : CompanyID; Position

Наконец, вы можете просто установить свойство фильтра из основной формы:

Me.Employees_subform.Form.Filter = "Position=""Tecnical""" Me.Employees_subform.Form.FilterOn = True

Если это не то, что вы имеете в виду, добавьте некоторые примечания к вашему вопросу.

ИЗМЕНИТЬ

Вы можете указать параметры для запроса, указав элемент управления в форме:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees WHERE Position = Forms!MyMainForm!cboPosition

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

То, что вы не можете сделать, это изменить параметр и привязать его к форме или подформату.

Например:

DoCmd.SetParameter "@SomeID", "1" ' This works DoCmd.OpenQuery ("Queryx") ' This will give a prompt for @SomeID and then run Me.SomeSubform.Form.RecordSource = "Queryx"

qaru.site

Как установить значения параметров запроса SQL INSERT через VBA в Microsoft Access?

Всего смысл подчиненного, что она находится под контролем источником записей и канальный ребенком и мастер-полей. Скажем, форма компания и Подчиненные Служащие, источник записи для подчиненного может быть:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees

Ссылки ребенок и мастер-полей будут CompanyID. Когда вы перейдете через основную форму, будут отображаться только те записи, которые относятся к текущей компании. Допустим, вы тогда хотите отобразить только те сотрудники, которые в техническом положении, вы можете изменить источник записи во время выполнения:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees WHERE Position = "Technical"

Или, если это всегда будет фильтр на форме, добавьте выпадающий, скажем, к основной форме и использовать его в качестве второго ведущего поля связи, так что у вас есть:

Link Master Fields: CompanyID; cboPosition Link Child Fields : CompanyID; Position

Наконец, вы можете просто установить свойство фильтра из главной формы:

Me.Employees_subform.Form.Filter = "Position=""Tecnical""" Me.Employees_subform.Form.FilterOn = True

я Это не то, что вы имеете в виду, добавьте некоторые примечания к вашему вопросу.

EDIT

Вы можете указать параметры запроса с помощью ссылки на контроль в форме:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees WHERE Position = Forms!MyMainForm!cboPosition

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

То, что вы не можете сделать, это изменить параметр и «привязать» его к форме или подчиненной форме.

Например:

DoCmd.SetParameter "@SomeID", "1" ' This works DoCmd.OpenQuery ("Queryx") ' This will give a prompt for @SomeID and then run Me.SomeSubform.Form.RecordSource = "Queryx"

stackoverrun.com

sql - Запуск вложенного SQL-запроса Access из Excel VBA

жаль, что название не так точно, как должно быть, но английский не мой первый язык, и я не мог объяснить лучше. Это не вопрос о том, как выполнять запросы в базе данных Access из Excel VBA, я знаю, как это сделать. Я запрашиваю помощь, потому что у меня есть рабочий SQL-запрос, встроенный в Access для тестирования, который мне нужно запустить из встроенной макроса Excel. Конкурс: Я создаю инструмент, составленный из базы данных Access (которая является "пассивной", она хранит только данные) и некоторые электронные таблицы Excel, взаимодействующие с ней. Мне нужно это так из-за пользователей, которым придется использовать его, поэтому я не могу это изменить. У меня есть функции, которые позволяют мне общаться с БД, предварительно создавая нужные мне строки. В этом случае я хочу прочитать результат запроса набора записей. Функция VBA, чтобы сделать это, следующая:

Public Function Read_Recordset(ByVal stSQL1 As String) As ADODB.Recordset Dim cnt As ADODB.Connection Dim stDB As String Dim stConn As String Dim wbBook As Workbook Dim wsSheet1 As Worksheet 'Instantiate the ADO-objects. Set cnt = New ADODB.Connection Set Read_Recordset = New ADODB.Recordset 'Path to the database. stDB = Foglio1.Cells(1, 2) 'Create the connectionstring. stConn = "Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=" & stDB & ";" With cnt .Open (stConn) 'Open the connection. .CursorLocation = adUseClient 'Necessary to disconnect the recordset. End With Debug.Print stSQL1 With Read_Recordset .Open stSQL1, cnt 'Create the recordset. Set .ActiveConnection = Nothing 'Disconnect the recordset. End With 'Release objects from the memory. cnt.Close Set cnt = Nothing End Function

Теперь в БД доступа я уже создал необходимый мне запрос, который довольно сложный, но работает безупречно:

SELECT TOP 2 * FROM ( SELECT C.Name, format(O.Freight,"#0.00") as Freight, format((O.Forwarding+ C.FixedFee + O.Freight*C.MgmtSurcharge/100 + O.Freight*C.FixedFuelSurcharge/100+( Switch ( 1.85<C.FuelReferencePrice, C.FuelReferencePrice,1.85>C.FuelReferencePrice,1.85 ) - C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight),"#0.00") as AdditionalCosts,format((O.Freight+(O.Forwarding + C.FixedFee + O.Freight*C.MgmtSurcharge/100 + O.Freight*C.FixedFuelSurcharge/100+( Switch ( 1.85<C.FuelReferencePrice, C.FuelReferencePrice,1.85>C.FuelReferencePrice,1.85 ) - C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight)),"#0.00") as TotalCost FROM Temp_TaxableWeights AS T INNER JOIN (Weight_Ranges AS W INNER JOIN (Carriers AS C INNER JOIN [OBPT_Groupage&LorryOwner] AS O ON C.[ID] = O.[CarrierID]) ON W.ID = O.WeightRangeID) ON T.CarrierID = C.ID WHERE (((W.WeightMin)< T.TaxableWeight) AND ((W.WeightMax)>= T.TaxableWeight) AND ((O.DistrictID)=35)) AND O.RateTypeID=4 UNION SELECT C.Name, format(O.Freight*T.TaxableWeight,"#0.00") as Freight, format((O.Forwarding + C.FixedFee + O.Freight*T.TaxableWeight*C.MgmtSurcharge/100 + O.Freight*T.TaxableWeight*C.FixedFuelSurcharge/100+( Switch ( 1.85<C.FuelReferencePrice, C.FuelReferencePrice,1.85>C.FuelReferencePrice,1.85 ) -C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight*T.TaxableWeight),"#0.00") as AdditionalCosts,format((O.Freight*T.TaxableWeight +O.Forwarding + C.FixedFee + O.Freight*T.TaxableWeight*C.MgmtSurcharge/100 + O.Freight*T.TaxableWeight*C.FixedFuelSurcharge/100+( Switch ( 1.85<C.FuelReferencePrice, C.FuelReferencePrice,1.85>C.FuelReferencePrice,1.85 ) -C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight*T.TaxableWeight),"#0.00") as TotalCost FROM Temp_TaxableWeights AS T INNER JOIN (Weight_Ranges AS W INNER JOIN (Carriers AS C INNER JOIN [OBPT_Groupage&LorryOwner] AS O ON C.[ID] = O.[CarrierID]) ON W.ID = O.WeightRangeID) ON T.CarrierID = C.ID WHERE (((W.WeightMin)< T.TaxableWeight) AND ((W.WeightMax)>= T.TaxableWeight) AND ((O.DistrictID)=35)) AND O.RateTypeID=8 ORDER BY TotalCost ASC ) AS Best2Quotations;

Это дает мне результаты, которые я хочу:

Теперь моя проблема. Мне нужно запустить этот запрос из электронной таблицы Excel, потому что он не будет статичным, поскольку я написал его в Access для тестирования: некоторые из значений выбираются из самого листа. Тем не менее, я не могу запустить даже статический. Я пытаюсь с помощью этого кода:

Public Sub btnCalcQuotations_Click() Dim stSQL As String Dim rstTemp As ADODB.Recordset Dim RealWeight As Double, Volume As Double stSQL = "SELECT TOP 2 * FROM (SELECT C.Name, format(O.Freight," & Chr(34) & "#0.00" & Chr(34) & ") as Freight, format((O.Forwarding + C.FixedFee + O.Freight*C.MgmtSurcharge/100 + O.Freight*C.FixedFuelSurcharge/100+(Switch(1.85<C.FuelReferencePrice,C.FuelReferencePrice , 1.85 > C.FuelReferencePrice, 1.85)" & _ "- C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight)," & Chr(34) & "#0.00" & Chr(34) & ") as AdditionalCosts,format((O.Freight+(O.Forwarding + C.FixedFee + O.Freight*C.MgmtSurcharge/100 + O.Freight*C.FixedFuelSurcharge/100+ (Switch(1.85<C.FuelReferencePrice,C.FuelReferencePrice , 1.85 > C.FuelReferencePrice, 1.85)" & _ "- C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight))," & Chr(34) & "#0.00" & Chr(34) & ") as TotalCost,W.WeightMin, W.WeightMax, C.FuelReferencePrice,C.IndexedFuelSurcharge FROM Temp_TaxableWeights AS T INNER JOIN (Weight_Ranges AS W INNER JOIN (Carriers AS C INNER JOIN [OBPT_Groupage&LorryOwner] AS O ON C.[ID] = O.[CarrierID])" & _ "ON W.ID = O.WeightRangeID) ON T.CarrierID = C.ID WHERE (((W.WeightMin) < T.TaxableWeight) And ((W.WeightMax) >= T.TaxableWeight) And ((O.DistrictID) = 35)) And O.RateTypeID = 4 UNION SELECT C.Name, format(O.Freight*T.TaxableWeight," & Chr(34) & "#0.00" & Chr(34) & ") as Freight, format((O.Forwarding + C.FixedFee + O.Freight*T.TaxableWeight*C.MgmtSurcharge/100 +" & _ "O.Freight*T.TaxableWeight*C.FixedFuelSurcharge/100+ (Switch(1.85<C.FuelReferencePrice,C.FuelReferencePrice , 1.85 > C.FuelReferencePrice, 1.85) - C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight*T.TaxableWeight)," & Chr(34) & "#0.00" & Chr(34) & ") as AdditionalCosts,format((O.Freight*T.TaxableWeight +O.Forwarding + C.FixedFee + O.Freight*T.TaxableWeight*C.MgmtSurcharge/100 + O.Freight*T.TaxableWeight*C.FixedFuelSurcharge/100+" & _ "(Switch(1.85<C.FuelReferencePrice,C.FuelReferencePrice, 1.85 > C.FuelReferencePrice, 1.85)- C.FuelReferencePrice)/1.85*C.IndexedFuelSurcharge*O.Freight*T.TaxableWeight)," & Chr(34) & "#0.00" & Chr(34) & ") as TotalCost,W.WeightMin, W.WeightMax, C.FuelReferencePrice, C.IndexedFuelSurcharge FROM Temp_TaxableWeights AS T INNER JOIN (Weight_Ranges AS W INNER JOIN (Carriers AS C INNER JOIN [OBPT_Groupage&LorryOwner] AS O ON C.[ID] = O.[CarrierID]) ON W.ID = O.WeightRangeID) ON T.CarrierID = C.ID" & _ "WHERE (((W.WeightMin) < T.TaxableWeight) And ((W.WeightMax) >= T.TaxableWeight) And ((O.DistrictID) = 35)) And O.RateTypeID = 8 ORDER BY TotalCost ASC)" Set rstTemp = Read_Recordset(stSQL) With rstTemp If Not .EOF Then r = Application.WorksheetFunction.Match("Trasportatore", Columns(24), 0) + 2 .MoveFirst While Not .EOF Cells(r, 24) = !Name Cells(r, 25) = !Freight Cells(r, 26) = !AdditionalCost Cells(r, 27) = !TotalCost .MoveNext Wend End If End With End Sub

Я не могу заставить его работать, в момент фактического чтения данных, поэтому эта строка предыдущей функции Read_Recordset VBA:

.Open stSQL1, cnt 'Create the recordset.

он возвращает мне ошибку времени выполнения, которая гласит:

"JOIN выражение не поддерживается" (или что-то подобное, мое находится на итальянском языке)

Я довольно борется, после того, как много времени, проведенного при поиске запроса в Access, я не мог удержаться от идеи не запускать его из Excel. Любые предложения или альтернативное решение? Все было бы очень благодарно. С Уважением,

Marco

qaru.site