ZH/Case-Study-01-Journal-24

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

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

实施日志-24-窗体新增字段批量导入


2010-11-24

Reference设置内容的批量导入

背景

  • 由于Reference的设置内容比较多,而且还要加入中文翻译,因此希望能有一个批量导入的方法。
    • 方法一:写XML文件,利用PackIn工具导入。
    • 方法二:写SQL语句依次插入。INSERT INTO ... (...) VALUES ( ... )。
    • 方法三:写Script脚本导入。
    • 方法四:维护一个基础数据库,再从这个数据库导入到ADempiere的PostgreSQL数据库。
    • 方法五:利用Import File Loader窗口导入。
    • 方法六:利用Pentaho Data Integration ( Kettle )工具进行导入。
  • 方案选择:
    • 一开始我选择了方法四,因为实施过程中变动比较多。
    • 后来发现方法四方案不佳,于是采用了Pentaho Data Integration + SQL语句 的综合方案,见“2010-11-27”的实施内容。--Peanut 于2010年11月27日补充。
    • 这几天重新查看了Import File Loader,发现还有一个方案可供选择:“Import File Loader + SQL语句” 的综合方案,不过比PDI方案多了一项工作——将电子表格另存为.CSV文件。--Peanut 于2010年12月03日补充。

探索

方法四:维护一个基础数据库,再从这个数据库导入到ADempiere的PostgreSQL数据库。

之前在Windows操作系统下用MS Access进行过数据的导入导出。MS Access同一个数据库可以同时进行自建表格、连接至PostgreSQL(通过ODBC或JDBC)、连接至EXCEL电子表格文件,这样就可以非常方便地进行导入和更新了。

现在Linux操作系统下用OpenOffice.org Base,也试图用同样的方法进行,但是发现OOo Base只能三选一,要么自建表格,要么连接至PostgreSQL,要么连接Calc电子表格文件。

因此在OOo Base下进行电子表格-->PostgreSQL数据库的数据导入更为复杂一些。

步骤

备注:由于本方案不佳,于是采用了Pentaho Data Integration + SQL语句 的综合方案,见“2010-11-27”的实施内容。

1. 在PostgreSQL新建base数据库。

同时新建ad_reference, ad_ref_list数据表。

注意:新建的数据表一定要设立主键,否则无法新增和编辑数据。


2. 安装OpenOffice.org与PostgreSQL的连接工具。

 #aptitude install openoffice.org-sdbc-postgresql

3. 在OpenOffice.org Base新建adempiere-base数据库。

a).选择Connect to an existing database;

b).选择postgresql;

c).在Datasource URL栏输入: host=localhost port=5432 dbname=base

d). 在user name栏输入:adempiere

这样就可以在OOo Base操作PostgreSQL数据库了。

4. 将电子表格中的数据导入到PostgreSQL。

a).打开电子表格,把数据整理好。

b).在OOo Calc中选择并复制要导入的数据。(即选择并复制单元格。)

c).在OOo Base中选择要导入的表格,执行“粘贴”,这时会出现数据导入对话框,这样数据就可以顺利插入到PostgreSQL了。

讨论栏

2010-11-27

数据导入

采用Pentaho方案

  • 在“2010-11-24”的实施日志中,数据导入选用了方案四-使用OOo Base来中转,后来发现这个方法存在两个问题:
  1. PostgreSQL的Base数据库向adempiere数据库导入数据不方便。
  2. 从电子表格到OOo Base数据库的数据粘贴也不方便。
  • 后来采取以下方法:
  1. 不另外建立数据库,直接在adempiere数据库中建立数据导入表。例如ii_reference, ii_ref_list, ii_column。
  2. 不再利用OOo Base来中转数据,使用Pentaho Data Integration(PDI)工具将数据从电子表格导入PostgreSQL数据库。
    • (使用PDI工具是来自于Robin的建议,感谢Robin的帮助!)

数据导入工具包

  1. 数据导入模板。电子表格格式。
  2. PDI导入模板。
  3. SQL语句。
  • 执行的功能包括:
  1. 新建Reference,包括ref_list及翻译。
  2. 在表格(即ad_Column)中完成名称、描述、翻译、Reference引用等设置。
  3. 在窗口(即ad_Field)中完成名称、描述、翻译等设置。

