Страницы: 1
RSS
SQL-запрос к 2-мерному массиву
 
Уважаемые знатоки Excel, VBA и SQL.
Подскажите, пожалуйста.
Благодаря советам форумчан я уже примерно понимаю как можно  сделать SQL-запрос к внешней базе данных, листу Excel, или даже диапазону на листе -
Но вот имеется 2-мерный масссив, созданный программно в VBA. Можно ли сделать sql-запрос к такому массиву? Не записывая его предварительно на лист или во внешний источник?

Буду признателен за хотя бы указание где искать. Очень надо
 
Нельзя.Попробуйте решить ваш вопрос через словарь
 
Вообще-то можно создать так называемый Disconnected Recordset, заполнить его данными  из VBA-массива и тогда этот Recordset можно обрабатывать SQL-запросами, но заполнение само по себе медленное, проще и быстрее (в раза 2 со словарями) обойтись обработкой самого VBA-массива.
Изменено: ZVI - 30.10.2014 05:04:17
 
Доброе время суток
Цитата
тогда этот Recordset можно обрабатывать SQL-запросами
Владимир, подскажите, пожалуйста, как это у вас получается? Я пока смог только использовать Recordset.Filter.
 
Добрый день, Андрей.
Да, с recordset-ом работает свойство Filter, выполняющий то, что  в SQL-запросе следует за WHERE.
Насколько я понимаю, это и требовалось. Еще могут быть полезны Sort и Find.
А всё, что до WHERE относится к Connection, то есть связано с физическим объектом, если мы говорим не о .Net
В VB.Net есть объект DataSet, который не привязан к источнику и позволяет выполнять SQL-команды (в памяти).
Если в VBA нужно работать со своей таблицей данных с использованием полных SQL-команд, то проще открыть одно соединение к какому-нибудь внешнему файлу (XLS, MDB) и с помощью Connection.Execute "CREATE TABLE ..." создать свою таблицу, заполнить ее хоть из массива, поработать, а в конце не забыть ещё и удалить таблицу  Connection.Execute "DROP TABLE ...".
Но, если цель - обработка VBA-массива, то, как уже отмечалось, проще обойтись без чего-либо от SQL.
Изменено: ZVI - 03.11.2014 11:23:41
 
Доброе время суток Владимир
Спасибо, я надеялся, что что-то пропустил с Recordset и можно в VBA делать нечто подобное LINQ в .Net. Жаль.
А вспомогательные базы конечно же делаю. Использую, обычно, ODBC драйвер для SQLite - как то пошустрее чем Access получается. Да, и судя по всему, нужно переходить на что-то более мощное.
Ещё раз спасибо.
 
Цитата
putejski написал: Можно ли сделать sql-запрос к такому массиву? Не записывая его предварительно на лист или во внешний источник?
поместить массив в RecordSet и работать с ним как с рекордсетом
(применяяя, как отметил ZVI все возможные методы - Sort, Find, Filter)...
для пользы дела -  репост функции Array To ADO Recordset - чтобы было у всех под рукой  :)
Код
Function rstArrayToRecordset(arrField As Variant, arrData As Variant) As ADODB.Recordset
'Array To ADO Recordset
'http://excelexperts.com/Array-To-ADO-Recordset
 
    Dim rstData             As ADODB.Recordset
    Dim recordString        As String
    Dim arrRecord           As Variant
    Dim intLoop1            As Integer
    Dim intLoop2            As Integer
 
    ReDim arrRecord(1 To 1, 1 To UBound(arrData, 2))
 
    Set rstData = New ADODB.Recordset
 
    For intLoop1 = 1 To UBound(arrField, 2)
        rstData.Fields.Append arrField(1, intLoop1), adVarChar, 500
    Next intLoop1
 
    rstData.Open
 
    For intLoop1 = 1 To UBound(arrData, 1)
        For intLoop2 = 1 To UBound(arrData, 2)
            arrRecord(1, intLoop2) = arrData(intLoop1, intLoop2)
        Next intLoop2
 
        rstData.AddNew 'arrField, arrRecord
        rstData.Fields(0).Value = arrRecord(1, 1)
        rstData.Fields(1).Value = arrRecord(1, 2)
        rstData.Fields(2).Value = arrRecord(1, 3)
        rstData.Fields(3).Value = arrRecord(1, 4)
        rstData.Update
 
    Next intLoop1
 
    Set rstArrayToRecordset = rstData
    Erase arrRecord
    Set rstData = Nothing
End Function
... не совсем SQL, но программная реализация его функциональности... через ado
Изменено: JeyCi - 03.08.2015 14:40:58
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Читают тему
Наверх