sap系列-14 smartform

smartform实例程序

*&---------------------------------------------------------------------*
*& Report ZLS_12
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zls_12.
TYPE-POOLS: slis.
TABLES: ekko,ekpo,eket.
*--------定义变量-----------*
TYPES: BEGIN OF ty_alv,
         ebeln TYPE ekko-ebeln, "订单编号
         werks TYPE ekpo-werks, "退货门店
         eindt TYPE eket-eindt, "交货日期
         ekorg TYPE ekko-ekorg, "采购组织
         ekgrp TYPE ekko-ekgrp, "采购组
         lifnr TYPE ekko-lifnr, "供应商
         ebelp TYPE ekpo-ebelp, "项目编号
         bsart TYPE ekko-bsart, "订单类型
         matnr TYPE ekpo-matnr, "商品编号
         txz01 TYPE ekpo-txz01, "商品描述
         bedat TYPE ekko-bedat, "订单日期
         menge TYPE ekpo-menge, "退货数量
         meins TYPE ekpo-meins, "单位
         ernam TYPE ekko-ernam, "制单人
         sel   TYPE char1, "选择标识
       END OF ty_alv.
DATA: lt_alv TYPE TABLE OF ty_alv.
DATA: lt_alv_sel TYPE TABLE OF ty_alv.
DATA: wa_alv TYPE ty_alv.

TYPES: BEGIN OF ty_eket,
         ebeln TYPE eket-ebeln,
         ebelp TYPE eket-ebelp,
         eindt TYPE eket-eindt,
       END OF ty_eket.
DATA: lt_eket TYPE TABLE OF ty_eket,
      wa_eket TYPE ty_eket.

DATA: fieldcat    TYPE slis_t_fieldcat_alv,
      fieldcat_ln LIKE LINE OF fieldcat,
      layout      TYPE slis_layout_alv.
DATA: col_pos TYPE int2.
DATA: lv_string TYPE string.

*--------选择屏幕-----------*
PARAMETERS p_ekorg TYPE ekko-ekorg.
SELECT-OPTIONS: s_ekgrp FOR ekko-ekgrp ,
s_lifnr FOR ekko-lifnr ,
s_ebeln FOR ekko-ebeln ,
s_bsart FOR ekko-bsart ,
s_werks FOR ekpo-werks ,
s_matnr FOR ekpo-matnr ,
s_txz01 FOR ekpo-txz01 .

START-OF-SELECTION.
  CONCATENATE 'ekorg IN s_ekgrp' 'lifnr IN s_lifnr' ' a~ebeln IN s_ebeln' 'bsart IN s_bsart' 'werks IN s_werks' 'matnr IN s_matnr' 'txz01 IN s_txz01' INTO lv_string SEPARATED BY ' and '.
  IF p_ekorg IS NOT INITIAL.
    CONCATENATE lv_string 'and a~ekorg = p_ekorg' INTO lv_string SEPARATED BY space.
  ENDIF.
  SELECT a~ebeln ekorg ekgrp lifnr bsart matnr txz01 bedat ernam b~ebelp werks menge meins
      FROM ekko AS a INNER JOIN ekpo AS b ON a~ebeln = b~ebeln
      INTO CORRESPONDING FIELDS OF TABLE lt_alv
    WHERE (lv_string).

  IF lt_alv IS NOT INITIAL.
    SELECT ebeln ebelp eindt FROM eket INTO TABLE lt_eket FOR ALL ENTRIES IN lt_alv
      WHERE ebeln = lt_alv-ebeln
      AND ebelp = lt_alv-ebelp.
  ENDIF.

  LOOP AT lt_alv INTO wa_alv.
    READ TABLE lt_eket INTO wa_eket WITH KEY ebeln = wa_alv ebelp = wa_alv-ebelp.
    IF sy-subrc = 0.
      wa_alv-eindt = wa_eket-eindt.
      MODIFY lt_alv FROM wa_alv.
    ENDIF.
    CLEAR wa_alv.
    CLEAR wa_eket.
  ENDLOOP.
