总账数据访问安全性控制(5)

本文介绍在客户化开发的程序中需要考虑总账数据访问安全性的控制

一、Form界面开发

如果Form界面中需要引用账户组合,同时希望账户组合受到数据安全性控制,需要增加如下的工作:

  1. 添加GLCORE.pll库文件到Form中
  2. 在账户组合字段的WHEN-VALIDATE-ITEM触发器中添加如下的代码来验证权限

gl_flexfield. validate(ledger_id NUMBER, flexmode VARCHAR2, flexvalue VARCHAR2, alevel VARCHAR2, full_validation BOOLEAN, edate DATE)

这个过程验证如果失败后,过程中会抛出这个消息:GLCORE_NO_ACCESS

ledger_id:分类账ID
flexmode:账户组合模式,指弹性域包括:所有段组合,账户段,平衡段和管理段
                  对应可以提供的值:gl_flexfield.ALL_SEGMENTS, gl_flexfield.ACCOUNT, gl_flexfield.BALANCING, gl_flexfield.MANAGEMENT
flexvalue
:账户的段值,根据账户组合模式不同提供不同的值
alevel:数据访问权限级别:完全、写、只读和无权限。
             对应的值:gl_access_set.FULL_ACCESS, gl_access_set.WRITE_ACCESS, gl_access_set.READ_ONLY_ACCESS, gl_access_set.NO_ACCESS
full_validation
:段值是否需要验证
edate:验证段值的日期,此值为null时跳过值的验证

下面是一个实际的代码例子:

gl_flexfield.validate(:HEADER.ledger_id,
         gl_flexfield.ALL_SEGMENTS, :LINES.accounting_flexfield,
         gl_access_set.WRITE_ACCESS, TRUE, :HEADER.default_effective_date);

二、SQL编写

如果希望编写的SQL执行结果受到数据安全性的控制,需要特别添加限制。

1)凭证相关

如果在程序中希望SQL取出的凭证数据受到数据安全性的控制,那需要连接数据库表

GL_JE_SEGMENT_VALUES来过滤数据,主要的字段:

je_header_id:凭证头ID
segment_type_code:段值类型,有B代表平衡段;M代表管理段
segment_value:段值

表关系图:

 gl_access_set_je_erd

同时检查数据安全性设置表GL_ACCESS_SET_ASSIGNMENTS中的设置:
access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
ledger_id
segment_value
access_privilege_code

下面是一个使用的例子:

SELECT *
  FROM gl_je_batches_headers_v
WHERE chart_of_accounts_id = 101
   AND period_set_name = ‘Accounting’
   AND accounted_period_type = ‘Month’
   AND (gl_je_batches_headers_v.ledger_id IN
       (SELECT acc.ledger_id
           FROM gl_access_set_ledgers acc
          WHERE acc.access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)) AND EXISTS
        (SELECT ‘readable line’
           FROM gl_je_segment_values sv, gl_access_set_assignments acc
          WHERE sv.je_header_id = gl_je_batches_headers_v.je_header_id
            AND sv.segment_type_code = ‘B’
            AND acc.access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
            AND acc.ledger_id = gl_je_batches_headers_v.ledger_id
            AND acc.segment_value = sv.segment_value))
   AND (je_batch_id = header_je_batch_id_qry + 0)
   AND (header_name = ’06-NOV-02 Project Mfg To Consolidation USD’)
ORDER BY batch_name, period_name

2)分类帐相关

如果在程序中希望SQL取出的分类账数据受到数据安全性的控制,那需要连接数据库表
XLA_AE_SEGMENT_VALUES

ae_header_id:分类账头ID
segment_type_code:段值类型,有B代表平衡段;M代表管理段
segment_value:段值

表关系图:

 gl_access_set_xla_erd

同时检查数据安全性设置表GL_ACCESS_SET_ASSIGNMENTS中的设置:
access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
ledger_id
segment_value
access_privilege_code

一个使用的例子:

SELECT *
  FROM xla_ae_headers xah
WHERE (ledger_id IN
       (SELECT acc.ledger_id
           FROM gl_access_set_ledgers acc
          WHERE acc.access_set_id = fnd_profile.VALUE(‘GL_ACCESS_SET_ID’)) AND
       EXISTS
        (SELECT ‘readable line’
           FROM xla_ae_segment_values sv, gl_access_set_assignments acc
          WHERE sv.ae_header_id = xah.ae_header_id
            AND sv.segment_type_code = ‘B’
            AND acc.access_set_id = fnd_profile.VALUE(‘GL_ACCESS_SET_ID’)
            AND acc.ledger_id = xah.ledger_id
            AND acc.segment_value = sv.segment_value))

三、PL/SQL编写

如果在客户化编写的PL/SQL程序中需要考虑总账数据安全性控制,使用数据库包GL_FORMSINFO中所提供的过程与方法,下面是它的声明:

SQL> descr GL_FORMSINFO;
Element                   Type     
————————- ———
FULL_ACCESS               CONSTANT 
WRITE_ACCESS              CONSTANT 
READ_ACCESS               CONSTANT 
NO_ACCESS                 CONSTANT 
GET_COA_INFO              PROCEDURE
GET_ACCESS_INFO           PROCEDURE
CHECK_ACCESS              FUNCTION 
GET_LEDGER_TYPE           FUNCTION 
GET_DEFAULT_LEDGER        FUNCTION 
HAS_SINGLE_LEDGER         FUNCTION 
WRITE_ANY_LEDGER          FUNCTION 
GET_LEDGER_INFO           PROCEDURE
VALID_BSV                 FUNCTION 
VALID_MSV                 FUNCTION 
MULTI_ORG                 FUNCTION 
INSTALL_INFO              FUNCTION 
GET_IEA_INFO              PROCEDURE
GET_USAGE_INFO            PROCEDURE
GET_BUSINESS_DAYS_PATTERN PROCEDURE
IEA_DISABLED_SUBSIDIARY   FUNCTION 
GET_INDUSTRY_MESSAGE      FUNCTION 
SESSION_ID                FUNCTION 
SERIAL_ID                 FUNCTION 

程序中使用 CHECK_ACCESS方法即可以检查数据访问安全性。

四、凭证导入

如果客户化程序需要通过总账接口来导入凭证,那需要注意导入凭证受到数据访问权限设置的控制,因此插入到GL_INTERFACE中的数据要充分考虑这点,一般可以采取如下方式:

  1. 如果运行导入程序的职责不具备完全访问分类账的权限,那可以包装一下导入程序,在调用导入程序之前进行数据的过滤
  2. 如果不希望受到数据访问权限的限制,也可以专门设置一个完整权限访问的职责,用它来进行凭证的导入

至此整个“总账数据访问安全性控制”系列已全部结束,下面是系列文章的链接:

原文地址:https://www.cnblogs.com/liuweicong39/p/2771101.html