SAP PP工单在制品数量报表分享

一、报表逻辑

SAP PP工单在制品数量报表分享

SAP PP工单在制品数量报表分享

SAP PP工单在制品数量报表分享

SAP PP工单在制品数量报表分享

SAP PP工单在制品数量报表分享

SAP PP工单在制品数量报表分享

二、报表界面

SAP PP工单在制品数量报表分享

三、报表代码

*&———————————————————————*
*& Report ZRPPP_0015
*&———————————————————————*
*& 09.07.2021 08:55:45 By Guoxj  工单在制品数量报表
*&———————————————————————*
REPORT zrppp_0015.
TYPE-POOLS:slis.

TABLES: afko,afpo,ztmm_mara,ztmm_marc,cskt,crhd,resb,caufv,
        sscrfields ,icon,stxh.
DATA: BEGIN OF gt_msg OCCURS 0,
        msgid  LIKE sy-msgid,
        msgty  LIKE sy-msgty,
        msgno  LIKE sy-msgno,
        msgv1  LIKE sy-msgv1,
        msgv2  LIKE sy-msgv2,
        msgv3  LIKE sy-msgv3,
        msgv4  LIKE sy-msgv4,
        lineno LIKE mesg-zeile,
      END OF gt_msg.

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_layout TYPE REF TO cl_salv_layout.
DATA: gs_program TYPE salv_s_layout_key.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_display TYPE REF TO cl_salv_display_settings.

TYPES: BEGIN OF ty_salv  ,
         aufnr       TYPE  afpo-aufnr,
         matnr       TYPE  afpo-matnr,
         maktx       TYPE  makt-maktx,
         matnr_ltext TYPE  char255,
         zzxmbm      TYPE  ztmm_marc-zzxmbm,
         psmng       TYPE  afpo-psmng,
         wemng       TYPE  afpo-wemng,
         zwemng      TYPE  afpo-wemng,
         zsbsl       TYPE  p DECIMALS 3, “实报数量
         zzt         TYPE  char4,
         matnr1      TYPE  resb-matnr,
         maktx1      TYPE  makt-maktx,
         maktx_ltxt  TYPE  char255,
         meins       TYPE  resb-meins,
         bdmng       TYPE  resb-bdmng,
         enmng       TYPE  resb-enmng,
         zenmng      TYPE  resb-enmng,
         zenmng1     TYPE  resb-enmng,
         zenmng2     TYPE  resb-enmng,
         labst       TYPE  mard-labst,
         zenmng3(16) TYPE  p DECIMALS 9 , ” resb-enmng,
         zausch      TYPE  char10,
         zenmng4(16) TYPE  p DECIMALS 9 , “resb-enmng,
         dwerk       TYPE  afpo-dwerk,
         ftrmi       TYPE  afko-ftrmi,
         tecodat     TYPE datum,
         idat2       TYPE caufv-idat2,
         ltext       TYPE  cskt-ltext,
         arbpl       TYPE  crhd-arbpl,
         kostl       TYPE  ztpp001_info-kostl, ” 成本中心
         zbmmc       TYPE  ztpp001_info-zbmmc, ” 成本中心描述
         zzbfl       TYPE char10,
         zzdl        TYPE char10,
         dauat       TYPE afpo-dauat,
         ablad       TYPE afpo-ablad,
         zltext      TYPE caufv-zltext,
         gstrp       TYPE afko-gstrp,

         zddxqs      TYPE caufv-zddxqs,
         zkunnr      TYPE caufv-zkunnr,
         zkondm      TYPE caufv-zkondm,
         zygll       TYPE caufv-zygll,
         zbz         TYPE caufv-zbz,
         sttxt       TYPE j_stext,
         rsnum       TYPE resb-rsnum,
         rspos       TYPE resb-rspos,
         btn         TYPE char10,
       END OF ty_salv .

TYPES: BEGIN OF ty_bom  ,
         stlnr TYPE resb-stlnr,
         stlty TYPE resb-stlty,
         stlkn TYPE resb-stlkn,
         stpoz TYPE resb-stpoz,
       END OF ty_bom .

DATA:BEGIN OF gt_tab OCCURS 0 .
       INCLUDE TYPE ty_salv .
       INCLUDE TYPE ty_bom .
DATA:
       objnr      TYPE aufk-objnr,
       objid      TYPE aufk-objid,
       posnr      TYPE resb-posnr,
       item_objnr TYPE resb-objnr,
       ausch      TYPE resb-ausch,
       routing_no TYPE co_aufpl,
*       kostl      TYPE kostl,
       esmng      TYPE resb-esmng, “工单组件单位用量
       flg        TYPE c,
       shkzg      TYPE resb-shkzg,
       bwart      TYPE resb-bwart,
       aufpl      TYPE co_aufpl,
     END OF gt_tab .

DATA:gt_tab_show TYPE TABLE OF ty_salv .

DATA:BEGIN OF gt_anr OCCURS 0 .
DATA: aufnr      LIKE gt_tab-aufnr,
      zzt        LIKE gt_tab-zzt,
      flg        LIKE gt_tab-flg,
      arbpl      LIKE gt_tab-arbpl,
      routing_no LIKE gt_tab-routing_no,
      kostl      LIKE gt_tab-kostl,
      END OF gt_anr .

DATA:BEGIN OF gw_info.
DATA: ztype     TYPE bapi_mtype,
      zmsg      TYPE bapi_msg,
*      m_best_eko TYPE char1, “采购组织
*      m_best_bsa TYPE char1, “凭证类型
*      m_best_wrk TYPE char1, “工厂
*      m_best_ekg TYPE char1, “采购组
      zaopp_prs TYPE char1, “价格权限

      END OF gw_info .

DATA: flg_err   TYPE c,
      flg_query TYPE c, “仅查询,不读取物料长文本,工单状态等数据
      gv_check  TYPE i.

DATA: “dauat TYPE zspp_000-dauat,
  arbpl TYPE zspp_000-arbpl,
  ltext TYPE zspp_000-ltext.

DATA: r_lgort_x TYPE RANGE OF mard-lgort.

CLASS l_cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table
      IMPORTING e_salv_function.
    METHODS: on_link_click FOR EVENT link_click OF cl_salv_events_table
      IMPORTING row column.
ENDCLASS.

CLASS l_cl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
    PERFORM handle_user_command USING e_salv_function.
  ENDMETHOD.
  METHOD on_link_click.
    PERFORM handle_link_click USING row column.
  ENDMETHOD.

ENDCLASS.

SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: s_dwerk   FOR  afpo-dwerk NO-EXTENSION NO INTERVALS OBLIGATORY MEMORY ID wrk,
  s_aufnr   FOR  afpo-aufnr,
  s_matnr   FOR  afpo-matnr,
  s_zzxmbm  FOR  ztmm_marc-zzxmbm NO INTERVALS,
  s_matnr1  FOR  resb-matnr,”cskt-ltext,
  s_arbpl   FOR  arbpl,
  s_ltext   FOR  ltext NO-EXTENSION NO INTERVALS ,
  s_ftrmi   FOR  afko-ftrmi,
  s_idat2   FOR  caufv-idat2 .
  PARAMETERS p_zero AS CHECKBOX .

*  PARAMETERS: zzt TYPE char10 DEFAULT '' AS  LISTBOX VISIBLE LENGTH 15 USER-COMMAND chgzt  .
*  PARAMETERS: zflag AS CHECKBOX DEFAULT '' USER-COMMAND chk.

  SELECTION-SCREEN SKIP 1 .

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.”定位
    SELECTION-SCREEN COMMENT 1(8)  txt .
    SELECTION-SCREEN POSITION 10.
    PARAMETERS all AS CHECKBOX USER-COMMAND cmd.
    SELECTION-SCREEN COMMENT 11(5)  chk FOR FIELD all.

  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN ULINE .
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.”定位
    SELECTION-SCREEN COMMENT 5(8)  chk1 FOR FIELD crtd.
    SELECTION-SCREEN COMMENT 20(5) chk2 FOR FIELD rel.
    SELECTION-SCREEN COMMENT 34(5) chk3 FOR FIELD teco.

    SELECTION-SCREEN POSITION 1.
    PARAMETERS crtd AS CHECKBOX .
    SELECTION-SCREEN POSITION 15.
    PARAMETERS rel AS CHECKBOX  DEFAULT 'X'.
    SELECTION-SCREEN POSITION 29.
    PARAMETERS teco AS CHECKBOX.
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 1.”定位
    SELECTION-SCREEN COMMENT 5(8)  chk4 FOR FIELD flag.
    SELECTION-SCREEN COMMENT 20(5) chk5 FOR FIELD del.
    SELECTION-SCREEN COMMENT 34(5) chk6 FOR FIELD lock.
    SELECTION-SCREEN COMMENT 48(5) chk7 FOR FIELD close.

    SELECTION-SCREEN POSITION 1.
    PARAMETERS flag AS CHECKBOX .
    SELECTION-SCREEN POSITION 15.
    PARAMETERS del AS CHECKBOX.
    SELECTION-SCREEN POSITION 29.
    PARAMETERS lock AS CHECKBOX.
    SELECTION-SCREEN POSITION 43.
    PARAMETERS close AS CHECKBOX.
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK part1.

