powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Сравнить RecordSets
63 сообщений из 63, показаны все 3 страниц
VBA - Сравнить RecordSets
    #38261313
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть два заполненных объекта типа RecordSet. Набор полей идентичен.

Код: vbnet
1.
2.
3.
' Вот декларация для моих наборов данных
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset



Как мне вывести на лист или в новый RecordSet те из записей rs2, которых нет в rs ?
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261325
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как именно рекордсеты заполняются данными?
гораздо проще и сильно быстрее сделать запрос к БД для выборки таких записей
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261529
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

А какая разница? Заполнены они на 100% без ошибок. Если возможно применить SQL к RecordSet так же легко, как к файлам реальной БД - записи в студию.
А обращаться для этого непосредственно к БД я не хочу, так как получится слишком громоздкая конструкция, там и так сложные выборки. Не проще ли поработать с уже отобранными значениями в RecordSet?
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261539
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shizuku,

Shocker.Pro, прав, я подобное использовал бы исключительно методом sql конструкции:
Код: plsql
1.
select * from table t1 where t1.column1 not in (select t2.column1 from table2 t2)


И это "нагромождение" будет в разы эффективнее.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261550
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuНе проще ли поработать с уже отобранными значениями в RecordSet?не проще. Применить SQL-запрос к рекордсету не получится. Если выборки сложные, существуют механизмы представлений, хранимых процедур, временных таблиц и т.п., в любом случае такие вещи делаются на сервере. Например, никто не мешает сделать две временных таблицы, слить туда результаты и потом сделать выборку, раз уж запросы такие сложные, что нельзя их сравнить как два подзапроса.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261559
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShizukuЕсли возможно применить SQL к RecordSet так же легко, как к файлам реальной БД - записи в студию.
мечтатель ...

kiv-1980И это "нагромождение" будет в разы эффективнее.
если ТС не врёт, и там действительно, "суровые" выборки,
то, всё таки, будет проще "сработать" всё на клиенте - сохранить данные из рекордсетов в файл, и потом, открыть новый рекордсет на этом файле, выбрав только различающиеся записи
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261563
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112если ТС не врёт, и там действительно, "суровые" выборки,
то, всё таки, будет проще "сработать" всё на клиентекакие бы ни были суровые выборки, никто не мешает работать с ними на сервере, а не на клиенте. Что если в исходных выборках будет по миллиону записей, а на выходе всего десять? зачем гнать это на клиента и там обрабатывать?
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261565
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112,

Как-то сталкивался с подобным, практика показывает, если есть возможность использовать запрос, ею надо пользоваться, есть масса конструкций, которые позволят избежать потери при запросах. А правильные планы, выруливают любые выборки.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261578
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proqwerty112если ТС не врёт, и там действительно, "суровые" выборки,
то, всё таки, будет проще "сработать" всё на клиентекакие бы ни были суровые выборки, никто не мешает работать с ними на сервере, а не на клиенте. Что если в исходных выборках будет по миллиону записей, а на выходе всего десять? зачем гнать это на клиента и там обрабатывать?
на сколько я понял стартовый пост, - обе выборки УЖЕ на клиенте

а "суровость" выборки - может быть разной,
может там и возвращается в итоге 10-ть записей, но делает этот возврат ХП, которая выполняется полчаса ...
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261663
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И каждая выборка у меня в пределах своего Connection через Connection.Execute("My SQL String")

Как я сделаю выборку сразу из двух Connection? Они на разных наборах данных построены, а не на одних и тех же таблицах, хотя структура и одинакова.

Каждый из двух Connection имеет свой Data Source - не один и тот же.

А если опустить все вложенные и прочие сложности выборок, то мне нужно:

Код: sql
1.
SELECT поле_которое_сравниваю FROM табл_источник_rs WHERE rs.поле_которое_сравниваю NOT IN (SELECT табл_источник_rs2.поле_которое_сравниваю FROM табл_источник_rs2) 



Таблицы табл_источник_rs и табл_источник_rs2 - имеют одинаковые структуру, но хранятьсчя в разных папках, и имеют соотвественно разные данные (почему собственно и нужно их сравнить). Если бы это были две таблицы в пределах одного Data Source (в одной папке), то можно было бы попытаться такой запрос сделать. А так...
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261670
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причем тут коннекшены и датасоурсы????

