|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
У меня есть два заполненных объекта типа RecordSet. Набор полей идентичен. Код: vbnet 1. 2. 3.
Как мне вывести на лист или в новый RecordSet те из записей rs2, которых нет в rs ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 08:55 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
как именно рекордсеты заполняются данными? гораздо проще и сильно быстрее сделать запрос к БД для выборки таких записей ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 09:08 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shocker.Pro, А какая разница? Заполнены они на 100% без ошибок. Если возможно применить SQL к RecordSet так же легко, как к файлам реальной БД - записи в студию. А обращаться для этого непосредственно к БД я не хочу, так как получится слишком громоздкая конструкция, там и так сложные выборки. Не проще ли поработать с уже отобранными значениями в RecordSet? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 10:55 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shizuku, Shocker.Pro, прав, я подобное использовал бы исключительно методом sql конструкции: Код: plsql 1.
И это "нагромождение" будет в разы эффективнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 11:00 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
ShizukuНе проще ли поработать с уже отобранными значениями в RecordSet?не проще. Применить SQL-запрос к рекордсету не получится. Если выборки сложные, существуют механизмы представлений, хранимых процедур, временных таблиц и т.п., в любом случае такие вещи делаются на сервере. Например, никто не мешает сделать две временных таблицы, слить туда результаты и потом сделать выборку, раз уж запросы такие сложные, что нельзя их сравнить как два подзапроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 11:05 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
ShizukuЕсли возможно применить SQL к RecordSet так же легко, как к файлам реальной БД - записи в студию. мечтатель ... kiv-1980И это "нагромождение" будет в разы эффективнее. если ТС не врёт, и там действительно, "суровые" выборки, то, всё таки, будет проще "сработать" всё на клиенте - сохранить данные из рекордсетов в файл, и потом, открыть новый рекордсет на этом файле, выбрав только различающиеся записи ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 11:09 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
qwerty112если ТС не врёт, и там действительно, "суровые" выборки, то, всё таки, будет проще "сработать" всё на клиентекакие бы ни были суровые выборки, никто не мешает работать с ними на сервере, а не на клиенте. Что если в исходных выборках будет по миллиону записей, а на выходе всего десять? зачем гнать это на клиента и там обрабатывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 11:11 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
qwerty112, Как-то сталкивался с подобным, практика показывает, если есть возможность использовать запрос, ею надо пользоваться, есть масса конструкций, которые позволят избежать потери при запросах. А правильные планы, выруливают любые выборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 11:12 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shocker.Proqwerty112если ТС не врёт, и там действительно, "суровые" выборки, то, всё таки, будет проще "сработать" всё на клиентекакие бы ни были суровые выборки, никто не мешает работать с ними на сервере, а не на клиенте. Что если в исходных выборках будет по миллиону записей, а на выходе всего десять? зачем гнать это на клиента и там обрабатывать? на сколько я понял стартовый пост, - обе выборки УЖЕ на клиенте а "суровость" выборки - может быть разной, может там и возвращается в итоге 10-ть записей, но делает этот возврат ХП, которая выполняется полчаса ... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 11:16 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
И каждая выборка у меня в пределах своего Connection через Connection.Execute("My SQL String") Как я сделаю выборку сразу из двух Connection? Они на разных наборах данных построены, а не на одних и тех же таблицах, хотя структура и одинакова. Каждый из двух Connection имеет свой Data Source - не один и тот же. А если опустить все вложенные и прочие сложности выборок, то мне нужно: Код: sql 1.
Таблицы табл_источник_rs и табл_источник_rs2 - имеют одинаковые структуру, но хранятьсчя в разных папках, и имеют соотвественно разные данные (почему собственно и нужно их сравнить). Если бы это были две таблицы в пределах одного Data Source (в одной папке), то можно было бы попытаться такой запрос сделать. А так... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 11:57 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
причем тут коннекшены и датасоурсы???? БД одна или разные? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:02 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Если очень хочется все-таки сравнивать рекордсеты, то самый быстрый способ (но при этом оба рекордсета должны быть отсортированы по полю, по которому идет сравнение) идти двумя курсорами по двум рекордсетам последовательно. Если при очередной итерации в одном рекордсете сравниваемое поле становится больше другого, то значит в том другом есть запись, которая отсутствует в первом. Соответственно, вычленяем эту запись и двигаем курсор только на втором рекордсете. Ну и, разумеется, зеркально. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:06 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shocker.Pro, Это dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БД ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:09 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
ShizukuЭто dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БДв аксессе можно объединять запросы к разным файлам с помощью IN (SELECT ... FROM .... IN ("c:\1.mdb")...). Что-то подобное есть и в дибейсе, но тут я не силен, возможно точно такая-же конструкция. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:17 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shocker.ProЕсли очень хочется все-таки сравнивать рекордсеты, то самый быстрый способ... Код: vbnet 1. 2. 3. 4. 5. 6.
Так что-ли ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:18 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Нет, тут, честно говоря, написан сущий бред ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:19 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Можно объединить оба рекордсета в один xml-документ и сделать xpath-запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:26 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
как-то так. Но сюда еще надо дописать алгоритм, если, к примеру, rs2 уже закончился, а в rs еще есть записи, то все их надо тоже скопировать, так как их нет в rs2. Ну и наоборот. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:28 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shocker.ProЕсли очень хочется все-таки сравнивать рекордсеты, то самый быстрый способ (но при этом оба рекордсета должны быть отсортированы по полю, по которому идет сравнение)ИМХО. Первое - сравнивать рекордсеты всё-таки нужно по всем полям. Второе - при наличии полностью дублирующихся строк в каждом рекордсете, возможно, должно совпадать также их количество. Я уж не говорю о том, что должны полностью совпадать их структуры - по именам, типам и размерам полей. Возможно, допустим различный порядок полей - но и тут я бы поостерёгся. Хотя для именно поставленной задачи порядком можно пренебречь. Однако всё это должен чётко указать ТС. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:38 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shocker.Proкак-то так. Но сюда еще надо дописать алгоритм, если, к примеру, rs2 уже закончился, а в rs еще есть записи, то все их надо тоже скопировать, так как их нет в rs2. Ну и наоборот.Да уж, проще xml. 1. Загрузить первый рекордсет в первый документ 2. Загрузить второй рекордсет во второй документ 3. Скопировать строки из первого во второй, но в отдельную ноду (любую, можно создать новую в корне документа). 4. Выбрать с помощью xpath те записи, которые дублируются в этой ноде. 5. Удалить их. 6. Очистить/удалить отдельную ноду 7. Загрузить xml обратно в рекордсет ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:40 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
AkinaОднако всё это должен чётко указать ТС.А ТС и указал четко: набор полей одинаков, проверять наличие записей, а не отличие, то есть лишь по ключевым полям. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:43 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Shocker.ProShizukuЭто dBase IV - dbf файлы. Да, если брать так, то одна папка - одна БД. Я беру из разных папок, значит из разных БДв аксессе можно объединять запросы к разным файлам с помощью IN (SELECT ... FROM .... IN ("c:\1.mdb")...). Что-то подобное есть и в дибейсе, но тут я не силен, возможно точно такая-же конструкция. да, точно такая же конструкция и для dBase 7608932 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:44 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Akina, Структуры идентичны, а количество записей может несовпадать (почему и сравниваем). В принципе, меня не интересует изменилось там какое-то поле или нет. Меня интересуют новые строки, и есть ключ в первом столбце, по которому можно было бы отобрать такие строки запросом типа SELECT ... NOT IN SELECT... как я писал выше. Но для сравнения RecordSet это конечно не применимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:45 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
Я когда-то пробовал вариант типа Код: sql 1. 2. 3. 4.
Попробую еще раз. Запросик, конечно, будет аховый - строчек на 10-15 )) - но лишь бы работал. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:49 |
|
VBA - Сравнить RecordSets
|
|||
---|---|---|---|
#18+
ShizukuСтруктуры идентичны... и есть ключ в первом столбцетогда вполне подойдет мой алгоритм, так как будет сделан только один проход по каждому рекордсету. Мне кажется, он отработает быстрее, чем через xml, так как не будет ворочаться лишний объем данных ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2013, 12:50 |
|
|
start [/forum/topic.php?fid=60&msg=38261772&tid=2156975]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 153ms |
0 / 0 |