两个箱子里东西若完全一样则合并,否则分开的一个算法

本文介绍了一种用于合并包材信息的算法实现细节。该算法通过处理包材编号、数量等字段来判断是否可以将多个包材条目合并为一条记录,以减少数据冗余并提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

  DATA : BEGIN OF CMP_ITEM OCCURS 0,
                  exidv    LIKE vbplk-exidv,    " 包材编号
                  sumvemng TYPE STRING,        " 数量字符串
                  sumvgpos type i,              " 项目行编号相加汇总
                  flag     type c,              "是否合并标志位
                  same_exidv(4) type c,
         end of cmp_item.
  DATA : WA_CMP_ITEM  LIKE LINE OF CMP_ITEM.

  FIELD-SYMBOLS: <lfs_item1> LIKE LINE OF item,
                 <lfs_item2> LIKE LINE OF item,
                 <lfs_item3> LIKE LINE OF item,
                 <lfs_item_data1> LIKE LINE OF item_data,
                 <lfs_item_data2> LIKE LINE OF item_data.
  DATA: lv_cumulative TYPE char1,
         lv_tabix TYPE i,
        exidv_vemng type string,
        tmp_vemng type string,
        tmp2_vemng type p decimals 1,
        exidv_vgpos type i,
        lv_index like sy-tabix,
        CONCAFLAG TYPE C,
        lv_line type i,
        together_flag type i,
        tmp_together_flag type i,
        subflag type i,
        loopline1 type i,
        loopline2 type i,
        MORE_FLAG TYPE C.

  CHECK item[] IS NOT INITIAL.
  SORT item BY exidv vemng .
  READ TABLE item INDEX 1 ASSIGNING <lfs_item1>.
  exidv_vgpos = <lfs_item1>-vgpos.
  tmp2_vemng = <lfs_item1>-vemng.
  exidv_vemng = tmp2_vemng.

*  DESCRIBE TABLE item LINES lv_line.
  LOOP AT item ASSIGNING <lfs_item2> FROM 2.
    IF <lfs_item2>-exidv = <lfs_item1>-exidv.                            "箱号相同,进行合并
      exidv_vgpos = <lfs_item2>-vgpos + exidv_vgpos.
      tmp2_vemng = <lfs_item2>-vemng.
      tmp_vemng = tmp2_vemng.
      concatenate  exidv_vemng tmp_vemng into exidv_vemng.
      condense exidv_vemng no-gaps.
