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: 得到下接人工设定的字符
l 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中做搜索
作者:陈伟明