БД одна или разные?
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261678
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если очень хочется все-таки сравнивать рекордсеты, то самый быстрый способ (но при этом оба рекордсета должны быть отсортированы по полю, по которому идет сравнение) идти двумя курсорами по двум рекордсетам последовательно. Если при очередной итерации в одном рекордсете сравниваемое поле становится больше другого, то значит в том другом есть запись, которая отсутствует в первом. Соответственно, вычленяем эту запись и двигаем курсор только на втором рекордсете. Ну и, разумеется, зеркально.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261682
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Это dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БД
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261698
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuЭто dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БДв аксессе можно объединять запросы к разным файлам с помощью IN (SELECT ... FROM .... IN ("c:\1.mdb")...). Что-то подобное есть и в дибейсе, но тут я не силен, возможно точно такая-же конструкция.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261702
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЕсли очень хочется все-таки сравнивать рекордсеты, то самый быстрый способ...
Код: vbnet
1.
2.
3.
4.
5.
6.
For j = 1 To rs2_count
  For i = 1 To rs_count
    If rs2.Fields <> rs2.Fields Then rs3.AddNew !ls = fl(0) Else i = i + 1
  Next
  j = j + 1
Next



Так что-ли
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261706
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, тут, честно говоря, написан сущий бред
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261718
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно объединить оба рекордсета в один xml-документ и сделать xpath-запрос.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261725
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Do Until rs.EOF Or rs2.EOF
  Select Case rs("поле_которое_сравниванием").Value
    Case rs2("поле_которое_сравниванием").Value
      rs.MoveNext
      rs2.MoveNext
    Case Is > rs2("поле_которое_сравниванием").Value
      'копируем из rs2 куда-нибудь текущую запись, это запись, которой нет в rs
      rs2.MoveNext
    Case Is < rs2("поле_которое_сравниванием").Value
      'копируем из rs куда-нибудь текущую запись, это запись, которой нет в rs2
      rs.MoveNext
  End Select  
Loop

как-то так. Но сюда еще надо дописать алгоритм, если, к примеру, rs2 уже закончился, а в rs еще есть записи, то все их надо тоже скопировать, так как их нет в rs2. Ну и наоборот.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261746
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕсли очень хочется все-таки сравнивать рекордсеты, то самый быстрый способ (но при этом оба рекордсета должны быть отсортированы по полю, по которому идет сравнение)ИМХО.
Первое - сравнивать рекордсеты всё-таки нужно по всем полям.
Второе - при наличии полностью дублирующихся строк в каждом рекордсете, возможно, должно совпадать также их количество.
Я уж не говорю о том, что должны полностью совпадать их структуры - по именам, типам и размерам полей. Возможно, допустим различный порядок полей - но и тут я бы поостерёгся. Хотя для именно поставленной задачи порядком можно пренебречь.

Однако всё это должен чётко указать ТС.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261751
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proкак-то так. Но сюда еще надо дописать алгоритм, если, к примеру, rs2 уже закончился, а в rs еще есть записи, то все их надо тоже скопировать, так как их нет в rs2. Ну и наоборот.Да уж, проще xml.

1. Загрузить первый рекордсет в первый документ
2. Загрузить второй рекордсет во второй документ
3. Скопировать строки из первого во второй, но в отдельную ноду (любую, можно создать новую в корне документа).
4. Выбрать с помощью xpath те записи, которые дублируются в этой ноде.
5. Удалить их.
6. Очистить/удалить отдельную ноду
7. Загрузить xml обратно в рекордсет
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261761
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaОднако всё это должен чётко указать ТС.А ТС и указал четко: набор полей одинаков, проверять наличие записей, а не отличие, то есть лишь по ключевым полям.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261764
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProShizukuЭто dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БДв аксессе можно объединять запросы к разным файлам с помощью IN (SELECT ... FROM .... IN ("c:\1.mdb")...). Что-то подобное есть и в дибейсе, но тут я не силен, возможно точно такая-же конструкция.
да, точно такая же конструкция и для dBase
7608932
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261767
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Структуры идентичны, а количество записей может несовпадать (почему и сравниваем).
В принципе, меня не интересует изменилось там какое-то поле или нет. Меня интересуют новые строки, и есть ключ в первом столбце, по которому можно было бы отобрать такие строки запросом типа SELECT ... NOT IN SELECT... как я писал выше. Но для сравнения RecordSet это конечно не применимо.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261772
Shizuku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я когда-то пробовал вариант типа
Код: sql
1.
2.
3.
4.
SELECT Customers.CustomerID
FROM Customers
IN "C:\DBASE\DATA\SALES" "dBASE IV;"
WHERE Customers.CustomerID Like "A*"



Попробую еще раз. Запросик, конечно, будет аховый - строчек на 10-15 ))
- но лишь бы работал.
...
Рейтинг: 0 / 0
VBA - Сравнить RecordSets
    #38261780
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShizukuСтруктуры идентичны... и есть ключ в первом столбцетогда вполне подойдет мой алгоритм, так как будет сделан только один проход по каждому рекордсету. Мне кажется, он отработает быстрее, чем через xml, так как не будет ворочаться лишний объем данных
...
Рейтинг: 0 / 0
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
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
63 сообщений из 63, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Сравнить RecordSets
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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