LEADERSOFT.ru Разработка на заказ программ и сайтов
Форумы по информационным технологиям
 
Регистрация  |  Вход
left
Форумы Минимизировать
ПоискСписок форумов
  Программирование  Microsoft Access. Файлы mdb и accdb  Накопительная и...
 Re: Накопительная информация в поле отчёта
 
 14.07.2008 17:10:51
Admin1
731 сообщения
1-ый


Re: Накопительная информация в поле отчёта

Построчная обработка записей в отчете указана в примере 6: http://shops.leadersoft.ru/Product.aspx?ProductID=3814

 14.07.2008 17:39:01
Alex N
9 сообщения


Re: Накопительная информация в поле отчёта

 Admin1написал

Построчная обработка записей в отчете указана в примере 6: http://shops.leadersoft.ru/Product.aspx?ProductID=3814

Не то. Нужна обработка ДРУГОГО источника в зависимости от условий строки текущего. и вывод результата в поле текущего отчёта


С уважением, Бабий Александр
 15.07.2008 1:37:29
Lukas
7 сообщения


Re: Накопительная информация в поле отчёта

Попробуйте так. Это модуль отчета, два события.

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

 15.07.2008 13:21:13
Admin1
731 сообщения
1-ый


Re: Накопительная информация в поле отчёта
 Измененный Admin1  на 15.07.2008 13:26:19)

1. Вообще у Вас проблемы с бизнес логикой. Сейчас программа, обрабатывая !!!  каждую запись отчета, делает сложную и не очень эффективную процедуру запроса к базе данных (OpenRecordset). При этом постоянно выделяется/освобождается память, загружается процессор, сеть и т.п.. Сколько такая программа будет устойчиво работать - непонятно, но, то что ваша программа будет зависать и падать - это 100% гарантия. (!!! А потом, будут все говорить, что MS Access ненадежная программа).

2. Выход. Запрос для отчета делается 1 раз. Открывается он вместе с отчетом. Далее обрабатывается построчно. А вообще вариантов построения SQL запросов - много. Над ним надо думать... SELECT, JOIN, UNION, временные таблицы должны решить эту проблему.

3. В верхнем примере тоже есть логика, т.к. запросы обрабатываются только при открытии отчета.

 15.07.2008 15:42:52
Alex N
9 сообщения


Re: Накопительная информация в поле отчёта

Lukas , Admin1 , спасибо большое за чёткие ответы и по-сути. Буду разбираться.

Admin1 - замечание действительно правильное. А ещё меня тревожит вопрос - а вдруг данных для заполнения поля будет ОЧЕНЬ много... Ну ладно. Это второй вопрос.

Lukas - отдельное спасибо за чёткий и полный код. Буду разбираться.


С уважением, Бабий Александр
  Программирование  Microsoft Access. Файлы mdb и accdb  Накопительная и...
ПоискПоиск  Список форумовСписок форумов  
right