• 采购订单打印并预览PDF


    *&---------------------------------------------------------------------*
    *& Report  Z01MMF019
    *& Author's name:  CAIXIANG
    *& Program title:  采购订单打印
    *& Date:          20161031
    *&---------------------------------------------------------------------*
    *& Description:
    *&1.根据以上选择条件,查询出所有符合条件的采购订单,在清单中选择并点击打印。
    *&---------------------------------------------------------------------*
    
    REPORT z01mmf019 MESSAGE-ID zmm02.
    
    *&---------------------------------------------------------------------*
    *& 数据声明
    *&---------------------------------------------------------------------*
    INCLUDE Z01MMF019_TOP.
    *INCLUDE z01mmf102_top.
    *&---------------------------------------------------------------------*
    *&  包含                Z01MMF068_TOP
    *&---------------------------------------------------------------------*
    
    TABLES: z01mm_s_068,
            ekko,
            ekpo,
            lfa1.
    
    *&---------------------------------------------------------------------*
    *
    *计划交货日期,
    *单价 = 净价/价格单位,(6位小数) NETPR/PEINH
    *币别
    *&---------------------------------------------------------------------*
    TYPES:BEGIN OF ty_alv,
            sel      TYPE c,       "标识:是否已选择 'X' 选中
            lin      TYPE sy-tabix,
    *&抬头
            ebeln    TYPE ekpo-ebeln, "PO
            ebelp    TYPE ekpo-ebelp, "PO行
            lifnr    TYPE ekko-lifnr,  "供应商
            namel    TYPE char100,     "供应商名称
            ekorg    TYPE ekko-ekorg,  "采购组织
            ekgrp    TYPE ekko-ekgrp,  "采购组
            address  TYPE char100,     "供应商地址(ADRC-STREET+ADRC-STR_SUPPL1)
            zzrloc   TYPE ekko-zzrloc, "贸易方式:即收货地点 EKKO-ZZRLOC的描述
            zzrloc_t TYPE char100,
            zterm    TYPE ekko-zterm,  "付款方式:根据付款条件EKKO-ZTERM取其描述
            zterm_t  TYPE char100,
            zzpovr   TYPE ekko-zzpovr, "订单版本号:EKKO-ZZPOVR
            bedat    TYPE ekko-bedat,  "采购订单日期:EKKO-BEDAT
            zzpotp   TYPE ekko-zzpotp, "订单发放类型:即PO发放类型EKKO-ZZPOTP的描述
            zzpotp_t TYPE char100,
            waers    TYPE ekko-waers,  "货币单位:EKKO-WAERS
            verkf    TYPE lfm1-verkf,  "供应商联系人 LFM1-VERKF
            telf1    TYPE lfa1-telf1,  "供应商联系电话 LFA1-TELF1
            name_cg  TYPE t024-eknam,
            zzisasso TYPE ekko-zzisasso,
            bsart    TYPE ekko-bsart,
            eknam    TYPE t024-eknam,  "采购员:取EKKO-EKGRP的名称T024-EKNAM
            lands    TYPE ekko-lands,
    *&项目
            matnr    TYPE ekpo-matnr, "物料
            maktx    TYPE makt-maktx, "物料长文本
            menge    TYPE ekpo-menge, "数量
            meins    TYPE ekpo-meins, "单位
            plifz    TYPE ekpo-plifz, "按天的计划交货时间
            netpr    TYPE ekpo-netpr, "净价
            peinh    TYPE ekpo-peinh, "价格单位
            netpr_d  TYPE p DECIMALS 6, "单价
    
            kbetr    TYPE konp-kbetr,  "含税:根据税码EKPO- MWSKZ取税率,如:17%
            mseh3    TYPE t006a-mseh3, "单位:(度量单位)根据EKPO-MEINS取其商业名称T006-MSEH3
            eindt    TYPE eket-eindt,  "交货期:EKET-EINDT
            netwr    TYPE ekpo-netwr,  "金额:EKPO-NETWR
            netwr_s  TYPE ekpo-netwr,  "总额:汇总所有行的金额
            text_po  TYPE char100,     "备注:PO抬头的表头文本
            mwskz    TYPE ekpo-mwskz,
            flag     TYPE c,
    * include TYPE z01mm_s_069.
          END OF ty_alv.
    
    TYPES:tt_alv  TYPE STANDARD TABLE OF ty_alv
                       WITH DEFAULT KEY INITIAL SIZE 0.
    TYPES:tyt_alv TYPE ty_alv OCCURS 0.
    DATA:gt_alv TYPE STANDARD TABLE OF ty_alv,
         wa_alv TYPE ty_alv.
    
    TYPES:BEGIN OF ty_gncg,
            index    TYPE sy-tabix,
    *抬头:
            namel    LIKE lfa1-name1,  "供应商名称(LFA1-NAME1+NAME2)
            lifnr    LIKE ekko-lifnr,  "供应商编码
            address  TYPE char100,     "供应商地址(ADRC-STREET+ADRC-STR_SUPPL1)
            zzrloc   TYPE ekko-zzrloc, "贸易方式:即收货地点 EKKO-ZZRLOC的描述
            zzrloc_t TYPE char100,
            zterm    TYPE ekko-zterm,  "付款方式:根据付款条件EKKO-ZTERM取其描述
            zterm_t  TYPE char100,
            zzpovr   TYPE ekko-zzpovr, "订单版本号:EKKO-ZZPOVR
            bedat    TYPE ekko-bedat,  "采购订单日期:EKKO-BEDAT
            zzpotp   TYPE ekko-zzpotp, "订单发放类型:即PO发放类型EKKO-ZZPOTP的描述
            zzpotp_t TYPE char100,
            waers    TYPE ekko-waers,  "货币单位:EKKO-WAERS
            verkf    TYPE lfm1-verkf,  "供应商联系人 LFM1-VERKF
            telf1    TYPE lfa1-telf1,  "供应商联系电话 LFA1-TELF1
            text_po  TYPE string,      "备注:PO抬头的表头文本
            zztmcp   TYPE ekko-zztmcp, "TMK 采购单编号
            inco     TYPE string,
    
    *行项目
            ebeln    TYPE ekpo-ebeln,
            ebelp    TYPE ekpo-ebelp,  "项目
            matnr    TYPE ekpo-matnr,  "物品编码
            maktx    TYPE makt-maktx,  "物料描述:根据物料取其长文本
            kbetr    TYPE konp-kbetr,  "含税:根据税码EKPO- MWSKZ取税率,如:17%
            mseh3    TYPE t006a-mseh3, "单位:(度量单位)根据EKPO-MEINS取其商业名称T006-MSEH3
            netpr_d  TYPE p DECIMALS 6, "单价:EKPO-NETPR除以价格单位EKPO-PEINH,保留6位小数
            eindt    TYPE eket-eindt,  "交货期:EKET-EINDT
            menge    TYPE ekpo-menge,  "数量:EKPO-MENGE
            meins    TYPE ekpo-meins,  "单位
            netwr    TYPE ekpo-netwr,  "金额:EKPO-NETWR
            netwr_s  TYPE ekpo-netwr,  "总额:汇总所有行的金额
    *脚注:
            eknam    TYPE t024-eknam,  "采购员:取EKKO-EKGRP的名称T024-EKNAM
    *背面条款:
            page     TYPE sy-tabix,    "页码
            text     TYPE string,
          END OF ty_gncg.
    
    DATA:gt_gncg TYPE STANDARD TABLE OF ty_gncg,
         wa_gncg TYPE ty_gncg.
    *----------------------------------------------------------------------
    *  Data parameters for alv report use
    *----------------------------------------------------------------------
    DATA: g_program   TYPE sy-repid,
          gw_layout   TYPE slis_layout_alv,
          gt_fieldcat TYPE slis_t_fieldcat_alv,
          wa_fieldcat TYPE slis_fieldcat_alv,
          gt_event    TYPE slis_t_event,
          wa_event    TYPE slis_alv_event.
    DATA: g_grid  TYPE  REF TO cl_gui_alv_grid.
    DATA: g_tabix TYPE i.
    DATA: g_len TYPE i.
    
    *----------------------------------------------------------------------
    *  Other use
    *----------------------------------------------------------------------
    DATA:lt_list  TYPE vrm_values,
         ls_value LIKE LINE OF lt_list.
    
    
    
    *&---------------------------------------------------------------------*
    *& 选择屏幕
    *&---------------------------------------------------------------------*
    INCLUDE Z01MMF019_SCR.
    *INCLUDE z01mmf102_scr.
    *&---------------------------------------------------------------------*
    *&  包含                Z01MMF068_SCR
    *&---------------------------------------------------------------------*
    
    SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
    PARAMETERS:p_ekorg LIKE ekko-ekorg OBLIGATORY DEFAULT 'M011',
               p_ekgrp LIKE ekko-ekgrp OBLIGATORY DEFAULT 'A06'.
    
    SELECT-OPTIONS:s_lifnr FOR lfa1-lifnr,
                   s_bedat FOR ekko-bedat,
                   s_ebeln FOR ekko-ebeln.
    
    *PARAMETERS:p_type AS LISTBOX TYPE CHAR10 VISIBLE LENGTH 20 DEFAULT '国内采购订单',
    *           P_FLAG TYPE CHAR5 NO-DISPLAY.
    SELECTION-SCREEN END OF BLOCK b1.
    
    SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
    *1.    国内采购订单:            采购组织M011,订单收货地点EKKO-ZZRLOC=Z01或Z05
    *2.    联动采购订单TMC:         采购组织M011,订单联动标识EKKO-ZZISASSO=X
    *3.    联动采购订单TMK:         采购组织S061,订单联动标识EKKO-ZZISASSO=X
    *4.    联动采购订单TMK(English):采购组织S061,订单联动标识EKKO-ZZISASSO=X
    *5.    模具采购订单TMC:采购组织M011,订单类型EKKO-BSART=Z007
    *6.    模具采购订单TMK:采购组织S061,订单类型EKKO-BSART=Z007
    PARAMETERS:rb_01 RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND rb,
               rb_02 RADIOBUTTON GROUP g1,
               rb_03 RADIOBUTTON GROUP g1,
               rb_04 RADIOBUTTON GROUP g1,
               rb_05 RADIOBUTTON GROUP g1,
               rb_06 RADIOBUTTON GROUP g1.
    SELECTION-SCREEN END OF BLOCK b2.
    
    *&---------------------------------------------------------------------*
    *& 子程序
    *&---------------------------------------------------------------------*
    *INCLUDE z01mmf169_frm.
    
    
    INITIALIZATION.
    
    AT SELECTION-SCREEN.
      PERFORM frm_check_auth.
    
    AT SELECTION-SCREEN OUTPUT.
      PERFORM frm_init_ptype.
    
    *&---------------------------------------------------------------------*
    *& 程序主事件
    *&---------------------------------------------------------------------*
    START-OF-SELECTION.
      PERFORM frm_get_data.
      PERFORM frm_alv_out.
    
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_INIT_PTYPE
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM frm_init_ptype .
      REFRESH lt_list .
    
      CASE 'X'.
        WHEN rb_01 OR rb_02 OR rb_05.
          p_ekorg = 'M011'.
        WHEN rb_03 OR rb_04 OR rb_06.
          p_ekorg = 'S061'.
        WHEN OTHERS .
      ENDCASE.
    
      IF p_ekorg NE 'M011' AND p_ekorg NE 'S061'.
        MESSAGE s001(00) WITH '限定采购组织要为M011或S061!' DISPLAY LIKE 'E'.
        STOP.
      ENDIF.
    
    ENDFORM.
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_DATA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM frm_get_data .
    *& 订单打印类型  P_TYPE
      DATA:l_tabix TYPE sy-tabix.
      DATA:adrc TYPE adrc.
    
      DATA:lt_alv TYPE STANDARD TABLE OF ty_alv.
      DATA:lt_lfa1 TYPE STANDARD TABLE OF lfa1,
           ls_lfa1 TYPE lfa1.
      DATA:lt_makt TYPE STANDARD TABLE OF makt,
           ls_makt TYPE makt.
      DATA:lt_z01mmtrloc TYPE STANDARD TABLE OF z01mmtrloc,
           ls_z01mmtrloc TYPE z01mmtrloc.
      DATA:lt_z01mmtpotp TYPE STANDARD TABLE OF z01mmtpotp,
           ls_z01mmtpotp TYPE z01mmtpotp.
      DATA:lt_t024 TYPE STANDARD TABLE OF t024,
           ls_t024 TYPE t024.
      DATA:lt_t052u TYPE STANDARD TABLE OF t052u,
           ls_t052u TYPE t052u.
      DATA:lt_ftaxp LIKE ftaxp OCCURS 0 WITH HEADER LINE,
           l_aland  LIKE rf82t-land1,
           l_datab  LIKE rf82t-datab,
           l_mwskz  LIKE rf82t-mwskz,
           l_txjcd  LIKE rf82t-txjcd.
    
      SELECT a~lifnr
             a~ekorg
             a~ekgrp
             a~ebeln
             a~waers
             a~zzrloc
             a~zterm
             a~zzpovr
             a~bedat
             a~zzpotp
             a~zzisasso
             a~bsart
             a~lands
    
             b~ebelp
             b~matnr
             b~menge
             b~meins
             b~netpr
             b~peinh
             b~netwr
             b~plifz "按天的计划交货时间
             b~mwskz
    
        INTO CORRESPONDING FIELDS OF TABLE gt_alv
        FROM ekko AS a
        JOIN ekpo AS b
          ON a~ebeln EQ b~ebeln
       WHERE a~ekorg EQ p_ekorg
         AND a~ekgrp EQ p_ekgrp
         AND a~lifnr IN s_lifnr
         AND a~bedat IN s_bedat
         AND a~loekz EQ space
    *     AND a~frgke EQ 'R'
         AND a~ebeln IN s_ebeln
         AND b~loekz EQ space.
      IF sy-subrc NE 0.
        MESSAGE s001(00) WITH '未查询到满足条件的记录,请重试!' DISPLAY LIKE 'E'.
        STOP.
      ENDIF.
    
    *  RANGES:r_zzrloc FOR ekko-zzrloc.
    *  CASE 'X'.
    *    WHEN rb_01.
    *      r_zzrloc(3) = 'IEQ'.
    *      r_zzrloc-low = 'Z01'.
    *      APPEND r_zzrloc.
    *      CLEAR r_zzrloc.
    *      r_zzrloc(3) = 'IEQ'.
    *      r_zzrloc-low = 'Z05'.
    *      APPEND r_zzrloc.
    *      CLEAR r_zzrloc.
    *      DELETE gt_alv WHERE zzrloc NOT IN r_zzrloc.
    *    WHEN rb_02 OR rb_03 OR rb_04.
    *      DELETE gt_alv WHERE zzisasso NE 'X'.
    *    WHEN rb_05 OR rb_06.
    *      DELETE gt_alv WHERE bsart NE 'Z007'."采购凭证类型
    *
    *    WHEN OTHERS.
    *  ENDCASE.
    
    *  lt_alv = gt_alv.
    *  SORT lt_alv by zzpotp.
    *  delete ADJACENT DUPLICATES FROM lt_alv COMPARING zzpotp.
    
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE lt_lfa1
        FROM lfa1
         FOR ALL ENTRIES IN gt_alv
       WHERE lifnr EQ gt_alv-lifnr.
      SORT lt_lfa1 BY lifnr.
    
    *& 物料描述
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE lt_makt
        FROM makt
         FOR ALL ENTRIES IN gt_alv
       WHERE matnr = gt_alv-matnr
         AND spras = sy-langu.
      SORT lt_makt BY matnr.
    
    *& 收货地点EKKO-ZZRLOC的描述
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE lt_z01mmtrloc
        FROM z01mmtrloc.
      SORT lt_z01mmtrloc BY zzrloc.
    
    *& PO发放类型
      SELECT *
        FROM z01mmtpotp
        INTO TABLE lt_z01mmtpotp
         FOR ALL ENTRIES IN gt_alv
      WHERE zzpotp = gt_alv-zzpotp .
      SORT lt_z01mmtpotp BY zzpotp.
    
    *& 取采购员描述
      SELECT *
        FROM t024
        INTO TABLE lt_t024
         FOR ALL ENTRIES IN gt_alv
       WHERE ekgrp = gt_alv-ekgrp.
      SORT  lt_t024 BY ekgrp.
    
    *& 取付款条件描述
      SELECT *
        FROM t052u
        INTO TABLE lt_t052u
         FOR ALL ENTRIES IN gt_alv
       WHERE spras = 'ZH'
         AND zterm = gt_alv-zterm .
    
    
      LOOP AT gt_alv INTO wa_alv.
        l_tabix = sy-tabix.
    
        READ TABLE lt_lfa1 INTO ls_lfa1 WITH KEY lifnr = wa_alv-lifnr BINARY SEARCH.
        IF sy-subrc EQ 0.
          CONCATENATE ls_lfa1-name1 ls_lfa1-name2 INTO wa_alv-namel.
    *&供应商地址
          CLEAR:adrc.
          SELECT SINGLE *
            INTO adrc
            FROM adrc
           WHERE addrnumber EQ ls_lfa1-adrnr.
          IF sy-subrc EQ 0.
            CONCATENATE adrc-street adrc-str_suppl1 INTO wa_alv-address.
          ENDIF.
        ENDIF.
    
        READ TABLE lt_makt INTO ls_makt WITH KEY matnr = wa_alv-matnr BINARY SEARCH.
        IF sy-subrc EQ 0.
          wa_alv-maktx = ls_makt-maktx.
        ENDIF.
    
    *& 贸易方式
        READ TABLE lt_z01mmtrloc INTO ls_z01mmtrloc WITH KEY zzrloc = wa_alv-zzrloc BINARY SEARCH.
        IF sy-subrc EQ 0.
          wa_alv-zzrloc_t = ls_z01mmtrloc-zzrloct.
        ENDIF.
    
    *& 付款条件
        READ TABLE lt_t052u INTO ls_t052u WITH KEY zterm  = wa_alv-zterm BINARY SEARCH.
        IF sy-subrc EQ 0.
          wa_alv-zterm_t = ls_t052u-zterm.
        ENDIF.
    
    *& PO订单发放类型
        READ TABLE lt_z01mmtpotp INTO ls_z01mmtpotp WITH KEY zzpotp  = wa_alv-zzpotp BINARY SEARCH.
        IF sy-subrc EQ 0.
          wa_alv-zzpotp_t = ls_z01mmtpotp-zzpotpt.
        ENDIF.
    
    *& 采购员
        READ TABLE lt_t024 INTO ls_t024 WITH KEY ekgrp = wa_alv-ekgrp BINARY SEARCH.
        IF sy-subrc EQ 0.
          wa_alv-eknam = ls_t024-eknam.
        ENDIF.
    
    *& 含税->税率
        CLEAR:l_aland,l_datab ,l_mwskz,l_txjcd,
              lt_ftaxp,lt_ftaxp[].
        l_aland = wa_alv-lands."报告国家
        l_datab = wa_alv-bedat.
        l_mwskz = wa_alv-mwskz.
        l_txjcd = wa_alv-mwskz.
        CALL FUNCTION 'GET_TAX_PERCENTAGE'
          EXPORTING
            aland   = l_aland
            datab   = l_datab
            mwskz   = l_mwskz
            txjcd   = l_txjcd
          TABLES
            t_ftaxp = lt_ftaxp.
        LOOP AT lt_ftaxp WHERE kschl = 'MWVS'.
    *& 计算出税率
          IF lt_ftaxp-kbetr IS NOT INITIAL.
            wa_alv-kbetr = lt_ftaxp-kbetr / 10.                 "/ 1000.
          ENDIF .
        ENDLOOP.
    
    *&单位
        SELECT SINGLE mseh3
          INTO wa_alv-mseh3
          FROM t006a
         WHERE msehi EQ wa_alv-meins
           AND spras EQ sy-langu.
    
    *&单价 = 净价/价格单位,(6位小数) NETPR/PEINH
        IF  wa_alv-peinh IS NOT INITIAL.
          wa_alv-netpr_d = wa_alv-netpr / wa_alv-peinh.
        ELSE.
          wa_alv-netpr_d = wa_alv-netpr.
        ENDIF.
    
    *&交货日期
        SELECT SINGLE eindt
          INTO wa_alv-eindt
          FROM eket
         WHERE ebeln EQ wa_alv-ebeln
           AND ebelp EQ wa_alv-ebelp.
    
        SHIFT wa_alv-ebeln LEFT DELETING LEADING '0'.
        SHIFT wa_alv-ebelp LEFT DELETING LEADING '0'.
    
        MODIFY gt_alv FROM wa_alv INDEX l_tabix.
        CLEAR:wa_alv.
      ENDLOOP.
    
      SORT gt_alv BY ebeln ebelp.
      g_len = lines( gt_alv ).
      IF g_len EQ 0.
        MESSAGE s001(00) WITH '未查询到满足条件的记录,请重试!' DISPLAY LIKE 'E'.
        STOP.
      ELSE.
        MESSAGE s001(00) WITH '找到数据条目:' g_len.
      ENDIF.
    
    ENDFORM.
    *&---------------------------------------------------------------------*
    *&      Form  FRM_ALV_OUT
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM frm_alv_out .
      DATA: l_nn TYPE i.
    
      DEFINE add_fieldcat.
        CLEAR WA_FIELDCAT.
        WA_FIELDCAT-FIELDNAME    =  &1.
        WA_FIELDCAT-SELTEXT_L    =  &2.
        WA_FIELDCAT-KEY          =  &3.
        WA_FIELDCAT-COL_POS      =  L_NN + 1.
        WA_FIELDCAT-JUST         =  &4.
        WA_FIELDCAT-OUTPUTLEN    =  &5.
        WA_FIELDCAT-FIX_COLUMN   =  &6.
        WA_FIELDCAT-NO_ZERO      =  &7.
        WA_FIELDCAT-EDIT         =  &8.
        APPEND WA_FIELDCAT TO GT_FIELDCAT.
      END-OF-DEFINITION.
    
      CLEAR gt_fieldcat.
      REFRESH gt_fieldcat.
      add_fieldcat   'LIFNR  '      '供应商'        ''     ''  ''  ''  '' ''.
      add_fieldcat   'NAMEL  '      '供应商名称'    ''     ''  ''  ''  '' ''.
      add_fieldcat   'EKORG  '      '采购组织'      ''     ''  ''  ''  '' ''.
      add_fieldcat   'EKGRP  '      '采购组'        ''     ''  ''  ''  '' ''.
      add_fieldcat   'EBELN  '      'PO'            ''     ''  ''  ''  '' ''.
      add_fieldcat   'EBELP  '      'PO行'          ''     ''  ''  ''  '' ''.
      add_fieldcat   'MATNR  '      '物料'          ''     ''  ''  ''  '' ''.
      add_fieldcat   'MAKTX  '      '物料长文本'    ''     ''  ''  ''  '' ''.
      add_fieldcat   'MENGE  '      '数量'          ''     ''  ''  ''  '' ''.
      add_fieldcat   'MEINS  '      '单位'          ''     ''  ''  ''  '' ''.
      add_fieldcat   'EINDT  '      '计划交货日期'  ''     ''  ''  ''  '' ''.
      add_fieldcat   'NETPR_D'      '单价'          ''     ''  ''  ''  '' ''.
      add_fieldcat   'WAERS  '      '币别'          ''     ''  ''  ''  '' ''.
    
      gw_layout-colwidth_optimize = 'X'.
      gw_layout-zebra = 'X'.
      gw_layout-box_fieldname     = 'SEL'.
    
      g_program = sy-repid.
    *& 调用函数显示ALV列表
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          i_callback_program       = g_program
          i_default                = 'X'
          i_save                   = 'U'
          is_layout                = gw_layout
          it_fieldcat              = gt_fieldcat
          i_callback_pf_status_set = 'FRM_SET_STATUS'
          i_callback_user_command  = 'FRM_USER_COMMAND'
        TABLES
          t_outtab                 = gt_alv
        EXCEPTIONS
          program_error            = 1
          OTHERS                   = 2.
    
    ENDFORM.
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CHECK_AUTH
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM frm_check_auth .
    *权限要求: 按采购组织、采购组检查权限
    
    
    ENDFORM.
    FORM frm_set_status  USING extab TYPE slis_t_extab.
    **功能: 设置ALV菜单栏
      DATA:
      l_rec_excfunc LIKE LINE OF extab.  "工作区: 不用显示的菜单项
    **STEP 1. 设置菜单
    **STEP 1.1 隐藏掉不需要的标准按钮
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&RNT'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&REFRESH'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&DATA_SAVE'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&SAL'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&ALL'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&UMC'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '%SL'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&VEXCEL'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&AQW'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&ABC'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&GRAPH'.
      APPEND l_rec_excfunc TO extab.
    
      CLEAR l_rec_excfunc.
      l_rec_excfunc-fcode = '&INFO'.
      APPEND l_rec_excfunc TO extab.
    
    **STEP 2. 激活显示自定义菜单
      SET PF-STATUS 'ZSTATUS2' EXCLUDING extab.
    ENDFORM.                    "FRM_SET_PF_STATUS
    
    FORM frm_user_command
                  USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.
    ***********************************************************************
    **功能: 响应用户的ALV上的操作
    **输入:(屏幕操作命令)
    **返回:
    **      (根据不同命令有不同的处理程序)
    ***********************************************************************
    **BELOW**数据声明
      DATA:
        lv_subrc LIKE sy-subrc,      "返回码:0表示成功,1表示失败
        lc_msgtx TYPE msgtx.         "说明信息
    **ABOVE**数据声明
    **BELOW**初始化
      DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_grid = lr_grid.
      CALL METHOD lr_grid->check_changed_data.
      rs_selfield-refresh = 'X'.  "要求执行完此子程序后自动刷新ALV清单
    
    **STEP 1. 操作
      CASE r_ucomm.
        WHEN '&ZSALL'.  "选择全部条目
          PERFORM frm_ucomm_zsall          "选择全部条目
                     CHANGING gt_alv[].   "本次处理前后的ALV数据
        WHEN '&ZDSAL'. "取消全部选择
          PERFORM frm_ucomm_zdsal         "取消全部选择
                     CHANGING gt_alv[].   "本次处理前后的ALV数据
    
        WHEN '&ZPRINT'.                   "打印
          PERFORM frm_ucomm_print          "修改DB
                   CHANGING gt_alv[].     "本次确认调整前后的ALV数据
    
      ENDCASE .
    *ABOVE**程序主体
    ENDFORM.                    "FRM_USER_COMMAND
    *&---------------------------------------------------------------------*
    *&      Form  FRM_UCOMM_ZSALL
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      <--P_GT_ALV[]  text
    *----------------------------------------------------------------------*
    FORM frm_ucomm_zsall  CHANGING p_gt_alv TYPE  tyt_alv.
      LOOP AT gt_alv INTO wa_alv WHERE sel IS INITIAL  .
        wa_alv-sel = 'X'.
        MODIFY gt_alv FROM wa_alv.
        CLEAR:wa_alv.
      ENDLOOP.
    ENDFORM.
    *&---------------------------------------------------------------------*
    *&      Form  FRM_UCOMM_ZDSAL
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      <--P_GT_ALV[]  text
    *----------------------------------------------------------------------*
    FORM frm_ucomm_zdsal  CHANGING p_gt_alv  TYPE  tyt_alv.
      LOOP AT gt_alv INTO wa_alv WHERE sel IS NOT INITIAL .
        wa_alv-sel = ''.
        MODIFY gt_alv FROM wa_alv.
        CLEAR:wa_alv.
      ENDLOOP.
    ENDFORM.
    *&---------------------------------------------------------------------*
    *&      Form  FRM_UCOMM_ZPOST
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      <--P_LV_SUBRC  text
    *      <--P_LC_MSGTX  text
    *      <--P_GT_ALV[]  text
    *----------------------------------------------------------------------*
    FORM frm_ucomm_print  CHANGING   p_gt_alv    TYPE  tyt_alv.
      DATA:l_msg              TYPE string,
           lt_alv             TYPE STANDARD TABLE OF ty_alv,
    *       lt_alv_prt         TYPE STANDARD TABLE OF z01mmf024_item,
    *       ls_alv_prt         TYPE z01mmf024_item,
           ls_alv             TYPE ty_alv,
           func_mod_name      TYPE rs38l_fnam,
           output_options     TYPE ssfcompop,
           it_job_output_info TYPE ssfcrescl,
           control_parameters TYPE ssfctrlop,
           lc_sfname          TYPE tdsfname, "VALUE 'Z01MMF102',
           lc_index           TYPE sy-index,     "计数器
           lc_number          TYPE sy-index,     "计数器
           lc_num             TYPE sy-index,
           lc_tot             TYPE int4,
           lc_int             TYPE int4,
           lc_tot_num         TYPE string,
           lc_je              TYPE ekpo-netwr,
           lc_je_sum          TYPE string.
    
      DATA:ls_otfdata     TYPE ssfcrescl,
           lt_otf         TYPE TABLE OF itcoo,
           l_bin_filesize TYPE i, "soli_tab
           lt_lines       TYPE TABLE OF tline,
           l_filename     TYPE string,
           l_path         TYPE string,
           l_pathfilename TYPE string.
    
      CASE 'X'.
        WHEN rb_01.
          lc_sfname = 'Z01MMF102_1'.
        WHEN rb_02.
          lc_sfname = 'Z01MMF102_2'.
        WHEN rb_03.
          lc_sfname = 'Z01MMF102_3'.
        WHEN rb_04.
          lc_sfname = 'Z01MMF102_4'.
        WHEN rb_05.
          lc_sfname = 'Z01MMF102_5'.
        WHEN rb_06.
          lc_sfname = 'Z01MMF102_6'.
        WHEN OTHERS.
      ENDCASE.
    
    
    *  BREAK XIANGC.
      APPEND LINES OF p_gt_alv TO lt_alv.
      DELETE lt_alv WHERE sel IS INITIAL.
    
      IF lt_alv IS INITIAL.
        l_msg = '至少要选中一笔条目才可进行操作!'.
        MESSAGE i001(00) WITH  l_msg.
        RETURN.
      ELSE.
    * 选中凭证的一行,则默认将凭证所有行选中
        PERFORM frm_change_select_item CHANGING p_gt_alv.
    
    *. 初始化打印控制参数
        CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
          EXPORTING
            formname           = lc_sfname
          IMPORTING
            fm_name            = func_mod_name
          EXCEPTIONS
            no_form            = 1
            no_function_module = 2
            OTHERS             = 3.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          EXIT.
        ENDIF.
    * 1 by 1 ,循环打印
        SORT lt_alv BY ebeln.
        DELETE ADJACENT DUPLICATES FROM lt_alv COMPARING ebeln.
        lc_index = lines( lt_alv ).
    
        LOOP AT lt_alv INTO ls_alv.
          lc_number = lc_number + 1.
          output_options-tdimmed    = 'X'.
          control_parameters-getotf = 'X'.
    
          IF lc_number < lc_index.
            control_parameters-no_close = 'X'.
          ELSE.
    *&打印关闭
            control_parameters-no_close = space.
          ENDIF.
    
          CLEAR:gt_gncg,lc_num.
          CLEAR:lc_tot_num,lc_tot,
                lc_je_sum,lc_je.
          LOOP AT p_gt_alv INTO wa_alv WHERE sel = 'X' AND ebeln = ls_alv-ebeln.
            MOVE-CORRESPONDING wa_alv TO wa_gncg.
            lc_num = lc_num + 1.
            wa_gncg-index = lc_num.
            lc_tot = lc_tot + wa_gncg-menge.
            lc_je  = lc_je  + wa_gncg-netwr.
            APPEND wa_gncg TO gt_gncg.
            CLEAR: wa_alv,wa_gncg.
          ENDLOOP.
    
          lc_tot_num = lc_tot.
          lc_je_sum  = lc_je.
          CALL FUNCTION func_mod_name
            EXPORTING
              control_parameters = control_parameters
              output_options     = output_options
              user_settings      = space
              in_tot_num         = lc_tot_num
              ln_je_sum          = lc_je_sum
    *        TABLES
              in_item            = gt_gncg
            importing
    *         DOCUMENT_OUTPUT_INFO       =
              job_output_info    = ls_otfdata
    *         JOB_OUTPUT_OPTIONS =
            EXCEPTIONS
              formatting_error   = 1
              internal_error     = 2
              send_error         = 3
              user_canceled      = 4
              OTHERS             = 5.
          IF sy-subrc <> 0.
            DATA errortab TYPE tsferror.
            CALL FUNCTION 'SSF_READ_ERRORS'
              IMPORTING
                errortab = errortab.
    
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ELSE.
    *&调用打印
            control_parameters-no_open = 'X'.
    
    *&+++转换成PDF
            lt_otf[] = ls_otfdata-otfdata[].
            CALL FUNCTION 'CONVERT_OTF'
              EXPORTING
                format                = 'PDF'
                max_linewidth         = 132
    *           ARCHIVE_INDEX         = ' '
    *           COPYNUMBER            = 0
    *           ASCII_BIDI_VIS2LOG    = ' '
    *           PDF_DELETE_OTFTAB     = ' '
    *           PDF_USERNAME          = ' ' "don't exist
    *           PDF_PREVIEW           = ' ' "don't exist
    *           USE_CASCADING         = ' ' "don't exist
              IMPORTING
                bin_filesize          = l_bin_filesize
    *           BIN_FILE              =
              TABLES
                otf                   = lt_otf
                lines                 = lt_lines "t_pdf_tab
              EXCEPTIONS
                err_max_linewidth     = 1
                err_format            = 2
                err_conv_not_possible = 3
                err_bad_otf           = 4
                OTHERS                = 5.
    
    *&PDF 预览
            CALL FUNCTION 'ZSTXBC_SSFCOMP_PDF_PREVIEW'
              EXPORTING
                i_otf                    = lt_otf[]
              EXCEPTIONS
                convert_otf_to_pdf_error = 1
                cntl_error               = 2
                OTHERS                   = 3.
            IF sy-subrc EQ 0.
    *&调用保存 对话框
              CALL METHOD cl_gui_frontend_services=>file_save_dialog
                EXPORTING
    *             window_title         =
    *             default_extension    =
    *             default_file_name    =
    *             with_encoding        =
                  file_filter          = '*.PDF'
    *             initial_directory    =
    *             prompt_on_overwrite  = 'X'
                CHANGING
                  filename             = l_filename
                  path                 = l_path
                  fullpath             = l_pathfilename
    *             user_action          =
    *             file_encoding        =
                EXCEPTIONS
                  cntl_error           = 1
                  error_no_gui         = 2
                  not_supported_by_gui = 3
                  OTHERS               = 4.
              IF sy-subrc <> 0.
              ENDIF.
    
              l_bin_filesize = l_bin_filesize * 2.
              CALL FUNCTION 'GUI_DOWNLOAD'
                EXPORTING
                  bin_filesize            = l_bin_filesize
                  filename                = l_pathfilename
                  filetype                = 'BIN'
    *             APPEND                  = ' '
                  write_field_separator   = ' '
                TABLES
                  data_tab                = lt_lines
    *             fieldnames              = gt_fieldnames
                EXCEPTIONS
                  file_write_error        = 1
                  no_batch                = 2
                  gui_refuse_filetransfer = 3
                  invalid_type            = 4
                  no_authority            = 5
                  unknown_error           = 6
                  header_not_allowed      = 7
                  separator_not_allowed   = 8
                  filesize_not_allowed    = 9
                  header_too_long         = 10
                  dp_error_create         = 11
                  dp_error_send           = 12
                  dp_error_write          = 13
                  unknown_dp_error        = 14
                  access_denied           = 15
                  dp_out_of_memory        = 16
                  disk_full               = 17
                  dp_timeout              = 18
                  file_not_found          = 19
                  dataprovider_exception  = 20
                  control_flush_error     = 21
                  OTHERS                  = 22.
            ENDIF.
    
          ENDIF.
        ENDLOOP.
      ENDIF.
    
    ENDFORM.
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CHANGE_SELECT_ITEM
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      <--P_P_GT_ALV  text
    *----------------------------------------------------------------------*
    FORM frm_change_select_item  CHANGING gt_alv TYPE tyt_alv.
      DATA :lt_alv TYPE STANDARD TABLE OF ty_alv,
            ls_alv TYPE ty_alv.
      APPEND LINES OF gt_alv TO lt_alv.
      DELETE lt_alv WHERE sel IS INITIAL.
      SORT lt_alv BY ebeln.
      DELETE ADJACENT DUPLICATES FROM lt_alv COMPARING ebeln.
    
      LOOP AT lt_alv INTO ls_alv.
        LOOP AT gt_alv INTO wa_alv WHERE ebeln = ls_alv-ebeln AND sel IS INITIAL.
          wa_alv-sel = 'X'.
          MODIFY gt_alv FROM wa_alv.
          CLEAR:wa_alv.
        ENDLOOP.
        CLEAR:ls_alv.
      ENDLOOP.
    
    ENDFORM.
  • 相关阅读:
    CloudFlare Workers 反代任意网站和挂载单页代码
    排查Linux服务器是否有被入侵方法总结
    修复Windows time时间服务无法自动启动的问题
    如何删除windows服务
    linux之NetHogs与nload流量监控
    常用IPV4 DNS服务器与常用IPV6 DNS服务器
    Win10系统如何删除网络及修改网络名称
    window修改远程桌面RDP方法
    单击鼠标右键菜单显示怎么在左边?
    传统IDC机房部署网站
  • 原文地址:https://www.cnblogs.com/rainysblog/p/8214337.html
Copyright © 2020-2023  润新知