AT SELECTION-SCREEN OUTPUT.
  ADD 1 TO gv_check .
  CHECK gv_check > 1 .
  crtd = rel = teco = flag = del = lock = close = all .

*  IF zflag = 'X'  .
*    zzt = '' .
*  ENDIF.

*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ltext-low .
*  PERFORM frm_search_ltext .
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ltext-high .
*  PERFORM frm_search_ltext .

INITIALIZATION.
  txt = '工单状态:' .
  chk = '全选'.
  chk1 = '已创建'.
  chk2 = '已下达'.
  chk3 = '技术关闭' .
  chk4 = '标记'.
  chk5 = '删除'.
  chk6 = '锁定' .
  chk7 = '财务结算' .
*  DATA itab_list TYPE vrm_values.
*  itab_list = VALUE #(
*  ( key = 'CRTD' text = '已创建' )
*  ( key = 'REL' text = '已审批' )
*  ( key = 'TECO' text = '技术性完成' )
*  ( key = '标记' text = '标记' )
*  ( key = '删除' text = '删除' )
*  ( key = '锁定' text = '锁定' )
*  ( key = '结算' text = '已财务结算' )
*
*  ).
*
*  CALL FUNCTION 'VRM_SET_VALUES'
*    EXPORTING
*      id     = 'ZZT'
*      values = itab_list.
*  REFRESH itab_list.

  DATA: lv_begdat TYPE datum,
        lv_enddat TYPE datum.
  DATA: BEGIN OF date,
          j(4),
          m(2),
          t(2),
        END OF date.

  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = sy-datum
    IMPORTING
      last_day_of_month = lv_enddat
    EXCEPTIONS
      day_in_no_date    = 1
      OTHERS            = 2.

  date = lv_enddat.
  date-t = '01'.
  lv_begdat = date .

*  r_lgort_x = VALUE #(  sign = 'I' option = 'EQ'  ( low = '9999' )
*                                              ( low = 'BRJ1' )
*                                              ( low = 'BRJ2' )
*                                              ( low = 'CMP1' )
*                                              ( low = 'CMS1' )
*                                              ( low = 'CQ04' )
*                                              ( low = 'LD01' )
*                                              ( low = 'MRJS' )
*                                              ( low = 'RJ01' )
*                                              ( low = 'RJ03' )
*                                              ( low = 'RJP1' )
*                                              ( low = 'RJS1' )
*                                              ( low = 'RJS3' )
*                                              ( low = 'XN02' )
*                                              ( low = 'ZY02' )
*                                              ( low = 'ZY03' )
*                                              ( low = 'ZY04' )
*                                              ( low = 'ZY05' )
*                                              ( low = 'ZY06' )
*                                              ( low = 'ZY07' )
*                                              ( low = 'ZYLD' )
*                                              ( low = 'ZZZZ' )  ) .

START-OF-SELECTION.
  IF crtd = '' AND rel = '' AND teco = '' AND flag = '' AND del = '' AND lock = '' AND close = '' AND all = '' .
    MESSAGE '请选择工单状态.' TYPE 'S' DISPLAY LIKE 'E' .
    RETURN.
  ENDIF.
  PERFORM frm_check_auth .

  CHECK flg_err = '' .

  SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, lgort AS low
  INTO TABLE @r_lgort_x
  FROM mdlg WHERE berid LIKE '%ND' AND werks IN @s_dwerk .

  IF cl_abap_matcher=>matches( pattern = 'ZPP002' text = sy-tcode ) .
    flg_query = 'X' .
  ENDIF.

  PERFORM frm_get_data .

*  IF gt_tab[] IS INITIAL.
*    MESSAGE '未查询到数据' TYPE 'S' DISPLAY LIKE 'W' .
*  ENDIF.

  PERFORM frm_show_alv .

*&———————————————————————*
*& Form frm_show_alv
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_show_alv .
  CLEAR gt_tab_show[] .
  MOVE-CORRESPONDING gt_tab[] TO gt_tab_show[] .
  TRY.
      cl_salv_table=>factory(
      IMPORTING
        r_salv_table = gr_table
      CHANGING
        t_table      = gt_tab_show[]
        ).
    CATCH cx_salv_msg.
  ENDTRY.

  gr_columns = gr_table->get_columns( ).
  gr_columns->set_optimize( 'X' ).

  DEFINE mcr_undisplay.
    TRY.
      gr_column ?= gr_columns->get_column( &1 ).
      gr_column->set_visible( cl_salv_column_table=>false ).
      gr_column->set_technical( 'X' ) .
    CATCH cx_salv_not_found .
    ENDTRY.
  END-OF-DEFINITION.

  DATA: s TYPE scrtext_s,
        m TYPE scrtext_m,
        l TYPE scrtext_l.
  DEFINE mcr_setcoltext.
    TRY.
      gr_column ?= gr_columns->get_column( &1 ).
      s = &2 .m = &2. l = &2 .
      gr_column->set_short_text( s ).
      gr_column->set_medium_text( m ).
      gr_column->set_long_text( l ).
    CATCH cx_salv_not_found .
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE mcr_zzero.
    TRY.
      gr_column ?= gr_columns->get_column( &1 ).
      gr_column->set_edit_mask( '==ZZERO' ).
    CATCH cx_salv_not_found .
    ENDTRY.
  END-OF-DEFINITION.

  IF s_dwerk-low+0(3) <> '813'.
    mcr_undisplay: 'ZDDXQS',
    'ZKONDM',
    'ZYGLL',
    'ZBZ'.
  ENDIF.

  IF rel = ''.
    mcr_undisplay: 'BTN'.
  ENDIF.

  mcr_setcoltext:
  'AUFNR'  '工单号',
  'MATNR'  '物料编码',
  'MAKTX'  '物料描述',
  'MATNR_LTEXT'  '物料长文本',
  'ZZXMBM'  '项目编码',
  'PSMNG'  '已订购量',
  'WEMNG'  '完成数量',
  'ZWEMNG'  '未完成数量',
  'ZZT'  '加工单状态',
  'STTXT'  '加工单状态(全)',
  'MATNR1'  '组件物料编码',
  'MAKTX1'  '组件物料描述',
  'MAKTX_LTXT'  '组件物料长文本',
  'MEINS'  '计量单位',
  'BDMNG'  '需求数量',
  'ENMNG'  '发放量',
  'ZENMNG'  '组件短缺量',
  'ZENMNG1'  '报废数量',
  'ZENMNG2'  '在制品数量',
  'LABST'  '现有数量',
  'ZENMNG3'  '组件单位用量',
  'ZAUSCH'  '单位损耗',
  'ZENMNG4'  'BOM单位用量(不含报废率)',
  'DWERK'  '地点',
  'FTRMI'  '发放日期',
  'TECODAT' 'TECO日期',
  'IDAT2'  '工单关闭日期',
  'LTEXT'  '部门名称',
  'ARBPL'  '工作中心',
  'KOSTL'  '成本中心',
  'ZBMMC'  '成本中心描述',
  'ZZBFL'  '报废率',
  'ZZDL'  '单龄',
  'DAUAT'  '订单类型',
  'ABLAD'  '备注1(卸货点)',
  'ZLTEXT'  '备注文本',
  'ZDDXQS'  '订单需求数',
  'ZKONDM'  '终端客户',
  'ZYGLL'  '预估良率',
  'ZBZ'  '备注',
  'ZSBSL'  '实报数量',
  'RSNUM'  '预留号',
  'RSPOS'  '预留行号',
  'BTN'  '操作'.

  mcr_zzero: 'PSMNG', 'WEMNG' , 'ZWEMNG' ,'BDMNG','ENMNG','ZENMNG', 'ZENMNG1',
  'ZENMNG2' , 'LABST' , 'ZENMNG3' ,'ZENMNG4' , 'ZSBSL'.

  TRY.
      gr_column ?= gr_columns->get_column( 'BTN' ).
      gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      gr_column ?= gr_columns->get_column( 'AUFNR' ).
      gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      gr_column ?= gr_columns->get_column( 'ZENMNG2' ).
      gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
    CATCH cx_salv_not_found .
  ENDTRY.

  TRY.
      DATA lv_status TYPE sypfkey .
      lv_status = 'STANDARD'  .
      CALL METHOD gr_table->set_screen_status
        EXPORTING
          report        = sy-repid
          pfstatus      = lv_status
          set_functions = gr_table->c_functions_all.
    CATCH cx_sy_arithmetic_error INTO DATA(exc).
  ENDTRY.

  gr_layout = gr_table->get_layout( ).
  gs_program-report = sy-repid.
  gr_layout->set_key( gs_program ).
  gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
  gr_layout->set_default( 'X' ).

  “=====事件注册
  DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
  “=====获取事件对象
  DATA: lr_event TYPE REF TO cl_salv_events_table.
  CREATE OBJECT lr_handle_event.
  lr_event = gr_table->get_event( ).

  SET HANDLER lr_handle_event->on_user_command FOR lr_event.
  SET HANDLER lr_handle_event->on_link_click FOR lr_event.

  gr_table->display( ).
