ZH/Case-Study-01-Journal-03

From ADempiere
Jump to: navigation, search
This Wiki is read-only for reference purposes to avoid broken links.

<返回中文首页> <返回本案例研究首页>

Noia 64 apps knode m.png

Contents

实施日志-03

2010年12月

2010-12-02

JasperReport父子表问题

JasperReport父子表在客户端(Client)上的布署

  • 今天用ireport建立父子报表,即包含子报表(subreport)的报表。在ireport上可以正常显示,但是在adempiere客户端却无法显示。
  • 第二天把这个问题解决了,发现是iReport的版本问题。
  • ADempiere 3.6.0 LTS 集成的JasperReport版本是3.7.3。而我用的iReport版本是3.7.6。今天重新下载了iReport-3.7.3,父子报表经编译后,在客户端(Client)可以正常显示。

JasperReport父子表在Web服务器上的布署

  • JasperReport父子表在Web服务器上的布署
  • JasperReport父子表在Web服务器上的布署,在官方文档Problem_with_subreports上发现子报表需要额外编译。后来经测试并不存在官方文档上所说的问题,详见2010-12-23实施日志。--2010年12月23日 Peanut Blake
  • 我已经将官方文档Problem_with_subreports当中过时的内容进行了删除和修改。--2010年12月23日 Peanut Blake

讨论栏

2010-12-03

JasperReport大写金额的问题

  • 父子表的问题解决了之后,今天用iReport来制作报表还算顺利。只是遇到中文大写金额的问题。
  • 找到一篇文章在JasperReport报表中加入大写金额,不知道能否在ADempiere下实现。有空再试试。

数据格式问题

今天发现几个问题:

1. 用电子表格向数据库导入数据时,要注意电子表格的字段类型的设定,尤其是以数字表示的字符。今天发现有个reference的其中几下拉选项无法选择,查找发现是电子表格的数字“1”导入到数据库后变成了“1.0”,导致ad_ref_list无法以value来匹配。

2. 在数据库新增字符型字段时,要注意区分固定长度字符和非固定长度字符的设定。比如我之前设定“合同编号”(Contract No)时就设定为固定长度:

 ALTER TABLE c_order ADD ContractNo character(12);

结果发现实际输入合同编号不足12位时,数据库会自动补足空格,在报表中很不美观。于是改为:

 ALTER TABLE c_order ALTER ContractNo TYPE character varying(12);

讨论栏

2010-12-09

销售订单窗口优化调整

  • 对销售订单窗口进行了优化:
    • 主要是关闭了不用的选项、设置Field Group、设置默认值。
    • 在Document Type里把不需要的Sales Order Type改为禁用。

销售合同的报表格式调整

  • 已经把销售合同的报表格式调整到位。
  • 主要解决了以下问题:
    • 页码问题。需要设置好Page_Number的有效范围。
    • 文本框随内容自动调整高度问题;
    • sub-report相对路径问题;
    • 金额合计问题。需要新建变量,并设置好生效范围;
    • ADempiere与JasperReports参数传递问题。
    • 避免文本框跨页分断问题。将Band: Detail 1的属性Split Allowed设置为False。
    • 文本框NULL值问题。将文本框属性Blank when Null设置为True。

几点发现

  • 发现用Import Product窗口不但可以导入产品信息,还可以导入产品价格表,非常方便。
  • 发现登录用户名也是大小写敏感的,同时也可以用中文用户名登录。
  • Sales Order当中Sales Representative的设置: 要同时设置User和Business Partner,并关联起来。

Address的Country默认值设置

  • 在Business Partner窗口的Location页签有个Address字段,点击右侧小图标会弹出一个"Add New Location/Address"或"Update Location/Address"窗口,这窗口找不到设置的地方。
  • 我的目的是把Location/Address的Country默认值设置为China。
  • 我尝试过通过"Window, Tab & Field"窗口、"Table & Column"窗口,设置Country字段的Default Logic,均告无效。
  • 后来发现这是系统内建的,这样处理很不方便。
 This window is made manual.
 This is the class for it: VLocationDialog

