ZH/Case-Study-01-Journal-26

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

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

实施日志-26-权限设置


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窗体实现不同角色显示不同价格表。
  • 基本结论:
  1. 没有办法在 Table and Column 窗体里直接对 Price List表的访问权限进行控制
  2. 可以在 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的维护权限控制

  • 控制方法:
  1. 控制 Price List 页签:
    1. Price List窗口
  2. 控制 Price List 字段:
    1. Product窗口Price页签 -
    2. Business Partner窗口
    3. Purchase Order窗口 Purchase Order 页签
    4. Sales Order窗口 Customer 页签
    5. Process: Create Requisition from PO
  3. 在Role窗口中设置禁用:
    1. Product Info窗体

产品-Product的维护权限控制

  • 关于产品/物料维护:
  1. 产成品由市场部维护。
  2. 其它物料由生产部维护。如果细分,可以考虑原材料由采购科维护,半成品由计划科维护。
  • 相关窗体:
  1. Product窗口。
  • 控制方法:
  1. 新建物料:对产品类别(Product Category)字段下拉单进行控制。例如原材料只对采购角色显示,不对销售角色显示。
  2. 物料维护:产品类别与角色相挂钩。例如当产品类别为成品时,以采购角色为只读,对销售角色为读写。

业务伙伴-Business Partner的维护权限控制

  • 相关窗体:
  1. Business Partner窗体
  • 控制方法:
  1. 新建业务伙伴:
    1. 对业务伙伴分组(Business Partner Group)字段下拉单进行控制。例如国外客户组只能销售角色显示,不对采购角色显示。
    2. 对页签Customer / Vendor / Employee 三个页签进行控制。例如 Customer 页签对采购角色为只读。
  2. 修改业务伙伴:
    1. 产品类别与角色相挂钩。例如当产品类别为成品时,以采购角色为只读,对销售角色为读写。

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 字段

Access Control 001 Tab SQL Where.png

方法二:字段下拉选项-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 字段:

Access Control 002 Column Dynamic Validation.png

  • 图示:Valdiatio Rule 窗口 Valdiation Code 字段:

Access Control 003 Validation Validation Code.png

经测试不可行的方法

方法一: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.

链接