Постраничные итоги

отредактировано 13:35 Раздел: FastReport .NET
Привет.
Может кому поможет - мне лично техподдержка и поиск в интернет не помог. Пришлось делать самому.

Проблема вывода постраничных итогов актуальна при печати бланков бухотчетности (накладные, ТТН и т.д.)
В FastReport возникают 2 проблемы: "отлипание" страничных итогов при выводе в подвал страницы и необходимость наличия хотя бы одной записи на последней странице.

Проблему решил так: в бэнд данных добавил дочерний бэнд (Child1), на нем разместил поле SumKolVoPage (суммарное количество на странице)
в свойствах отчета отмечаем двойной проход. Не уверен что это оптимальное решение, но оно точно работает.
Собственно код скрипта:
Namespace FastReport
  Public Class ReportScript
    dim d1 as Integer   ' Строки первого прохода
    dim d2 as Integer   ' Строки второго прохода
    dim SumKol as Double = 0
    dim DataH(10000) As Double  ' Массив с высотой строк
    
    Private Sub Data1_AfterPrint(ByVal sender As object, ByVal e As EventArgs)
     IF Engine.FinalPass         
      IF Engine.FreeSpace > DataH(d2+1) + SumKolVoPage.Height then
        child1.Visible = false
      else
        SumKolVoPage.Text = sumkol
        child1.Visible = true
        sumkol = 0  
      End if
      'На последней странице должна быть хотя бы одна строка 
      'Поэтому перед печатью проверям поместится ли на текущей странице подвал отчета 
      if d2 = d1-1 and Engine.FreeSpace < SumKolVoPage.Height + ReportSummary1.Height then 
          SumKolVoPage.Text = sumkol
          child1.Visible = true
          sumkol = 0
      end if    
      if d1 = d2 then 
          SumKolVoPage.Text = sumkol
          child1.Visible = True
      end if    
     End if     
    End Sub
    
    Private Sub Data1_BeforePrint(ByVal sender As object, ByVal e As EventArgs)
      IF Engine.FinalPass 
        sumkol = sumkol + CType(Report.GetColumnValue("tmp_ttn.КолВо"), Double) ' Здесь собственно суммируем требуемое поле отчета
      end if   
    End Sub

    Private Sub Data1_AfterLayout(ByVal sender As object, ByVal e As EventArgs)
      IF Engine.FirstPass
          d1 = d1+1
          DataH(d1) = Text2.Height ' На первом проходе заполняем массив с высотой строк
      end if  
      IF Engine.FinalPass
        d2 = d2 + 1
      end if  
    End Sub
    
    Private Sub Child1_AfterPrint(ByVal sender As object, ByVal e As EventArgs)
        if d2 = d1-1 and Engine.FreeSpace < ReportSummary1.Height then
          engine.StartNewPage
        end if
    End Sub
  End Class
End Namespace

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.