powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объеденение(сложение) рекордсетов.
39 сообщений из 39, показаны все 2 страниц
Объеденение(сложение) рекордсетов.
    #32941778
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Существует N баз данных, структура у всех одинаковая, таблицы одинаковые, данные в таблицах на разных серверах разные.

Cоздаю конекты, запросы к БД, получаю ответы в виде N рекордсетов.
Вопрос: как объеденить все рекордсеты в одни?

Пробовал по детски: set recordserT = recordset1+recordset2+...+recordsetN
Ошибка: Type mismatch, и больше нечего в голову не приходит.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941853
LKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LKO
Гость
Azartкак объеденить все рекордсеты в одни?

если рекордсеты ADO, то можно создать рекордсет, с такими же полями, как и в N исходных (Вы говорите, что они по структуре одинаковые), затем слить в него данные из всех исходных рекордсетов...

При этом, конечно, будет потеряна возможность менять данные в БД через этот рекордсет, да и дорогая, и на мой взгляд бессмысленная операция...
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941859
LKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LKO
Гость
Если не секрет, зачем?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941921
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторесли рекордсеты ADO, то можно создать рекордсет, с такими же полями, как и в N исходных
Да использую ADODB.
Как слить данные в один рекордсет??

Менять данные в БД не тербуется.
Это будет ДЛЛ, требуется их только оттуда считывать(БД много), объеденять и уже дальше сними будут другие работать.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941946
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение, что рекордсеты нельзя объединять. Можно только через промежуточную таблицу
... или открыть рекордсет через запрос типа:
Код: plaintext
1.
2.
3.
SELECT *
FROM Items IN 'C:\1.mdb'
UNION ALL SELECT *
FROM Items IN 'C:\ 2 .mdb';
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32941984
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тоже думаю про то чтобы загнать всё во временную таблицу, а потом вернуть всё в один рекордсет. Если это конечно возможно.
Есть у кого линки про временные таблицы??

Код: plaintext
1.
2.
3.
4.
SELECT *
FROM Items IN 'C:\1.mdb'
UNION ALL SELECT *
FROM Items IN 'C:\2.mdb';

Не очень понял к чему это, сервера БД раскиданы далеко, они НЕ объеденены локалкой. Или ты предлагаешь делать так
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
FROM Items IN '\\88.90.13.14\1.mdb'
Where .....
UNION ALL SELECT *
FROM Items IN '\\194.67.57.25\2.mdb';
Where ....
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942031
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть один, не изящный, но работающий способ:
Создать синтетический рекордсет и в него "залить" все остальные.

В циклах конечно, по этому "не изящный".
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942042
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azart
Не очень понял к чему это, сервера БД раскиданы далеко, они НЕ объеденены локалкой. Или ты предлагаешь делать так
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
FROM Items IN '\\88.90.13.14\1.mdb'
Where .....
UNION ALL SELECT *
FROM Items IN '\\194.67.57.25\2.mdb';
Where ....

тяжкий случай однако.
запрос может накрыться медным тазом, если конекта к одной из баз не будет. однако, вдруг получится?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942045
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Worobjoff: Как сделать синтетический рекордсет и в него "залить" все остальные.
Если можно пример кода или линк на чтонить похожее.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942059
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2marvan, даже очень возможно, что будет отсутствовать коннект к каким то серверам, но я не могу знать точный путь к mdb. К тому же задача стоит так чтобы, конект ко всем БД был одновременный, т.е. ещё надо многопоточность делать, а при машем методе это не возможно. :(
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942066
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   Set rsFlt = New ADODB.Recordset
   rsFlt.Fields.Append "Вкладка", adChar,  3 
   rsFlt.Fields.Append "Галка", adBoolean
   rsFlt.Fields.Append "Параметр", adVarChar,  20 
   rsFlt.Fields.Append "Условие", adInteger, , adFldIsNullable
   rsFlt.Fields.Append "Значение1", adDouble, , adFldIsNullable
   rsFlt.Fields.Append "Значение2", adDouble, , adFldIsNullable
   rsFlt.Open , , adOpenStatic, adLockBatchOptimistic
'Данные по Мехдобыче
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("НФРаб", Null, False, "Qж")
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("ДобРаб", Null, False, "Qн")
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("ДобРаб", Null, False, "%H2O")
   rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), Array("ДобРаб", Null, False, "Dштуцера")