ENDFORM.
*&———————————————————————*
*& Form frm_get_data
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_get_data .
  RANGES:r_matnr FOR mara-matnr,
  r_matnr_tmp FOR mara-matnr,
  r_aufnr FOR afpo-aufnr,
  r_aufnr_tmp FOR afpo-aufnr,
  r_lgort FOR mdlg-lgort.

  TYPES: BEGIN OF ty_aufnr ,
           aufnr TYPE aufnr,
         END OF ty_aufnr .
  DATA: lt_aufnr     TYPE TABLE OF ty_aufnr,
        lt_aufnr_tmp TYPE TABLE OF ty_aufnr.

  DATA:lv_tmp       TYPE char20,
       lv_char      TYPE qsollwertc,
       lv_menge(16) TYPE  p DECIMALS 10,
       lv_dec(5)    TYPE p DECIMALS 2.

  TYPES:BEGIN OF ty_tab ,
          aufnr  TYPE  afpo-aufnr,
          matnr1 TYPE  resb-matnr.
          INCLUDE TYPE ty_bom .
  TYPES: END OF ty_tab .
  DATA:lt_tab TYPE TABLE OF ty_tab .

  DATA wheresql TYPE TABLE OF edpline .
  DATA gh_ztpp001_info TYPE ztpp001_info.
  DATA gd_ztpp001_info TYPE TABLE OF ztpp001_info.
*  DATA:tline  TYPE STANDARD TABLE OF tline WITH HEADER LINE,
*       tdname TYPE thead-tdname.
*  BREAK guoxiongjie .
*
  “筛选项目编码
  IF s_zzxmbm[] IS NOT INITIAL.
    LOOP AT s_zzxmbm.
      CONCATENATE '%' s_zzxmbm-low '%' INTO lv_tmp .
      SELECT matnr, werks ,zzxmbm APPENDING TABLE @DATA(lt_xmbm) FROM ztmm_marc
            WHERE zzxmbm LIKE @lv_tmp AND werks IN @s_dwerk  .
    ENDLOOP.

    DATA:lw_xmbm LIKE LINE OF lt_xmbm.

    LOOP AT lt_xmbm INTO lw_xmbm .
      r_matnr-sign = 'I'.
      r_matnr-option = 'EQ'.
      r_matnr-low = lw_xmbm-matnr .
      APPEND r_matnr .
    ENDLOOP.
    IF r_matnr[] IS INITIAL .
      RETURN .
    ENDIF .
  ENDIF.

  APPEND 'afpo~dwerk IN @s_dwerk AND '  TO wheresql .
  APPEND 'afpo~aufnr IN @s_aufnr AND '  TO wheresql .
  APPEND 'resb~matnr IN @s_matnr1 AND '  TO wheresql .
  IF p_zero IS INITIAL.
    APPEND '( resb~bdmng > 0 or resb~enmng > 0 ) AND ' TO wheresql .”增加提货数大于0筛选-211211-lys
  ENDIF.
  APPEND 'afko~ftrmi IN @s_ftrmi AND '  TO wheresql .
  APPEND 'caufv~idat2 IN @s_idat2 AND '  TO wheresql .

  APPEND LINES OF s_matnr[] TO r_matnr_tmp[].
  APPEND LINES OF r_matnr[] TO r_matnr_tmp[].
  DELETE r_matnr_tmp WHERE low NOT IN r_matnr .
  DELETE r_matnr_tmp WHERE low NOT IN s_matnr .
  SORT r_matnr_tmp .
  DELETE ADJACENT DUPLICATES FROM r_matnr_tmp[].
  APPEND 'afpo~matnr IN @r_matnr_tmp AND '  TO wheresql .

  “筛选部门
  IF s_ltext[] IS NOT INITIAL.
    IF sy-uname   CS 'MES' AND s_dwerk-low = '8030'. ” 8030 特殊处理, MES调用时传入的是车间文本,需分开处理
      DATA(lv_gzzx) = |%{ s_ltext-low }%|.
*      SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
*      INTO TABLE @r_aufnr
      SELECT a~aufnr
      FROM ztpp001_info  AS a  INNER JOIN  aufk AS b ON a~aufnr = b~aufnr
      INNER JOIN afko AS c ON a~aufnr = c~aufnr
      WHERE a~ktext LIKE @lv_gzzx AND a~aufnr IN @s_aufnr AND b~werks IN @s_dwerk
      AND  c~ftrmi IN @s_ftrmi
      AND  c~plnbez IN @r_matnr_tmp
      INTO TABLE @lt_aufnr_tmp.
      IF sy-subrc NE 0.
        RETURN .
      ENDIF.
    ELSE.
      DATA(lv_bmmc) = |%{ s_ltext-low }%|.
*        SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
*        INTO TABLE @r_aufnr
      SELECT a~aufnr
      FROM ztpp001_info  AS a  INNER JOIN  aufk AS b ON a~aufnr = b~aufnr
      INNER JOIN afko AS c ON a~aufnr = c~aufnr
      WHERE a~zbmmc LIKE @lv_bmmc AND a~aufnr IN @s_aufnr AND b~werks IN @s_dwerk
        AND  c~ftrmi IN @s_ftrmi
        AND  c~plnbez IN @r_matnr_tmp
      INTO TABLE @lt_aufnr_tmp.
      IF sy-subrc NE 0.
        RETURN .
      ENDIF.
    ENDIF.
  ENDIF.
  “筛选工作中心
  IF s_arbpl[] IS NOT INITIAL.
*    SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
*    INTO TABLE @r_aufnr
    SELECT a~aufnr
    FROM ztpp001_info AS a  INNER JOIN  aufk AS b ON a~aufnr = b~aufnr
    INNER JOIN afko AS c ON a~aufnr = c~aufnr
    WHERE a~zgzzx IN @s_arbpl AND a~aufnr IN @s_aufnr AND b~werks IN @s_dwerk
    AND  c~ftrmi IN @s_ftrmi
    INTO TABLE @lt_aufnr_tmp.
  ENDIF.

  SELECT
  CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
  FROM @lt_aufnr_tmp AS a
  INTO TABLE @r_aufnr_tmp .

*  APPEND LINES OF s_aufnr[] TO r_aufnr_tmp[].
*  APPEND LINES OF r_aufnr[] TO r_aufnr_tmp[].
*  DELETE r_aufnr_tmp WHERE low NOT IN s_aufnr .
*  DELETE r_aufnr_tmp WHERE low NOT IN r_aufnr .

  “筛选工单状态
*I0001  ZH  CRTD  已创建
*I0002  ZH  RELL  已审批
*I0045  ZH  TECO  技术性完成
*I0076  ZH  FLAG  标记
*I0013  ZH  DELL  删除
*I0043  ZH  LOKD  已锁定
*I0046  ZH  CLSD  已结算
  “需要的状态取出来
  DATA r_stat TYPE RANGE OF jest-stat .
  r_stat = VALUE #( sign = 'I'  option = 'EQ' ( low = 'I0001' high = crtd )
  ( low = 'I0002' high = rel )
  ( low = 'I0045' high = teco )
  ( low = 'I0076' high = flag )
  ( low = 'I0013' high = del )
  ( low = 'I0043' high = lock )
  ( low = 'I0046' high = close )
  ).
  DELETE r_stat WHERE high = '' .
  CLEAR:r_aufnr[] .
  SELECT “DISTINCT aufk~aufnr “, vsaufk~stat
