ABAP BOM反查至成品

记录一下反查的代码,稍微改改就能用

LOOP AT gt_item.
    "第一次反查
    CALL FUNCTION 'CS_WHERE_USED_MAT'
      EXPORTING
        datub                      = sy-datum
        datuv                      = sy-datum
        matnr                      = gt_item-matnr
        werks                      = p_werks
      TABLES
        wultb                      = lt_wultb
        equicat                    = gt_equicat
        kndcat                     = gt_kndcat
        matcat                     = gt_matcat
        stdcat                     = gt_stdcat
        tplcat                     = gt_tplcat
        prjcat                     = gt_prjcat
      EXCEPTIONS
        call_invalid               = 1
        material_not_found         = 2
        no_where_used_rec_found    = 3
        no_where_used_rec_selected = 4
        no_where_used_rec_valid    = 5
        OTHERS                     = 6.
    "如果没有反查到结果,说明此组件没有上层物料,直接写到FGCODE表
    "设置标记为X代表已经为最上层物料
    IF lt_wultb[] IS INITIAL.
      MOVE: p_werks TO gt_fgcode-werks,
            gt_item-matnr TO gt_fgcode-fgcode,
            gt_item-matnr TO gt_fgcode-matnr,
            'X' TO gt_fgcode-flag.
      APPEND gt_fgcode.
      CLEAR: gt_fgcode.
    ELSE.
      "反查到有上层结果后,在进行递归反查
      LOOP AT lt_wultb INTO gs_wultb.
        MOVE: gs_wultb-werks TO gt_fgcode-werks,
              gs_wultb-matnr TO gt_fgcode-fgcode,
              gs_wultb-idnrk TO gt_fgcode-matnr.
        APPEND gt_fgcode.
        CLEAR: gt_fgcode.
      ENDLOOP.
      PERFORM frm_get_fgcode.
    ENDIF.
  ENDLOOP.

DATA: lt_wultb LIKE TABLE OF gs_wultb,
        lt_mara LIKE TABLE OF mara WITH HEADER LINE.
  DATA: lv_matnr LIKE mara-matnr,
        lv_fgcode LIKE mara-matnr.

  LOOP AT gt_fgcode WHERE flag NE 'X'.
    "将之前反查到的FGCODE字段值作为组件向上反查
    REFRESH: lt_wultb.
    CLEAR: lv_fgcode.
    lv_fgcode = gt_fgcode-fgcode.
    CALL FUNCTION 'CS_WHERE_USED_MAT'
      EXPORTING
        datub                      = sy-datum
        datuv                      = sy-datum
        matnr                      = lv_fgcode
        werks                      = gt_fgcode-werks
      TABLES
        wultb                      = lt_wultb
        equicat                    = gt_equicat
        kndcat                     = gt_kndcat
        matcat                     = gt_matcat
        stdcat                     = gt_stdcat
        tplcat                     = gt_tplcat
        prjcat                     = gt_prjcat
      EXCEPTIONS
        call_invalid               = 1
        material_not_found         = 2
        no_where_used_rec_found    = 3
        no_where_used_rec_selected = 4
        no_where_used_rec_valid    = 5
        OTHERS                     = 6.
    "如果此行未查到结果,说明为最上层物料,赋值标记X
    IF lt_wultb[] IS INITIAL.
      MOVE: 'X' TO gt_fgcode-flag.
      MODIFY gt_fgcode.
      CLEAR: gt_fgcode.
    ELSE.
      "如果还有上层物料,先保存最原始组件,删除中间料的行,
      "将新查到的物料值赋值到FGCODE表
      lv_matnr = gt_fgcode-matnr.
      DELETE gt_fgcode.
      LOOP AT lt_wultb INTO gs_wultb.
        MOVE: gs_wultb-werks TO gt_fgcode-werks,
              gs_wultb-matnr TO gt_fgcode-fgcode,
              gs_wultb-idnrk TO gt_fgcode-matnr.
        APPEND gt_fgcode.
        CLEAR: gt_fgcode.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

FGCODE表就是反查结果了,根据需要区分成品半成品等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值