采购订单打印并预览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.
原文地址:https://www.cnblogs.com/rainysblog/p/8214337.html