*  CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, aufk~aufnr AS low
*  INTO TABLE @r_aufnr
  aufk~aufnr
  FROM vsaufk INNER JOIN aufk ON vsaufk~objnr = aufk~objnr
  WHERE  inact EQ ' ' AND aufk~werks IN @s_dwerk AND stat IN @r_stat AND aufk~aufnr IN @r_aufnr_tmp
  AND aufk~werks IN @s_dwerk AND aufk~idat2 IN @s_idat2
  INTO TABLE @lt_aufnr .

*  IF r_aufnr[] IS INITIAL.
  IF lt_aufnr[] IS INITIAL.
    EXIT .
  ENDIF.

*  SORT r_aufnr .
*  DELETE ADJACENT DUPLICATES FROM r_aufnr[] .
*  APPEND LINES OF r_aufnr[] TO r_aufnr_tmp[].

*  DELETE r_aufnr_tmp WHERE low NOT IN r_aufnr .
*  SORT r_aufnr_tmp .
*  DELETE ADJACENT DUPLICATES FROM r_aufnr_tmp[].
*  APPEND 'afpo~aufnr IN r_aufnr_tmp  '  TO wheresql .
*  APPEND 'afpo~aufnr = r_aufnr_tmp-low  '  TO wheresql .

  IF teco = 'X' OR flag = 'X' OR del = 'X' OR close = 'X' . “此4种状态的工单所有组件自动打上了删除标记
  ELSE.
    APPEND ' resb~xloek = '' '' '  TO wheresql .
  ENDIF.
  “排除虚拟件
  APPEND '  resb~DUMPS = '' '' '  TO wheresql .

  SELECT
  afpo~aufnr,
  afpo~matnr,
  afpo~psmng,
  afpo~wemng,
  resb~matnr AS matnr1,
  resb~meins AS meins,
  resb~bdmng,
  resb~enmng,
  resb~ausch,
  afpo~dwerk,
  afko~ftrmi,
  resb~esmng,
  resb~posnr,
  caufv~idat2,
  caufv~objnr,
  caufv~objid,
  resb~stlnr,
  resb~stlty,
  resb~stlkn,
  resb~stpoz,
  resb~objnr AS item_objnr,
  afpo~dauat,
  resb~bwart,
  resb~shkzg,
  afpo~ablad,
  caufv~zltext,
  afko~gstrp,
  caufv~zddxqs,
  caufv~zkunnr,
  caufv~zkondm,
  caufv~zygll,
  caufv~zbz,
  afko~aufpl,
  resb~rsnum,
  resb~rspos
  FROM afpo INNER JOIN afko ON afpo~aufnr = afko~aufnr
  INNER JOIN caufv ON afpo~aufnr = caufv~aufnr
  INNER JOIN resb ON resb~rsnum = afko~rsnum
*  FOR ALL ENTRIES IN r_aufnr_tmp
  INNER JOIN @lt_aufnr AS a ON afko~aufnr = a~aufnr
  WHERE (wheresql)
  INTO CORRESPONDING FIELDS OF TABLE @gt_tab.

  IF r_matnr_tmp[] IS NOT INITIAL.
    DELETE gt_tab WHERE matnr NOT IN r_matnr_tmp .
  ELSE.
    r_matnr[] = VALUE #( FOR wa_mat IN gt_tab ( sign = 'I' option = 'EQ' low = wa_mat-matnr1 ) ).
  ENDIF.

**  “结算日期.
**  SELECT aufnr,idat2 INTO TABLE @DATA(lt_caufv) FROM caufv FOR ALL ENTRIES IN @gt_tab
**        WHERE aufnr = @gt_tab-aufnr .
**  DATA:lw_caufv LIKE LINE OF lt_caufv .
*
  SELECT * FROM ztpp001_info FOR ALL ENTRIES IN @gt_tab WHERE aufnr = @gt_tab-aufnr
  INTO TABLE @DATA(lt_info) .

  MOVE-CORRESPONDING gt_tab[] TO lt_tab[] .
  SELECT c~aufnr,c~matnr1,b~menge,a~bmeng
  FROM @lt_tab AS c
  LEFT JOIN stko AS a ON a~stlnr = c~stlnr AND a~stlty = c~stlty
  LEFT JOIN stpo AS b ON c~stlnr  = b~stlnr AND c~stlty = b~stlty AND c~matnr1 = b~idnrk
  WHERE a~datuv LE @sy-datum AND a~valid_to GE @sy-datum
  AND b~datuv LE @sy-datum AND b~valid_to GE @sy-datum
  INTO TABLE @DATA(lt_stpo) .

  IF gt_tab[] IS NOT INITIAL .
    SELECT * INTO CORRESPONDING FIELDS OF TABLE gd_ztpp001_info FROM  ztpp001_info  FOR ALL ENTRIES IN gt_tab
    WHERE aufnr = gt_tab-aufnr.
    SORT gd_ztpp001_info   BY aufnr.
  ENDIF.

  LOOP AT gt_tab ASSIGNING FIELD-SYMBOL(<sy_tab>).

*    READ TABLE lt_caufv INTO lw_caufv WITH KEY aufnr = <sy_tab>-aufnr .
*    IF sy-subrc EQ 0.
*      <sy_tab>-idat2 = lw_caufv-idat2 .
*    ENDIF.
*    PERFORM frm_get_aufnr TABLES lt_cskt USING <sy_tab> .
*         'LTEXT'  '部门名称',
*                  'ARBPL'  '工作中心',
    READ TABLE lt_info INTO DATA(lw_info) WITH KEY aufnr = <sy_tab>-aufnr .
    IF sy-subrc EQ 0 .
      <sy_tab>-arbpl = lw_info-zgzzx .

      IF lw_info-zbmmc IS INITIAL.
        SELECT SINGLE ktext FROM cskt WHERE kostl = @lw_info-kostl AND spras = 1
        INTO @<sy_tab>-ltext .
        UPDATE ztpp001_info SET zbmmc = <sy_tab>-ltext WHERE aufnr = <sy_tab>-aufnr AND kostl = lw_info-kostl .
      ELSE.
        <sy_tab>-ltext = lw_info-zbmmc .
      ENDIF.
    ENDIF.

    PERFORM frm_get_aufnr_a USING <sy_tab> .

*    INSERT VALUE #( sign = 'I' option = 'EQ' low = <sy_tab>-aufnr ) INTO TABLE r_aufnr.
*    DATA(lv_aufnr) = |{ <sy_tab>-aufnr ALPHA = OUT }|.
*    INSERT VALUE #( sign = 'I' option = 'EQ' low = lv_aufnr ) INTO TABLE r_aufnr.

*    INSERT VALUE #( sign = 'I' option = 'EQ' low = <sy_tab>-matnr1  ) INTO TABLE r_matnr.
  ENDLOOP.

  DELETE gt_tab WHERE flg = 'X' .

*    TECO日期
  SELECT objnr, udate FROM jcds FOR ALL ENTRIES IN @gt_tab
  WHERE objnr = @gt_tab-objnr AND stat = 'I0045' AND inact = '' AND usnam <> 'IT_ERP'
  INTO TABLE @DATA(lt_jcds) .

  “物料描述
  SELECT matnr, maktx INTO TABLE @DATA(lt_makt) FROM makt FOR ALL ENTRIES IN @gt_tab
        WHERE ( matnr = @gt_tab-matnr OR matnr = @gt_tab-matnr1 )
        AND spras = @sy-langu .
  DATA:lw_makt LIKE LINE OF lt_makt.

  “物料项目编码
  SELECT matnr, werks,zzxmbm INTO TABLE @lt_xmbm FROM ztmm_marc FOR ALL ENTRIES IN @gt_tab
  WHERE matnr = @gt_tab-matnr  AND werks = @gt_tab-dwerk .

  “成本中心名称
*  SELECT kostl,ltext INTO TABLE @lt_cskt FROM cskt FOR ALL ENTRIES IN @gt_tab
*  WHERE kostl = @gt_tab-kostl AND spras = @sy-langu .
*  DATA:lw_cskt LIKE LINE OF lt_cskt.