*      if sy-tabix = lv_line.
      AT LAST.
        cmp_item-exidv = <lfs_item1>-exidv.
        cmp_item-sumvgpos =  exidv_vgpos.
        cmp_item-sumvemng = exidv_vemng.
        clear cmp_item-flag.
        append cmp_item.
      ENDAT.
    else.                                                               "箱号不同,上一项附加到CMP_ITEM表中
      cmp_item-exidv = <lfs_item1>-exidv.
      cmp_item-sumvgpos =  exidv_vgpos.
      cmp_item-sumvemng = exidv_vemng.
      clear cmp_item-flag.
      append cmp_item.
      ASSIGN <lfs_item2> TO <lfs_item1>.
      exidv_vgpos = <lfs_item1>-vgpos.
      tmp2_vemng = <lfs_item1>-vemng.
      exidv_vemng = tmp2_vemng.
      AT LAST.                                                              "最后一项附加入表
        cmp_item-exidv = <lfs_item1>-exidv.
        cmp_item-sumvgpos =  exidv_vgpos.
        cmp_item-sumvemng = exidv_vemng.
        clear cmp_item-flag.
        append cmp_item.
      ENDAT.
    endif.
  endloop.
  SORT CMP_ITEM BY EXIDV.
  READ TABLE CMP_ITEM INDEX 1 INTO WA_CMP_ITEM.
  loop at cmp_item FROM 2.
    if     wa_cmp_item-sumvgpos EQ cmp_item-sumvgpos             "超过2个(含)箱子含有相同项次和数量,标志位置位
       AND wa_cmp_item-sumvemng EQ cmp_item-sumvemng.
      cmp_item-flag = 'X'.
      cmp_item-same_exidv = wa_cmp_item-exidv+16(4).
      lv_index = sy-tabix - 1.
      modify  cmp_item   transporting flag same_exidv.
      modify  cmp_item   INDEX lv_index transporting flag same_exidv.
    else.
      clear cmp_item-flag.
      clear cmp_item-same_exidv.
      wa_cmp_item = cmp_item.
      continue.
    endif.
  endloop.

  loop at item.
    read table cmp_item with key exidv = item-exidv.
    IF SY-SUBRC = 0.
      if cmp_item-flag = 'X'.
        item-flag = 'X'.
        item-same_exidv = cmp_item-same_exidv.
        modify item transporting flag same_exidv.
      else.
        clear item-flag.
        clear item-same_exidv.
        continue.
      endif.
    ENDIF.
  endloop.
  LOOP AT item WHERE FLAG NE 'X' .                                      "没有连号的情况
    ASSIGN   ITEM TO <lfs_item1> .
    APPEND INITIAL LINE TO ITEM_DATA ASSIGNING <lfs_item_data1>.
    <lfs_item_data1>-caenr(4) = <lfs_item1>-exidv+16(4).
    <lfs_item_data1>-caenr+5(1) = '-'.
    <lfs_item_data1>-matnr    = <lfs_item1>-matnr.
    <lfs_item_data1>-arktx    = <lfs_item1>-arktx.
    <lfs_item_data1>-maktxc   = <lfs_item1>-maktxc.
    <lfs_item_data1>-maktxe   = <lfs_item1>-maktxe.
    <lfs_item_data1>-vemng    = <lfs_item1>-vemng.
    <lfs_item_data1>-ntgew    = <lfs_item1>-ntgew.
    <lfs_item_data1>-brgew    = <lfs_item1>-brgew.
    <lfs_item_data1>-volum    = <lfs_item1>-volum.
    <lfs_item_data1>-gebsq    = <lfs_item1>-gebsq.
    <lfs_item_data1>-vgpos    = <lfs_item1>-vgpos.
    <lfs_item_data1>-KDMAT    = <lfs_item1>-KDMAT.
    <lfs_item_data1>-PMATN    = <lfs_item1>-PMATN.
    <lfs_item_data1>-BSTKD_E  = <lfs_item1>-BSTKD_E.
    <lfs_item_data1>-bussiness_check = <lfs_item1>-bussiness_check.
    <lfs_item_data1>-INS_MATNR  =  <lfs_item1>-INS_MATNR.
  ENDLOOP.
  LOOP AT ITEM WHERE FLAG = 'X'.
    APPEND ITEM TO SUMITEM.
  ENDLOOP.
  IF SUMITEM[] IS NOT INITIAL.                                      "SUMITEM中FLAG标志位用来判断是否已经连号
    SORT SUMITEM BY EXIDV VGPOS.

    loopline1 = 1.
    loopline2 = 2.
    LOOP AT sumitem ASSIGNING <lfs_item1> FROM loopline1.
      IF <lfs_item1>-FLAG IS  INITIAL.                            "已经连号了,无须再判断
        CONTINUE.
      ENDIF.
      CLEAR MORE_FLAG.
      loopline2 = loopline1 + 1.
      LOOP AT sumitem ASSIGNING <lfs_item2> FROM loopline2.
        IF <lfs_item2>-FLAG IS  INITIAL.
          CONTINUE.
        ENDIF.
        together_flag = <lfs_item2>-exidv+16(4) - <lfs_item1>-exidv+16(4).
        IF  together_flag > 1 .
          subflag = together_flag - tmp_together_flag.
          IF  subflag = 1.
            IF MORE_FLAG = 'X'.
              CLEAR MORE_FLAG.
              IF     <lfs_item2>-same_exidv EQ <lfs_item1>-same_exidv
                AND  <lfs_item2>-vgpos EQ <lfs_item1>-vgpos
                AND  <lfs_item2>-vemng EQ <lfs_item1>-vemng.
                <lfs_item_data1>-caenr+7(4) = <lfs_item2>-exidv+16(4).
                <lfs_item_data1>-vemng = <lfs_item_data1>-vemng + <lfs_item2>-vemng.
                <lfs_item_data1>-ntgew = <lfs_item_data1>-ntgew + <lfs_item2>-ntgew.
                <lfs_item_data1>-brgew = <lfs_item_data1>-brgew + <lfs_item2>-brgew.
                <lfs_item_data1>-volum = <lfs_item_data1>-volum + <lfs_item2>-volum.
                tmp_together_flag = together_flag.
                MORE_FLAG = 'X'.
                CLEAR <lfs_item2>-FLAG.
                CONTINUE.
              ELSE.
                CONTINUE.
              ENDIF.
            ELSE.
              CONTINUE.
            ENDIF.
          ELSEIF subflag = 0.
              CONTINUE.
          ELSE.
            loopline1 = loopline1 + 1.
            exit.
          ENDIF.
        ELSEIF
          together_flag = 1  AND <lfs_item2>-vgpos EQ <lfs_item1>-vgpos
                             AND <lfs_item2>-vemng EQ <lfs_item1>-vemng.
          IF MORE_FLAG IS INITIAL.                                                "连号多于2个标志位

            APPEND INITIAL LINE TO item_data ASSIGNING <lfs_item_data1>.
            <lfs_item_data1>-caenr(4) = <lfs_item1>-exidv+16(4).
            <lfs_item_data1>-caenr+5(1) = '-'.
            <lfs_item_data1>-matnr    = <lfs_item1>-matnr.
            <lfs_item_data1>-arktx    = <lfs_item1>-arktx.
            <lfs_item_data1>-maktxc   = <lfs_item1>-maktxc.
            <lfs_item_data1>-maktxe   = <lfs_item1>-maktxe.
            <lfs_item_data1>-vemng    = <lfs_item1>-vemng.
            <lfs_item_data1>-ntgew    = <lfs_item1>-ntgew.
            <lfs_item_data1>-brgew    = <lfs_item1>-brgew.
            <lfs_item_data1>-volum    = <lfs_item1>-volum.
            <lfs_item_data1>-gebsq    = <lfs_item1>-gebsq.
            <lfs_item_data1>-vgpos    = <lfs_item1>-vgpos.
            <lfs_item_data1>-KDMAT    = <lfs_item1>-KDMAT.
            <lfs_item_data1>-PMATN    = <lfs_item1>-PMATN.
            <lfs_item_data1>-BSTKD_E  = <lfs_item1>-BSTKD_E.
            <lfs_item_data1>-bussiness_check = <lfs_item1>-bussiness_check.
            <lfs_item_data1>-INS_MATNR  =  <lfs_item1>-INS_MATNR.
            CLEAR <lfs_item1>-FLAG.
          ENDIF.
          <lfs_item_data1>-caenr+7(4) = <lfs_item2>-exidv+16(4).
          <lfs_item_data1>-vemng = <lfs_item_data1>-vemng + <lfs_item2>-vemng.
          <lfs_item_data1>-ntgew = <lfs_item_data1>-ntgew + <lfs_item2>-ntgew.
          <lfs_item_data1>-brgew = <lfs_item_data1>-brgew + <lfs_item2>-brgew.
          <lfs_item_data1>-volum = <lfs_item_data1>-volum + <lfs_item2>-volum.
          CLEAR <lfs_item2>-FLAG.
          MORE_FLAG = 'X'.
          tmp_together_flag = together_flag.