*---------显示ALV-----------*
  layout-zebra = 'X'.
  layout-detail_popup = 'X'.
  layout-f2code = 'X'.
  layout-no_vline = 'X'.
  layout-colwidth_optimize = 'X'.
  layout-detail_initial_lines = 'X'.
  layout-detail_titlebar = '详细内容'.
  layout-box_fieldname = 'SEL'.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'EKORG'.
  fieldcat_ln-ref_tabname = 'EKKO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '采购组织'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'EKGRP'.
  fieldcat_ln-ref_tabname = 'EKKO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '采购组'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'LIFNR'.
  fieldcat_ln-ref_tabname = 'EKKO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '供应商'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'BEDAT'.
  fieldcat_ln-ref_tabname = 'EKKO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '订单日期'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'EINDT'.
  fieldcat_ln-ref_tabname = 'EKET'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '交货日期'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'EBELN'.
  fieldcat_ln-ref_tabname = 'EKKO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '订单编号'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'BSART'.
  fieldcat_ln-ref_tabname = 'EKKO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '订单类型'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'WERKS'.
  fieldcat_ln-ref_tabname = 'EKPO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '退货门店'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'MATNR'.
  fieldcat_ln-ref_tabname = 'EKPO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '商品编号'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'TXZ01'.
  fieldcat_ln-ref_tabname = 'EKPO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '商品描述'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'MENGE'.
  fieldcat_ln-ref_tabname = 'EKPO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '退货数量'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'MEINS'.
  fieldcat_ln-ref_tabname = 'EKPO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '单位'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  col_pos = col_pos + 1.
  fieldcat_ln-fieldname = 'ERNAM'.
  fieldcat_ln-ref_tabname = 'EKKO'.
  fieldcat_ln-col_pos = col_pos.
  fieldcat_ln-seltext_m = '制单人'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK        = ' '
*     I_BYPASSING_BUFFER       = ' '
*     I_BUFFER_ACTIVE          = ' '
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FORM_PF_STATUS_SET'
      i_callback_user_command  = 'FORM_USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE   = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME         =
*     I_BACKGROUND_ID          = ' '
*     I_GRID_TITLE             =
*     I_GRID_SETTINGS          =
      is_layout                = layout
      it_fieldcat              = fieldcat
*     IT_EXCLUDING             =
*     IT_SPECIAL_GROUPS        =
*     IT_SORT                  =
*     IT_FILTER                =
*     IS_SEL_HIDE              =
*     I_DEFAULT                = 'X'
*     I_SAVE                   = ' '
*     IS_VARIANT               =
*     IT_EVENTS                =
*     IT_EVENT_EXIT            =
*     IS_PRINT                 =
*     IS_REPREP_ID             =
*     I_SCREEN_START_COLUMN    = 0
*     I_SCREEN_START_LINE      = 0
*     I_SCREEN_END_COLUMN      = 0
*     I_SCREEN_END_LINE        = 0
*     I_HTML_HEIGHT_TOP        = 0
*     I_HTML_HEIGHT_END        = 0
*     IT_ALV_GRAPHICS          =
*     IT_HYPERLINK             =
*     IT_ADD_FIELDCAT          =
*     IT_EXCEPT_QINFO          =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*     O_PREVIOUS_SRAL_HANDLER  =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER  =
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      t_outtab                 = lt_alv
*   EXCEPTIONS
*     PROGRAM_ERROR            = 1
*     OTHERS                   = 2
    .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.


FORM form_pf_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD'.

ENDFORM.

FORM form_user_command USING r_ucomm LIKE sy-ucomm
                                   rs_selfield TYPE slis_selfield.
  DATA flag_error TYPE sap_bool.
  REFRESH lt_alv_sel.
  CASE r_ucomm.
    WHEN 'ZPRI'.
      DATA lr_alv_grid  TYPE REF TO cl_gui_alv_grid.
      IF lr_alv_grid IS INITIAL.
        CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
* EXPORTING
*   IR_SALV_FULLSCREEN_ADAPTER       =
          IMPORTING
*           ET_EXCLUDING                     =
*           E_REPID                          =
*           E_CALLBACK_PROGRAM               =
*           E_CALLBACK_ROUTINE               =
            e_grid = lr_alv_grid
