Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Результат запроса сразу в массив (переменную). / 7 сообщений из 7, страница 1 из 1
25.05.2007, 08:40:39
    #34550179
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса сразу в массив (переменную).
Как из файла dbf отобрать данные и результат поместить сразу в переменную?

Есть файл main.dbf из которого надо выбрать записи, соответствующие некоторым условиям. Например, периоду с 01.01.2007 по 31.01.2007 и (или) по какому-то другому признаку.
Если из Excel выполнить запрос (Данные -> Внешние данные -> Создать запрос), в Мастере запросов указать требуемые поля и условия файла main.dbf, указать в «заключительный шаг» пункт «Просмотр или изменение данных в Microsoft Query», то окно Microsoft Query с уже отобранными данными появляется быстро. А вот сам перенос отобранных данных на лист Excel происходит очень долго.
Сами отобранные данные не являются окончательным результатом и далее происходит их обработка. Для убыстрения работы сначала данные переносятся в переменные (массив), а затем сам массив обрабатывается.
Хотелось бы эти ненужные и очень медленные стадии переноса данных на лист и с листа в массив убрать, а сразу из запроса в массив.

Макрорекордер записывает только код с QueryTables.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;Driver={Microsoft Visual FoxPro Driver};UID=;PWD=;SourceDB=d:;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Coll" _
        ), Array("ate=RUSSIAN;Null=Yes;Deleted=Yes;")), Destination:=Range("A1"))
        .Sql = Array( _
        "SELECT main.dataoper, main.summa" & Chr( 13 ) & "" & Chr( 10 ) & "FROM main main" & Chr( 13 ) & "" & Chr( 10 ) & "WHERE (main.dataoper>={d '2007-01-01'} And main.dataoper<={d '2007-01-31'})" & Chr( 13 ) & "" & Chr( 10 ) & "ORDER BY main.dataoper" _
        )
        .FieldNames = True
        .RefreshStyle = xlInsertDeleteCells
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .RefreshOnFileOpen = False
        .HasAutoFormat = True
        .BackgroundQuery = True
        .TablesOnlyFromHTML = True
        .Refresh BackgroundQuery:=False
        .SavePassword = True
        .SaveData = True
    End With

Похожие темы были и раньше, в т.ч. и на этом форуме, но применить их не получилось.
Читать помощь по ADODB.Recordset мне не лень - просто обычный пользователь в нагромождении той информации никогда не разберётся.
Перепробовал кучу вариантов, но ничего не получилось. Где-то возникает затык, никак не могу побороть его. Хотя для знающих людей этот затык сразу, наверное, виден.

Если можно, то прошу конкретно работающий код с конкретным файлом при конкретных условиях.
Т.е., файл main.dbf. В массив загнать все данные из полей Dataoper и Summa, удовлетворяющие условию с 1 по 31 января 2007 г. Дальше будет легче, я думаю.
Т.е., что-то типа:
Код: plaintext
1.
2.
3.
4.
Dim db As Database, rs As Recordset ' ... и другие нужные для запроса описания
Dim Data() As Variant ' массив переменных, куда надо поместить полученные запросом занные
' код подключения к main dbf и строки запроса - ТУТ НЕ МОГУ СООБРАЗИТЬ, ЧТО НАПИСАТЬ!
' в итоге нужен заполненный массив Data(), например, для:
MsgBox Data( 10 , 0 ) ' отображение  11 -го элемента даты


Убедительная просьба не давать общие ответы типа: "копай в сторону ADO", "пробуй Recordset", "почитай про Connection и OpenDatabase", "используй GetRows" и т.п. Ну не получается у меня из кучи общей информации выбрать нужное... к сожалению.
...
Рейтинг: 0 / 0
25.05.2007, 10:10:17
    #34550390
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса сразу в массив (переменную).
...
Рейтинг: 0 / 0
25.05.2007, 10:11:50
    #34550395
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса сразу в массив (переменную).
tolikt
Если можно, то прошу конкретно работающий код с конкретным файлом при конкретных условиях.
Т.е., файл main.dbf. В массив загнать все данные из полей Dataoper и Summa, удовлетворяющие условию с 1 по 31 января 2007 г. [/src]
Не стесняйтесь выложить варианты которые пробывали
И еще файл mdb чтоб не создовать