*  TYPES:BEGIN OF ty_aufnr,
*          aufnr TYPE aufnr,
*        END OF ty_aufnr .
*  DATA: t_aufnr TYPE TABLE OF ty_aufnr .
*  t_aufnr = VALUE #( FOR wa IN r_aufnr_tmp ( aufnr = wa-low ) ).

  “报废数量
  SELECT ztpp005~aufnr, matnr, SUM( enmng1 ) AS bfsl
  FROM @lt_aufnr AS a INNER JOIN ztpp005 ON ztpp005~aufnr = a~aufnr
  GROUP BY ztpp005~aufnr, matnr
  INTO TABLE @DATA(lt_005) .
  DATA:lw_005 LIKE LINE OF lt_005 .

  SELECT ztpp009~aufnr, matnr1, SUM( znum1 ) AS bfsl
  FROM @lt_aufnr AS a INNER JOIN ztpp009 ON ztpp009~aufnr = a~aufnr
  GROUP BY ztpp009~aufnr, matnr1
  INTO TABLE @DATA(lt_009).
  DATA:lw_009 LIKE LINE OF lt_009 .

  “库存数量
*  SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, lgort AS low
*    INTO TABLE @r_lgort
*    FROM mdlg WHERE berid LIKE '%ND' AND werks IN @s_dwerk .

  SELECT matnr, SUM( labst ) AS labst INTO TABLE @DATA(lt_mard)
        FROM mard
        WHERE matnr IN @r_matnr AND werks IN @s_dwerk AND lgort NOT IN @r_lgort_x
        AND labst > 0
        GROUP BY matnr .
  DATA:lw_mard LIKE LINE OF lt_mard .

  SELECT * INTO TABLE @DATA(lt_012)
        FROM ztpp012 .
  DATA:lw_012 LIKE LINE OF lt_012 .

  SELECT aufpl, aplzl, arbid
  FROM afvc FOR ALL ENTRIES IN @gt_tab
  WHERE aufpl = @gt_tab-aufpl
  INTO TABLE @DATA(lt_afvc) .

  DATA where_sql TYPE TABLE OF edpline .
  IF s_dwerk-low = '8030'.
    APPEND ' left( c~arbpl,2 ) <> ''WB'' ' TO where_sql .  “8030排除外包工序
  ENDIF.
  SELECT arbpl, a~aufpl,a~aplzl, a~vgw01, a~vge01,a~ism01 ,a~vgw02, a~vge02,a~ism02 ,a~vgw03, a~vge03,a~ism03 ,a~ile01 ,a~bmsch ,a~mgvrg ,a~lmnga
  FROM afvv AS a INNER JOIN @lt_afvc AS b ON a~aufpl = b~aufpl AND a~aplzl = b~aplzl
  INNER JOIN crhd AS c ON b~arbid = c~objid
  WHERE (where_sql)
  INTO TABLE @DATA(lt_afvv) .

  SORT lt_afvv BY aufpl aplzl ASCENDING .

  SORT gt_tab ASCENDING BY aufnr posnr .
  LOOP AT gt_tab ASSIGNING <sy_tab>.
    READ TABLE gd_ztpp001_info INTO gh_ztpp001_info WITH  KEY  aufnr = <sy_tab>-aufnr  BINARY SEARCH.
    IF sy-subrc EQ 0 .
      <sy_tab>-kostl  =   gh_ztpp001_info-kostl. ” 成本中心
      <sy_tab>-zbmmc  =  gh_ztpp001_info-zbmmc. ” 成本中心描述
    ENDIF.
    “实报数量取工序最小的数量
    SELECT MIN( a~lmnga ) FROM @lt_afvv AS a WHERE aufpl = @<sy_tab>-aufpl
    INTO @<sy_tab>-zsbsl .

*    READ TABLE lt_jcds INTO DATA(lw_jcds) WITH KEY objnr = <sy_tab>-objnr .
*    IF sy-subrc EQ 0 .
*      <sy_tab>-tecodat = lw_jcds-udate .
*    ENDIF.
    SELECT SINGLE MAX( a~udate ) FROM @lt_jcds AS a WHERE objnr = @<sy_tab>-objnr INTO @DATA(lv_udate).
    IF sy-subrc EQ 0 .
      <sy_tab>-tecodat = lv_udate .
    ENDIF.

    READ TABLE lt_makt INTO lw_makt WITH KEY matnr = <sy_tab>-matnr .
    IF sy-subrc EQ 0.
      <sy_tab>-maktx = lw_makt-maktx .
    ENDIF.
    “物料长文本
    PERFORM frm_get_mat_ltext USING <sy_tab>-matnr CHANGING <sy_tab>-matnr_ltext .

    READ TABLE lt_makt INTO lw_makt WITH KEY matnr = <sy_tab>-matnr1 .
    IF sy-subrc EQ 0.
      <sy_tab>-maktx1 = lw_makt-maktx .
    ENDIF.
    “物料组件物料长文本
    PERFORM frm_get_mat_ltext USING <sy_tab>-matnr1 CHANGING <sy_tab>-maktx_ltxt .

    READ TABLE lt_xmbm INTO lw_xmbm WITH KEY matnr = <sy_tab>-matnr werks = <sy_tab>-dwerk  .
    IF sy-subrc EQ 0.
      <sy_tab>-zzxmbm = lw_xmbm-zzxmbm .
    ENDIF.

*    READ TABLE lt_cskt INTO lw_cskt WITH KEY kostl = <sy_tab>-kostl .
*    IF sy-subrc EQ 0.
*      <sy_tab>-ltext = lw_cskt-ltext .
*    ENDIF.

    <sy_tab>-zwemng = <sy_tab>-psmng – <sy_tab>-wemng.
    <sy_tab>-zenmng = <sy_tab>-bdmng – <sy_tab>-enmng.

    “报废数量
    READ TABLE lt_009 INTO lw_009 WITH KEY aufnr = <sy_tab>-aufnr matnr1 = <sy_tab>-matnr1.
    IF sy-subrc EQ 0.
      <sy_tab>-zenmng1 = lw_009-bfsl .
    ENDIF.

    DATA(lv_aufnr) = |{ <sy_tab>-aufnr ALPHA = OUT }|.
    DATA(lv_matnr) = |{ <sy_tab>-matnr1 ALPHA = OUT }|.

    IF <sy_tab>-zenmng1 IS INITIAL .
      READ TABLE lt_005 INTO lw_005 WITH KEY aufnr = lv_aufnr matnr = lv_matnr.
      IF sy-subrc EQ 0.
        <sy_tab>-zenmng1 = lw_005-bfsl .
      ELSE.
        READ TABLE lt_005 INTO lw_005 WITH KEY aufnr = <sy_tab>-aufnr matnr = <sy_tab>-matnr1.
        IF sy-subrc EQ 0.
          <sy_tab>-zenmng1 = lw_005-bfsl .
        ENDIF.
      ENDIF.
    ENDIF.

    “库存数量
    READ TABLE lt_mard INTO lw_mard WITH KEY matnr = <sy_tab>-matnr1 .
    IF sy-subrc EQ 0 .
      <sy_tab>-labst = lw_mard-labst .
    ENDIF.

    “组件单位用量
    “开工单的时候如果不手动对工单组件需求数量进行修改,工单生成的预留的ESMNG与原组件BOM单耗一致,与使用可能性和优先级无关。
    “如果对工单组件的需求数量进行修改后,预留的ESMNG变成(1-使用可能性)*原BOM单耗。
    CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
      EXPORTING
        i_number_of_digits = 9
        i_fltp_value       = <sy_tab>-esmng
      IMPORTING
        e_char_field       = lv_char.
    <sy_tab>-zenmng3 = lv_char .

    “单位损耗
    IF <sy_tab>-ausch IS NOT INITIAL.
      <sy_tab>-zausch = <sy_tab>-ausch .” / 100 .
      CONCATENATE <sy_tab>-zausch '%' INTO <sy_tab>-zausch .
      CONDENSE <sy_tab>-zausch NO-GAPS .
    ENDIF.

*    CALL FUNCTION 'ROUND'
*      EXPORTING
*        decimals      = 6
*        input         = lv_menge
*        sign          = '-'
*      IMPORTING
*        output        = <sy_tab>-zenmng4
*      EXCEPTIONS
*        input_invalid = 1
*        overflow      = 2
*        type_invalid  = 3
*        OTHERS        = 4.

    “报废率
    IF <sy_tab>-zenmng1 > 0 AND <sy_tab>-enmng > 0 .
      <sy_tab>-zzbfl = <sy_tab>-zenmng1 / <sy_tab>-enmng  .
      lv_dec = <sy_tab>-zzbfl * 100 .
      <sy_tab>-zzbfl = lv_dec .
      CONCATENATE <sy_tab>-zzbfl '%' INTO <sy_tab>-zzbfl .
    ELSE.
      CLEAR:<sy_tab>-zzbfl .
    ENDIF.

    CLEAR lv_menge.