Здесь рекордсет заполняется "руками". Нужно доработать чтобы из другого рекордсета
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942085
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка: не надо обращать на строку
Код: plaintext
rsFlt.Fields.Append "Вкладка", adChar,  3 
Там 6 сейчас.
"Горячий" пример - сейчас с ним работаю.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942097
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До AddNew уже добрался, ну что то пока не как не получается заполнить его из другово рекордасета. Будем работать.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942132
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartДо AddNew уже добрался, ну что то пока не как не получается заполнить его из другово рекордасета. Будем работать.
Код: plaintext
1.
2.
3.
4.
5.
do until rs.Eof
 rsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр"), _
  Array(rs.Fields("Вкладка").Value, rs.Fields("Условие").Value, rs.Fields("Галка").Value, rs.Fields("Параметр").Value)
 rsflt.Update
 rs.Movenext
loop
Примерно так.
Замечание: лучше задать типы полей "руками", не копировать типы из исходника - меньше проблем будет
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942188
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем по строчкам копировать?
гораздо быстрее будет создать временную таблицу на диске и запросами на добавление сливать в неё данные из доступных баз, как предлагал LKO.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942199
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторrsFlt.AddNew Array("Вкладка", "Условие", "Галка", "Параметр")
Каждый раз возвращается рекордсет с разными полями. Или предполагается каждый раз доставать имена полей и уже потом руками их занасить.
Большая куча циклов получается.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942205
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как создать временную таблицу? :)
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942327
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант:
Один раз в базе данных создаём таблицу c определённой структутой (раз она во всех базах одинаковая)
1. Перед каждым обновлением выполняем sql запрос на удаление всех записей в этой таблице.
2. В цикле перечисляем все удалённые БД. Проверяем доступность базы. И если доступна, то INSERT INTO [локальная таблица] SELECT * FROM [удалённая таблица]
3. открываем recordset на основе локальной таблицы
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942372
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. компьютер на котором будет запускаться данная прога не будет базы данных.
2. на счёт таблицы. В каждой БД их определённое количество(одинаковое) и их структура одинаковая, НО их больше чем одна!!! и надо отрабатывать запросы на все таблици.

Правильно ли я предпологаю после выше сказанно, что выход, это создавать локально самому БД(файлик mdb), далее каждый раз создавать таблицу с определёными полями(имена можно вытащить из запроса, а вот тип незнаю как достать). а после этого
автор2. В цикле перечисляем все удалённые БД. Проверяем доступность базы. И если доступна, то INSERT INTO [локальная таблица] SELECT * FROM [удалённая таблица]
3. открываем recordset на основе локальной таблицы
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32942821
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartВ каждой БД их определённое количество(одинаковое) и их структура одинаковая, НО их больше чем одна!!! и надо отрабатывать запросы на все таблици.

Если так, то зачем создавать БД. Проще иметь шаблон БД с пустыми таблицами. (mdb). Для каждого сеанса делать с него копию, и заполнять запросами из удалённых баз.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32943755
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм. А не проще ли настроить репликацию на серверах? Сливать данные автоматом в одну базу, а потом уже показывать как вздумается?

Magnus
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944083
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли так, то зачем создавать БД. Проще иметь шаблон БД с пустыми таблицами. (mdb). Для каждого сеанса делать с него копию, и заполнять запросами из удалённых баз. Интересный вариант, но запросто может быть не к одной таблицы, а к группе таблиц, которые в свою очередь связаны по ключу.

