1.rml 报表的组成
RML报表主要分两部分组成,第一部分是一个在打印目录里面的.py文件,还有.rml的打印文件,这两个文件共同形成了PDF文件。.这两个文件是一样的文件名,不同的扩展名。
.py文件是一个python程序文件,由它来取数据库的值,并且进行数据计算。
.rml文件是决定PDF的外观,表格和样式都由rml文件来生成的。一个报表的rml样式由两部分组成,一部分是表头,一部分是内容。分在两个不同的rml文件中,表头文件是一个公共文件。
2.一个例子讲述rml文件
下面我以一个POS单来讲述一下rml文件的组成,在代码中,我标记了,每段代码起到的是什么作用。
为什么以POS单做为例子呢?因为POS单简单,代码少,但具有了rml打印文件的所有部分。
这个代码已经不是原来的代码了,我已经删除了好多格式文字的代码,以便看的更清楚,事实上,这些代码,只起到装饰作用,做简单的报表,可以不用的。
<br /><?xml version="1.0"?><br /><document filename="test.pdf"><br /> <template pageSize="(204.0,842.0)" <!-前面的数字代表打印纸张的大小,这个用数字表示的,也可以用cm表示,比如21cm。->title="Receipt" author="OpenERP S.A. ([email protected])" allowSplitting="20"><br /> <pageTemplate id="first"><br /> <frame id="first" x1="0.0" y1="0.0" width="204" height="800"/> <!-这个数字代表的打印内容的大小,纸边界,起始位置,这个位置决定了生成文件后文字的位置,一般要测试才能知道具体位置-〉<br /> </pageTemplate><br /> </template><br /> <stylesheet>〈!-这个标签是打印样式,表格样式 定义了表格名称,划线,文字的大小等等,可以不定义,表格没有线,文件一样大小-〉<br /> <blockTableStyle id="Standard_Outline"><br /> <blockAlignment value="LEFT"/><br /> <blockValign value="TOP"/><br /> </blockTableStyle> <br /> <blockTableStyle id="Table2"><br /> <blockAlignment value="LEFT"/><br /> <blockValign value="TOP"/><br /> <lineStyle kind="LINEABOVE" colorName="#000000" start="1,0" stop="1,0"/><br /> <!-上面的这行,kind="LINEABOVE" 决定了表格划线 colorName="#000000" 决定了表格线的颜色 start="1,0" stop="1,0"决定了划线的起止位置,没有这句,表格是没有线的 -><br /> </blockTableStyle><br /> <blockTableStyle id="Table4"><br /> <blockAlignment value="LEFT"/><br /> <blockValign value="TOP"/><br /> </blockTableStyle><br /> <blockTableStyle id="Table10"><br /> <blockAlignment value="LEFT"/><br /> <blockValign value="TOP"/><br /> <lineStyle kind="LINEABOVE" colorName="#000000" start="0,1" stop="0,1"/><br /> <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/><br /> <lineStyle kind="LINEABOVE" colorName="#000000" start="1,1" stop="1,1"/><br /> <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/><br /> <lineStyle kind="LINEABOVE" colorName="#000000" start="2,1" stop="2,1"/><br /> <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/><br /> </blockTableStyle><br /> <initialize><br /> <paraStyle name="all" alignment="justify"/><br /> </initialize><br /> </stylesheet><br /> <story><!-story开始就是表格的内容了,oe的数据就调用到这里-><br /> <para>[[ repeatIn(objects,'o') ]]</para> <!-para标签调用数据和要显示的文字,这个标签里面的内容就是表格内的内容-><br /> <para>[[o.user_id.company_id.name]]</para><br /> <para>[[ address and display_address(address)]]</para><br /> <para>电话 : [[ address and address.phone ]]</para><br /> <para>收银 : [[ o.user_id.name ]]</para><br /> <para>超市 : [[ o.shop_id.name ]]</para><br /> <para>时间 : [[ o.date_order ]]</para><br /> <para>N° : [[ o.name ]]</para><br /> <blockTable colWidths="68.0,68.0,68.0"><!-一个blockTable标签就是一个表格,colWidths表格的宽度,后来字一个分号代表一个格,还有一个标签 rowHeights表格的高度-><br /> <tr><br /> <td><br /> <para>Description</para><br /> </td><br /> <td><br /> <para>Qty</para><br /> </td><br /> <td><br /> <para>Price</para><br /> </td><br /> </tr><!-一个td代表一个格,一个tr代表表格的一行-><br /> <tr><br /> <td><br /> <para>[[ repeatIn(o.lines,'line') ]]</para><br /> <para>[[ line.product_id.name ]]</para><br /> <para>With a [[ line and line.discount == 0.0 and removeParentNode('font') ]] ([[ '%.2f' % line.discount ]]) % discount. <!-百分号是格式化用的%.2f'表示两位小数-><br /> </para><br /> <para><br /> <font color="white"> </font><br /> </para><br /> </td><br /> <td><br /> <para>[[o.state=='cancel' and o.statement_ids and '-' or '']][['%.f' % line.qty ]]</para><br /> </td><br /> <td><br /> <para>[[o.state=='cancel' and o.statement_ids and '-' or '']][[ formatLang(net(line.id), currency_obj=company.currency_id) ]] <font face="Helvetica">[[ line and line.discount == 0.0 and removeParentNode('font') ]] ([[ formatLang(line.discount, currency_obj=company.currency_id) ]])</font></para><br /> </td><br /> </tr><br /> </blockTable><br /> <blockTable colWidths="136.0,68.0" style="Table2"><br /> <tr><br /> <td><br /> <para>Taxes :</para><br /> </td><br /> <td><br /> <para>[[o.state=='cancel' and o.statement_ids and '-' or '']][[formatLang(o.amount_tax, currency_obj=company.currency_id)]]</para><br /> </td><br /> </tr><br /> </blockTable><br /> <blockTable colWidths="136.0,68.0" style="Table4"><br /> <tr><br /> <td><br /> <para>Total :</para><br /> </td><br /> <td><br /> <para>[[o.state=='cancel' and o.statement_ids and '-' or '']][[formatLang(o.amount_total, currency_obj=company.currency_id)]]</para><br /> </td><br /> </tr><br /> </blockTable><br /> <blockTable colWidths="102.0,34.0,68.0" style="Table10"><br /> <tr><br /> <td><br /> <para>Payment Mode</para><br /> </td><br /> <td><br /> <para><br /> <font> </font><br /> </para><br /> </td><br /> <td><br /> <para>Amount</para><br /> </td><br /> </tr><br /> <tr><br /> <td><br /> <para>[[ repeatIn(get_journal_amt(o),'d') ]]</para><br /> <para>[[ d['name'] ]]</para><br /> </td><br /> <td><br /> <para><br /> <font color="white"> </font><br /> </para><br /> </td><br /> <td><br /> <para>[[ formatLang(d['amt'] or 0, currency_obj=company.currency_id) ]]</para><br /> </td><br /> </tr><br /> </blockTable><br /> </story><br /></document><br />
以上是对rml文件的分析,根据这个分析就能写出自己的rml文件了,但这只是一部分,因为你还不会调用其它数据到rml文件里面来。不过我们能够修改表格去掉不显示的东西,和完全重新画一个新样式的表格了。
3.报表的表头
即使这样,我们发现,如果使用系统表头的打印文件,默认的表头,在横线下面有很大一块空白。这样我们就要修改表头的rml文件,修改这个不用找到文件,在软件里就能修改。
在设置-公司-公司-页眉页脚里时行修改。修改第一项“RML页眉”下面是我修改过的一个例子:
<br /><header><br /> <pageTemplate><br /> <frame id="first" x1="1.3cm" y1="3.0cm" height="21.7cm" width="19.0cm"/><br /> <!-上面这段代码表示了带表头打印的宽高,我说的那个空白是由y1="3.0cm"控制的,是表的打印高度,改成6,文字就上去了,打印的位置比较合适-><br /> <stylesheet><br /> <!-- Set here the default font to use for all <para> tags --><br /> <paraStyle name='Normal' fontName="DejaVu Sans"/><br /> <paraStyle name="main_footer" fontSize="8.0" alignment="CENTER"/><br /> <paraStyle name="main_header" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/><br /> </stylesheet><br /> <pageGraphics><br /> <!-- Set here the default font to use for all <drawString> tags --><br /> <setFont name="DejaVu Sans" size="8"/><br /> <!-- You Logo - Change X,Y,Width and Height --><br /> <image x="1.3cm" y="27.7cm" height="40.0" >[[ company.logo or removeParentNode('image') ]]</image><br /> <fill color="black"/><br /> <stroke color="black"/><br /><br /> <!-- page header --><br /> <lines>1.3cm 27.7cm 20cm 27.7cm</lines><!-这个是表头的线,要保留-><br /> <drawRightString x="20cm" y="27.8cm">[[ company.rml_header1 ]]</drawRightString><br /> <drawString x="1.3cm" y="27.3cm">[[ company.partner_id.name ]]</drawString><br /> <place x="1.3cm" y="25.3cm" height="1.8cm" width="15.0cm"><br /> <para style="main_header">[[ display_address(company.partner_id) or '' ]]</para><br /> </place><!--phone这段是公司电话吧,可以删除这段话在表头里没啥用--><br /> <drawString x="1.3cm" y="25.0cm">Phone:</drawString><br /> <drawRightString x="7cm" y="25.0cm">[[ company.partner_id.phone or '' ]]</drawRightString><br /> <drawString x="1.3cm" y="24.6cm">Mail:</drawString><br /> <drawRightString x="7cm" y="24.6cm">[[ company.partner_id.email or '' ]]</drawRightString><br /> <lines>1.3cm 24.5cm 7cm 24.5cm</lines><!--这个线可以不要,没啥用--><br /><br /> <!-- left margin --><!--这段代码是打印在底下左边的公司版权,那个90好像是文字旋转90度,改打印公司名字就在我加的**那里--><br /> <rotate degrees="90"/><br /> <fill color="grey"/><br /> <drawString x="2.65cm" y="-0.4cm">**power by openERP**</drawString><br /> <fill color="black"/><br /> <rotate degrees="-90"/><br /><br /> <!--page bottom--><!--这段是打印底下的页码和线,页码计算在这段代码里,自己写的rml代码可以参考这个--><br /> <lines>1.2cm 2.65cm 19.9cm 2.65cm</lines><br /> <place x="1.3cm" y="0cm" height="2.55cm" width="19.0cm"><br /> <para style="main_footer">[[ company.rml_footer ]]</para><br /> <para style="main_footer">Contact : [[ user.name ]] - Page: <pageNumber/></para><br /> </place><br /> </pageGraphics><br /> </pageTemplate><br /></header><br />
4.关于格式化.py文件
这个文件我还没太弄懂,好像又称做解释器我只发我知道的,我看OE介绍,这个文件主要包括以下代码:
<br /> import time<br />from report import report_sxw<br /><br />class order(report_sxw.rml_parse):<br /> def __init__(self, cr, uid, name, context):<br /> super(order, self).__init__(cr, uid, name, context)<br /> self.localcontext.update({<br /> 'time': time,<br /> })<br /><br />report_sxw.report_sxw('report.sale.order', 'sale.order',<br /> 'addons/sale/report/order.rml', parser=order, header=True)<br />
就写到这,关于如何调用数据库数据,等我弄明白了,再给大家写出来,好像得用python代码。
承德-至阳