*    DATA(lv_bfsl) = <sy_tab>-bdmng – <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) .
    “BOM单位用量(不含报废率)
*    lv_menge = ( <sy_tab>-bdmng – lv_bfsl ) /  <sy_tab>-psmng.

*    lv_menge = <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) / <sy_tab>-psmng .
    READ TABLE lt_stpo INTO DATA(lw_stpo) WITH KEY aufnr = <sy_tab>-aufnr matnr1 = <sy_tab>-matnr1 .
    IF sy-subrc EQ 0.
      lv_menge = lw_stpo-menge / lw_stpo-bmeng .
    ELSE.
      lv_menge = <sy_tab>-zenmng3 / ( 1 + <sy_tab>-ausch / 100 ) . “BOM表有变化取不到值时计算出来
    ENDIF.

    <sy_tab>-zenmng4 = lv_menge .

    “在制品数量
*    1  组件单位用量
*    2  BOM单位用量(不含报废率)
*    READ TABLE lt_012 INTO lw_012 WITH KEY werks = s_dwerk-low .
*    IF sy-subrc EQ 0.
*      IF lw_012-dwyl = '1'.
*        DATA(lv_dwyl) = <sy_tab>-zenmng3. “组件单位用量
*      ELSEIF lw_012-dwyl = '2'.
*        lv_dwyl = <sy_tab>-zenmng4. “BOM单位用量(不含报废率)
*      ENDIF.
*    ELSE.
*      “没维护,默认
*      IF s_dwerk-low = '1001'.
*        lv_dwyl = <sy_tab>-zenmng3. “组件单位用量
*      ELSEIF s_dwerk-low = '1002' .
*        lv_dwyl = <sy_tab>-zenmng4. “BOM单位用量(不含报废率)
*      ENDIF.
*    ENDIF.
*    <sy_tab>-zenmng2 = <sy_tab>-enmng – ( <sy_tab>-wemng * lv_dwyl ) – <sy_tab>-zenmng1 .
*    ENMNG发放量 – ( BDMNG需求数量 / PSMNG已订购量) * WEMNG完成数量 * (1-AUSCH单位损耗/100) – ZENMNG1报废数量
*    <sy_tab>-zenmng2 = <sy_tab>-enmng – ( <sy_tab>-bdmng / <sy_tab>-psmng ) * <sy_tab>-wemng * ( 1 – <sy_tab>-ausch / 100 ) – <sy_tab>-zenmng1 .

*  在制数量的计算逻辑:
*  ABU:在制数 = 已领数 – 需求数 / 订购数 * 已入库数 – 报废数
*  CBU:在制数 = 已领数 – 需求数/(1+损耗%) / 订购数 * 已入库数 – 报废数
*    IF s_dwerk-low = '1001'.
*      <sy_tab>-zenmng2 = <sy_tab>-enmng –  <sy_tab>-bdmng / <sy_tab>-psmng  * <sy_tab>-wemng  – <sy_tab>-zenmng1 .
*    ELSEIF s_dwerk-low = '1002'.
*      <sy_tab>-zenmng2 = <sy_tab>-enmng –  <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) / <sy_tab>-psmng * <sy_tab>-wemng – <sy_tab>-zenmng1 .
*    ENDIF.
    “10.14,统一计算公式
    <sy_tab>-zenmng2 = <sy_tab>-enmng –  <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) / <sy_tab>-psmng * <sy_tab>-wemng – <sy_tab>-zenmng1 .
    IF <sy_tab>-meins = 'EA'.
      IF <sy_tab>-zenmng2 < 0 .
        <sy_tab>-zenmng2 = ceil( <sy_tab>-zenmng2 ) .
      ELSE.
        <sy_tab>-zenmng2 = floor( <sy_tab>-zenmng2 ) .
      ENDIF.
    ENDIF.
    IF <sy_tab>-dauat = 'CJ01' AND <sy_tab>-bwart = '531' AND <sy_tab>-enmng > 0.”20211210_LYS
      <sy_tab>-bdmng = <sy_tab>-bdmng * -1 .
      <sy_tab>-enmng = <sy_tab>-enmng * -1 .
      <sy_tab>-zenmng2 = <sy_tab>-zenmng2 * -1 .
    ENDIF.
    “8131, 无物料号工单时的处理逻辑
    IF <sy_tab>-dwerk = '8131' AND <sy_tab>-matnr IS INITIAL .
      <sy_tab>-bdmng = <sy_tab>-bdmng * -1 . “需求数量
      <sy_tab>-enmng = <sy_tab>-enmng * -1 . “发放量
      <sy_tab>-zenmng2 = <sy_tab>-zenmng2 * -1 . “在制品数量
    ENDIF.

    “单龄
*    IF <sy_tab>-ftrmi IS NOT INITIAL .
*      <sy_tab>-zzdl = <sy_tab>-ftrmi – sy-datum  .
*    ENDIF.
    IF <sy_tab>-ftrmi IS NOT INITIAL .
      IF <sy_tab>-dwerk = '8021' OR <sy_tab>-dwerk = '8022'.
        <sy_tab>-ftrmi = <sy_tab>-gstrp.
        <sy_tab>-zzdl = <sy_tab>-gstrp – sy-datum.
      ELSE.
        <sy_tab>-zzdl = <sy_tab>-ftrmi – sy-datum  .
      ENDIF.
      “TECO状态以TECO日期-当前日期.
      IF <sy_tab>-tecodat IS NOT INITIAL .
        <sy_tab>-zzdl = <sy_tab>-ftrmi – <sy_tab>-tecodat  .
      ENDIF.
    ELSE.
      CLEAR <sy_tab>-zzdl .
    ENDIF.

    IF <sy_tab>-zzt = 'TECO' AND <sy_tab>-idat2 IS NOT INITIAL.
      CLEAR <sy_tab>-idat2 .
    ENDIF.

    AT NEW aufnr.
      IF <sy_tab>-zzt = 'REL'.
        <sy_tab>-btn = '@3X@关闭工单'.
      ENDIF.
    ENDAT.

  ENDLOOP.

ENDFORM.
*&———————————————————————*
*& Form frm_check_auth
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_check_auth .
*  DATA:lt_values TYPE TABLE OF us335 WITH HEADER LINE .
*  CLEAR:gw_info .
*
*  CLEAR:gt_msg,gt_msg[].
*  gt_msg-msgid = '00' .
*  gt_msg-msgty = 'E' .
*  gt_msg-msgno = '001' .
*
*  AUTHORITY-CHECK OBJECT 'ZAUTMM_PRS' ID 'ZACTIVE' FIELD 'X'.
*  IF sy-subrc NE 0. “价格权限
*    gw_info-zaopp_prs = 'X'.
*  ENDIF.

ENDFORM.
*&———————————————————————*
*& Form frm_search_ltext
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
FORM frm_search_ltext .
  CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
    EXPORTING
      tabname           = 'CSKT'
      fieldname         = 'LTEXT'
      searchhelp        = 'ZSH_CSKT_LTEXT'
      dynpprog          = sy-repid
      dynpnr            = sy-dynnr
      dynprofield       = 'S_LTEXT'
    EXCEPTIONS
      field_not_found   = 1
      no_help_for_field = 2
      inconsistent_help = 3
      no_values_found   = 4
      OTHERS            = 5.
ENDFORM.
*&———————————————————————*
*& Form frm_get_aufnr
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> <SY_TAB>
*&      –> FLG_GET
*&———————————————————————*
FORM frm_get_aufnr TABLES pt_cskt USING pv_tab LIKE LINE OF gt_tab.

