Difference between revisions of "ZH/Case-Study-01-Journal-01"
From ADempiere
This Wiki is read-only for reference purposes to avoid broken links.
(→讨论栏目) |
|||
(21 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | [[Chinese|<返回中文首页>]] | + | [[Chinese|<返回中文首页>]] [[ZH/Case-Study-01|<返回本案例研究首页>]] |
+ | <span style="position:relative;left:-10px;top:10px">[[Image:Noia_64_apps_knode_m.png|40px]]</span> | ||
− | =实施日志= | + | {| cellspacing="0" style="margin-top:23px; width:100%;padding:1px;margin-top:-50px;vertical-align:top;" |
+ | | | ||
+ | <span style="font-size:100%;vertical-align:top;"> | ||
+ | {| style="vertical-align:top;" width="100%" cellspacing="1" cellpadding="1" | ||
+ | |- | ||
+ | |style="width:75%;vertical-align:top;"| | ||
+ | {| style="width: 100%; margin:6px 0 0 0; background:none; border-spacing: 0px;text-align:left; font-size:100%; padding:0.2em; border:1px solid #BFB1A3; color:#000; font-weight:bold;" | ||
+ | |- | ||
+ | | style="background-color:#F2E6CE;vertical-align:top;"| | ||
+ | <div style="top:+0.2em;text-align:left;"> | ||
+ | :* 本页面于2010年12月26日停止更新,原有内容已经复制到“实施日志-新排版”。见[[ZH/Case-Study-01|案例01-机械设备制造业进销存实施案例]]。 | ||
+ | :* 感谢您的关注! | ||
+ | </div> | ||
+ | |} | ||
+ | </span> | ||
+ | |} | ||
+ | |||
+ | |||
+ | =实施日志-01= | ||
* 本文属于[[ZH/Case-Study-01|ADempiere ERP现实案例研究之一]]。 | * 本文属于[[ZH/Case-Study-01|ADempiere ERP现实案例研究之一]]。 | ||
* 本文记录ADempiere ERP项目实施的过程 | * 本文记录ADempiere ERP项目实施的过程 | ||
Line 14: | Line 33: | ||
==2010-10-28== | ==2010-10-28== | ||
===系统安装=== | ===系统安装=== | ||
− | * | + | * 今天上午完成了系统安装。安装方法见[[Install on Debian Chinese|在Debian及Postgres上安装Adempiere]] |
* 系统补丁安装方法见[[Patches_Installation]](英文)。 | * 系统补丁安装方法见[[Patches_Installation]](英文)。 | ||
* 安装过程中所遇到的问题已经汇总到[[ZH/Problem in Installation|安装问题解决方法]]。 | * 安装过程中所遇到的问题已经汇总到[[ZH/Problem in Installation|安装问题解决方法]]。 | ||
Line 58: | Line 77: | ||
* Albertachen大人所言极是,本人虚心接受!--Peanut | * Albertachen大人所言极是,本人虚心接受!--Peanut | ||
====三楼==== | ====三楼==== | ||
− | + | > ''(台灣技術支持團隊說明:perior control單據期間未開啟,單據不可成立單據不可過帳,單據沒有成立沒有庫存帳,單據沒有過帳沒有成本帳)'' | |
− | + | : 回复Albertachen :ADempiere创建实体时已经默认创建并启用2010财年,只需要在Year页签和Period页签确认一下即可,不需要另外手工开启会计期间。之前没有写清楚,抱歉! | |
− | + | > ''(台灣技術支持團隊說明:沒有自動依據單據類別直接反應到財務報表的 ERP 就像是被斬頭的人,是屍塊已經沒有核心價值與靈魂)'' | |
− | + | : 回复Albertachen :财务的确非常重要,但是这家公司已经有一套T3用友通标准版财务软件,所以我的想法是第一期暂不使用ADempiere的财务功能,比如说会计凭证录入,但是可以先把财务的骨架搭起来,以便后期启用。--Peanut | |
==2010-10-30== | ==2010-10-30== | ||
Line 132: | Line 151: | ||
* '''物料分类方法:''' | * '''物料分类方法:''' | ||
# 成品,指可以直接销售给客户的设备及其配件,Finished Goods。 | # 成品,指可以直接销售给客户的设备及其配件,Finished Goods。 | ||
+ | ## 包装机械,Packing Machine | ||
+ | ## 专用机械,Specialized Machine | ||
# 半成品,指经加工或组装的零部件,Semi-Finished Goods。 | # 半成品,指经加工或组装的零部件,Semi-Finished Goods。 | ||
# 原材料,指直接用于产品的采购件,包括铸件和锻件,不包括焊条、刀具、办公用品等物品,Raw-material。 | # 原材料,指直接用于产品的采购件,包括铸件和锻件,不包括焊条、刀具、办公用品等物品,Raw-material。 | ||
Line 242: | Line 263: | ||
====二楼==== | ====二楼==== | ||
* 谢谢Myfren的补充!看来货币折算类型应当设置为spot。 --Peanut | * 谢谢Myfren的补充!看来货币折算类型应当设置为spot。 --Peanut | ||
− | ==== | + | ====三楼==== |
* 那个角色的设置是否简单了点? | * 那个角色的设置是否简单了点? | ||
* 在设置角色的时候是否应该设置上下级关系,如销售员和销售经理,后续建立销售订单可以建立相关的审批流程。以便更好的了解Adempiere的细节操作 。-- Myfren | * 在设置角色的时候是否应该设置上下级关系,如销售员和销售经理,后续建立销售订单可以建立相关的审批流程。以便更好的了解Adempiere的细节操作 。-- Myfren | ||
− | ==== | + | ====四楼==== |
* 我准备通过不同的角色分配不同的Menu来进行主要权限控制,同时以窗体权限控制和脚本来进行辅助控制。 | * 我准备通过不同的角色分配不同的Menu来进行主要权限控制,同时以窗体权限控制和脚本来进行辅助控制。 | ||
* “销售员和销售经理”——本来打算过几天再设置的。嗯,我现在就加上去 :-) --Peanut | * “销售员和销售经理”——本来打算过几天再设置的。嗯,我现在就加上去 :-) --Peanut | ||
Line 351: | Line 372: | ||
* OK,一切完毕!以TongjiAdmin角色登录系统,打开窗口:Sales Order,就可以看到自己的杰作了 :-) | * OK,一切完毕!以TongjiAdmin角色登录系统,打开窗口:Sales Order,就可以看到自己的杰作了 :-) | ||
===讨论栏=== | ===讨论栏=== | ||
+ | ====一楼 為何不是在單據類別設定==== | ||
+ | * 為何不是在單據類別(C_DocType_ID)設定: | ||
+ | *# 研发销售、Research & Sales 訂單 | ||
+ | *# 来图加工、Processing with Supplied Drawings 訂單 | ||
+ | *# 设备改造、Equipment Upgrading 訂單 | ||
+ | |||
+ | * Business Type : 會改變客戶訂單是否必須核對價格清單 ? | ||
+ | * Business Type : 是要來判斷或改變哪些管理流程 ? | ||
+ | |||
+ | * 在訂單 C_Order 加欄位,也必須在 MOrder 物件加 Method, | ||
+ | ** I_C_Order.java 加 get/setC_BusinessType_ID Method ! | ||
+ | ** X_C_Order.java 加 get/setC_BusinessType_ID Method ! | ||
+ | ** MOrder.java ,Constructure, beforeSave 必須檢查驗證 ! | ||
+ | |||
+ | * C_BusinessType 必需產生物件給系統引用 | ||
+ | ** I_C_BusinessType.java | ||
+ | ** X_C_BusinessType.java | ||
+ | ** MBusinessType.java | ||
+ | *** 列如 MBusinessType businessType = MBusinessType.get(); | ||
+ | *** 列如 MBusinessType[] businessTypes = MBusinessType.getAll(); | ||
+ | * -- Albertachen | ||
+ | |||
+ | ====二楼 ==== | ||
+ | * 呵呵,我没有想到单据类别(C_DocType_ID)可以这样用。谢谢Albertachen的提醒! | ||
+ | > ''Business Type : 會改變客戶訂單是否必須核對價格清單 ?'' | ||
+ | : 回复Albertachen:对于这家公司,这三种业务类型可以共用一个价格表。 | ||
+ | > ''Business Type : 是要來判斷或改變哪些管理流程 ?'' | ||
+ | : 回复Albertachen :在这家公司,不同的业务类型与不同的业务流程关联。比如“来图加工”就不需要技术部进行设计,但是需要技术部进行造价核算和图纸转化。 | ||
+ | * -- Peanut | ||
==2010-11-04== | ==2010-11-04== | ||
− | === | + | ===关联报表=== |
− | === | + | [[Image:ZH-Case-Study-01-Report-ProductBOM.png|300px|thumb|产品物料明细报表]] |
+ | * 今天主要测试了ADempiere的关联报表功能,这个报表的制作有点繁杂,想参照测试的新手建议从最简单的报表修改开始。 | ||
+ | * 本测试参照HumanFlash的动画教程进行,见HumanFlash/Part8/D.Customizing Reports/4.Create New Reports(Document Lines)。 | ||
+ | * 测试时遇到一个小问题,就是报表头与报表明细重迭了,后来发现是Print Format当中的Header Margin没有设置。设置为120后就不重迭了。 | ||
+ | ====SQL语句==== | ||
+ | * SQL语句如下: | ||
+ | |||
+ | * MyProduct_V | ||
+ | <pre> | ||
+ | CREATE OR REPLACE VIEW MyProduct_V AS | ||
+ | SELECT | ||
+ | p.M_Product_ID AS MyProduct_V_ID, | ||
+ | p.AD_Client_ID, | ||
+ | p.AD_Org_ID, | ||
+ | p.isActive, | ||
+ | p.created, | ||
+ | p.createdby, | ||
+ | p.updated, | ||
+ | p.updatedby, | ||
+ | 'en_US' AS AD_Language, | ||
+ | p.M_Product_ID, | ||
+ | p.value, | ||
+ | p.name, | ||
+ | p.M_Product_Category_ID, | ||
+ | uom.UoMSymbol, | ||
+ | tax.name AS TaxCategory, | ||
+ | rl.name AS ProductType, | ||
+ | p.volume, | ||
+ | p.weight, | ||
+ | p.upc, | ||
+ | p.sku | ||
+ | FROM M_Product p | ||
+ | INNER JOIN C_UoM uom ON ( uom.C_UoM_ID = p.C_UoM_ID ) | ||
+ | INNER JOIN C_TaxCategory tax on (tax.C_TaxCategory_ID = p.C_TaxCategory_ID) | ||
+ | INNER JOIN AD_Ref_List rl ON ( rl.value = p.ProductType AND rl.AD_Reference_ID =270); | ||
+ | </pre> | ||
+ | |||
+ | * MyProduct_VT | ||
+ | <pre> | ||
+ | CREATE OR REPLACE VIEW MyProduct_VT AS | ||
+ | SELECT | ||
+ | p.M_Product_ID AS MyProduct_V_ID, | ||
+ | p.AD_Client_ID, | ||
+ | p.AD_Org_ID, | ||
+ | p.isActive, | ||
+ | p.created, | ||
+ | p.createdby, | ||
+ | p.updated, | ||
+ | p.updatedby, | ||
+ | pt.ad_language AS AD_Language, | ||
+ | p.M_Product_ID, | ||
+ | p.value, | ||
+ | pt.name, | ||
+ | p.M_Product_Category_ID, | ||
+ | uomt.UoMSymbol, | ||
+ | taxt.name AS TaxCategory, | ||
+ | rlt.name AS ProductType, | ||
+ | p.volume, | ||
+ | p.weight, | ||
+ | p.upc, | ||
+ | p.sku | ||
+ | FROM M_Product p | ||
+ | INNER JOIN M_Product_Trl pt ON (pt.M_Product_ID = p.M_Product_ID ) | ||
+ | INNER JOIN C_UoM uom ON ( uom.C_UoM_ID = p.C_UoM_ID ) | ||
+ | INNER JOIN C_UoM_Trl uomt ON (uomt.c_uom_id = uom.c_uom_id) | ||
+ | INNER JOIN C_TaxCategory tax ON (tax.C_TaxCategory_ID = p.C_TaxCategory_ID) | ||
+ | INNER JOIN C_TaxCategory_Trl taxt ON (tax.C_TaxCategory_ID = taxt.C_TaxCategory_ID) | ||
+ | INNER JOIN AD_Ref_List rl ON ( rl.value = p.ProductType AND rl.AD_Reference_ID =270) | ||
+ | INNER JOIN AD_Ref_List_Trl rlt ON ( rlt.AD_Ref_List_ID = rl.AD_Ref_List_ID ); | ||
+ | </pre> | ||
+ | |||
+ | * MyProductLine_V | ||
+ | <pre> | ||
+ | CREATE OR REPLACE VIEW MyProductLine_V AS | ||
+ | SELECT | ||
+ | pb.AD_Client_ID, | ||
+ | pb.ad_org_id, | ||
+ | pb.isactive, | ||
+ | pb.created, | ||
+ | pb.createdby, | ||
+ | pb.updated, | ||
+ | pb.updatedby, | ||
+ | 'en_US' AS AD_Language, | ||
+ | pb.M_Product_ID, | ||
+ | pb.BomQty, | ||
+ | pb.Line, | ||
+ | pb.Description, | ||
+ | p.value, | ||
+ | p.name AS BOMProduct, | ||
+ | uom.UoMSymbol, | ||
+ | rl.name AS BomType | ||
+ | FROM M_Product_BOM pb | ||
+ | INNER JOIN M_Product p ON (pb.M_ProductBOM_ID = p.m_product_id) | ||
+ | INNER JOIN c_uom uom ON ( uom.c_uom_id = p.c_uom_id ) | ||
+ | INNER JOIN ad_ref_list rl ON ( rl.value = pb.bomtype AND rl.ad_reference_id =279); | ||
+ | </pre> | ||
+ | |||
+ | * MyProductLine_VT | ||
+ | <pre> | ||
+ | CREATE OR REPLACE VIEW MyProductLine_VT AS | ||
+ | SELECT | ||
+ | pb.AD_Client_ID, | ||
+ | pb.ad_org_id, | ||
+ | pb.isactive, | ||
+ | pb.created, | ||
+ | pb.createdby, | ||
+ | pb.updated, | ||
+ | pb.updatedby, | ||
+ | pt.AD_Language AS AD_Language, | ||
+ | pb.M_Product_ID, | ||
+ | pb.BomQty, | ||
+ | pb.Line, | ||
+ | pb.Description, | ||
+ | p.value, | ||
+ | pt.name AS BOMProduct, | ||
+ | uomt.UoMSymbol, | ||
+ | rlt.name AS BomType | ||
+ | FROM M_Product_BOM pb | ||
+ | INNER JOIN M_Product p ON (pb.M_ProductBOM_ID = p.m_product_id) | ||
+ | INNER JOIN M_Product_trl pt ON (pt.M_Product_ID = p.m_product_id) | ||
+ | INNER JOIN c_uom uom ON ( uom.c_uom_id = p.c_uom_id ) | ||
+ | INNER JOIN c_uom_trl uomt ON ( uomt.c_uom_id = uom.c_uom_id ) | ||
+ | INNER JOIN ad_ref_list rl ON ( rl.value = pb.bomtype AND rl.ad_reference_id =279) | ||
+ | INNER JOIN ad_ref_list_trl rlt ON ( rlt.ad_ref_list_id = rl.ad_ref_list_id); | ||
+ | </pre> | ||
− | |||
− | |||
===讨论栏=== | ===讨论栏=== | ||
+ | ====一楼-不建议用View写报表==== | ||
+ | * 不建議一開始就偷懶用 View 來寫報表. | ||
+ | * 因為當資料是 : 萬筆*萬筆*萬筆 JOIN, 時資料庫會很慢很慢. | ||
+ | * 這是我們在大量資料的公司實際上線後的基本教條.嚴禁用 View 寫報表,除非他沒有 Join. | ||
+ | * 建議使用資料庫 StoredProcedure 傳入參屬限制 JOIN 範圍. | ||
+ | |||
+ | * ADempiere 近來的方向,將所有 StoredProcedure 幾乎都移除.請參考 Compiere 3.0之前的版本. | ||
+ | * ADempiere 近來的方向,並不是以中大型企業大量資料每日千筆交易以上交易量.因此沒人討論到速度問題. | ||
+ | * 我們的主要服務對象是在每日萬筆資料或千筆交易量的企業,我們大量使用 StoredProcedure. | ||
+ | * 我們可能是唯一將 ADempiere 用於中大型企業, 所以我們仿效 SAP ECC6.0 架構大量使用 StoredProcedure. | ||
+ | |||
+ | * --Albertachen | ||
+ | |||
+ | ====二楼==== | ||
+ | * 谢谢Albertachen的提醒!但是我有个疑问,写报表不用View的话用什么?我只找到这篇文章[http://space.e800.com.cn/ASDFGHJKL/entity/view/?id=23185 数据库 SQL千万级数据规模处理概要]。--Peanut | ||
=讨论栏目= | =讨论栏目= | ||
Line 365: | Line 552: | ||
=链接= | =链接= | ||
*[[ZH/Case-Study-01|ADempiere ERP现实案例研究之一]] | *[[ZH/Case-Study-01|ADempiere ERP现实案例研究之一]] | ||
+ | ** [[ZH/Case-Study-01-Requirement Analysis|客户实施需求分析]] | ||
+ | ** [[ZH/Case-Study-01-Implementation Programme|实施方案]] | ||
+ | ** [[ZH/Case-Study-01-Implementation Plan|实施计划]] | ||
+ | ** 实施日志 | ||
+ | *** [[ZH/Case-Study-01-Journal-02|实施日志-02]] | ||
+ | *** [[ZH/Case-Study-01-Journal-03|实施日志-03]] | ||
[[Category:Chinese]] | [[Category:Chinese]] |
Latest revision as of 19:59, 30 December 2010
Contents实施日志-01
2010年10月2010-10-27项目发起
2010-10-28系统安装
2010-10-29实体初始化
讨论栏一楼
二楼
三楼> (台灣技術支持團隊說明:perior control單據期間未開啟,單據不可成立單據不可過帳,單據沒有成立沒有庫存帳,單據沒有過帳沒有成本帳)
> (台灣技術支持團隊說明:沒有自動依據單據類別直接反應到財務報表的 ERP 就像是被斬頭的人,是屍塊已經沒有核心價值與靈魂)
2010-10-30重新导入中国会计科目
仓库重新设定
其它
讨论栏一楼
二楼2010年11月2010-11-01实施栏讨论栏2010-11-02物料类别
计量单位
货币设置
UPDATE c_currency SET isactive = 'N'; UPDATE c_currency SET isactive = 'Y' WHERE iso_code='CNY' OR iso_code='USD' OR iso_code='EUR'; 货币折算类型
货币汇率设置
用户
角色
讨论栏一楼
二楼
三楼
四楼
2010-11-03
价格表
业务类型
新建窗体:业务类型
CREATE TABLE C_Business_Type ( C_Business_Type_id numeric(10,0) NOT NULL, ad_client_id numeric(10,0) NOT NULL, ad_org_id numeric(10,0) NOT NULL, "name" character varying(50) NOT NULL, description character varying(200), isactive character(1) NOT NULL DEFAULT 'Y'::bpchar, created timestamp without time zone NOT NULL DEFAULT now(), updated timestamp without time zone NOT NULL DEFAULT now(), createdby numeric(10,0) NOT NULL, updatedby numeric(10,0) NOT NULL ); ALTER TABLE C_Business_Type ADD PRIMARY KEY (C_Business_Type_ID );
增加Business Type下拉选项
ALTER TABLE c_order ADD C_Business_Type_id numeric(10,0) NOT NULL DEFAULT 1000001;
讨论栏一楼 為何不是在單據類別設定
二楼
> Business Type : 會改變客戶訂單是否必須核對價格清單 ?
> Business Type : 是要來判斷或改變哪些管理流程 ?
2010-11-04关联报表
SQL语句
CREATE OR REPLACE VIEW MyProduct_V AS SELECT p.M_Product_ID AS MyProduct_V_ID, p.AD_Client_ID, p.AD_Org_ID, p.isActive, p.created, p.createdby, p.updated, p.updatedby, 'en_US' AS AD_Language, p.M_Product_ID, p.value, p.name, p.M_Product_Category_ID, uom.UoMSymbol, tax.name AS TaxCategory, rl.name AS ProductType, p.volume, p.weight, p.upc, p.sku FROM M_Product p INNER JOIN C_UoM uom ON ( uom.C_UoM_ID = p.C_UoM_ID ) INNER JOIN C_TaxCategory tax on (tax.C_TaxCategory_ID = p.C_TaxCategory_ID) INNER JOIN AD_Ref_List rl ON ( rl.value = p.ProductType AND rl.AD_Reference_ID =270);
CREATE OR REPLACE VIEW MyProduct_VT AS SELECT p.M_Product_ID AS MyProduct_V_ID, p.AD_Client_ID, p.AD_Org_ID, p.isActive, p.created, p.createdby, p.updated, p.updatedby, pt.ad_language AS AD_Language, p.M_Product_ID, p.value, pt.name, p.M_Product_Category_ID, uomt.UoMSymbol, taxt.name AS TaxCategory, rlt.name AS ProductType, p.volume, p.weight, p.upc, p.sku FROM M_Product p INNER JOIN M_Product_Trl pt ON (pt.M_Product_ID = p.M_Product_ID ) INNER JOIN C_UoM uom ON ( uom.C_UoM_ID = p.C_UoM_ID ) INNER JOIN C_UoM_Trl uomt ON (uomt.c_uom_id = uom.c_uom_id) INNER JOIN C_TaxCategory tax ON (tax.C_TaxCategory_ID = p.C_TaxCategory_ID) INNER JOIN C_TaxCategory_Trl taxt ON (tax.C_TaxCategory_ID = taxt.C_TaxCategory_ID) INNER JOIN AD_Ref_List rl ON ( rl.value = p.ProductType AND rl.AD_Reference_ID =270) INNER JOIN AD_Ref_List_Trl rlt ON ( rlt.AD_Ref_List_ID = rl.AD_Ref_List_ID );
CREATE OR REPLACE VIEW MyProductLine_V AS SELECT pb.AD_Client_ID, pb.ad_org_id, pb.isactive, pb.created, pb.createdby, pb.updated, pb.updatedby, 'en_US' AS AD_Language, pb.M_Product_ID, pb.BomQty, pb.Line, pb.Description, p.value, p.name AS BOMProduct, uom.UoMSymbol, rl.name AS BomType FROM M_Product_BOM pb INNER JOIN M_Product p ON (pb.M_ProductBOM_ID = p.m_product_id) INNER JOIN c_uom uom ON ( uom.c_uom_id = p.c_uom_id ) INNER JOIN ad_ref_list rl ON ( rl.value = pb.bomtype AND rl.ad_reference_id =279);
CREATE OR REPLACE VIEW MyProductLine_VT AS SELECT pb.AD_Client_ID, pb.ad_org_id, pb.isactive, pb.created, pb.createdby, pb.updated, pb.updatedby, pt.AD_Language AS AD_Language, pb.M_Product_ID, pb.BomQty, pb.Line, pb.Description, p.value, pt.name AS BOMProduct, uomt.UoMSymbol, rlt.name AS BomType FROM M_Product_BOM pb INNER JOIN M_Product p ON (pb.M_ProductBOM_ID = p.m_product_id) INNER JOIN M_Product_trl pt ON (pt.M_Product_ID = p.m_product_id) INNER JOIN c_uom uom ON ( uom.c_uom_id = p.c_uom_id ) INNER JOIN c_uom_trl uomt ON ( uomt.c_uom_id = uom.c_uom_id ) INNER JOIN ad_ref_list rl ON ( rl.value = pb.bomtype AND rl.ad_reference_id =279) INNER JOIN ad_ref_list_trl rlt ON ( rlt.ad_ref_list_id = rl.ad_ref_list_id); 讨论栏一楼-不建议用View写报表
二楼
讨论栏目
链接 |