Построчная обработка записей в отчете указана в примере 6: http://shops.leadersoft.ru/Product.aspx?ProductID=3814
Не то. Нужна обработка ДРУГОГО источника в зависимости от условий строки текущего. и вывод результата в поле текущего отчёта
Попробуйте так. Это модуль отчета, два события.
Option Compare Database Option Explicit Private Type SubItems ' Пользовательский тип для массива значений ItemsID As Variant ' значение поля связи ItemsValue As String ' сшитые данные End Type Private Items() As SubItems ' массив пользовательских типов данных, где мы будем хранить сшитые данные из поля Private strFieldLinkName As String ' имя поля связи с таблицей сшиваемых данных (в этом отчете!!!) Private strTableItemsName As String ' имя таблицы, где хранятся сшиваемые данные Private strFieldItemsName As String ' имя поля сшиваемых данных в таблице, где хранятся сшиваемые данные Private strFieldLinkNameInTableItems As String ' имя поля связи в таблице, где хранятся сшиваемые данные Private Sub Report_Open(Cancel As Integer) ' обработка ошибок не прописана!!! Dim strSQL As String Dim strSQL2 As String Dim strItems As String Dim rst As DAO.Recordset Dim rst2 As DAO.Recordset Dim i As Integer i = 0 strFieldLinkName = "IDTown" ' заменить именами своего проекта (в этом отчете!!!) strFieldItemsName = "LoadAdress" ' заменить именами своего проекта strTableItemsName = "tblLoadAdress" ' заменить именами своего проекта strFieldLinkNameInTableItems = "IDTownLoad" ' заменить именами своего проекта strSQL = "Select " & strFieldLinkName & " From " & Me.RecordSource If Me.FilterOn And Me.Filter <> vbNullString Then strSQL = strSQL & " WHERE " & Me.Filter & ";" Else strSQL = strSQL & ";" End If Set rst = CurrentDb.OpenRecordset(strSQL, , dbReadOnly) Do Until rst.EOF Select Case rst.Fields(0).Type Case Is = dbLong strSQL2 = "Select " & strFieldLinkNameInTableItems & ", " & strFieldItemsName & " FROM " & strTableItemsName & " WHERE " & strFieldLinkNameInTableItems & "=" & rst.Fields(0) & ";" Case Is = dbText strSQL2 = "Select " & strFieldLinkNameInTableItems & ", " & strFieldItemsName & " FROM " & strTableItemsName & " WHERE " & strFieldLinkNameInTableItems & "='" & rst.Fields(0) & "';" Case Else MsgBox "Здесь прописана обработка только двух типов данных полей связи: Long и Text" 'проверить тип поля для связи таблиц в своем проекте rst.Close Set rst = Nothing Exit Sub End Select Set rst2 = CurrentDb.OpenRecordset(strSQL2, , dbReadOnly) NextRecord: If Not (rst2.EOF) Then If Not (rst2.Fields(1)) = vbNullString Then strItems = rst2.Fields(1) rst2.MoveNext Else rst2.MoveNext GoTo NextRecord End If Do Until rst2.EOF If Not (rst2.Fields(1)) = vbNullString Then strItems = strItems & ", " & rst2.Fields(1) rst2.MoveNext Loop i = i + 1 ReDim Preserve Items(i) Items(i).ItemsID = rst.Fields(0) Items(i).ItemsValue = strItems rst2.Close Set rst2 = Nothing End If rst.MoveNext Loop rst.Close Set rst = Nothing End Sub ' поиск в массиве не оптимизирован !!! Private Sub ОбластьДанных_Format(Cancel As Integer, FormatCount As Integer) ' обработка ошибок не прописана!!! Dim i As Integer For i = 0 To UBound(Items) If Items(i).ItemsID = Me.Controls(strFieldLinkName).Value Then Me.fldItems = Items(i).ItemsValue ' *fldItems* то поле, куда подставляется сшитый результат Exit Sub End If Next i Me.fldItems = vbNullString ' *fldItems* то поле, куда подставляется сшитый результат End Sub
1. Вообще у Вас проблемы с бизнес логикой. Сейчас программа, обрабатывая !!! каждую запись отчета, делает сложную и не очень эффективную процедуру запроса к базе данных (OpenRecordset). При этом постоянно выделяется/освобождается память, загружается процессор, сеть и т.п.. Сколько такая программа будет устойчиво работать - непонятно, но, то что ваша программа будет зависать и падать - это 100% гарантия. (!!! А потом, будут все говорить, что MS Access ненадежная программа).
2. Выход. Запрос для отчета делается 1 раз. Открывается он вместе с отчетом. Далее обрабатывается построчно. А вообще вариантов построения SQL запросов - много. Над ним надо думать... SELECT, JOIN, UNION, временные таблицы должны решить эту проблему.
3. В верхнем примере тоже есть логика, т.к. запросы обрабатываются только при открытии отчета.
Lukas , Admin1 , спасибо большое за чёткие ответы и по-сути. Буду разбираться.
Admin1 - замечание действительно правильное. А ещё меня тревожит вопрос - а вдруг данных для заполнения поля будет ОЧЕНЬ много... Ну ладно. Это второй вопрос.
Lukas - отдельное спасибо за чёткий и полный код. Буду разбираться.