Abap 根据优先级从JEST表中获取单个主状态? 对于JEST表中的每个对象号,我想得到一个我认为是我的主要状态的状态。< /P> P>主要的问题是,在我的例子中,我认为像I00 76(删除标志)这样的状态可以同时比其他创建的(i00 01)活跃。在这个场景中,我想使用groupbyobjnr,然后在I0076始终覆盖任何其他状态的状态下使用一个CASE
这在ABAP CD或SQL中是可能的吗?或者我必须编写ABAP代码(AMDP或后处理)来解决这个问题吗 输入:Abap 根据优先级从JEST表中获取单个主状态? 对于JEST表中的每个对象号,我想得到一个我认为是我的主要状态的状态。< /P> P>主要的问题是,在我的例子中,我认为像I00 76(删除标志)这样的状态可以同时比其他创建的(i00 01)活跃。在这个场景中,我想使用groupbyobjnr,然后在I0076始终覆盖任何其他状态的状态下使用一个CASE,abap,opensql,cds,Abap,Opensql,Cds,这在ABAP CD或SQL中是可能的吗?或者我必须编写ABAP代码(AMDP或后处理)来解决这个问题吗 输入: +-------+-------+ | OBJNR | STAT | +-------+-------+ | OBJ1 | I0001 | | OBJ1 | I0076 | | OBJ2 | I0001 | +-------+-------+ 输出: +-------+-------+ | OBJ1 | I0076 | | OBJ2 | I0001 | +-------+
+-------+-------+
| OBJNR | STAT |
+-------+-------+
| OBJ1 | I0001 |
| OBJ1 | I0076 |
| OBJ2 | I0001 |
+-------+-------+
输出:
+-------+-------+
| OBJ1 | I0076 |
| OBJ2 | I0001 |
+-------+-------+
您可以通过使用三个CD视图来实现这一点
- 在第一个CDS视图中,使用where语句仅选择已删除状态(where stat='I0076')
- 在第二个CDS视图中,使用where语句仅选择未删除状态(where stat“I0076”)
- 在第三个CDS视图中,在第一个和第二个视图上使用左外部联接,并添加一个case语句以仅包含一个结果(当first.stat为null时为case,然后是second.stat else first.stat end as status)
- 在第一个CDS视图中,使用where语句仅选择已删除状态(where stat='I0076')
- 在第二个CDS视图中,使用where语句仅选择未删除状态(where stat“I0076”)
- 在第三个CDS视图中,在第一个和第二个视图上使用左外部联接,并添加一个case语句以仅包含一个结果(当first.stat为null时为case,然后是second.stat else first.stat end as status)
案例
条件和合并
上进行聚合。如果您的状态被分成两组相互排斥的状态(例如“覆盖”和“非覆盖”),那么只有一个合并
和一个案例就足够了
像这样:
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
,将最高优先级的状态放在第一位(因为在CDScoalesce
函数中只接受两个参数,但在SQL中它可以有多个参数)
当然,它需要针对新的状态进行更新,但由于CDS语法有限,我看不到轻量级选项
要获得更可靠的解决方案,您可以创建另一个CDS视图,该视图将包含具有以下结构的状态优先级:
| STATUS | PRIORITY |
| (CHAR 5) | (INT) |
+----------+----------+
| I0001 | 1 |
| I0011 | 2 |
| I0076 | 100 |
| I0079 | 101 |
其中,每个覆盖状态将具有更高的优先级,优先级应唯一标识状态。它可以取自某些Z表,您可以在其中直接设置优先级,也可以取自自定义设置(如果它们可用),或者取自编码的AMDP(例如,通过行数()
函数对最后3个字符进行子串排序)
然后,需要将两个视图与该视图合并:
- 第一个视图将状态代码转换为状态优先级,并计算优先级最高的状态:
MAX(priority)作为最终状态
- 第二个视图将其转换回:最终状态->优先级->状态
UPD:如果在任何常规状态(I0001
)之后始终具有覆盖状态(I0076
),则可以将左侧外部联接
与相同的JEST
表一起使用。以下DDL源已在SAP_ABA 750 SP 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'
将视图Z_TEST_V定义为从JEST中选择为j1
左外连接为j2
在j1.OBJNR=j2.OBJNR上
和j2.STAT='I0076'
和j2.INACT=''
{
j1.OBJNR,
结合(
j2.STAT,
j1.STAT
)作为统计
}
其中j1.INACT=“”
和j1.STAT'I0076'
您可以在CDS视图定义中建立您的状态优先级,并在案例
条件和合并
上进行聚合。如果您的状态被分成两组相互排斥的状态(例如“覆盖”和“非覆盖”),那么只有一个合并
和一个案例就足够了
像这样:
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
,将最高优先级的状态放在第一位(因为在CDScoalesce
函数中只接受两个参数,但在SQL中它可以有多个参数)
当然,它需要针对新的状态进行更新,但由于CDS语法有限,我看不到轻量级选项
要获得更可靠的解决方案,您可以创建另一个CDS视图,该视图将包含具有以下结构的状态优先级:
| STATUS | PRIORITY |
| (CHAR 5) | (INT) |
+----------+----------+
| I0001 | 1 |
| I0011 | 2 |
| I0076 | 100 |
| I0079 | 101 |
其中,每个覆盖状态将具有更高的优先级,优先级应唯一标识状态。它可以取自某些Z表,您可以在其中直接设置优先级,也可以取自自定义设置(如果它们可用),或者取自编码的AMDP(例如,通过行数()
函数对最后3个字符进行子串排序)
然后,需要将两个视图与该视图合并:
- 第一个视图将状态代码转换为状态优先级,并计算优先级最高的状态:
MAX(priority)作为最终状态
- 第二个视图将其转换回:最终状态->优先级->状态
UPD:如果在任何常规状态(I0001
)之后始终具有覆盖状态(I0076
),则可以将左侧外部联接
与相同的JEST
表一起使用。以下DDL源已在SAP_ABA 750 SP 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'
将视图Z_TEST_V定义为从JEST中选择为j1
左外连接为j2
在j1.OBJNR=j2.OBJNR上
和j2.STAT='I0076'
和j2.INACT=''
{
j1.OBJNR,
结合(
j2.STAT,
j1.STAT
)作为统计
}
其中j1.INACT=“”
和j1.STAT'I0076'
您希望得到什么