SQL语句操作风险

  • 整个导入过程对数据库直接进行SQL语句操作,风险很大。这次实施过程中就有过一次误操作:
--更新Window Field名字。
UPDATE ad_field SET "name" = ii_column.name 
FROM ii_column WHERE ( ii_column.ad_field_id = ad_field.ad_field_id ) ;

我不留神误写成:

UPDATE ad_field SET "name" = ii_column.name 
FROM ii_column WHERE ( ii_column.ad_tab_id = ad_field.ad_tab_id ) ;

执行完毕就悲剧了。幸好后来用了其它办法补救回来了。

  • 为了最大限度的降低风险:
  1. 将整个过程先在测试数据库当中执行完毕,确认无误后方可在正式数据库中执行。
  2. 在正式数据库中执行之前,必须将数据库备份好。

讨论栏

  • 在数据导入过程中遇到了一些问题,总结如下。

二次开发-为什么不能自顶向下

  • 为什么不能自顶向下进行设计? Window -> AD Table -> DB Table 一脉贯通。我的设想是:在Window当中增加一个字段,系统就应当可以在AD Table、DB Table、Reference进行一系列的自动设置。 --Peanut
  • 假设你要新建的字段是虚拟列 还要建数据库字段吗??在"表与列"窗口里有个同步列字段,是可以在数据库中创建数据库字段的。 --豪客
  • 即便是虚拟列,系统也应当可以自动判断,或者用户略作标识。 --Peanut
  • 这个我觉得是完全可行的,只不过Table的column有自己的一些设置,而且可以在不同的窗口重用。另外,频繁地更新数据库表可能也会有比较大的风险吧?而且像virtual column我看好像在数据库里也是对应了相应的列的,是要保存数据的。---徐浣泽
  • 嗯,频繁地更新数据库表的确存在风险。不过我想可以设置一个“生成数据库表”按钮,当Window窗口设计经过一系列修改基本定型后,点击这个按钮执行即可,这样可以避免频繁更新数据库表。--Peanut

直观编辑Window界面的工具

  • 为什么没有工具直观地编辑Window界面?现在要比较费劲地在ad_field表当中设置Sequence、Same Line等字段。--Peanut
  • 直观? 我们做了一个不需要加几个配置字段,或者以外挂的实现。一个设计器,但是是公司的,希望有时间做个开源的。--豪客
  • 后来在What is ADempiere?页面当中找到一个说法——" By not being productized, the ADempiere application can support a rapid release cycle with quick response on bug fixes, innovative integration with modern software tools and applications, rapid extendibility and customization with business processes. " 意思是这样可以带来更快的发布周期和开发实施。--Peanut Blake, DEC 29, 2010.

关于窗口布局的疑问

  • 业务伙伴BPartner窗口的Logo页是在什么地方设置的?# 销售订单Sales Order窗口中的Delivery, Invoicing等可以收缩/展开的栏目是怎么设置的?--Peanut
  • 字段组。--aoslee
  • 这些都属于field group的内容,logo的field group是tab,而收缩/展开里面的那些叫Collapse。你zoom到filed group去看看就知道了。---徐浣泽
  • 感谢aoslee和徐浣泽的帮助!Logo页和Delivery收缩/展开都是利用“字段组”(Field Group)来实现的。有两个地方需要设置:
    • Field Group窗口。
    • Window, Tab & Field窗口中的Field Group字段。 --Peanut

关于“从数据库创建表”功能

  • 打开Table & Column窗口执行Create Columns from DB,不能直接引入数据库中的默认值,即Default Value或Default Logic。之前我用过一个月的GlobalQSS 3.6.1Branch, 我记得该版本是可以的,不知道是不是3.6.0LTS官方版本的Bug,或者说是GlobalQSS新增的功能?--Peanut
  • 有这个功能吗?我一般都是反着做,在AD先建好数据,然后再用AD在数据库中自动建表。建表的时候也有一些限制,比如无法自动帮你创建外键,需要手动创建,所以我想,Create Columns from DB这个功能可能也有一些不完善的地方吧。另外,即Default Value或Default Logic应该有一些自己独特的语法,支持除数据库的默认值之外更多的功能。--徐浣泽
  • 呵呵,我从来没有反着做过,下次测试一下。--Peanut


2010-12-03

数据格式问题

今天发现几个问题:

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);

讨论栏

链接