P.S. Звучит как-то не красиво, обычно при таких просьбах отсылают в подфорум "работа"
...
Рейтинг: 0 / 0
25.05.2007, 11:45:57
    #34550764
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса сразу в массив (переменную).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Sub test()
    Dim cnn As ADODB.Connection
    Dim strCnnString As String
    Dim rst As ADODB.Recordset
    Dim Data() As Variant
    Set cnn = New ADODB.Connection
    ' Строка подключения ODBC.
    strCnnString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\temp;"
    ' Строка подключение OLE DB.
    'strCnnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\folder;Extended Properties=dBASE IV;User ID=Admin;Password=;"
    cnn.Open strCnnString
    ' Используем метод Execute для создания набора записей.
    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
    Set rst = cnn.Execute("SELECT Dataoper, Summa FROM [Main.dbf]")
'    Do Until rst.EOF
'        Debug.Print rst.Fields(0) & " " & rst.Fields(1)
'        rst.MoveNext
'    Loop
    Data = rst.GetRows
    MsgBox UBound(Data)
    MsgBox Data( 0 ,  0 ) & " " & Data( 1 ,  0 )
    MsgBox Data( 0 ,  1 ) & " " & Data( 1 ,  1 )
    
    rst.Close
    Set rst = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub
...
Рейтинг: 0 / 0
25.05.2007, 11:56:59
    #34550812
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса сразу в массив (переменную).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Sub test()
    Dim cnn As ADODB.Connection
    Dim strCnnString As String
    Dim rst As ADODB.Recordset
    Dim Data() As Variant
    Set cnn = New ADODB.Connection
    ' Строка подключения ODBC.
    strCnnString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\temp;"
    ' Строка подключение OLE DB.
    'strCnnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
            "c:\folder;Extended Properties=dBASE IV;User ID=Admin;Password=;"
    cnn.Open strCnnString
    ' Используем метод Execute для создания набора записей.
    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
    Set rst = cnn.Execute("SELECT Dataoper, Summa FROM [Main.dbf] WHERE Dataoper " & _
      "BETWEEN #01/01/2007# AND #31/01/2007#")
'    Do Until rst.EOF
'        Debug.Print rst.Fields(0) & " " & rst.Fields(1)
'        rst.MoveNext
'    Loop
    Data = rst.GetRows
    MsgBox UBound(Data)
    MsgBox Data( 0 ,  0 ) & " " & Data( 1 ,  0 )
    MsgBox Data( 0 ,  15 ) & " " & Data( 1 ,  15 )
    
    rst.Close
    Set rst = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub
...
Рейтинг: 0 / 0
27.05.2007, 22:06:48
    #34554060
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса сразу в массив (переменную).
vkodor - ЧЕЛОВЕК!

Работает!
Только:
1. Пришлось поэкспериментировать с отключением/подключением ссылок Micrisoft ActiveX Data Object. В какой-то момент угадал.
2. В строке Dim Data() As Variant пришлось убрать скобки, т.к. компилятор ругался в строке Data = rst.GetRows ("Невозможно присвоить значение массиву")

Теперь бы ещё минимальные знания по SQL, т.к. умные люди говорят, что большую часть нужных вычислений-манипуляций с полученными данными можно сделать в самой строке sql. Ну да ладно, это - на потом.
...
Рейтинг: 0 / 0
28.05.2007, 09:17:06
    #34554372
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса сразу в массив (переменную).
Минимальные знания там возьмёшь (где-то дня за 3 )
http://www.firststeps.ru/sql/r.php?4
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Результат запроса сразу в массив (переменную). / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]