服务器端报表编程

当服务器收到客户端生成报表的请求时,它首先创建报表的副本,然后该副本调用 generate 方法。

此方法会触发 on_before_generate 事件。在此事件处理程序中,开发人员应编写生成报表内容的代码。

例如,演示应用程序的 发票(invoice) 报表的事件处理程序如下:

def on_generate(report):
    invoices = report.task.invoices.copy()
    invoices.set_where(id=report.id.value)
    invoices.open()

    customer = invoices.firstname.display_text + ' ' + invoices.customer.display_text
    address = invoices.billing_address.display_text
    city = invoices.billing_city.display_text + ' ' + invoices.billing_state.display_text + ' ' + \
        invoices.billing_country.display_text
    date = invoices.invoicedate.display_text
    shipped = invoices.billing_address.display_text + ' ' + invoices.billing_city.display_text + ' ' + \
        invoices.billing_state.display_text + ' ' + invoices.billing_country.display_text
    taxrate = invoices.taxrate.display_text
    report.print_band('title', locals())

    tracks = invoices.invoice_table
    tracks.open()
    for t in tracks:
        quantity = t.quantity.display_text
        track = t.track.display_text
        unitprice = t.unitprice.display_text
        sum = t.amount.display_text
        report.print_band('detail', locals())

    subtotal = invoices.subtotal.display_text
    tax = invoices.tax.display_text
    total = invoices.total.display_text
    report.print_band('summary', locals())

首先,我们使用 copy 方法创建 发票(invoices) 业务项的副本。

invoices = report.task.invoices.copy()

我们创建副本是因为多个用户可以在并行线程中同时生成相同的报表。

然后,我们调用副本的 set_where 方法:

invoices.set_where(id=report.id.value)

其中 report.id.value 是报表的 id 参数,我们在客户端的 on_before_print_report 事件处理程序中设置了其值,该值等于当前 发票(invoice)id 字段的值。

然后,我们使用 open 方法在服务器上获取记录。 之后,使用 print_band 方法打印标题栏:

report.print_band('title', locals())

但在此之前,我们为四个局部变量赋值:customer(客户)、address(地址)、 city(城市)和 date(日期),这些变量对应报表模板中标题区段的可编程单元格。

然后,以相同的方式生成明细区段和汇总区段。

报表生成后,如果客户端设置的报表 extension 属性值不等于 'pdf',服务器会使用 LibreOffice 将其转换 ods 文件。

报表生成后,它将存储在 static 目录的 report 文件夹中,服务器会向客户端发送报表文件的 url。