ZH/Case-Study-01-Journal-26
From ADempiere
This Wiki is read-only for reference purposes to avoid broken links.
实施日志-26-权限设置
- 本文属于机械装备制造业进销存实施案例——ADempiere ERP案例研究之一。
- 本文记录ADempiere ERP项目实施的过程
2010-12-24
价格表区分角色权限问题
- 用户权限控制是下一步有待解决的问题,主要是区分采购/市场不同角色的查看/编辑权限。
- 首先以价格表查看权限问题为例:
- 系统中主要有两类价格表:一类是销售价格表,另一类是采购价格表;
- 销售价格表一般来说是商业机密,只能让相关的人员查看。
- 应当如何设置才能让不同的角色查看/维护不同的价格表?
- 与价格表问题一样,Business Partner(业务伙伴)和Product(产品)也存在相同的问题。
- 例如客户和供应商应当分别由采购员和销售员维护,不允许进行跨越职权的操作。
- 同样,采购物料和销售产品也应当分别由采购员和销售员维护。
讨论栏
一楼-角色设置方法-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.
2011-01-07
价格表、产品、业务伙伴区分角色权限的实现
初步探索
- 初步探索在Price List窗体实现不同角色显示不同价格表。
- 基本结论:
- 没有办法在 Table and Column 窗体里直接对 Price List表的访问权限进行控制
- 可以在 Window, Tab & Field 窗体对 Price List 窗体的Price List页签进行控制。
- 具体方法:通过Window, Tab & Field 窗体找到 Price List窗体的Price List页签,在 Sql where 字段进行以下设置:
( M_PriceList.M_PriceList_ID = 1000002 AND @AD_Role_ID@ = 1000000 ) OR ( M_PriceList.M_PriceList_ID = 1000003 AND @AD_Role_ID@ = 1000001 )
- 最后对 Albert 的指导表示感谢!SQL Where这个方法正是 Albert 建议的。
价格表-Price List的维护权限控制
- 控制方法:
- 控制 Price List 页签:
- Price List窗口
- 控制 Price List 字段:
- Product窗口Price页签 -
- Business Partner窗口
- Purchase Order窗口 Purchase Order 页签
- Sales Order窗口 Customer 页签
- Process: Create Requisition from PO
- 在Role窗口中设置禁用:
- Product Info窗体
产品-Product的维护权限控制
- 关于产品/物料维护:
- 产成品由市场部维护。
- 其它物料由生产部维护。如果细分,可以考虑原材料由采购科维护,半成品由计划科维护。
- 相关窗体:
- Product窗口。
- 控制方法:
- 新建物料:对产品类别(Product Category)字段下拉单进行控制。例如原材料只对采购角色显示,不对销售角色显示。
- 物料维护:产品类别与角色相挂钩。例如当产品类别为成品时,以采购角色为只读,对销售角色为读写。
业务伙伴-Business Partner的维护权限控制
- 相关窗体:
- Business Partner窗体
- 控制方法:
- 新建业务伙伴:
- 对业务伙伴分组(Business Partner Group)字段下拉单进行控制。例如国外客户组只能销售角色显示,不对采购角色显示。
- 对页签Customer / Vendor / Employee 三个页签进行控制。例如 Customer 页签对采购角色为只读。
- 修改业务伙伴:
- 产品类别与角色相挂钩。例如当产品类别为成品时,以采购角色为只读,对销售角色为读写。
2011-01-12
区分角色访问权限的设置
- 今天完成了产品、价格、业务伙伴的区分角色访问权限的设置。
经测试可行的方法
方法一:Tab 页签 SQL Where 字段 - 非 WHERE 语句
- Window, Tab & Field 窗口 Tab 页签 SQL Where 字段 - 非 WHERE 语句
- 例子:Price List窗口,销售角色看销售价格表,采购角色看采购价格表,管理角色看所有价格表。
- 对 Price List窗口 - Price List页签的SQL Where字段进行如下设置:
管理角色: ( @AD_Role_ID@ IN (1000000, 1000046)) 销售角色: OR ( M_PriceList.M_PriceList_ID IN (1000002, 1000003 ) AND ( @AD_Role_ID@ BETWEEN 1000008 AND 1000010 ) ) 采购角色: OR (( M_PriceList.M_PriceList_ID = 1000001) AND ( @AD_Role_ID@ BETWEEN 1000016 AND 1000018 )) 其它实体: OR ( @AD_Client_ID@<>1000000 )
- 图示:Window, Tab & Field 窗口 Tab 页签 SQL Where 字段
方法二:字段下拉选项-Dynamic Validation
- 途径:通过 Table and Column 窗口 Column 页签 Dynamic Validation 字段 来控制。
- 例子:Product 窗口 Price 页签,销售角色看销售价格表,采购角色看采购价格表,管理角色看所有价格表。
- Product 窗口 Price 页签 Price List Version 字段,对应的是 M_ProductPrice 表的 M_PriceList_Version_ID 字段。
- 为 M_ProductPrice.M_PriceList_Version_ID 字段 新建 Validation: M_PriceList_Version_Control,
- Valdiatio Rule 窗口 Valdiation Code 字段设置为:
管理者角色: (( @AD_Role_ID@ IN (1000000, 1000046)) 销售角色: OR ( M_PriceList_Version.M_PriceList_Version_ID IN (1000002, 1000003 ) AND ( @AD_Role_ID@ BETWEEN 1000008 AND 1000010 )) 采购角色: OR (( M_PriceList_Version.M_PriceList_Version_ID = 1000001) AND ( @AD_Role_ID@ BETWEEN 1000016 AND 1000018 )) 其它实体: OR ( @AD_Client_ID@<>1000000 ) ) 实体匹配:AND ( M_PriceList_Version.AD_Client_ID = @AD_Client_ID@ )
- 图示:Table and Column 窗口 Column 页签 Dynamic Validation 字段:
- 图示:Valdiatio Rule 窗口 Valdiation Code 字段:
经测试不可行的方法
方法一:Window Customization 窗口
- Window Customization 窗口是 Beta Functionality(测试功能)。测试了一下没有作用。
- Albert Chen提到的 AD_UserDef_Win_User 表就是用在该窗体的。
- 要是这个功能实现了,角色和用户的窗口权限设置就轻松很多了。
Discuss-讨论
- 补充:看了下compiere3.3和adempiere3.61的相关代码,发现compiere此部分更加完善,但还是Beta测试版,在相关的vo中附加了Window Customization条件,可以参考下。另Albert Chen给出修改方法http://tw.myblog.yahoo.com/adempiere-compiere/article?mid=1320&next=1319&l=a&fid=1 --siantii
- 谢谢siantii的补充! Albert Chen的网页我这里打不开。 --Peanut Blake
方法二:Tab 页签 Read Only Logic 字段
- Window, Tab & Field 窗口 Tab 页签 Read Only Logic 字段
- Read Only Logic 字段存在Bug,我将其设置为 1=1 。通过 GardenAdmin 角色登录打开该页签,该页签已变为灰色,工具栏新增/保存等按钮也变为灰色,但是页签中的字段仍然可以编辑并保存。
方法三:SQL Where 字段 - WHERE 语句
- Window, Tab & Field 窗口 Tab 页签 SQL Where 字段 - WHERE 语句
- SQL Where 字段有一些Bug,对 WHERE 语句会报错(Error),对 FROM 语句也会报警告(Warning)。
- 对Role窗体进行测试:
EXISTS ( SELECT 1 FROM AD_Role ) -- 结果 成功 EXISTS ( SELECT 1 FROM AD_Role WHERE 1=1 ) --结果 失败
- 对Product Category窗体进行测试:
M_Product.M_Product_Category_ID IN ( SELECT M_Product_Category_ID FROM M_Product_Category ) --结果 成功 M_Product.M_Product_Category_ID IN ( SELECT M_Product_Category_ID FROM M_Product_Category WHERE 1=1) --结果 失败
Discuss-讨论
- EXISTS ( SELECT 1 FROM AD_Role WHERE 1=1 ) --结果 失败 Try entering everything in lowercase instead,might work! Hengsin 09:29, 12 January 2011 (UTC)
- Hi Hengsin, it works! really amazing! thanks! exists ( select 1 from ad_role where 1=1 ). -- Peanut Blake 14 January 2011.
- 物有本末事有終始 作研究不是來 amazing 因為 postgres DB table name 大小寫代表不同 table, AD_Role 沒有存在 Albert Chen 17 January 2011.
- Hi Albert Chen. 你的批评很中肯,要理解背后的原理。 我继续进行了测试: (1). exists ( select 1 from AD_Role where 1=1 ) - 测试通过。 (2) exists ( select 1 from ad_role WHERE 1=1 ) - 测试失败。 测试表明与表名大小写无关,与 where 大小写有关。-- Peanut Blake 24 January 2011.
- 有关于价格表的权限设置,在角色中单据操作权限中是不是可以进行设置? - Liuqiaff. 24 January 2011.
- 你是指 Role 窗口的 Document Action Access 页签吧? 这里无法对价格表进行权限设置。价格表不属于单据(Document)。 -- Peanut Blake 24 January 2011.