*  DATA:lw_objects   TYPE bapi_pp_order_objects,
*       lt_header    TYPE TABLE OF bapi_order_header1 WITH HEADER LINE,
*       lt_operation TYPE TABLE OF bapi_order_operation1 WITH HEADER LINE,
*       lw_return    TYPE bapiret2.
*
*  DATA:BEGIN OF lt_cskt OCCURS 0 .
*  DATA:kostl TYPE cskt-kostl,
*       ltext TYPE cskt-ltext,
*       END OF lt_cskt .
*
*  READ TABLE gt_anr WITH KEY aufnr = pv_tab-aufnr .
*  IF sy-subrc EQ 0.
*    MOVE-CORRESPONDING gt_anr TO pv_tab .
*    RETURN.
*  ENDIF.
*
*  lt_cskt[] = pt_cskt[].
*
*
*  CLEAR pv_tab-flg .
*  lw_objects-header = 'X' .
*  lw_objects-operations = 'X' .
*
*  CALL FUNCTION 'BAPI_PRODORD_GET_DETAIL'
*    EXPORTING
*      number        = pv_tab-aufnr
*      order_objects = lw_objects
*    IMPORTING
*      return        = lw_return
*    TABLES
*      header        = lt_header
*      operation     = lt_operation.
*
*  LOOP AT lt_header.
*
*    DATA(routing_no) = lt_header-routing_no .
*    DATA(plant) = lt_header-production_plant .
*
*    IF lt_header-system_status CS '删除' .  lt_header-system_status = '删除' . ENDIF.
*    IF lt_header-system_status CS '标记' .  lt_header-system_status = '标记' . ENDIF.
*    IF lt_header-system_status CS '结算' .  lt_header-system_status = '结算' . ENDIF.
*    IF lt_header-system_status CS '锁定' .  lt_header-system_status = '锁定' . ENDIF.
*
*    REPLACE 'RELR' INTO lt_header-system_status WITH  ''.
*    pv_tab-zzt = lt_header-system_status .
*    IF all = 'X' AND
*      ( lt_header-system_status CS 'CRTD' OR lt_header-system_status CS 'REL' OR lt_header-system_status CS 'TECO'
*      OR lt_header-system_status CS '锁定' OR lt_header-system_status CS '结算'  OR lt_header-system_status CS '删除'
*      OR lt_header-system_status CS '标记' ).
*      pv_tab-flg = ''.
*      EXIT .
*    ELSEIF all = '' AND ( flag = 'X' OR  del = 'X' OR lock = 'X' OR close = 'X' OR crtd = 'X' OR rel = 'X'  OR teco = 'X') .
*      pv_tab-flg = 'X' .
*      IF flag = 'X' AND lt_header-system_status CS '标记'.
*        pv_tab-flg = '' .
*      ENDIF.
*      IF del = 'X' AND lt_header-system_status CS '删除'.
*        pv_tab-flg = '' .
*      ENDIF.
*      IF lock = 'X' AND lt_header-system_status CS '锁定'.
*        pv_tab-flg = '' .
*      ENDIF.
*      IF close = 'X' AND lt_header-system_status CS '结算'.
*        pv_tab-flg = '' .
*      ENDIF.
*      IF crtd = 'X' AND lt_header-system_status CS 'CRTD'.
*        pv_tab-flg = '' .
*      ENDIF.
*      IF rel = 'X' AND lt_header-system_status CS 'REL'.
*        pv_tab-flg = '' .
*      ENDIF.
*      IF teco = 'X' AND lt_header-system_status CS 'TECO'.
*        pv_tab-flg = '' .
*      ENDIF.
*    ELSE.
*      pv_tab-zzt = ''.
*      pv_tab-flg = 'X' .
*      RETURN .
*    ENDIF.
*
*
*  ENDLOOP.
*
*  LOOP AT lt_operation WHERE routing_no = routing_no AND system_status NS '删除' AND work_center <> ''.
*    DATA(work_center) = lt_operation-work_center .
*    EXIT .
*  ENDLOOP.
*
*  IF work_center NOT IN s_arbpl.
*    pv_tab-flg = 'X' .
*    RETURN .
*  ENDIF.
*  pv_tab-arbpl = work_center .
*
*  SELECT SINGLE kostl INTO @DATA(lv_kostl) FROM crhd INNER JOIN crco ON crhd~objid = crco~objid
*        WHERE arbpl = @work_center AND werks = @plant .
*
*  pv_tab-routing_no = routing_no .
*  pv_tab-kostl = lv_kostl .
*
*
*  IF lt_cskt[] IS NOT INITIAL.
*    DATA:lw_cskt LIKE LINE OF lt_cskt .
*    READ TABLE lt_cskt INTO lw_cskt WITH KEY kostl = lv_kostl .
*    IF sy-subrc NE 0.
*      pv_tab-flg = 'X' .
*      RETURN .
*    ENDIF.
*  ENDIF.
*
*  DEFINE marco_anr_txt.
*    IF lt_header-system_status CS &1 .”'CRTD' .
*       pv_tab-zzt = &2 .”'创建' .
*    ENDIF.
*  END-OF-DEFINITION.
*  marco_anr_txt:'CRTD' '已创建',
*                'REL'  '已下达' ,
*                'TECO' '技术关闭' ,
*                '标记' '标记' ,
*                '删除' '删除' ,
*                '锁定' '锁定' ,
*                '结算' '已财务结算' .
*
*  INSERT VALUE #( aufnr       = pv_tab-aufnr
*                  zzt         = pv_tab-zzt
*                  flg         = pv_tab-flg
*                  arbpl       = pv_tab-arbpl
*                  routing_no  = pv_tab-routing_no
*                  kostl       = pv_tab-kostl ) INTO TABLE gt_anr.
*
*

ENDFORM.
*&———————————————————————*
*& Form frm_get_aufnr_a
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> <SY_TAB>
*&———————————————————————*
FORM frm_get_aufnr_a  USING   pv_tab LIKE LINE OF gt_tab.
  DATA:lv_zzt TYPE char4 .

  CHECK flg_query NE 'X' .

  “查询工单状态
  LOOP AT gt_tab INTO DATA(tmp_tab) WHERE aufnr = pv_tab-aufnr AND zzt <> ''.
    DATA(query_flg) = 'X' .
    pv_tab-zzt = tmp_tab-zzt .
    pv_tab-sttxt = tmp_tab-sttxt  .
    EXIT .
  ENDLOOP.

  IF query_flg NE 'X' .
    CALL FUNCTION 'Z_FMPP_013'
      EXPORTING
        objnr  = pv_tab-objnr
*       AUFNR  =
      IMPORTING
        status = pv_tab-zzt
        sttxt  = pv_tab-sttxt.

    CASE pv_tab-zzt .
      WHEN '标记'.
        IF ( crtd = 'X' OR rel = 'X' ) AND flag = '' . pv_tab-flg = 'X'. ENDIF .
      WHEN '删除'.
        IF ( crtd = 'X' OR rel = 'X' ) AND del = '' . pv_tab-flg = 'X'. ENDIF .
      WHEN '结算'.
        IF ( crtd = 'X' OR rel = 'X' ) AND close = '' . pv_tab-flg = 'X'. ENDIF .
      WHEN '锁定'.
        IF ( crtd = 'X' OR rel = 'X' ) AND lock = '' . pv_tab-flg = 'X'. ENDIF .
    ENDCASE.
  ENDIF.
  CLEAR query_flg .

  “查询组件状态
  IF ( crtd = '' AND rel = '' ) OR all = 'X' .
    DATA: item_zt TYPE char4 .
    CALL FUNCTION 'Z_FMPP_013'
      EXPORTING
        objnr  = pv_tab-item_objnr
*       AUFNR  =
      IMPORTING
        status = item_zt.
    CASE item_zt .
      WHEN '删除'.
        pv_tab-flg = 'X'.
    ENDCASE.
  ENDIF.

  CHECK pv_tab-arbpl IS INITIAL OR pv_tab-ltext IS INITIAL  .

  DATA:lw_objects   TYPE bapi_pp_order_objects,
       lt_header    TYPE TABLE OF bapi_order_header1 WITH HEADER LINE,
       lt_operation TYPE TABLE OF bapi_order_operation1 WITH HEADER LINE,
       lw_return    TYPE bapiret2.

  lw_objects-header = 'X' .
  lw_objects-operations = 'X' .

  CALL FUNCTION 'BAPI_PRODORD_GET_DETAIL'
    EXPORTING
      number        = pv_tab-aufnr
      order_objects = lw_objects
    IMPORTING
      return        = lw_return
    TABLES
      header        = lt_header
      operation     = lt_operation.

  CHECK lt_header[] IS NOT INITIAL .
  DATA(routing_no) = lt_header[ 1 ]-routing_no .
  DATA(plant) = lt_header[ 1 ]-production_plant .

  LOOP AT lt_operation WHERE routing_no = routing_no AND system_status NS '删除' AND work_center <> ''.
    DATA(work_center) = lt_operation-work_center . ” ARBPL
    EXIT .
  ENDLOOP.

  SELECT SINGLE ltext, m_cramn~ktext, crhd~arbpl ,crco~kostl INTO @DATA(lw_info)
        FROM crhd INNER JOIN crco ON crhd~objid = crco~objid
        INNER JOIN cskt ON crco~kostl = cskt~kostl AND spras = @sy-langu
        INNER JOIN m_cramn ON crhd~arbpl = m_cramn~arbpl AND crhd~werks = m_cramn~werks