авторА не проще ли настроить репликацию на серверах? Нет не проще, всё уше описанное делается для уменьшения межсетевого трафика, а с репликацией он не уменьшается а увеличивается, хотя репликация снималабы все проблемы.

А можнали заполнить рекордсет из датагрида? если да, то можно поочередно заполнять один датагрид инфой из всех рекордсетов, а потом из него всё слить в один рекордсет.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944498
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тестировал синтетический рекордсет таким способом (самому надо):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Private Sub btnСорт_Click()
   Dim t1 As Date, t2 As Date
   t1 = Now
   rsx.Sort = "ДАТА"
   t2 = Now
   lblСорт = Format((t2 - t1), "hh:mm:ss")
End Sub

Private Sub btnСтарт_Click()
   Dim t1 As Date, t2 As Date, t3 As Date
   If Not rsx Is Nothing Then Set rsx = Nothing
   Call Создать_rsx
   If rs.State = adStateOpen Then rs.Close
   Screen.MousePointer = ccHourglass
   DoEvents
   t1 = Now
   rs.Open
   t2 = Now
   Do Until rs.EOF
      rsx.AddNew 'Array("ИД", "ДАТА", "ТЕКСТ"), Array(rs.Fields(0), rs.Fields(1), rs.Fields(2))
      rsx.Fields( 0 ) = rs.Fields( 0 )
      rsx.Fields( 1 ) = rs.Fields( 1 )
      rsx.Fields( 2 ) = rs.Fields( 2 )
      rs.MoveNext
   Loop
   t3 = Now
   lblКопирование = Format((t2 - t1) *  60 , "hh:mm:ss")
   lblСчитывание = Format((t3 - t2) *  60 , "hh:mm:ss")
   Label2 = "Всего записей  " & rsx.RecordCount
   Screen.MousePointer = ccDefault
End Sub

Private Sub Form_Load()
   DE1.Conn1.Open
   Set rs = New ADODB.Recordset
   rs.Source = s
   rs.CursorLocation = adUseClient
   rs.ActiveConnection = Conn1
   rs.LockType = adLockReadOnly
   rs.CursorType = adOpenStatic
End Sub

Sub Создать_rsx()
   If Not rsx Is Nothing Then Set rsx = Nothing
   Set rsx = New ADODB.Recordset
   rsx.Fields.Append "ИД", adInteger
   rsx.Fields.Append "ДАТА", adDate
   rsx.Fields.Append "ТЕКСТ", adVarChar,  255 , adFldIsNullable
   rsx.Open
End Sub
Считывание всех 454 000 записей с оракла за 46 секунд
(запрос без сортировок и фильтров)
Копирование их в синтетический рекордсет за 4 секунды
Сортировка первый раз по одному полю за 10 секунд,
второй раз и все следующие за 0 секунд

Способ копирования записей в синтетический рекордсет на скорость не влияет.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944524
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то я не догоняю как твой пример решит(поможет решить) мою проблему?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944621
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartЧто то я не догоняю как твой пример решит(поможет решить) мою проблему?Здесь rs - только один источник. Для примера.
Поставь сколько надо этих rs-истчников с разных коннектов и "заливай" их последовательно во все тот же rsx.
Или условия задачи изменились? Azartструктура у всех одинаковая, таблицы одинаковые, данные в таблицах на разных серверах разные
Cоздаю конекты, запросы к БД, получаю ответы в виде N рекордсетов.
Вопрос: как объеденить все рекордсеты в один?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944669
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа,
похоже наш автор имеет ввиду немного не то

вот что он хочет, как я понял:

Код: plaintext
select rs1.Field1,rs1.Field2 ..., rs2.Field1, rs2.Field2 .... 

и тд и тп
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944680
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТЗ тоже, просто я не очень силён в программирование, точнее только учусь, отсюда глупые вопросы. Я так понял у меня должно получится что то такое

автор
Dim rsSymma as ADODB.Recordset
Dim rs1 as ADODB.Recordset
Dim rs2 as ADODB.Recordset
Dim rsN as ADODB.Recordset

