powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Сравнить RecordSets
13 сообщений из 63, страница 3 из 3
VBA - Сравнить RecordSets
    #38262616
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuShocker.Proпропущено...
вообще, при открытии рекордсета он и так стоит на первой записи... если только ничего с ним не делали до этого.
Выгружалось на лист, и еще сохранялось в переменные RecordCount.Не обязательно даже сравнивать формулами - тогда эти листы и есть две готовые "таблицы", и нужные данные вы можете получить своим одним SQL-запросом...
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262627
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, kiv-1980

Нашел ошибку. Оба примера я трассирую через Debug.Print - как у kiv-1980. Оказывается, лог в окне Immediate обрезает всё, что больше 200 строк, т.е. начала я просто не видел.

Есть возможность убрать ограничение Debug.Print в 200 строк?
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262686
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внимание, барабанная дробь! Первый рабочий вариант:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
'Встаем на первую запись
rs.MoveFirst
rs2.MoveFirst
'Счетчик найденных
ass = 0
'Цикл поиска
Do Until (rs2.EOF)
    Find_result = False
    rs.MoveFirst
    Do Until (rs.EOF)
        If rs2("n_ls") = rs("n_ls") Then
           Find_result = True
        End If
        rs.MoveNext
    Loop
 If Find_result = False Then
   Debug.Print "Найдено: " & rs2("n_ls")
   ass = ass + 1
 End If
 rs2.MoveNext
Loop
Debug.Print "Всего RS: " & ass - 1



Изменения:
Переписал на поиск в rs2, поиск в rs мне не нужен.
Во вложенном цикле не хватало возврата на первую запись для rs.

Теперь можно пробовать переделывать другие варианты, и оптимизировать по скорости. Перебор по циклу заметно притормаживает...
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262691
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо внутреннего цикла:
Код: vbnet
1.
2.
rs.Find "n_ls=" & rs2("n_ls")
Find_result = Not rs.EOF
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262713
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyВместо внутреннего цикла:
Код: vbnet
1.
2.
rs.Find "n_ls=" & rs2("n_ls")
Find_result = Not rs.EOF



Не пошло. В переменной ass насчитало всё подряд, а не найденные
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262727
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuAntonariyВместо внутреннего цикла:
Код: vbnet
1.
2.
rs.Find "n_ls=" & rs2("n_ls")
Find_result = Not rs.EOF



Не пошло. В переменной ass насчитало всё подряд, а не найденныеПолностью код покажите.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262740
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
'Встаем на первую запись
rs.MoveFirst
rs2.MoveFirst
'Счетчик найденных
ass = 0
'Цикл поиска
Do Until (rs2.EOF)
    Find_result = False
    rs.MoveFirst
    rs.Find "n_ls=" & rs2("n_ls")
    Find_result = Not rs.EOF
 If Find_result = False Then
   Debug.Print "Найдено: " & rs2("n_ls")
   ass = ass + 1
 End If
 rs2.MoveNext
Loop
Debug.Print "Всего RS: " & ass - 1
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262745
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще маленький вопрос не по теме. У меня rs.CursorType = adOpenStatic
Для добавления найденных записей в это набор, я должен сменить тип на обновляемый.
Вопрос. Мои добавления и обновления этого rs останутся только в Excel или попортят таблицы -источник в БД, из которой я выборку делал?
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262747
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuAntonariy,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
'Встаем на первую запись
rs.MoveFirst
rs2.MoveFirst
'Счетчик найденных
ass = 0
'Цикл поиска
Do Until (rs2.EOF)
    Find_result = False
    rs.MoveFirst
    rs.Find "n_ls=" & rs2("n_ls")
    Find_result = Not rs.EOF
 If Find_result = False Then
   Debug.Print "Найдено: " & rs2("n_ls")
   ass = ass + 1
 End If
 rs2.MoveNext
Loop
Debug.Print "Всего RS: " & ass - 1

Что за кривая логика? Если Find_result = False, то что-то там найдено.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
'Встаем на первую запись
rs.MoveFirst
rs2.MoveFirst
'Счетчик найденных
ass = 0
'Цикл поиска
Do Until (rs2.EOF)
    rs.MoveFirst
    rs.Find "n_ls=" & rs2("n_ls")
    If Not rs.EOF Then
       Debug.Print "Найдено: " & rs2("n_ls")
       ass = ass + 1
    End If
    rs2.MoveNext
Loop
Debug.Print "Всего RS: " & ass - 1
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262749
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuЕще маленький вопрос не по теме. У меня rs.CursorType = adOpenStatic
Для добавления найденных записей в это набор, я должен сменить тип на обновляемый.
Вопрос. Мои добавления и обновления этого rs останутся только в Excel или попортят таблицы -источник в БД, из которой я выборку делал?CursorType не отвечает за возможность редактирования записей, он отвечает за способ. Если со static курсором не делать Update, то изменения рекордсета в базе не зафиксируются.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262769
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyCursorType не отвечает за возможность редактирования записей, он отвечает за способ. Если со static курсором не делать Update, то изменения рекордсета в базе не зафиксируются.

В моем случае, ничего не поможет...

При использовании метода Execute установки CursorType игнорируются: http://support.microsoft.com/kb/188857/en
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262780
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyЧто за кривая логика? Если Find_result = False, то что-то там найдено.

Не так... Тут стоит условие rs2("n_ls") = rs("n_ls")
И мы получаем список тех полей, значения которых в обоих сэтах равны. А надо список тех полей, которых в rs вообще нет.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262794
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внимание, рабочий вариант №2!
Оптимизированный Antonariy и исправленный мной.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ass = 0
ass2 = 0
Do Until (rs2.EOF)
    rs.MoveFirst
    rs.Find "n_ls=" & rs2("n_ls")
    If (rs.EOF) And (ass2 < kl2) Then
       Debug.Print "Найдено: " & rs2("n_ls")
       ass = ass + 1
    End If
    rs2.MoveNext
    ass2 = ass2 + 1
Loop
Debug.Print "Всего: " & ass - 1



Antonariy решил сыграть на том, что Find либо становится на первую найденную запись, либо уходит в BOF/EOF. И это красиво, но мы не поняли друг друга с логикой... Теперь порядок.
...
Рейтинг: 0 / 0
13 сообщений из 63, страница 3 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Сравнить RecordSets
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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