SAP:COOISPI 增强

项目要求在COOISPI界面增加“批次”查询条件,用于筛选流程订单。

 这里使用了一系列增强实现该功能。

Step1: 增强选择屏幕,增加批次查询条件。因为是标准程序,无法维护批次字段的选择文本。这里使用变量gc_charg,对批次字段设置选择文本。

 Step2: 在初始化事件时,增强对gc_charg赋值,实现批次字段的选择文本。

Step3:点击查询时,保存选择屏幕的输入条件。作用:后续使用批次进行数据过滤用。

Step4:使用badi:WORKORDER_INFOSYSTEM,增强实施方法TABLES_MODIFY_LAY。

  METHOD if_ex_workorder_infosystem~tables_modify_lay.
    DATA: lt_sel TYPE rsparams_tt.
    DATA: lt_charg_rg TYPE RANGE OF mch1-charg,
          ls_charg_rg LIKE LINE OF lt_charg_rg.

    DATA: lt_aufnr_rg TYPE RANGE OF afpo-aufnr.


*   从内存中取出选择屏幕输入信息
    IMPORT zcoois_sel = lt_sel FROM MEMORY ID 'ZCOOISPI'.

*   获得增强的批次输入值
    LOOP AT lt_sel INTO DATA(ls_sel) WHERE selname = 'S_CHARG'.
      CLEAR: ls_charg_rg.
      IF ls_sel-sign IS NOT INITIAL AND ls_sel-option IS NOT INITIAL.
        ls_charg_rg-sign   = ls_sel-sign  .
        ls_charg_rg-option = ls_sel-option.
        ls_charg_rg-low    = ls_sel-low   .
        ls_charg_rg-high   = ls_sel-high  .
        APPEND ls_charg_rg TO lt_charg_rg.
      ENDIF.
    ENDLOOP.

