powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объеденение(сложение) рекордсетов.
14 сообщений из 39, страница 2 из 2
Объеденение(сложение) рекордсетов.
    #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
14 сообщений из 39, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объеденение(сложение) рекордсетов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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