Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA - Сравнить RecordSets / 25 сообщений из 63, страница 1 из 3
17.05.2013, 08:55
    #38261313
Shizuku
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
У меня есть два заполненных объекта типа RecordSet. Набор полей идентичен.

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



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

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

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


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

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

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

а "суровость" выборки - может быть разной,
может там и возвращается в итоге 10-ть записей, но делает этот возврат ХП, которая выполняется полчаса ...
...
Рейтинг: 0 / 0
17.05.2013, 11:57
    #38261663
Shizuku
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
И каждая выборка у меня в пределах своего 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
17.05.2013, 12:02
    #38261670
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
причем тут коннекшены и датасоурсы????

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

Это dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БД
...
Рейтинг: 0 / 0
17.05.2013, 12:17
    #38261698
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
ShizukuЭто dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БДв аксессе можно объединять запросы к разным файлам с помощью IN (SELECT ... FROM .... IN ("c:\1.mdb")...). Что-то подобное есть и в дибейсе, но тут я не силен, возможно точно такая-же конструкция.
...
Рейтинг: 0 / 0
17.05.2013, 12:18
    #38261702
Shizuku
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
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
17.05.2013, 12:19
    #38261706
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
Нет, тут, честно говоря, написан сущий бред
...
Рейтинг: 0 / 0
17.05.2013, 12:26
    #38261718
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
Можно объединить оба рекордсета в один xml-документ и сделать xpath-запрос.
...
Рейтинг: 0 / 0
17.05.2013, 12:28
    #38261725
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
Код: 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
17.05.2013, 12:38
    #38261746
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Сравнить RecordSets
Shocker.ProЕсли очень хочется все-таки сравнивать рекордсеты, то самый быстрый способ (но при этом оба рекордсета должны быть отсортированы по полю, по которому идет сравнение)ИМХО.
Первое - сравнивать рекордсеты всё-таки нужно по всем полям.
Второе - при наличии полностью дублирующихся строк в каждом рекордсете, возможно, должно совпадать также их количество.
Я уж не говорю о том, что должны полностью совпадать их структуры - по именам, типам и размерам полей. Возможно, допустим различный порядок полей - но и тут я бы поостерёгся. Хотя для именно поставленной задачи порядком можно пренебречь.

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

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

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


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