讨论栏

Organization设置

疑问:Organization设置为Tongji Org与*有什么区别?感觉会影响到Sales Order里的Price List显示。

2010-12-13

销售订单实施小结

  • 这段时间主要进行销售订单窗口和销售合同报表的制作。前后大约花费了15天左右的时间,主要用在:
    • 销售订单窗口字段的增减和设置;
    • JasperReports的探索;
    • 对销售合同进行分析,并进行报表制作。

困难:销售合同没有标准化

  • 实施当中最为困难的是该企业的销售合同没有标准化。主要表现在以下几个方面:
  1. 销售合同格式没有标准化
    1. 语言不统一。存在纯中文、纯英文、中文+英文三种形式。
    2. 合同条款数目不固定,增减无常。
    3. 同一条款在不同合同中写法各不相同,某些内容(即字段)的显示和隐藏没有固定规律。
    4. 产品型号栏目格式不统一,存在以下三种形式:产品型号+中文名称,产品型号+英文名称, 产品型号+中文名称+英文名称。同时还存在是否添加产品图片的区别,这样一来就有六种形式。
  2. 销售合同条款内容(或选项)没有标准化
    1. 许多字段内容变化太多,以下拉列表显示的选项总是存在许多的例外。
    2. 例如付款条件(Payment Term),除了3:7、3:6:1等方式外,还存在许多其它特殊的付款条件,这样同时还带来财务上的许多麻烦(无论财务模块使用的是ADempiere的还是其它财务软件的)。当然付款条件多变的背后,反映了合同评审缺乏公司财务部门的严格把关。
  • 文档标准化是ERP成功实施的基本前提
    • 对于变化无常的合同格式,如果花费太多的精力去提供相应的报表格式,是毫无价值的工作。
    • 因此该项目实施只提供最基本格式的中文模板。用户如需进行格式或内容上的更改,就导出为*.ODT格式自行修改。
    • 对于销售合同的最佳解决方案是:标准的销售订单 + 灵活可变的合同附加条款。当然该企业要采纳这样的方案还需要一段过程。

客户端布署

  • 今天在Windows操作系统上进行了客户端布署。
  • 客户端数据连接、JasperReports父子报表均测试通过。
  • 布署要点:
    • 安装JRE 1.6。注意:ADempiere 3.6.0是基于Java 1.6的。
    • 设置好系统环境变量:JAVA_HOME, ADEMPIERE_HOME。

讨论栏

2010-12-15