Do Until rs1.EOF
rsSymma.AddNew 'Array
rsSymma.Fields(0) = rs1.Fields(0)
rsSymma.Fields(1) = rs1.Fields(1)
rsSymma.Fields(Т) = rs1.Fields(Т)
rs1.MoveNext
Loop

Do Until rs2.EOF
rsSymma.AddNew 'Array
rsSymma.Fields(0) = rs2.Fields(0)
rsSymma.Fields(1) = rs2.Fields(1)
rsSymma.Fields(Т) = rs2.Fields(Т)
rs2.MoveNext
Loop

Do Until rsN.EOF
rsSymma.AddNew 'Array
rsSymma.Fields(0) = rsN.Fields(0)
rsSymma.Fields(1) = rsN.Fields(1)
rsSymma.Fields(Т) = rsN.Fields(Т)
rsN.MoveNext
Loop


И в начале цикла делать
"Т = rs1.Fields.Count - 1", чтоб узнать количество полей, для всех оно будет одинаково, так что можно будет делать только 1 раз.

Поправьте меня, если я гдето опять ошибся.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944695
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за бредовый код - не вижу в нем никакого смысла.
объясни нормально как у тебя должны данные отображаться и в каком виде (нарисуй свой бумажный отчет сначала), а потом уже можно решение предлагать
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944699
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One: Т.е. возможно следущее???

Код: plaintext
rs.ActiveCommand(select rs1.Field1,rs1.Field2 ..., rs2.Field1, rs2.Field2 ....)
Надо будет перечислить все рекордсеты и все поля во всех рекордсетах. И получим конечный рекордсет rs в котором будет инфа из всех рекордсетов?
Терзают сомнения, что инфа из одинаковых полей разных рекордсетов будет добавляться в виде новых полей, а не в виде новых записей в эти же поля.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944728
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет так нельзя.
ответь на мой первый вопрос: какова цель твоей программы, что она должна сделать/отобразить/распечатать/и тп?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944732
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azart автор
Dim rsSymma as ADODB.Recordset
Dim rs1 as ADODB.Recordset
Dim rs2 as ADODB.Recordset
Dim rsN as ADODB.Recordset
. . .
И в начале цикла делать
"Т = rs1.Fields.Count - 1", чтоб узнать количество полей, для всех оно будет одинаково, так что можно будет делать только 1 раз.1. Вы правильно меня поняли.
2. А что количество полей заранее не известно? Или оно может со временем меняться?
Наверно сначала надо сделать задачу на фиксированном наборе полей, а потом думать как придать программе универсальность.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944749
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цель: объеденить в один рекордсет данные из N рекордсетов. А точнее есть ДЛЛ в ней
Код: plaintext
Public Function gettable(ByVal query As String) As Recordset 
, передают SQL запрос, я собираю инфу со всех БД этим запросом и должен вернуть ОДИН рекордсет. Всё просто если используется 1 БД, а если их больше тонадо объединять несколько полученных рекордсетов в нутри фунцкии, а как я не знаю. Далее с эти мрекордсетом будут работать другие люди и возвращать им кучу рекордсетов нельзя.

автор2. А что количество полей заранее не известно? Или оно может со временем меняться? В БД много таблиц и у всех количество полей разное, поэтому заранее количество полей не известно, и неизвестно какая выборка и из каких таблиц понадобится.
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944761
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
линкуй свои запросы из разных баз в свою акцессную базу , а потом натравливай union запрос
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944770
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локальной базы нет и создавать её не желательно(Остальные БД сиквеловские).
Может есть способ записать последовательно данные из каждого рекордсета к примеру в Датагрид, а потом из Датагрида запихнуть всё в один рекордсет?
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944807
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartВ БД много таблиц и у всех количество полей разное, поэтому заранее количество полей не известно, и неизвестно какая выборка и из каких таблиц понадобится.Предлагаю:
1. Решить задачу для одного, фиксированного запроса.
2. Написать универсальную процедуру для создания этого синтетического рекордсета.
Главое здесь правильно задать типы полей (полезно ограничить их разнообразие чтобы избежать подводных камней).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
For Each f In rs_in.Fields
 If f.Type = adChar Or f.Type = adVarChar Then
  rs_out.Fields.Append f.Name, f.Type, f.DefinedSize, adFldMayBeNull
  ' . . . ElseIf
  ' . . . ElseIf
  ' Для числовых типов задавать DefinedSize не надо
 End If