*   用批次信息对查询结果过滤
    IF lt_charg_rg[] IS NOT INITIAL.
      DELETE ct_ioheader WHERE charg NOT IN lt_charg_rg.
      DELETE ct_ioitem   WHERE charg NOT IN lt_charg_rg.

      " 使用增强的批次对系统的查询结果进行二次过滤
      IF ct_iomamo[] IS NOT INITIAL.
        SELECT aufm~mblnr,
               aufm~mjahr,
               aufm~zeile
          INTO TABLE @DATA(lt_aufm)
          FROM aufm
          INNER JOIN afpo ON afpo~aufnr = aufm~aufnr
          FOR ALL ENTRIES IN @ct_iomamo[]
          WHERE afpo~aufnr =  @ct_iomamo-aufnr
            AND afpo~charg IN @lt_charg_rg.

        IF sy-subrc <> 0.
          REFRESH: ct_iomamo.
        ELSE.
          DATA(lt_iomamo) = ct_iomamo[].
          REFRESH: ct_iomamo.  "清空结果,准备输出过滤后的结果
          LOOP AT lt_aufm INTO DATA(ls_aufm).
            LOOP AT lt_iomamo INTO DATA(ls_iomamo) WHERE mblnr =  ls_aufm-mblnr
                                                     AND mjahr =  ls_aufm-mjahr
                                                     AND zeile =  ls_aufm-zeile.
              APPEND ls_iomamo TO ct_iomamo.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_ioopgomo[] IS NOT INITIAL.
        SELECT mseg~mblnr,
               mseg~mjahr,
               mseg~zeile
          INTO TABLE @DATA(lt_mseg)
          FROM mseg
          INNER JOIN afpo ON afpo~aufnr = mseg~aufnr
          FOR ALL ENTRIES IN @ct_ioopgomo[]
          WHERE afpo~aufnr =  @ct_ioopgomo-aufnr
            AND afpo~charg IN @lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_ioopgomo[].
        ELSE.
          DATA(lt_ioopgomo) = ct_ioopgomo[].
          REFRESH: ct_ioopgomo.     "清空结果,准备输出过滤后的结果
          LOOP AT lt_mseg INTO DATA(ls_mseg).
            LOOP AT lt_ioopgomo INTO DATA(ls_ioopgomo) WHERE  mblnr  = ls_mseg-mblnr
                                                      AND mjahr  = ls_mseg-mjahr
                                                      AND zeile  = ls_mseg-zeile.
              APPEND ls_ioopgomo TO ct_ioopgomo.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.


      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_iogomo[] IS NOT INITIAL.
        SELECT mseg~mblnr,
               mseg~mjahr,
               mseg~zeile
          INTO TABLE @lt_mseg
          FROM mseg
          INNER JOIN afpo ON afpo~aufnr = mseg~aufnr
          FOR ALL ENTRIES IN @ct_iogomo[]
          WHERE afpo~aufnr =  @ct_iogomo-aufnr
            AND afpo~charg IN @lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_iogomo[].
        ELSE.
          DATA(lt_iogomo) = ct_iogomo[].
          REFRESH: ct_iogomo. "清空结果,准备输出过滤后的结果
          LOOP AT lt_mseg INTO ls_mseg.
            LOOP AT lt_iogomo INTO DATA(ls_iogomo) WHERE  mblnr  = ls_mseg-mblnr
                                                      AND mjahr  = ls_mseg-mjahr
                                                      AND zeile  = ls_mseg-zeile.
              APPEND ls_iogomo TO ct_iogomo.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.


      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_iosogomo[] IS NOT INITIAL.
        SELECT mseg~mblnr,
               mseg~mjahr,
               mseg~zeile
          INTO TABLE @lt_mseg
          FROM mseg
          INNER JOIN afpo ON afpo~aufnr = mseg~aufnr
          FOR ALL ENTRIES IN @ct_iosogomo[]
          WHERE afpo~aufnr =  @ct_iosogomo-aufnr
            AND afpo~charg IN @lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_iosogomo[].
        ELSE.
          DATA(lt_iosogomo) = ct_iosogomo[].
          REFRESH: ct_iosogomo.   "清空结果,准备输出过滤后的结果
          LOOP AT lt_mseg INTO ls_mseg.
            LOOP AT lt_iosogomo INTO DATA(ls_iosogomo) WHERE  mblnr  = ls_mseg-mblnr
                                                      AND mjahr  = ls_mseg-mjahr
                                                      AND zeile  = ls_mseg-zeile.
              APPEND ls_iosogomo TO ct_iosogomo.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_ioopcomp[] IS NOT INITIAL.
        " 读取凭证抬头中的批次信息,准备进行数据过滤
        SELECT * FROM afpo INTO TABLE @DATA(lt_afpo)
          FOR ALL ENTRIES IN @ct_ioopcomp[]
          WHERE aufnr = @ct_ioopcomp-aufnr
            AND charg IN @lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_ioopcomp[].
        ELSE.
          REFRESH: lt_aufnr_rg.
          LOOP AT lt_afpo INTO DATA(ls_afpo).
            APPEND VALUE #( sign = 'I' option = 'EQ' low = ls_afpo-aufnr ) TO lt_aufnr_rg.
          ENDLOOP.

          SORT lt_aufnr_rg BY low.
          DELETE ADJACENT DUPLICATES FROM lt_aufnr_rg COMPARING low.
          DELETE ct_ioopcomp WHERE aufnr NOT IN lt_aufnr_rg.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_ioopgmer[] IS NOT INITIAL.    "货物移动(包含错误)
        SELECT affw~weblnr  ,
               affw~weblpos
          INTO TABLE @DATA(lt_affw)
          FROM affw
          INNER JOIN afpo ON afpo~aufnr = affw~aufnr
          FOR ALL ENTRIES IN @ct_ioopgomo[]
          WHERE afpo~aufnr =  @ct_ioopgomo-aufnr
            AND afpo~charg IN @lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_ioopgmer[].
        ELSE.
          DATA(lt_ioopgmer) = ct_ioopgmer[].
          REFRESH: ct_ioopgmer.
          LOOP AT lt_affw INTO DATA(ls_affw).
            LOOP AT lt_ioopgmer INTO DATA(ls_ioopgmer) WHERE weblnr  = ls_affw-weblnr
                                                         AND weblpos  = ls_affw-weblpos.
              APPEND ls_ioopgmer TO ct_ioopgmer.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_iogmer[] IS NOT INITIAL.
        SELECT affw~weblnr  ,
               affw~weblpos
          INTO TABLE @lt_affw
          FROM affw
          INNER JOIN afpo ON afpo~aufnr = affw~aufnr
          FOR ALL ENTRIES IN @ct_iogmer[]
          WHERE afpo~aufnr =  @ct_iogmer-aufnr
            AND afpo~charg IN @lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_iogmer[].
        ELSE.
          DATA(lt_iogmer) = ct_iogmer[].
          REFRESH: ct_iogmer.  "输出二次过滤后的结果
          LOOP AT lt_affw INTO ls_affw.
            LOOP AT lt_iogmer INTO DATA(ls_iogmer) WHERE weblnr  = ls_affw-weblnr
                                                         AND weblpos  = ls_affw-weblpos.
              APPEND ls_iogmer TO ct_iogmer.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_iosogmer[] IS NOT INITIAL.
        SELECT affw~weblnr  ,
               affw~weblpos
          INTO TABLE @lt_affw
          FROM affw
          INNER JOIN afpo ON afpo~aufnr = affw~aufnr
          FOR ALL ENTRIES IN @ct_iosogmer[]
          WHERE afpo~aufnr =  @ct_iosogmer-aufnr
            AND afpo~charg IN @lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_iosogmer[].
        ELSE.
          DATA(lt_iosogmer) = ct_iosogmer[].
          REFRESH: ct_iosogmer.  "输出二次过滤后的结果
          LOOP AT lt_affw INTO ls_affw.
            LOOP AT lt_iosogmer INTO DATA(ls_iosogmer) WHERE weblnr  = ls_affw-weblnr
                                                         AND weblpos  = ls_affw-weblpos.
              APPEND ls_iosogmer TO ct_iosogmer.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_ioprodlist[] IS NOT INITIAL.
        REFRESH: lt_afpo.
        SELECT * FROM afpo INTO TABLE lt_afpo
          FOR ALL ENTRIES IN ct_ioprodlist[]
          WHERE aufnr = ct_ioprodlist-aufnr
            AND charg IN lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_ioprodlist.
        ELSE.
          " 准备过滤条件
          REFRESH: lt_aufnr_rg.
          LOOP AT lt_afpo INTO ls_afpo.
            APPEND VALUE #( sign = 'I' option = 'EQ' low = ls_afpo-aufnr ) TO lt_aufnr_rg.
          ENDLOOP.

          "输出二次过滤后的结果
          SORT lt_aufnr_rg BY low.
          DELETE ADJACENT DUPLICATES FROM lt_aufnr_rg COMPARING low.
          DELETE ct_ioprodlist WHERE aufnr NOT IN lt_aufnr_rg.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_iooper[] IS NOT INITIAL.
        REFRESH: lt_afpo.
        SELECT * FROM afpo INTO TABLE lt_afpo
          FOR ALL ENTRIES IN ct_iooper[]
          WHERE aufnr = ct_iooper-aufnrd
            AND charg IN lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_iooper.
        ELSE.
          " 准备过滤条件
          REFRESH: lt_aufnr_rg.
          LOOP AT lt_afpo INTO ls_afpo.
            APPEND VALUE #( sign = 'I' option = 'EQ' low = ls_afpo-aufnr ) TO lt_aufnr_rg.
          ENDLOOP.

          "输出二次过滤后的结果
          SORT lt_aufnr_rg BY low.
          DELETE ADJACENT DUPLICATES FROM lt_aufnr_rg COMPARING low.
          DELETE ct_iooper WHERE aufnrd NOT IN lt_aufnr_rg.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_ioopconf[] IS NOT INITIAL.
        REFRESH: lt_afpo.
        SELECT * FROM afpo INTO TABLE lt_afpo
          FOR ALL ENTRIES IN ct_ioopconf[]
          WHERE aufnr = ct_ioopconf-aufnr
            AND charg IN lt_charg_rg.
        IF sy-subrc <> 0.
          REFRESH: ct_ioopconf.
        ELSE.
          " 准备过滤条件
          REFRESH: lt_aufnr_rg.
          LOOP AT lt_afpo INTO ls_afpo.
            APPEND VALUE #( sign = 'I' option = 'EQ' low = ls_afpo-aufnr ) TO lt_aufnr_rg.
          ENDLOOP.

          "输出二次过滤后的结果
          SORT lt_aufnr_rg BY low.
          DELETE ADJACENT DUPLICATES FROM lt_aufnr_rg COMPARING low.
          DELETE ct_ioopconf WHERE aufnr NOT IN lt_aufnr_rg.
        ENDIF.
      ENDIF.

      "使用增强的批次对系统的查询结果进行二次过滤
      IF ct_ioopcap[] IS NOT INITIAL.  "能力
        SELECT DISTINCT afko~bedid
          INTO TABLE @DATA(lt_afko)
          FROM afko
          INNER JOIN afpo ON afko~aufnr = afpo~aufnr
          FOR ALL ENTRIES IN @ct_ioopcap
          WHERE afko~bedid = @ct_ioopcap-bedid.
        IF sy-subrc <> 0.
          REFRESH: ct_ioopcap[].
        ELSE.
          " 输出二次过滤后的结果
          DATA(lt_ioopcap) = ct_ioopcap[].
          REFRESH: ct_ioopcap[].
          LOOP AT lt_afko INTO DATA(ls_afko).
            LOOP AT lt_ioopcap INTO DATA(ls_ioopcap) WHERE bedid = ls_afko-bedid.
              APPEND ls_ioopcap TO ct_ioopcap[].
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ENDIF.
    ENDIF.

*  释放内存数据
    FREE MEMORY ID 'ZCOOISPI'.
  ENDMETHOD.

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值