采购及入库实施规划

  • 今天开始实施采购及入库。
  • 主要目标:
  1. 采购、入库的流程畅通;
  2. 采购报表3~5张;
  • 主要流程:
    • 采购申请 --> 采购 --> 入库。
    • 采购外协流程——在ERP的实现 (PDF文件

主要工作

  1. 采购及入库的流程梳理和确认。
  2. 表单格式的标准化及确认。由于采购合同尚未标准化,暂不实施。
  3. 要求采购部门提前整理数据,包括物料信息、供应商信息、价格表。实施顾问提供数据整理标准格式。
  4. 考察用友T3仓库模块,并建立数据接口。

实施难点

  • 物料编码的问题。
    • 物料编码不全面。目前只有自制半成品、成品有物料编码,钢材、机械标准件、电气元件等原材料均无物料编码。
    • 技术部门尚无专人负责物料编码。
    • 用友T3当中原有物料均以物料名称汉字拼字首字母作物料编码。
  • 审批流程。
  • 单据转化。
    • 采购申请单 --> 采购订单 --> 入库单。

需求调研汇集

  1. 采购合同一般由供方代拟。约20%的采购合同由需方撰写。
  2. 现有采购申请单行数太少,不够写。
  3. 现有入库单没有留出检验员签字的地方。
  4. 采购订单增加付款方式一栏,可以选择现金、支票、转账等。
  5. 在入库单上同时显示税前单价和税后单价,以便财务核算。
  6. 希望增加采购日程表,以便追踪采购进度。

讨论栏

入库单显示价格

> 在入库单上同时显示税前单价和税后单价,以便财务核算。

  • 采购发票如果和采购订单价格不一致怎么办? --Robin
  • 发票价格是最后实际成交价格,与订单定价不一致很正常啊,就是与入库单价格不一致都应该属正常。 --lcl
  • 采购发票如果和采购订单价格不一致,这种情况要看合计金额,如果合计金额不相同,就会打回发票重开。因为采购价格是经过审批的,如果以发票价格为最后实际成交价格,前面的审批就是摆设了。--Peanut
  • 如果成交价格<审批价格呢?不知道有没有这种情况? --小卢
  • 会有这种情况,但是财务上是不会通过的。 --Peanut
  • 据我所知,AD/Compiere 在入库单中是不记录价格的。--Robin
  • 入库单不记录价格,但是可以在打印格式中显示价格。--Peanut
  • 入库结算后得反写价格在入库单才行,不然出库核算材料成本数据来源哪里? --朱胜利
  • 可以依据采购平均价格。在Accounting Schema里的Costing Method设置。--Peanut

采购日程表

> 希望增加采购日程表,以便追踪采购进度。

  • 采购日程表是运输公司的日程表吗? -- Robin
  • 没有这么复杂,主要是下单日期、预计到货日期之类的。--Peanut

2010-12-16

初步探索

  • 把资料采购计划单的导入放在下一步进行,先基于ADempiere的原有功能。
  • RfQ(询价单)窗口
    • RfQ(询价单)窗口的三个页签分属三个表:C_RfQ, C_RfQLine, C_RfQLineQty。
    • 同时Quantity页签是Line的子页签。我考虑把Quantity页签合并到Line页签上,因为这家公司的询价没有这么复杂。
  • RfQ Response(询价反馈)窗口
    • RfQ Response(询价反馈单)窗口的三个页签也是分属三个表:C_RfQResponse, C_RfQResponseLine, C_RfQResponseLineQty。
    • 考虑关闭RfQ Response窗口,将询价反馈并入RfQ窗口。
    • Read Only(只读)字段:
      • RfQ Response窗口有好几个字段无法填写,包括Response页签的RfQ字段,Response Line页签RfQ Line字段,Response Quantity的RfQ Line Quantity字段。
      • 检查发现系统默认设置居然是Read Only。
      • 把Read Only去掉之后,发现RfQ Line字段和RfQ Line Quantity字段的下拉选项居然可以跨RfQ。不知道RfQ Response是否尚处测试版本?

Rule Engine与脚本

  • 今天开始学习和探索Rule Engine(引擎)的Script(脚本编程)。
  • 主要目的:从于从RfQ(询价单)创建Purchase Request(采购申请)。
  • 介绍:ADempiere的Rule窗口可以写脚本,集成了BeanShell。
  • ADempiere的Rule Engine要用到BeanShell,于是了解了一下BeanShell。
  • 相关链接:

讨论栏

2010-12-17

Rule Engine下写脚本

  • 今天把Rule Engine(引擎)的Script弄清楚了。
  • Script Callout主要用于窗体,Script Process主要用于Process。
  • 对于从 询价单 生成 采购申请单,可以利用Script Process执行SQL语句来实现。
 org.compiere.util.DB.executeUpdate(sql, A_TrxName);

脚本使用体会

  1. 优点:脚本的功能很强大。同时脚本既不需要重新编译ADempiere源代码,也不需要重新布署ADempiere服务器,因为脚本规则都存储在数据库中了。
  2. 缺点:不容易进行错误调试。我今天测试的Script当中有个SQL语句语法错误,居然没有任何报错。

对Rule Engine的疑问

  • Rule Engine为什么要区分成不同Event Type?比如Callout与Process,为什么不合并在一起?
  • Rule Engine的Rule Type为什么是JSR 223 Scripting APIs,而不是BeanShell官方网站上JSR 274?
  • A_TrxName的TrxName是什么意思?
  • Rule Engine中能否实现弹出对话框?代码什么?
    • 后来找到一段代码,不过尚未测试:
 javax.swing.JOptionPane.showMessageDialog(null,"Doing something in Callout!");

讨论栏

2010-12-19

采购询价的实施计划

RfQ Response窗口

  • 关闭RfQ Response(询价反馈)窗口,并入RfQ(询价)窗口。

RfQ窗口

  • RfQ页签:
    • Business Partner增加到两个,用于向供应商询价;
    • 增加字段:是否有现货,交货期,询价单发送日期,询价反馈单签收日期;
    • 增加功能:生成 Requistion(采购申请单);需要新增按钮和编写脚本;
  • Line页签:
    • 增加数量相关字段:计量单位、数量;
    • 增加报价反馈相关字段:报价1、报价备注1、报价2、报价备注2;
  • Quantity页签:
    • 关闭Quantity页签,并入到Line页签。
  • 总体:
    • 窗口优化:关闭不用的字段,将常用字段进行合理排布。

RfQ报表

  • 制作询价单报表。
    • 利用JasperReports制作。

讨论栏

2010-12-22

JasperReports导出PDF中文显示问题

问题描述

  • 问题概述:
    • JasperReports导出的PDF文件中,中文字符均显示为空白。
  • 问题描述:
    • JasperReports导出的PDF文件中,中文字符均显示为空白(不是空格、方框或乱码)。这个现象在iReport、ADempiere C/S 客户端、ADempiere B/S 浏览器端均存在。之前测试时只是检查了预览(或浏览)显示,没有检查导出的PDF文件,因此忽视了该问题。
  • 系统环境:
  1. 操作系统:Linux/Debian Squeeze/Testing, amd64
  2. JVM:java-sun-1.6.0_22, 64bit
  3. iReport:3.7.3
  4. ADempiere:3.6.0 LTS
  • 问题难点:
  • 策略:
    • 先在iReport中测试,成功后再进行ADempiere C/S 客户端测试,最后进行ADempiere B/S 浏览器端测试。
  • 总体步骤:
  1. 先准备好字体
  2. 然后在iReport系统设置当中设置好字体
  3. 接着是对.jrxml报表中的元素属性进行设置
  4. 最后对ADempiere进行设置

具体步骤

Step 1 准备TTF字体文件
  • 经测试,在ADempiere C/S客户端中JasperReports不支持TTC字体文件格式,因此要使用TTF字体文件。
  • 为了保证开源方案的一致性,我们不采用微软的字体,例如微软的宋体、黑体等,而是采用开源的文泉驿字体。本测试中用文泉驿正黑字体 ( wqy-zenhei.ttc) .
  • 由于文泉驿字体只提供TTC字体文件,因此需要转化。
  • 找到工具ttc2ttf,使用其中的BREAKTTC.EXE程序。BREAK TTC这个名字大概是拆分TTC文件的意思吧。
  • 在Windows操作系统下执行该程序。
 BREAKTTC.EXE WQY-ZENHEI.TTC
  • 该程序比较奇怪的地方是只认大写文件名,对于小写文件名会提示找不到该文件。
  • 执行后拆分成3个文件——FONT00.TTF、FONT01.TTF、FONT02.TTF。分别是WenQuanYi Zen Hei, WenQuanYi Zen Hei Mono, WenQuanYi Zen Hei Sharp。
  • 我们选用WenQuanYi Zen Hei,将文件更名为wqy-zenhei.ttf。
Step 2 在iReport设置字体引用
  • 导入字体文件wqy-zenhei.ttf。
    • 菜单:Tools -> Option -> Fonts -> Install Font
  • 导出为字体扩展件wqy-zenhei.jar
    • 菜单:Tools -> Option -> Fonts -> Export as extension
  • 删除原导入字体文件wqy-zenhei.ttf
    • 菜单:Tools -> Option -> Fonts -> Remove Font
  • 导入wqy-zenhei.jar
    • 菜单:Tools -> Option -> Classpath -> Add JAR
Step 3 元素PDF属性的设置
  • 在iReport打开JRXML文件,例如 example.jrxml。
  • 接下来对元素PDF属性的设置:
  1. Pdf Font name:有资料提到这个下拉框可能不会出现Classpath中引入的字体,我就遇到这种情况。这时可以直接手工输入字体名称,例如wqy-zenhei.ttf。
  2. Pdf Embedded:选不选均可。
  3. Pdf Encoding:选择Identity-H (Unicode with horizontal writing) 。
Step 4 iReport预览
  • 点击Preview预览。检查显示是否正确。
  • 点击Save保存图标,将报表保存为PDF格式,例如:example.pdf。
  • 用Evince或Adobe Reader等工具打开导出的的PDF文件,检查显示是否正确。
  • 经过以上步骤,iReport下的PDF中文测试就完成了。
Step 5 ADempiere布署
  • ADempiere的C/S 客户端及B/S 浏览器端布署。
  • ADempiere布署会涉及到的路径问题,一个是JasperReports文件本身的路径,另一个是JasperReports文件的元素PDF属性Pdf Font name所设置的字体路径。
  • 路径可分为相对路径和绝对路径。
  • 怎样集成JasperReports里PdfFontName举例用的是绝对路径:
  1. C/S布署:C:\Windows\Fonts\Arial.ttf
  2. B/S布署:http://192.168.2.109:8080/WebApp/arial.ttf
  • 在这里不建议使用绝对路径,因为这样一来就不能同时布署C/S和B/S,除非你只采用一种布署方式。
  • 我们建议采用相对路径,具体设置如下:
  1. 在iReport中将元素PdfFontName设置为:wqy-zenhei.ttf
  2. 在数据字典Report窗口将JasperReport路径设置为:example.jrxml
  3. 将example.jrxml文件复制到此路径下:$ADEMPIERE_HOME/reports/
  4. 将wqy-zenhei.ttf字体文件分别复制到两个路径下:
    1. $ADEMPIERE_HOME/
    2. $ADEMPIERE_HOME/reports/
    • 注意:C/S客户端从$ADEMPIERE_HOME/路径读取字体文件,B/S浏览器端从$ADEMPIERE_HOME/reports/路径读取字体文件
  • 最后在客户端及浏览器端分别进行报表导出PDF文件测试。

关于PDF中文问题的补充

关于jar字体包
  • ADempiere不需要安装.jar字体包,只需要设置好.ttf字体文件即可。
关于WebApp.war
  • 旧版的怎样集成JasperReports提到“If you are looking for an OS neutral solution you may add the font to your WebApp.war alongwith the .jrxml file and specify as pdfFontName the fullpath to it.”。
  • 但是在我们的方案中,并不需要设置WebApp.war,同样可以做到与显示效果与操作系统无关。
关于iTextAsian.jar方案
  • 有不少资料提到iTextAsian.jar方案(iTextAsian.jar 是一个亚洲字体包)。但是这个方法我们测试后不通过。
  • 大概方法如下:
  1. 将iTextAsian.jar放到Classpath下;
  2. 元素PDF属性的设置如下:
    1. Pdf Font name:STSong-Light
    2. Pdf Embedded:True
    3. Pdf Encoding:选择UniGB-UCS2-H (Chinese Simplified)

一点技巧

  • 在iReport当中对每一个元素都要进行PDF属性设置,这样比较繁琐。这里有一个小技巧,可以利用Style进行风格设定,统一设定Pdf Font name和Pdf Encoding。

关于Subreport子报表

SUBREPORT_DIR 子报表路径

  • 在实际使用中,不需要这么复杂,将SUBREPORT_DIR(子报表路径)设置为空,并将子报表与父报表统一放置在$ADEMPIERE_HOME/reports/路径下即可。

关于子报表无法显示的问题

  • 旧版的怎样集成JasperReports提到:"When you have a report which contain a subreport into, you need to use the last with the compiled files (it’s .jasper file). Sometimes, if you use iReport to compile/edit your reports, maybe you compile the subreport with this tool. When you test the report from iReport, it work fine; but when you run the report from ADempiere, you can’t see nothing. "
  • 旧版的怎样集成JasperReports说的是subreports(子报表)在ADempiere无法显示时,要在ADempiere内将.jrxml文件编译成.jasper文件,并放入路径:D:\Adempiere\jboss\server\adempiere\deploy\WebApp.ear\webApp.war\
  • 在我们的实际测试当中,并不存在上述问题。
    • 我们的子报表在iReport下编译,放在$ADEMPIERE_HOME/reports目录下。
    • 同时在iReport中将子报表SUBREPORT_DIR(子报表路径)设置为空。
    • 这样B/S和C/S方式均可正常显示了。

讨论栏

2010-12-24

价格表区分角色权限问题

  • 用户权限控制是下一步有待解决的问题,主要是区分采购/市场不同角色的查看/编辑权限。
  • 首先以价格表查看权限问题为例:
    • 系统中主要有两类价格表:一类是销售价格表,另一类是采购价格表;
    • 销售价格表一般来说是商业机密,只能让相关的人员查看。
    • 应当如何设置才能让不同的角色查看/维护不同的价格表?
  • 与价格表问题一样,Business Partner(业务伙伴)和Product(产品)也存在相同的问题。
    • 例如客户和供应商应当分别由采购员和销售员维护,不允许进行跨越职权的操作。
    • 同样,采购物料和销售产品也应当分别由采购员和销售员维护。

销售代表的设置

  • 在Sales Order销售代表选项中,Sales Representative (销售代表)要在Business Partner和User两处都要做好设置。
  • 原因在于Table: C_Order当中Sales Representative字段的Reference(引用)设置:AD_User - SalesRep。
  • 打开Reference: AD_User - SalesRep,找到Table Validation页签中,可以看到Sql Where设置为:EXISTS (SELECT * FROM C_BPartner bp WHERE AD_User.C_BPartner_ID=bp.C_BPartner_ID AND bp.IsSalesRep='Y')

讨论栏

一楼-角色设置方法-Albert

  • ADempiere 台灣技術支持團隊::Albert::
  • 不同 User / 不同 Role 要看到不同區段資料
  • AD_UserDef_Tab 要加 WHERECLAUSE 條件
  • AD_UserDef_Tab 要加 READONLYLOGIC 條件
  • 才能讓不同角色有不同資料區段讀寫權限。
  • 但是目前 360 並沒有修正好..
  • 目前未將 AD_UserDef_Tab 的區分加入,請自行增加此段功能
  • 在 AD_UserDef_Win 宣告要區分資料區段的 Role 或 User
  • AD_UserDef_Win.Role=#Role + AD_UserDef_Win.User=#User最優先
  • AD_UserDef_Win.User=#User 次優先
  • AD_UserDef_Win.Role=#Role 優先
  • 因此 GridWindowVO create 時需要先取得是否有 UserDef_Win
  • 以上問題都是相同的設定功能改善後可立即解決::
  • 我們是負責教導如何作出以上功能的顧問公司
  • 如果有需要可以為你們開課::Skype:Adempiere/Compiere :: Adempiere 技術轉移顧問

二楼-感谢Albert的教导

  • 谢谢Albert!
  • Albert大人给了我们许多宝贵的指点,让我们少走了很多弯路!Spring_xu也跟我提起过您对他的帮助。
  • 我们非常期盼有机会能聆听您的教导!
- Peanut Blake. DEC 26, 2010.

2010-12-26

实施栏

讨论栏

链接

本系列链接

相关链接