powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Сравнить RecordSets
25 сообщений из 63, страница 2 из 3
VBA - Сравнить RecordSets
    #38261800
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyShocker.Proкак-то так. Но сюда еще надо дописать алгоритм, если, к примеру, rs2 уже закончился, а в rs еще есть записи, то все их надо тоже скопировать, так как их нет в rs2. Ну и наоборот.Да уж, проще xml.
...
проще csv :)
1
выгружаем оба рекордсета в csv-файл
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
str_rs1 = rs1.GetString(, , ",", vbCrLf & "1,")
str_rs1 = Left(str_rs1, Len(str_rs1) - 4)

str_rs2 = rs2.GetString(, , ",", vbCrLf & "-1,")
str_rs2 = Left(str_rs2, Len(str_rs2) - 5)

str_fld = "flag,f1,f2,f3,..."

str_all = str_fld & vbCrLf & str_rs1 & vbCrLf & str_rs2
' и запись str_all в файл


2
запросом к csv, получаем "разницу" в записях в новый рекордсет
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
strSQL = _
"select f1,f2,f3,... " & _
"from [MyFile.csv] in 'C:\Temp\'[text;HDR=yes;] " & _
"group by f1,f2,f3,... " & _
"having sum(flag)<>0"

rs.Open strSQL, <любой сущ.коннекшион>
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261805
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShizukuСтруктуры идентичны... и есть ключ в первом столбцетогда вполне подойдет мой алгоритм, так как будет сделан только один проход по каждому рекордсету. Мне кажется, он отработает быстрее, чем через xml, так как не будет ворочаться лишний объем данныхЕсли эта операция происходит раз в несколько минут, то какая разница, пол-секунды она займет или две трети? Зато код более короткий и понятный.

Но рекордсет это реально быстрая штука. Хранилище типа key-value на рекордсете уверенно уделывает обычную коллекцию. Проверял не тестами, а профайлом реального проекта. На специальных тестах всякое может быть, но код будет жить не в тестах.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261821
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112проще csv :)красивое решение!!!

но опять же, если данных много, то это будут ощутимые по времени дисковые операции
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261834
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112Antonariyпропущено...
Да уж, проще xml.
...
проще csv :)
1
выгружаем оба рекордсета в csv-файлВыгрузка в xml делается в одну строчку. А в csv?
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261847
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty1122
запросом к csv, получаем "разницу" в записях в новый рекордсет
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
strSQL = _
"select f1,f2,f3,... " & _
"from [MyFile.csv] in 'C:\Temp\'[text;HDR=yes;] " & _
"group by f1,f2,f3,... " & _
"having sum(flag)<>0"

rs.Open strSQL, <любой сущ.коннекшион>

А запрос-то не правильный. Нужны только ключевые поля, а тут вылезут и одинаковый ключи с отличающимися прочими данными.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261879
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyА запрос-то не правильный. Нужны только ключевые поля, а тут вылезут и одинаковый ключи с отличающимися прочими данными.
хорошо,
тогда ещё проще
Код: vbnet
1.
2.
3.
4.
5.
strSQL = _
"select id " & _
"from [MyFile.csv] in 'C:\Temp\'[text;HDR=yes;] " & _
"group by id " & _
"having sum(flag)<>0"
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261900
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proтогда вполне подойдет мой алгоритм...

См. прилагаемый скриншот
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261907
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariyqwerty112пропущено...

проще csv :)
1
выгружаем оба рекордсета в csv-файлВыгрузка в xml делается в одну строчку. А в csv?
количество строк кода - это, конечно, "ещё тот показатель" :)
но, в принципе, в 3-и можно "уложится"

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
str_rs1 = rs1.GetString(, , ",", vbCrLf & "1,")
str_rs2 = rs2.GetString(, , ",", vbCrLf & "-1,")

CreateObject("Scripting.FileSystemObject").CreateTextFile("C:\Temp\MyFile.csv", True).Write _
"flag,f1,f2,f3,..." & vbCrLf & _
Left(str_rs1, Len(str_rs1) - 4) & vbCrLf & _
Left(str_rs2, Len(str_rs2) - 5)
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261925
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shizuku, в догонку

http://shot.qip.ru/00cbDh-4o8tiVLki/

