首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据优先级从JEST表中获取单个主状态?

根据优先级从JEST表中获取单个主状态?
EN

Stack Overflow用户
提问于 2020-11-30 11:43:00
回答 2查看 706关注 0票数 1

对于JEST表中的每个对象数,我希望得到一个我认为是我的主要状态的状态。

主要的问题是,在我的示例中,某些状态(如I0076 (删除标志))可以与created (I0001)等其他状态同时活动。在这个场景中,我想使用objnr的组,然后使用状态下的I0076总是覆盖任何其他状态的情况。

使用ABAP还是SQL,这是可能的吗?或者我必须编写ABAP代码(AMDP或后处理)来解决这个问题?

输入:

代码语言:javascript
复制
+-------+-------+
| OBJNR | STAT  |
+-------+-------+
| OBJ1  | I0001 |
| OBJ1  | I0076 |
| OBJ2  | I0001 |
+-------+-------+

输出:

代码语言:javascript
复制
+-------+-------+
| OBJ1  | I0076 |
| OBJ2  | I0001 |
+-------+-------+
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-01 15:31:05

您可以在CDS视图定义中构建状态优先级,并在CASE条件和COALESCE上进行聚合。如果您的状态被分成两组相互排斥的状态(例如“重写”和“非重写”),那么只需要一个COALESCE和一个CASE就足够了。

如下所示:

代码语言:javascript
复制
define view z_demo_v as select from jest {
  OBJNR,
  coalesce(
// Overriding statuses
    max( case when STAT = 'I0076' /*and other overriding values go here*/ then STAT end ),
// Non-overriding statuses. All overriding are captured in previous CASE
//so no need to exclude them here, coalesce will return the first MAX
    max( STAT)
  ) as STAT
}

  where INACT = ''
  group by OBJNR

如果您可以在每个组中拥有多个状态,那么您可以嵌套尽可能多的coalesce,因为您需要将最高优先级的状态放在第一位(因为在CDS coalesce函数中只接受两个参数,但在coalesce中它可以有很多)。

代码语言:javascript
复制
define view z_demo_v as select from jest {
  OBJNR,
  coalesce(
    coalesce(
      // Status with highest priority
      max( case STAT when 'I0076' then 'I0076' end ),
      // Status with second-highest priority
      max( case STAT when 'I0070' then 'I0070' end )
    ),
    // Status with other priority (that should be mutually exclusive)
    max( STAT)
  ) as STAT
}

  where INACT = ''
  group by OBJNR

当然,它需要更新以获得新的状态,但是由于CDS语法有限,我看不到轻量级选项。

为了获得更健壮的解决方案,您可以创建另一个CDS视图,该视图将包含具有结构的状态优先级:

代码语言:javascript
复制
| STATUS   | PRIORITY |
| (CHAR 5) | (INT)    |
+----------+----------+
| I0001    | 1        |
| I0011    | 2        |
| I0076    | 100      |
| I0079    | 101      |

在每个覆盖状态都将具有更高的优先级和优先级时,应该唯一地标识状态。它可以从直接放置优先级的Z表中获取,或者从自定义设置(如果可用的话)或者从编码的AMDP中获取(例如,减除最后3个字符并通过row_number()函数进行排序)。

然后,您需要将两个视图与该视图连接起来:

MAX( PRIORITY ) as FINAL_STATUS

  • Second视图将将状态代码转换为状态优先级,并计算出最优先的状态:视图将将其转换回: FINAL_STATUS ->优先级->状态。

代码语言:javascript
复制
define view z_stat_prio_v as select from z_statprio_t {
  STATUS,
  PRIORITY
}

define view z_demo_stat_last_v as select
  from jest as j
  join z_stat_prio_v as p
  on j.stat = p.status
 {
  j.OBJNR,
  max( p.PRIORITY ) as FINAL_STATUS
}

  where j.INACT = ''
  group by j.OBJNR


define view z_demo_stat_v as select
  from z_demo_stat_last_v as s
  join z_stat_prio_v as p
  on s.final_status = p.priority
 {
  s.OBJNR,
  p.STATUS as STAT
}

UPD:如果在任何一般状态(I0001)之后总是具有覆盖状态(在您的情况下是I0076),那么您可以使用带有相同的JEST表的LEFT OUTER JOIN。以下DDL源在SAP_ABA 750SP 08中被成功激活。

代码语言:javascript
复制
define view Z_TEST_V as select from JEST as j1
  left outer join JEST as j2
    on j1.OBJNR = j2.OBJNR
     and j2.STAT = 'I0076'
     and j2.INACT = ''
  {
  j1.OBJNR,
  coalesce (
    j2.STAT,
    j1.STAT
  ) as STAT

}
  where j1.INACT = ''
    and j1.STAT <> 'I0076'
票数 2
EN

Stack Overflow用户

发布于 2020-12-01 09:24:33

您可以通过使用三个CDS视图来实现这一点。

在第一个CDS视图中,您只使用where语句选择删除状态(其中stat =‘I0076’),在第二个CDS视图中,使用where语句只选择第三个CDS视图中的未删除状态(其中stat <>‘I0076’)

  • ,在第一个和第二个视图上使用左外部联接,并添加一个case语句只包含一个结果(当First.stat为null,然后Second.stat outer First.stat结束为状态)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65072920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档