对于JEST表中的每个对象数,我希望得到一个我认为是我的主要状态的状态。
主要的问题是,在我的示例中,某些状态(如I0076 (删除标志))可以与created (I0001)等其他状态同时活动。在这个场景中,我想使用objnr的组,然后使用状态下的I0076总是覆盖任何其他状态的情况。
使用ABAP还是SQL,这是可能的吗?或者我必须编写ABAP代码(AMDP或后处理)来解决这个问题?
输入:
+-------+-------+
| OBJNR | STAT |
+-------+-------+
| OBJ1 | I0001 |
| OBJ1 | I0076 |
| OBJ2 | I0001 |
+-------+-------+输出:
+-------+-------+
| OBJ1 | I0076 |
| OBJ2 | I0001 |
+-------+-------+发布于 2020-12-01 15:31:05
您可以在CDS视图定义中构建状态优先级,并在CASE条件和COALESCE上进行聚合。如果您的状态被分成两组相互排斥的状态(例如“重写”和“非重写”),那么只需要一个COALESCE和一个CASE就足够了。
如下所示:
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中它可以有很多)。
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视图,该视图将包含具有结构的状态优先级:
| STATUS | PRIORITY |
| (CHAR 5) | (INT) |
+----------+----------+
| I0001 | 1 |
| I0011 | 2 |
| I0076 | 100 |
| I0079 | 101 |在每个覆盖状态都将具有更高的优先级和优先级时,应该唯一地标识状态。它可以从直接放置优先级的Z表中获取,或者从自定义设置(如果可用的话)或者从编码的AMDP中获取(例如,减除最后3个字符并通过row_number()函数进行排序)。
然后,您需要将两个视图与该视图连接起来:
MAX( PRIORITY ) as FINAL_STATUS
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中被成功激活。
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'发布于 2020-12-01 09:24:33
您可以通过使用三个CDS视图来实现这一点。
在第一个CDS视图中,您只使用where语句选择删除状态(其中stat =‘I0076’),在第二个CDS视图中,使用where语句只选择第三个CDS视图中的未删除状态(其中stat <>‘I0076’)
https://stackoverflow.com/questions/65072920
复制相似问题