*        WHERE crhd~objid = @pv_tab-objid .”AND werks = @plant .
        WHERE crhd~arbpl = @work_center AND crhd~werks = @plant .

  pv_tab-arbpl = lw_info-arbpl .
  pv_tab-ltext = lw_info-ltext .

  UPDATE ztpp001_info SET zbmmc = lw_info-ltext kostl = lw_info-kostl zgzzx = lw_info-arbpl ktext = lw_info-ktext
  WHERE aufnr = pv_tab-aufnr .
  COMMIT WORK .

ENDFORM.
*&———————————————————————*
*& Form frm_get_mat_ltext
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> <SY_TAB>_MATNR
*&      <– <SY_TAB>_LTEXT
*&———————————————————————*
FORM frm_get_mat_ltext  USING    pv_matnr
CHANGING pv_ltext1.
  DATA:lt_tline LIKE tline OCCURS 0 WITH HEADER LINE.
  DATA:l_tdname LIKE stxh-tdname.

  CHECK flg_query NE 'X' .

  l_tdname = pv_matnr.
  SELECT SINGLE * FROM stxh
  WHERE tdobject = 'MATERIAL' AND tdname = l_tdname AND tdid = 'GRUN'.
  IF sy-subrc EQ 0.
    CALL FUNCTION 'READ_TEXT'
      EXPORTING
        client                  = sy-mandt
        id                      = 'GRUN'
        language                = sy-langu
        name                    = l_tdname
        object                  = 'MATERIAL'
      TABLES
        lines                   = lt_tline
      EXCEPTIONS
        id                      = 1
        language                = 2
        name                    = 3
        not_found               = 4
        object                  = 5
        reference_check         = 6
        wrong_access_to_archive = 7
        OTHERS                  = 8.
    IF sy-subrc EQ 0.
      LOOP AT lt_tline.
        CONCATENATE pv_ltext1 ' ' lt_tline-tdline INTO pv_ltext1.
        CONDENSE pv_ltext1.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFORM.
*&———————————————————————*
*& Form handle_link_click
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> ROW
*&      –> COLUMN
*&———————————————————————*
FORM handle_link_click  USING p_row p_column.

  READ TABLE gt_tab_show INTO DATA(lw_tab) INDEX p_row .
  CHECK sy-subrc EQ 0 .
  IF p_column = 'AUFNR' AND lw_tab-aufnr <> ''.
    SET PARAMETER ID 'ANR'   FIELD lw_tab-aufnr.
    CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
  ELSEIF p_column = 'ZENMNG2'  .”在制数量
    DATA(tmp_text) = '在制品数量  = 发放量 –   需求数量  / ( 1 + 单位损耗/100 )  / 已订购量  * 完成数量  – 报废数量'.
    DATA(tmp_qty) = lw_tab-zenmng2 && ' = ' && lw_tab-enmng && ' – ' && lw_tab-bdmng && ' / ( 1 + ' && lw_tab-zausch && ' / 100 ) / ' && lw_tab-psmng && ' * ' && lw_tab-wemng && ' – ' && lw_tab-zenmng1  .
    cl_demo_output=>new(
    )->begin_section( `在制品数量`
    )->write_text( |{ tmp_text } 
| && |{ tmp_qty }|
    )->display( ).

  ELSEIF p_column = 'BTN'.
*    BREAK guoxiongjie .
    IF lw_tab-btn+0(4) = '@3X@'.
      BREAK guoxiongjie .

      DATA lv_answer TYPE char1 .
      DATA lt_tab LIKE TABLE OF gt_tab .
      lt_tab[] = gt_tab_show[] .
      DELETE lt_tab WHERE aufnr <> lw_tab-aufnr .
      SELECT SUM( a~bdmng ) AS bdmng ,SUM( a~enmng ) AS enmng
      FROM @lt_tab AS a INTO @DATA(tmp_tab) .

      SELECT SINGLE a~aufnr FROM @lt_tab AS a
      WHERE zenmng2 <> 0
      INTO @DATA(tmp_anfnr) .
      IF sy-subrc EQ 0.
        CALL FUNCTION 'POPUP_TO_CONFIRM'
          EXPORTING
            titlebar              = '操作提示'
            text_question         = '工单在制数量不为0,是否继续?'
            text_button_1         = '是'
            text_button_2         = '否'
            display_cancel_button = ''
          IMPORTING
            answer                = lv_answer
          EXCEPTIONS
            text_not_found        = 1
            OTHERS                = 2.

        CHECK lv_answer  = 1 .

      ENDIF.

*      DATA lv_answer TYPE char1 .
      DATA: line1(46) TYPE c .
      DATA: line2(44) TYPE c .
      DATA: line3(44) TYPE c .
      DATA: line4(44) TYPE c .
      DATA: line5(40) TYPE c .
      DATA: line6(40) TYPE c .
      DATA: text TYPE string .
      DATA(zwf) = '…………………………………….' .
      line1 = |工    单:{ lw_tab-aufnr ALPHA = OUT }{ zwf }| .
      line2 = |已订购数:{ lw_tab-psmng }{ zwf }|.
      line3 = |完成数量:{ lw_tab-wemng }{ zwf }|.
      line4 = |实报数量:{ lw_tab-zsbsl }{ zwf }|.
      line5 = |组件-需求数量(合计):{ tmp_tab-bdmng }{ zwf }|.
      line6 = |组件-发 放 量(合计):{ tmp_tab-enmng }{ zwf }|.
      text = |{ line1 }{ line2 }{ line3 }{ line4 }{ line5 }{ line6 } 对工单执行TECO,是否继续?|.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          titlebar              = '提示'
          text_question         = text
          text_button_1         = '是'
          text_button_2         = '否'
          display_cancel_button = ''
        IMPORTING
          answer                = lv_answer
        EXCEPTIONS
          text_not_found        = 1
          OTHERS                = 2.
      IF lv_answer  = 1 .
        DATA: t_order TYPE TABLE OF bapi_order_key .
        DATA: t_return TYPE TABLE OF bapi_order_return .
        t_order = VALUE #( ( order_number = lw_tab-aufnr ) ) .

        CALL FUNCTION 'BAPI_PRODORD_COMPLETE_TECH'
          TABLES
            orders        = t_order
            detail_return = t_return.

        READ TABLE t_return INTO DATA(w_return) WITH KEY type = 'E'.
        IF sy-subrc EQ 0.
          MESSAGE w_return-message TYPE 'S' DISPLAY LIKE 'E' .
        ELSE.
          CLEAR: lw_tab .
          lw_tab-btn = '@ME@已执行' .
          CALL FUNCTION 'Z_FMPP_013'
            EXPORTING
              aufnr  = t_order[ 1 ]-order_number
            IMPORTING
              status = lw_tab-zzt
              sttxt  = lw_tab-sttxt.
          MODIFY gt_tab_show FROM lw_tab TRANSPORTING btn zzt sttxt WHERE aufnr = t_order[ 1 ]-order_number .

          gr_columns = gr_table->get_columns( ).
          gr_columns->set_optimize( 'X' ).
          CALL METHOD gr_table->refresh
            EXPORTING
              s_stable     = VALUE #( row = 'X' col = 'X' )
              refresh_mode = if_salv_c_refresh=>soft.
          gr_table->refresh( ).

          MESSAGE '技术上完成 已执行' TYPE 'S'.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.
*&———————————————————————*
*& Form handle_user_command
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> E_SALV_FUNCTION
*&———————————————————————*
FORM handle_user_command  USING e_salv_function.
  IF e_salv_function = '&REFRESH' .
    gr_columns = gr_table->get_columns( ).
    gr_columns->set_optimize( 'X' ).
    CALL METHOD gr_table->refresh
      EXPORTING
        s_stable     = VALUE #( row = 'X' col = 'X' )
        refresh_mode = if_salv_c_refresh=>soft.
  ENDIF.
ENDFORM.

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...