CDS代码
CDS代码如下,可自行转换成OPEN SQL代码
@AbapCatalog.sqlViewName: 'ZPPV024'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '读取生产工单状态'
define view ZPPV024_DDL as select distinct from aufk
left outer join jest on aufk.objnr = jest.objnr // 系统状态
left outer join tj02 on jest.stat = tj02.istat // 排除前台隐藏的状态
left outer join tj04 on jest.stat = tj04.istat // 状态顺序
left outer join tj02t on jest.stat = tj02t.istat and // 状态描述
tj02t.spras = $session.system_language
{
key aufk.aufnr , // 工单号
key min( case tj04.obtyp
when 'ORH' then tj04.linep
else '99' end ) as linep , // 排序码( 标准代码排序逻辑 )
key min( tj04.statp ) as statp , // 优先级
key min( tj02t.txt04 ) as txt04 , // 前台状态号
tj02t.txt30 // 前台状态描述
} where
aufk.autyp = '10' and // 工单
tj02.nodis <> 'X' and // 不显示隐藏的状态
jest.inact <> 'X' // 不显示未激活状态
group by aufk.aufnr,
tj02t.txt30
表间关系
相关的表一共就3个
jest是状态表,可以用主表aufk的objnr关联后取数
jest里面只有编码没有描述,所以要关联tj02t取描述的状态文本和状态描述文本
跟前台数据比对,发现数据库表里取出来的数据比实际的多
有两个原因,第一个原因是前台只显示了激活状态的状态,通过jest.inact字段可以控制是否显示激活状态的字段
另外一个原因是有些状态是默认前台不显示的,可以通过tj02.nodis字段控制是否显示不显示的字段
排除掉未激活的字段和不显示的字段,此时就已经和前台显示的字段一致了
还有最后一个问题,前台显示的时候是有顺序的,但是现在取出的结果是无序的
翻翻标准函数STATUS_TEXT_EDIT的代码…
这个函数执行的结果就跟前台的一致,debug发现前台获取状态也是用的这个函数
debug看眼逻辑
主要的逻辑就在这儿,如果能通过OBTYP = ‘ORH’ 和状态编码从tj04取到行,那就记录下该行的顺序码tj04.linep,优先级tj04.statp;如果取不到行就设置该行linep = ‘99’
最后根据linep statp txt04排序即可获得最后结果
按上述逻辑distinct去重之后,发现存在有多行满足关联条件的情况
根据主键linep statp txt04 取满足条件的第一行,使用聚合函数min()即可
最后视图的关联关系和条件就如下图所示了
顺序和前台一致,用open sql加个string_agg就完美了,可惜cds里面不支持该函数