*          loopline1 = loopline1 + 1.
*          EXIT.
          CONTINUE.
        ELSE.
*          CLEAR MORE_FLAG.                                  "如果下一个不连的话,标志清零
          CONTINUE.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDIF.

  LOOP AT SUMITEM ASSIGNING <lfs_item1> WHERE FLAG = 'X'.
             APPEND INITIAL LINE TO item_data ASSIGNING <lfs_item_data1>.
            <lfs_item_data1>-caenr(4) = <lfs_item1>-exidv+16(4).
            <lfs_item_data1>-caenr+5(1) = '-'.
            <lfs_item_data1>-matnr    = <lfs_item1>-matnr.
            <lfs_item_data1>-arktx    = <lfs_item1>-arktx.
            <lfs_item_data1>-maktxc   = <lfs_item1>-maktxc.
            <lfs_item_data1>-maktxe   = <lfs_item1>-maktxe.
            <lfs_item_data1>-vemng    = <lfs_item1>-vemng.
            <lfs_item_data1>-ntgew    = <lfs_item1>-ntgew.
            <lfs_item_data1>-brgew    = <lfs_item1>-brgew.
            <lfs_item_data1>-volum    = <lfs_item1>-volum.
            <lfs_item_data1>-gebsq    = <lfs_item1>-gebsq.
            <lfs_item_data1>-vgpos    = <lfs_item1>-vgpos.
            <lfs_item_data1>-KDMAT    = <lfs_item1>-KDMAT.
            <lfs_item_data1>-PMATN    = <lfs_item1>-PMATN.
            <lfs_item_data1>-BSTKD_E  = <lfs_item1>-BSTKD_E.
            <lfs_item_data1>-bussiness_check = <lfs_item1>-bussiness_check.
            <lfs_item_data1>-INS_MATNR  =  <lfs_item1>-INS_MATNR.
            CLEAR <lfs_item1>-FLAG.
  ENDLOOP.

  SORT ITEM_DATA BY caenr+0(4).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值