Не заходит в Case хотя проверка rs.RecordCount - rs2.RecordCount > 0
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261927
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112Antonariyпропущено...
Выгрузка в xml делается в одну строчку. А в csv?
количество строк кода - это, конечно, "ещё тот показатель" :)
но, в принципе, в 3-и можно "уложится"Годится :)
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261945
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а) скиншоты можно прикладывать прямо к сообщению на форуме
б) текст сообщения обошибке можно скопировать в буфер с помощью Ctrl+C
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261973
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fix
qwerty112
Код: vbnet
1.
2.
str_rs1 = "1" & rs1.GetString(, , ",", vbCrLf & "1,")
str_rs2 = "-1" & rs2.GetString(, , ",", vbCrLf & "-1,")
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261982
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тьху ! :)
fix
qwerty112fix
qwerty112
Код: vbnet
1.
2.
str_rs1 = "1," & rs1.GetString(, , ",", vbCrLf & "1,")
str_rs2 = "-1," & rs2.GetString(, , ",", vbCrLf & "-1,")
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262019
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proа) скиншоты можно прикладывать прямо к сообщению на форуме
Прикреплял - ушел только текст
Shocker.Proб) текст сообщения обошибке можно скопировать в буфер с помощью Ctrl+C
Конкретно для этой ошибки не сработало
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262030
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Ошибка была потому что надо было в RecordSet на первую запись перевестись.
А так... Трудно сказать. Вроде работает. Еще же "хвосты" обрезаные ловить...
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262037
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuShocker.Proа) скиншоты можно прикладывать прямо к сообщению на форуме

Прикреплял - ушел только текстИсчезает, если перед постом делал предварительный просмотр сообщения.
Профиль - Настройки форума - Включи "Стандартный дизайн" и "Включить быстрый ответ и цитирование" - глюк пропадет.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262042
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuОшибка была потому что надо было в RecordSet на первую запись перевестись.вообще, при открытии рекордсета он и так стоит на первой записи... если только ничего с ним не делали до этого.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262332
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если настаиваете на реализации в вб, тогда как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Dim Find_result As Boolean
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim sSQLString As String, sSQLString2 As String

sSQLString = "select * from table1"
Set rs = Connection1.Execute(sSQLString)

sSQLString2 = "select * from table2"
Set rs2 = Connection1.Execute(sSQLString2)

Do Until (rs.EOF)
    Find_result = False
    Do Until (rs2.EOF)
        If rs("test") = rs2("test") Then
           Find_result = True
        End If
    Loop
 If Find_result = False Then Debug.Print "Найдено: " & rs("test")
Loop

Set rs = Nothing
Set rs2 = Nothing


На мой взгляд конструкция в сквл и меньше и эстетичней, но для крутых мега громоздких выборок, такое наверное попроще.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262341
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох, тут уже много ответов, увидел только обновив )
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262351
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И прошу прощения пропустил, отходил от компа:
Код: plsql
1.
2.
3.
4.
....
rs.MoveNext
....
rs2.MoveNext



Не по теме: жаль что нельзя редактировать свой топик.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262429
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProShizukuОшибка была потому что надо было в RecordSet на первую запись перевестись.вообще, при открытии рекордсета он и так стоит на первой записи... если только ничего с ним не делали до этого.

Выгружалось на лист, и еще сохранялось в переменные RecordCount.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262498
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kiv-1980,

У вас, так же как и у Shocker.Pro, находит 200 записей. Я сделал сравнение вручную, и насчитал 535 записей. Т.е. больше половины остались неучтенными... :(
При этом разница в количестве записей между rs и rs2 составляет 126!
Получается, что "хвост" тоже тут не виноват (200+126=326<535).
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262519
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuУ вас, так же как и у Shocker.Pro, находит 200 записей. Я сделал сравнение вручную, и насчитал 535 записей.если два абсолютно разных алгоритма работают одинаково, а алгоритм ручного сравнения - по-другому, повод задуматься над вторым, а не над первыми

Ну а вообще, скорее всего проблема в ТЗ - мы выполняем ТЗ так, как оно написано, а подразумевается, видимо, что-то еще.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262544
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuВыгружалось на листтак если данные уже на листе, можно формулами их сравнить
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38262565
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да понятно, что по глобальной сети не отладишь. Вроде все то сделано. Сижу, дзенствую....
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Сравнить RecordSets
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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