1.     理论基础

注:我采用libreoffice5.2设计讲解

1.1.     定义模板指令

模板指令的语法和Genshi 模板语言相兼容,可以用Libreoffice( Write, Calc)来设计

1.1.1.      文本占位字段

我们可以在odt 文件中,通过“插入”->“字段”->“更多字段”->“功能”

类型选择“占位符”,格式选择“文字”,占位符写点位字符串,引用写指令,

最后点“插入”,这时在光标处就完成文本点位字段的定义

1.1.2.      超链接

   通过“插入”->“超链接”

   在URL 写上模板指令 要以“python://” 开头

   文本,写上显示的文字

1.1.3.      输入字段

   这个是我们用的最多,通过“插入”->“字段”->“更多字段”->“功能”

类型选择“输入字段”,然后在参照写上模板指令,点“插入”,再写上标识的名称

完成输入字段的定义

1.1.4.      框架

  我们有时要在文档中放入图片,比如产品图,这时就要用到框

通过“插入”->框架->框架, 然后选择“选择”标签,在“名称” 框那里输入模板指令

必须以image: 开头 如: image: asimage(user.company_id.logo)

 

1.2.     取回数据

  前面一节讲了如何在模板中定义容器,这时就要把真实的数据填入其中

当我胶用默认的解析器,创建任何一个模型的报表时,有些预定义的变量

l  objects :当创建报表时,它是对象的一个列表,当你想得到你所选的所有数据,你就要对这个变量做循环处理

l  o: 如查你只选择了一个对象,你就可以直接用这个变量,没必要创建循环

l  data: 来自向导的数据

l  user: 请求生成报表时的用户

l  time: 基于python库操作时间

 

以合作伙伴对象为例来说明

你想得到你选择第一个客户的名称

<objects[0].name>

你可以得到erp系统中”设置”->“技术”->”数据结构”->模型  里面所有模型的数据

得到当前用户公司的币种

<user.company_id.currency_id.code>

这个获取方法和系统代码获取数据一样的方式,通过面向对象的“.”

 

1.3.     条件部分

在现实生活也有很多的判断,这个报表也有。

通过<if> </if> 一对一对出现

如:


<if test="objects[0].customer">
This text is being printed when partner is a customer.
</if>


如果合作伙伴是客户,就打印中间那段话

因为要成对出现,可以看出,至少要定义两个独立的容器

当多重判断时,我们用choose 来定义


<choose>
<when test="objects[0].customer">
This text is being printed when partner is a customer.
</when>
<when test="objects[0].supplier">
This text is being printed when partner is a supplier.
</when>
<otherwise>
This text is being printed in all the other occasions.
</otherwise>
</choose>
<when test="objects[0].customer">


如果是客户,就打印客户那段话,若是供应商,就打印供应商那段话,那两个都不是,就打印 otherwise 中间那段话

 

1.4.     循环部分

这个在系统中还是用的很,当你选择了多个对象时。或你在一个订单里面加入多个产品时,

这些数据要呈现出来都要用到循环。

  通过成对的<for> </for>来实现

 <for each="one_partner in objects">
<if test="one_partner.customer">
<one_partner.name>
</if>
</for>


上面用了for来循环,同时中间还有一个条件语句

上面功能是把你所选的合作伙伴,只会是客户类型的,才会打印出来

one_partner 这个面对不同的对象,自己可以取一个对应的名字,用来在内部循环用

 

1.5.     附加方法

为了方便操作,定义一系列的方法

1.5.1.      语言相关的方法

l  getLang:  为模板设定默认语言

l  gettext:  为给定的文件获得译文

l  _: 功能和gettext一样

l  getLang: 得到当前影响 模板的语言

l  currency_to_text: 转换货币浮点格式

1.5.2.      数学相关的方法

l  sum_field:得到列表中对象的命名字段的和

l  sumif: 得到所选择的列表中对象指定条件的命名字段的和

 

1.5.3.      统计方法

l  average: 得到所有列表对象字段的平均数

l  count:得到列表中对象的总数

l  count_blank: 得到字段命名为空的列表中对象的数目

l  countif: 得到指定条件的列表中对象的数目

l  larger:得到列表对象最大值k-th

l  max_field: 得到列表对象最大值

l  min_field: 得到列表对象最小值

l  small: 得到列表对象最小值 k-th

 

1.5.4.      时间相关方法

l  dec_to_time: 把时间转换为hh:min 格式

l  time: 得到操作时间

1.5.5.      条形码相关方法

l  barcode: 转换数字为条形码

1.5.6.      帮助方法

l  asarray: 得到所有对象的命名字段为一个列表

l  asimages: 转换二进制数据为图片

l  bool_as_icon: 翻译布尔值 为 文本

l  browse: 得到对象列表

l  chunks: 把对象列表拆分成组

l  debugit: 帮助调试模板

l  erp2_gw: 插入EPL v2’gw’ 命令

l  field_accuracy: 得到对象字段的精度

l  field_size: 得到对象字段的最大范围

l  get_attachments:得到对象的附件

l  get_label:得到字段名称的译文

l  get_name: 得到对象的表术文

l  get_selection_item: 得到下接人工设定的字符

html_embed_image:得到html文档中插入的图片

l  html_escape: 过滤html文档中不安全的字符

l  html_builduri: 从字典中组合成uri字符串

l  html_prettyuri: 转换成安全的uri字符串

l  insert-subreport: 插入字报表

l  itemize:

l  safe:得到安全的表达式

l  search:在对象列表中做搜索

l  search_ids:  只在列表对象的id中做搜索

作者:陈伟明