BW根据相应逻辑将满足条件的订单进行合并;

发布时间 2023-04-23 16:04:08作者: 楚怼像

BW005练习题
业务场景:前台终端系统传输订单明细到BW,BW根据相应逻辑将满足条件的订单进行合并;
订单合并原则:

  1. 订单类型(AUART)为ZOR1或ZRE1的才执行合并;
  2. 合并抬头:订单类型(AUART)、客户(KUNNR)、单据日期(AUDAT)、过账日期(BUDAT)、库位(LGORT、ZKCSX、ZIFPRN)相同时合并到一个单
  3. 合并项目:把相同物料(MATNR)合并;
  4. 合并内容:数量(KWMENG)、金额(NETWR)
  5. 合并模型要求:需要创建合并单号(HBDH),保留合并单号与原订单对应关系;
  6. 其它要求:同一订单单号(BSTKD)的项目只能合并在一个合并单中,不允许跨合并单合并;订单合并后,如果一个订单合并后的行项目超过了200行,则合并到一个新的合并单中,并且保证同一个订单单号(BSTKD)合并在一个合并单中(HBDH)。

模型设计原则:
1、 采取三层模型设计,基础明细层(ZD_D002)、逻辑转换层、汇总层;
2、 明细层:存储终端订单原始数据;(标准ADSO)
逻辑转换层:处理合并逻辑,生成合并单号(HBDH)与原订单号(BSTKD)对应关系(标准ADSO)
汇总层:按照汇总单号汇总数据;(汇总ADSO)

模型设计示意图:

实现
一、转换层逻辑实现
1、新建DSO:ZYXF_D001

增加合并单号HBDH字段

2、创建转换

根据开发规范,合并单号(HBDH)字段赋值为空,说明写上End Routine,表示字段赋值逻辑所在位置

3、开始例程

  • 首次抽取时,取系统表当前最大的合并单号
    IF gv_hbdh IS INITIAL.
    SELECT MAX( hbdh ) FROM /bic/azyxf_d0012 INTO gv_hbdh.
    ENDIF.

  • 排序
    SORT source_package BY bstkd auart kunnr audat budat lgort zkcsx
    zifprn matnr.
    4、结束例程

  • 局部:合并单号
    DATA: lv_hbdh TYPE /bic/azyxf_d0011-hbdh.
    DATA: lv_auart TYPE _ty_s_tg_1-auart,
    lv_kunnr TYPE _ty_s_tg_1-kunnr,
    lv_audat TYPE _ty_s_tg_1-audat,
    lv_budat TYPE _ty_s_tg_1-budat,
    lv_lgort TYPE _ty_s_tg_1-lgort,
    lv_zkcsx TYPE _ty_s_tg_1-zkcsx,
    lv_zifprn TYPE _ty_s_tg_1-zifprn,
    lv_bstkd TYPE _ty_s_tg_1-bstkd.
    DATA: lv_lines TYPE sy-tabix.
    DATA: lv_newline TYPE c,
    lv_newbstkd TYPE c,
    lv_maxline TYPE c.
    BREAK-POINT.

  • 排序
    SORT result_package BY auart kunnr audat
    budat lgort zkcsx zifprn bstkd.
    LOOP AT result_package ASSIGNING <result_fields>.

  • 当前行(合并单号)
    lv_lines = lv_lines + 1.
    
    IF lv_lines GT 200.
      CLEAR lv_lines.
      lv_maxline = 'X'.
    ENDIF.
    
  • 判断是否新行
    IF lv_auart  NE <result_fields>-auart  OR
       lv_kunnr  NE <result_fields>-kunnr  OR
       lv_audat  NE <result_fields>-audat  OR
       lv_budat  NE <result_fields>-budat  OR
       lv_lgort  NE <result_fields>-lgort  OR
       lv_zkcsx  NE <result_fields>-zkcsx  OR
       lv_zifprn NE <result_fields>-zifprn .
      lv_newline = 'X'.
    ENDIF.
    
  • 对于非ZOR1和非ZRE1的订单,每个订单对应一个合并单号
    IF <result_fields>-auart NE 'ZOR1' AND
       <result_fields>-auart NE 'ZRE1' AND
       lv_bstkd  NE <result_fields>-bstkd.
      lv_newbstkd = 'X'.
    ENDIF.
    
  • 合并单号 + 1
    IF lv_newline = 'X' OR lv_newbstkd = 'X' OR lv_maxline = 'X'.
      gv_hbdh = gv_hbdh + 1.
      lv_hbdh = gv_hbdh.
    
      CLEAR: lv_newline,lv_newbstkd,lv_maxline.
    ENDIF.
    
  • 合并单号赋值
    <result_fields>-hbdh = lv_hbdh.
    
  • 记录上一行数据
    lv_auart  = <result_fields>-auart .
    lv_kunnr  = <result_fields>-kunnr .
    lv_audat  = <result_fields>-audat .
    lv_budat  = <result_fields>-budat .
    lv_lgort  = <result_fields>-lgort .
    lv_zkcsx  = <result_fields>-zkcsx .
    lv_zifprn = <result_fields>-zifprn.
    lv_bstkd  = <result_fields>-bstkd.
    

    ENDLOOP.
    5、新建DTP

设置语义组,保证所勾选的字段在通哟个

设置语义组,保证所勾选的字段在同一个请求包中,增加合并效率

抽取数据

显示请求号

二、汇总层实现
1、新建DSO:ZYXF_D002

2、创建转换

数量KWMENG聚合方式选择:SUM汇总

3、创建DTP