关于 OpenERP html 格式报表的一些测试.
-
看BBS里,一直有关于翻译,关于报表方面的努力.
我的想法是 关于翻译, 一般来讲,在很多企业里,只要使用顺手了.界面上有一些未翻译部分,也是不影响企业的正常使用的. 象SAP这样的大家伙,在走入国门后,还是有很多地方还是原版的E文界面的.本来近段时间一直在看OpenERP权限部分的东西. 也没有啥人可以IM讨论.
早先在OpenERP QQ群(69195329) 就讨论到关于 OpenERP 的实现机制. 我大致看了一下. OpenERP 设计上面是比较灵活的.支持多种格式的报表.
因为我在企业里时间里,一直觉得 HTML(XHTML) 在企业报表方面应该比较适合. 也在以前的企业里使用过很多HTML报表. 所以, 自然就希望 OpenERP支持HTML报表就好了.
当时讨论时 OpenERP 是 5.0.1 版.
抓包(xmlrpc)分析了一下, 在请求报表时,有一个参数引起了我的兴趣.<member><name>report_type</name><value><string>pdf</string></value></member>
根据 name 就可以估计,应该是支持多种格式的报表.
仔细看了一下 5.0.1 的 server 源码. 发现有个 html2html 的部分.猜想应该是 关于 html 报表的东西.然后,把抓到的数据包里的内容
<member><name>report_type</name><value><string>pdf</string></value></member>
改为
<member><name>report_type</name><value><string>html</string></value></member>
重新POST.. 很可惜. 失败了.. 但我想我的猜测应该没有错.
所以, OpenERP 5.0.3 放出来后, 群里又讨论到中文报表的效率问题(主要还是字体以及报表的处理方式), 如果使用HTML报表,自然不会存在上面的字估以及处理效率问题.
所以,按5.0.1 的方式,抓包,改包... 居然成功了...
然后再 模拟客户端取出报表的内容. 呵呵. 的确成功了. 报表内容返回了我选择商品的数据.
目前还存在两个问题待解决:
A 如何修改 Client 或者 web-Client ,让报表的表现默认为 html 格式.
B 如何修改 对应的报表HTML模板附:
报表的请求及返回原理:报表的交互都是使用的 xmlrpc 或者 netrpc (netrpc 与 xmlrpc 的不同,唯一就是 netrpc 直接走 socket 而非 HTTP)
Client--->简称 C
Server--->简称 S当点击报表时,
C 发送 对应报表的请求 rpc 内容.
本例 使用的打印商品标签(产品--->产品---->双击产品--->Product Labels)
[code]<param><value><string>product.product.label</string></value></param><param><value><array><data><value><int>2</int></value></data></array></value></param>...<member><name>model</name><value><string>product.product</string></value></member><member><name>id</name><value><int>2</int></value></member><member><name>report_type</name><value><string>html</string></value></member>
[/code]
本例数据, 目的打印 商品ID=2 的标签.注意 <string>html</string> 我已经由 <string>pdf</string> 改为 html 了.
然后服务器(S)返回:
<?xml version='1.0'?><methodResponse><params><param><value><int>3</int></value></param></params></methodResponse>
也就是说,生成了一个报表ID=3的报表.
接下来..客户端(C)再请求得到报表的二进制数据:
<methodCall><methodName>report_get</methodName><params>...<param><value><int>3</int></value></param></params></methodCall>
服务器(S)返回该报表的xml 数据
[code]
HTTP/1.0 200 OKServer: BaseHTTP/0.3 Python/2.5.2Date: Tue, 22 Sep 2009 07:29:19 GMTContent-type: text/xmlContent-length: 3101
<?xml version='1.0'?><methodResponse><params><param><value><struct><member><name>state</name><value><boolean>1</boolean></value></member><member><name>result</name><value><string>PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy93M2MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgo8aHRtbD4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i.....
....[/code]下面的部 result 部分便是报表的二进制数据(base64过的)
然后 base64 decode 一下.
得到报表内容:
[code]<!DOCTYPE HTML PUBLIC "-//w3c//DTD HTML 4.0 Frameset//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style type="text/css"> p {margin:0px; font-size:12px;} td {font-size:14px;}p.nospace {font-size:15.0px}
</style>
<script type="text/javascript">
var indexer = 0; var aryTest = ["<table border='0' width='277'><tr><td width='14'> </td><td><table style='mytable' colWidths='2.8cm,5.4cm'><tr><td><p style='nospace'/></td><td><p style='nospace' t='1'>1.0</p></td></tr><tr><p/><td><p style='nospace'>商品002</p>, <p style='nospace'/></td></tr><tr><td width='79.3700787402'/><td width='153.070866142'/></tr></table></td></tr></table><br/><br/></td></tr></table><br/>"] ; function nextData() { if(indexer < aryTest.length -1)......[/code]