Abap 根据优先级从JEST表中获取单个主状态? 对于JEST表中的每个对象号,我想得到一个我认为是我的主要状态的状态。< /P> P>主要的问题是,在我的例子中,我认为像I00 76(删除标志)这样的状态可以同时比其他创建的(i00 01)活跃。在这个场景中,我想使用groupbyobjnr,然后在I0076始终覆盖任何其他状态的状态下使用一个CASE

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 | +-------+

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

输入:

+-------+-------+
| 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)

您可以通过使用三个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视图定义中建立您的状态优先级,并在
案例
条件和
合并
上进行聚合。如果您的状态被分成两组相互排斥的状态(例如“覆盖”和“非覆盖”),那么只有一个
合并
和一个
案例就足够了

像这样:

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
函数中只接受两个参数,但在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
,将最高优先级的状态放在第一位(因为在CDS
coalesce
函数中只接受两个参数,但在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'
您希望得到什么