*           ET_FIELDCAT_LVC                  =
*           ER_TRACE                         =
*           E_FLG_NO_HTML                    =
*           ES_LAYOUT_KKBLO                  =
*           ES_SEL_HIDE                      =
*           ET_EVENT_EXIT                    =
*           ER_FORM_TOL                      =
*           ER_FORM_EOL                      =
          .
      ENDIF.
      DATA lt_row_id TYPE lvc_t_roid.
      CALL METHOD lr_alv_grid->get_selected_rows
        IMPORTING
*         et_index_rows =
          et_row_no = lt_row_id.

      if lt_row_id is INITIAL.
        MESSAGE '请选择打印数据' TYPE 'I'.
        exit.
        ENDIF.

      LOOP AT lt_row_id INTO DATA(wa_row_id).
        READ TABLE lt_alv INTO wa_alv INDEX wa_row_id-row_id.
        IF sy-subrc = 0.
          APPEND wa_alv TO lt_alv_sel.
        ENDIF.
        CLEAR wa_alv.
        CLEAR wa_row_id.
      ENDLOOP.

*处理选择数据,相同订单、门店、退货日期才可以打印
      SORT lt_alv_sel BY ebeln werks eindt.
      DATA lv_tabix LIKE sy-tabix.
      LOOP AT lt_alv_sel INTO wa_alv.
        lv_tabix = sy-tabix.
        IF lv_tabix <> 1.
          lv_tabix = lv_tabix - 1.
          READ TABLE lt_alv_sel INTO DATA(wa_alv_sel) INDEX lv_tabix.
          IF NOT ( wa_alv_sel-ebeln = wa_alv-ebeln AND wa_alv_sel-werks = wa_alv-werks AND wa_alv_sel-eindt = wa_alv-eindt ).
            flag_error = 'X'.
            MESSAGE '导出数据维度不一致' TYPE 'I'.
            EXIT.
          ENDIF.
        ENDIF.
      ENDLOOP.
*组装smartform参数,调用smartform
      IF flag_error <> 'X'.
        DATA lv_head TYPE zspurchase_head.
        DATA lt_item TYPE TABLE OF zspurchase_item.
        DATA wa_item TYPE zspurchase_item.

        READ TABLE lt_alv_sel INTO wa_alv INDEX 1.
        IF sy-subrc = 0.
          MOVE-CORRESPONDING wa_alv TO lv_head.
        ENDIF.
        CLEAR wa_alv.

        LOOP AT lt_alv_sel INTO wa_alv.
          MOVE-CORRESPONDING wa_alv TO wa_item.
          wa_item-idx = sy-tabix.
          APPEND wa_item TO lt_item.
          CLEAR wa_alv.
          CLEAR wa_item.
        ENDLOOP.

        DATA lv_fm_name TYPE rs38l_fnam.

        CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
          EXPORTING
            formname           = 'ZSMART_F02'
*           VARIANT            = ' '
*           DIRECT_CALL        = ' '
           IMPORTING
            fm_name            = lv_fm_name
          EXCEPTIONS
            no_form            = 1
            no_function_module = 2
            OTHERS             = 3.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        CALL FUNCTION lv_fm_name
          EXPORTING
*           ARCHIVE_INDEX    =
*           ARCHIVE_INDEX_TAB          =
*           ARCHIVE_PARAMETERS         =
*           CONTROL_PARAMETERS         =
*           MAIL_APPL_OBJ    =
*           MAIL_RECIPIENT   =
*           MAIL_SENDER      =
*           OUTPUT_OPTIONS   =
*           USER_SETTINGS    = 'X'
            i_head           = lv_head
*           IMPORTING
*           DOCUMENT_OUTPUT_INFO       =
*           JOB_OUTPUT_INFO  =
*           JOB_OUTPUT_OPTIONS         =
          TABLES
            t_item           = lt_item
          EXCEPTIONS
            formatting_error = 1
            internal_error   = 2
            send_error       = 3
            user_canceled    = 4
            OTHERS           = 5.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.


      ENDIF.
  ENDCASE.

ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值