BuildDetail

在生成某个细节区之前执行。

e参数属性:

Book:   返回工作簿。
Region: 返回正在打印的细节区名称。
DataRow:返回正在打印的行。

示例一

假定基于客户表设计了一个Excel报表模板,希望能够在报表中统计每个客户的已结账和未结账的货款。
实现这个功能的步骤是:

1、首先在设计模板的时候,插入两个标签:

2、在BeforeBuild事件中,将这两个标签插入到Marks集合:

Select Case e.Book.TempLate
   
Case "模板名称"
        e.Book.Marks.Add(
"已结账",0)
        e.Book.Marks.Add(
"未结账",0)
End
Select

3、在BuildDetail事件中加入下面的代码:

Select Case e.Book.TempLate
   
Case "模板名称"

        If e.DataRow IsNot Nothing Then
           
Dim Filter1 As String = "客户 = '" & e.DataRow("客户") & "' And 已结账 = True"
           
Dim Filter2 As String = "客户 = '" & e.DataRow("客户") & "' And 已结账 = False"
            e.Book.Marks(
"已结账") = DataTables("订单").Compute("Sum(金额)",Filter1)
            e.Book.Marks(
"未结账") = DataTables("订单").Compute("Sum(金额)",Filter2)

        End If

End
Select

需要注意的是,如果定义细节区的时候,设置了自动添加空行,那么e.DataRow有可能返回Nothing,所以我们需要在代码中对此进行判断,以免出错。

此外,如果报表模板中存在不止一个细节区,那么应该在BuildDetail事件代码中判断细节区的名称:

Select Case e.Book.TempLate
    Case
"模板名称"
       
If e.DataRow IsNot Nothing AndAlso e.Region = "客户" Then
           
Dim Filter1 As String = "客户 = '" & e.DataRow("客户") & "' And 已结账 = True"
           
Dim Filter2 As String = "客户 = '" & e.DataRow("客户") & "' And 已结账 = False"
            e.Book.Marks(
"已结账") = DataTables("订单").Compute("Sum(金额)",Filter1)
            e.Book.Marks(
"未结账") = DataTables("订单").Compute("Sum(金额)",Filter2)
        End
If
End
Select

示例二

如果还没有接触窗口设计,可以暂时忽略本示例。
我们之前介绍了一些扩展Excel报表功能的方法,例如利用BarCodeBuilder为Excel报表增加条码打印功能。
现在我们在此基础上进行扩展,为每一个细节区生成一个对应的条码图片。
实现这个功能的步骤为:

1、设计模版的时候,在细节区引用约定的图片文件"myimg.wmf"。

2、在BuildDetail事件中加入下面的代码:

Select Case e.Book.TempLate
    Case "模板名称"
        If e.DataRow IsNot Nothing Then
            Dim Bar As New BarCodeBuilder
            Bar.Symbology = Barpro.Symbology.Code39
            Bar.Code = e.DataRow("编码")
            Bar.BarRatio = 0.3
            Bar.BarHeight = 8
            bar.SaveImage(ProjectPath & "Images\myimg.wmf")
        End If

End
Select


本页地址:http://www.foxtable.com/webhelp/topics/1955.htm