展平/统一表行,其中条件与 ABAP 或 SQL

如何解决展平/统一表行,其中条件与 ABAP 或 SQL

我正在尝试将表展平为数组(或结构)。我的实现是在 SAP ABAP 中;但是,我相信这个问题与代码无关。我想知道是否有我不知道的算法或我想要实现的简单解决方案。我将接受任何语言或伪代码作为可接受的答案。

我正在从存储在数据库中的“用户限制”(即lt_restrictions)表中进行选择,例如:

enter image description here

这是 SAP BSP MVC Web 应用程序所必需的。当应用程序加载时,我正在执行用户授权检查以填充“用户角色”(即,mt_user_roles)本地表/数组(即,MVC 模型类上的属性).

授权检查涉及常规 ABAP -- 使用 IF 语句有条件地填充“用户角色”表,例如:

AUTHORITY-CHECK OBJECT 'PROGRAM_MANAGER_AUTH' ID 'xxx' FIELD 'yyy'.
IF ( sy-subrc = 0 ).
  APPEND VALUE #( low = 'program_manager' ) TO me->mt_user_roles.
ENDIF.

如果用户同时拥有项目经理进入用户权限,则此“用户角色”表/数组如下所示:

user roles table

对于上面两个表,如果用户具有项目经理入门用户角色,则唯一的限制是转换;因此,我需要填充“限制列表”(即ms_restrictions),如下所示:

enter image description here

否则,如果用户只有例如入口用户角色:

enter image description here

...

...有 2 个限制(释放和转换),所以我需要像这样填充“限制列表”(即 ms_restrictions):

enter image description here

我觉得有一个我可以使用的标准算法,或者这可以在 SELECT 语句中使用 SQL 完成,我的数据库表 WHERE 限制 = NULL(例如,WHERE save = ' ')或使用 {{3} },也许,如果“限制列表”是一个SELECT ... WHERE x IN clause

我应该提一下,我已经有了一个不受欢迎的部分解决方案,它涉及遍历数据库表并为每个限制条件设置多个 IF 语句。 “限制列表”被命名为ms_restrictions,它是一个ABAP STRUCTURE类型的类属性(对于ABAP新手来说,这基本上是一个一维大小的数组):

LOOP AT lt_restrictions INTO DATA(ls_restriction). 
    LOOP AT mt_user_roles INTO DATA(ls_user_role).
        "Check save restriction 
        IF ( 
            ls_restriction-role = ls_user_role-role AND
            ls_user_role = 'save'
        ).
            ms_restrictions-save = 'x'.
        ENDIF.
       "Check release restriction
       IF ( 
            ls_restriction-role = ls_user_role-role AND
            ls_user_role = 'release'
        ).
            ms_restrictions-release = 'x'.
        ENDIF.
       "Check other restrictions
       "......

     ENDLOOP.
ENDLOOP.
            

上述解决方案的问题是我必须为每个限制编写一个 IF 语句。更重要的是,它没有考虑 2 个或多个角色限制之间是否存在冲突,例如,项目经理只有 1 个限制,而 入口用户 有 2。我上面的逻辑可以扩展到考虑到这一点——好吧——甚至更多的 IF 语句:-( ..我想知道是否有不同的方法我可以拿?

另外,我应该提到。在我看来,禁用 HTML 按钮需要生成的“限制列表”,即 mt_restrictions,例如:

<button value = 'Save'    disabled = '//model/mt_restrictions-save' />
<button value = 'Release' disabled = '//model/mt_restrictions-release' />
<button value = 'Convert' disabled = '//model/mt_restrictions-convert' />
<button ... />

解决方法

我想出的解决方案涉及使用 ABAP FIELD-SYMBOL> 的数据类型和 OpenSQL FOR ALL ENTRIES IN SELECT 语句添加。

通过使用 <FIELD-SYMBOL>,您可以避免任何硬编码的属性和/或结构组件名称。现在,限制规则可以增长,而无需将来修改任何代码。

通过使用 FOR ALL ENTRIES IN,您可以将 Roles 表与 Restrictions 表同步。添加此子句允许您从透明的 Role/Restrictions 数据库表 SELECTINTO 一个表,仅包括适用于 AUTH-CHECK 中找到的角色的角色(因为 mt_user_roles为每个真正的 AUTH-CHECK 填充一个新行)。

方法 is_standard_user( )AUTH-CHECK 发生的地方。如果它等于 ABAP_TRUE,则应用所有限制——假设 ms_restrictions 结构组件的值都默认为 ABAP_TRUE

动态循环遍历ms_restrictions的每个结构组件,可以READ对应值的限制表。如果 value 等于 SPACE,则表示当前行没有限制。因此,将结构组件值标记为 SPACE(因为它可能已在之前的迭代中标记为 ABAP_TRUE)——这解决了“角色冲突问题”。

"perform authorization checks
IF ( NOT me->is_standard_user( ) ).

  "see if roles found
  IF ( lines( me->mt_user_roles ) > 0 ).

    "find pertaining restrictions for roles found in auth checks
    SELECT
      *
      FROM
        zmm_apr_roles
        FOR ALL ENTRIES IN    "select only rows applicable to auth-check
          @me->mt_user_roles
        WHERE
          role = @me->mt_user_roles-role
        INTO TABLE
          @DATA(lt_restrictions).

    "dynamically populate restriction list from multi-role restriction table
    DATA: lr_descr_struc TYPE REF TO data.
    DATA: lo_structdescr TYPE REF TO cl_abap_structdescr.
    CREATE DATA lr_descr_struc  LIKE ms_restrictions.
    lo_structdescr ?= cl_abap_structdescr=>describe_by_data_ref( p_data_ref = lr_descr_struc ).
    LOOP AT lo_structdescr->components ASSIGNING FIELD-SYMBOL(<lv_component>).
      ASSIGN COMPONENT <lv_component>-name OF STRUCTURE ms_restrictions TO FIELD-SYMBOL(<lv_field>).
      IF ( <lv_field> IS ASSIGNED ).
        "non-restricted value overwrites restricted value
        READ TABLE lt_restrictions WITH KEY (<lv_component>-name) = space TRANSPORTING NO FIELDS.
        IF ( sy-subrc = 0 ).
          <lv_field> = space.
        ENDIF.
      ENDIF.
    ENDLOOP.

  ENDIF.

ENDIF.

要添加新限制,只需:

  • zmm_apr_roles 和相应的数据字典组件添加新角色
  • ms_restrictions 的相应组件添加新的限制

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res