Next
Но это потом, а пока добейтесь правильной работы на одном запросе
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32944817
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Worobjoff
Код: plaintext
1.
 If f.Type = adChar Or f.Type = adVarChar Then
  rs_out.Fields.Append f.Name, adVarChar , f.DefinedSize, adFldMayBeNull
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32947173
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторГлавое здесь правильно задать типы полей Это сложно, т.к. я не могу знать какие поля будут требоваться в запросе. Чтоб это обойти создаю запрос к любой из базы данных с запросов тогоже вида что мне пришёл, но с условиями чтоб получить нуль записей, тем самым получаю рекордсет с полями но без записей, а далее начинаю заполнять как ты говорил. Промучился целый день и вот на что накнулся (вылетает на AddNew):

Cannot insert the value NULL into column "XXX", table "YYY.dbo.ZZZ"; column does not allow nulls. Insert fails.

а процедурку вот какую придумал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
z = rs.Fields.Count -  1 
        i =  0 
        Do Until rs.EOF
        rs1.AddNew
        Do While i = z
        rs1.Fields(i) = rs.Fields(i)
        i = i +  1 
        Loop
        rs.MoveNext
        Loop
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32947862
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот работающая процедура, которая создаст синтетический рекордсет, и зальет в него данные из открытого другого рекордсета. (rs_in - источник данныых и образец полей, rs_out - рекордсет уровня модуля (формы), используемый как синтетический)
Для копирования данных из остальных рекордсетов, надо еще одну процедуру написать используя то, что после строчки "'Начало копирования данных:"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Sub СинтетикКлон(ByRef rs_in As ADODB.Recordset, ByRef rs_out As ADODB.Recordset)
   Dim i As Long, k As Long
   Dim f As ADODB.Field
'Отсюда ...
   Set rs_out = Nothing ' 
   Set rs_out = New ADODB.Recordset '
   For Each f In rs_in.Fields ' Создание полей
      If (f.Type = adChar) Or (f.Type = adVarChar) Then
         rs_out.Fields.Append f.Name, f.Type, f.DefinedSize, adFldMayBeNull
      Else
         rs_out.Fields.Append f.Name, f.Type, , adFldMayBeNull
      End If
   Next
   rs_out.Open , , adOpenStatic, adLockBatchOptimistic
'И до этой строчки - создание рекордсета
'Начало копирования данных:
   If rs_in.RecordCount >  0  Then rs_in.MoveFirst    
   k = rs_out.Fields.Count -  1 
   Do Until rs_in.EOF
      rs_out.AddNew
      For i =  0  To k
         rs_out.Fields(i).Value = rs_in.Fields(i).Value
      Next
      rs_in.MoveNext
   Loop
End Sub
Здесь можно прочитать о типах полей
...
Рейтинг: 0 / 0
Объеденение(сложение) рекордсетов.
    #32947883
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartЧтоб это обойти создаю запрос к любой из базы данных с запросов тогоже вида что мне пришёл, но с условиями чтоб получить нуль записей, тем самым получаю рекордсет с полями но без записей, а далее начинаю заполнять как ты говорил. Промучился целый день и вот на что накнулся (вылетает на AddNew):

Cannot insert the value NULL into column "XXX", table "YYY.dbo.ZZZ"; column does not allow nulls. Insert fails. Если запрос, на основе которого создан рекордсет - не обновляемый, не получится это сделать по сл. причине:
Рекордсет берет в себя констрейнты с источника данных. И не только NotNull.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объеденение(сложение) рекордсетов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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