Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия. / 6 сообщений из 6, страница 1 из 1
23.03.2016, 11:09
    #39198603
Mnham
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия.
В чем суть, после выполнения двух запросов имеем два Recordset, RS и RS2 по 10 000 строк каждый.
В первой колонке храниться код позиции, во второй присвоенный класс АВС.
Необходимо подсчитать сколько позиций сменили класс АВС и в какую сторону.
Например:
Код: vbnet
1.
2.
3.
RS![Позиция]="10100" RS![Класс]="А"
RS2![Позиция]="10100" RS2![Класс]="B"
AB=AB+1


Собрал две конструкции.

1. Отрабатывает за 9 минут.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    Do While Not RS2.EOF
        RS.MoveFirst
        RS.Find "Позиция='" & RS2![Позиция] & "'"
        If Not RS.BOF And Not RS.EOF Then
            If RS![Класс] = "A" And RS2![Класс] = "A" Then AA = AA + 1
            If RS![Класс] = "A" And RS2![Класс] = "B+" Then AB_pl = AB_pl + 1
            If RS![Класс] = "A" And RS2![Класс] = "B" Then AB = AB + 1
            If RS![Класс] = "A" And RS2![Класс] = "C" Then AC = AC + 1
            If RS![Класс] = "A" And RS2![Класс] = "X" Then AX = AX + 1
        End If
        RS2.MoveNext
    Loop


2. Время отработки неизвестно.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    For i = 1 To RS2.RecordCount
        RS.MoveFirst
        For j = 1 To RS.RecordCount
            If RS2![Позиция] = RS![Позиция] Then
                If RS![Класс] = "A" And RS2![Класс] = "A" Then AA = AA + 1
                If RS![Класс] = "A" And RS2![Класс] = "B+" Then AB_pl = AB_pl + 1
                If RS![Класс] = "A" And RS2![Класс] = "B" Then AB = AB + 1
                If RS![Класс] = "A" And RS2![Класс] = "C" Then AC = AC + 1
                If RS![Класс] = "A" And RS2![Класс] = "X" Then AX = AX + 1
                Exit For
            End If
            RS.MoveNext
        Next j
        RS2.MoveNext
    Next i


Каким способом ускорить выполнение данной задачи?
...
Рейтинг: 0 / 0
23.03.2016, 11:30
    #39198627
Mnham
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия.
Кажется нашел решение:
5 сек
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Список1 = RS.GetRows
Список2 = RS2.GetRows
RS.MoveFirst
RS2.MoveFirst
    For i = 0 To UBound(Список2, 2)
        For j = 0 To UBound(Список1, 2)
            If Список2(0, i) = Список1(0, j) Then
                If Список1(1, j) = "A" And Список2(1, i) = "A" Then AA = AA + 1
                If Список1(1, j) = "A" And Список2(1, i) = "B+" Then AB_pl = AB_pl + 1
                If Список1(1, j) = "A" And Список2(1, i) = "B" Then AB = AB + 1
                If Список1(1, j) = "A" And Список2(1, i) = "C" Then AC = AC + 1
                If Список1(1, j) = "A" And Список2(1, i) = "X" Then AX = AX + 1
                Exit For
            End If
        Next j
    Next i
...
Рейтинг: 0 / 0
23.03.2016, 11:30
    #39198628
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия.
MnhamКаким способом ускорить выполнение данной задачи?
Создать третий запрос, который НА СЕРВЕРЕ обработает данные и сразу вернёт требуемое.
Ну типа
Код: vbnet
1.
2.
3.
4.
5.
6.
sql = "select q1.[Класс], q2.[Класс], COUNT(q2.[Класс]) " & _
       "from (" & rs1.RecordSource & ") as q1," & _
       "(" & rs2.RecordSource & ") as q2 " & _
       "where select q1.[Позиция]=q2.[Позиция] " & _
       "group by q1.[Класс], q2.[Класс]"
db.openrecordset sql
...
Рейтинг: 0 / 0
23.03.2016, 11:31
    #39198631
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия.
Хотя, располагая исходными текстами запросов, лучше написать нормальный текст третьего запроса.
...
Рейтинг: 0 / 0
23.03.2016, 11:52
    #39198655
Mnham
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия.
Akina, интересно

База данных - таблица .xlsx
Два запроса идентичны, разница в датах.
Пришлось так извратиться, дата записана в текстовом формате.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
            RS.Open "SELECT Позиция, (Позиция) AS Класс, (SUM(Кол_во_Транзакций)) AS Сумма_Транзакций " & _
                  "FROM [" & Имя_Листа & "$] " & _
                  "WHERE (Зона IN (" & Скл_Подразделения & ") AND " & _
                  "Дата IN (" & Период_Даты1 & Период_Даты2 & Период_Даты3 & Период_Даты4 & Период_Даты5 & Период_Даты6 & "))" & _
                  "GROUP BY Позиция " & _
                  "ORDER BY 3 DESC", _
                  CN, adOpenStatic, adLockBatchOptimistic


Далее идет алгоритм присвоения класса АВС
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Пример:
A=500
B_pl=200
B=200
C=100
                For i = 1 To .RecordCount
                    Select Case i
                    Case Is <= A
                        ![Класс] = "A"
                    Case A To A + B_pl
                        ![Класс] = "B+"
                    Case A + B_pl To A + B_pl + B
                        ![Класс] = "B"
                    Case A + B_pl + B To A + B_pl + B + C
                        ![Класс] = "C"
                    Case Is > A + B_pl + B + C
                        ![Класс] = "X"
                    End Select
                    .Update
                    .MoveNext
                Next i


Если это как то можно обрулить одним запросом, буду признателен.
...
Рейтинг: 0 / 0
23.03.2016, 11:57
    #39198662
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия.
MnhamБаза данных - таблица .xlsx
Таблица Excel - такая же база данных, как пивная бутылка - миномёт.
А то, что описано кодом, можно сделать формулами в самом Excel.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Excel VBA, как свести два ADODB.Recordset. Вопрос быстродействия. / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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