SAP_ABAP_excel上传功能开发实例

excel上传创建rebates结算单

1,sm38创建程序 ZEXCELUP

2,主程序内容

REPORT ZEXCELUP.
"INCLUDE ZEXCELUP_bapitest.
INCLUDE ZEXCELUP_top.   "定义全局变量
INCLUDE ZEXCELUP_sel.   "用户选择屏幕
INCLUDE ZEXCELUP_pbo.   "PBO 模块
INCLUDE ZEXCELUP_pai.   "PAI 模块
INCLUDE ZEXCELUP_forms"子例程

3,ZEXCELUP_top内容

TYPE-POOLS: slisicon"ALV显示使用的共享池
TABLES:  sscrfields.     "定义表
* NAVP navigation profile declaration
DATA: go_navigation_profile TYPE REF TO if_navp,
      gs_variant_prof       TYPE disvariant,
      gs_profile_key        TYPE  navp_s_profile_key.
* Containers & Grids
DATA: go_container     TYPE REF TO cl_gui_docking_container.
DATA: go_bg_container  TYPE REF TO cl_gui_docking_container"for background processing
DATA: go_grid          TYPE REF TO cl_gui_alv_grid.
DATA: gt_events TYPE cntl_simple_events.
DATA: gs_events LIKE LINE OF gt_events.

DATA: gt_fieldcat       TYPE lvc_t_fcat"Field catalog of the ALV
      gs_fieldcat       TYPE lvc_s_fcat,
      gt_sort           TYPE lvc_t_sort"Sort table for ALV
      gs_sort           TYPE lvc_s_sort,
      gt_filter         TYPE lvc_t_filt,
      gs_filter         TYPE lvc_s_filt,
      gt_excl_functions TYPE ui_functions"to exclude standard functionalities of the ALV toolbar
      gs_layout_alv     TYPE lvc_s_layo"Layout definition of ALV
      gs_variant        TYPE disvariant,
      gs_layout         TYPE disvariant,
      gv_exit           TYPE c,  "set if the user has aborted a layout selection
      gs_spec_layout    TYPE disvariant,    "specific layout
      gv_ok_code        LIKE syst-ucomm,
      gv_repid          LIKE sy-repid,
      gv_return         TYPE c,
      gv_company_text   TYPE t001-butxt,
      gv_save_layout,
      gt_context_own    TYPE ui_functions,  "Context Menu - Own transactions
      gt_context_std    TYPE ui_functions.  "Context Menu - Standard transactions

*选择屏幕按钮
DATA: gs_functxt TYPE smp_dyntxt.

*上传数据内表
DATA: gs_excel TYPE alsmex_tabline,
      gt_excel TYPE TABLE OF alsmex_tabline.
FIELD-SYMBOLS: <gs_excel> TYPE alsmex_tabline.

TYPESBEGIN OF gy_data,
         check_light  TYPE char4,
         create_light TYPE char4.
    INCLUDE STRUCTURE ZEXCELUP_01.
TYPESEND OF gy_data.

DATA: gs_sales_items_in      TYPE bapisditm,
      gs_sales_partners      TYPE bapiparnr,
      gs_sales_conditions_in TYPE bapicond.

DATA: gt_sales_items_in      TYPE STANDARD TABLE OF bapisditm,
      gt_sales_partners      TYPE STANDARD TABLE OF bapiparnr,
      gt_sales_conditions_in TYPE STANDARD TABLE OF bapicond.

DATA:gt_create_return TYPE STANDARD TABLE OF bapiret2,
     gs_create_return TYPE bapiret2.
TYPESBEGIN OF gy_data_create,
         number                TYPE gy_data-number,
         create_vbeln          TYPE vbeln,
         itm_number            TYPE numc06,
         sales_header_in       TYPE bapisdhd1,
         status_buffer_refresh TYPE  bapiflag-bapiflag,

         sales_items_in        LIKE gt_sales_items_in,
         sales_partners        LIKE gt_sales_partners,
         sales_conditions_in   LIKE gt_sales_conditions_in,
         create_return         LIKE gt_create_return.
TYPESEND OF gy_data_create.
DATA: gt_data_create TYPE STANDARD TABLE OF gy_data_create,
      gs_data_create TYPE gy_data_create.

DATA:gt_data TYPE STANDARD TABLE OF gy_data,
     gs_data TYPE gy_data.
FIELD-SYMBOLS:<gs_data> TYPE gy_data.

DATA:gv_check_result  TYPE char1,
     gv_create_result TYPE char1.

4,ZEXCELUP_sel内容

*&---------------------------------------------------------------------*
*& 包含               ZEXCELUP_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-st1.
PARAMETERS: p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK blk1.
**********************************************************************
*** 初始化事件                                                     ***
**********************************************************************
INITIALIZATION.
  PERFORM initial_screen.
**********************************************************************
*** 屏幕输出前事件                                                 ***
**********************************************************************
AT SELECTION-SCREEN OUTPUT.
  "PERFORM modify_screen.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM select_path"选择路径   

AT SELECTION-SCREEN.
  IF sscrfields-ucomm 'FC01'(fc1).
    PERFORM temp_excel_get.    "excel模板下载操作
  "ELSEIF sscrfields-ucomm = 'FC02'(fc2).
    "PERFORM import_data.
  ENDIF.

************************************************************************
*** 开始选择事件                                                     ***
************************************************************************
START-OF-SELECTION.
  PERFORM import_data.
  PERFORM get_data.

END-OF-SELECTION.

  CALL SCREEN '9000'."显示最终结果

4,Zexcelup_pbo内容

*&---------------------------------------------------------------------*
*& 包含               ZEXCELUP_PBO
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Include          ZMM0030_PBO
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
 MODULE status_9000 OUTPUT.
   SET PF-STATUS 'SCREEN_9000'.
   SET TITLEBAR 'TIT_9000'.
 ENDMODULE.                 " STATUS_9000  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  init_control_processing_9000  OUTPUT
*&---------------------------------------------------------------------*
 MODULE init_control_processing_9000 OUTPUT.
   IF cl_gui_alv_grid=>offlineIS INITIAL.
* Creating the Docking Container
     CHECK go_container IS INITIAL.
     CREATE OBJECT go_container
       EXPORTING
         side      = cl_gui_docking_container=>dock_at_bottom
         extension 1200
         repid     = gv_repid
         dynnr     '9000'.
* Creating the grid
     CHECK go_grid IS INITIAL.
     CREATE OBJECT go_grid
       EXPORTING
         i_parent = go_container.
   ELSE.
* >> BACKGROUND (offline) PROCESSING <<
     CHECK go_grid IS INITIAL.
     CREATE OBJECT go_grid
       EXPORTING
         i_parent = go_bg_container.
   ENDIF.

* building & changing the fieldcatalog
   PERFORM create_fieldcatalog.
   PERFORM change_fieldcatalog.

* 默认排序
   PERFORM create_default_sort.
* 默认过滤器
   PERFORM create_default_filter.

   IF cl_gui_alv_grid=>offlineIS INITIAL.
* 需要排除的ALV标准功能按钮.
     PERFORM exclude_toolbar_functions.

* Setting the layout of the ALV Grid
     PERFORM adjust_alv_layout.
   ENDIF.

* calling the used variant from the selection screen
   CLEAR gs_variant.
   MOVE gv_repid TO gs_variant-report.

     CALL METHOD go_grid->set_table_for_first_display
       EXPORTING
         is_variant           = gs_variant
         i_save               = gv_save_layout
         i_default            'X'
         is_layout            = gs_layout_alv
         it_toolbar_excluding = gt_excl_functions[]
       CHANGING
         it_outtab            = gt_data[]
         it_fieldcatalog      = gt_fieldcat[]
         it_sort              = gt_sort[]
         it_filter            = gt_filter[].

 ENDMODULE.                 " init_control_processing_9000  OUTPUT

5,zexcelup_pai内容

*&---------------------------------------------------------------------*
*& 包含               ZEXCELUP_PAI
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
 MODULE user_command_9000 INPUT.
   CASE gv_ok_code.
     WHEN 'CANC' OR 'EXIT' OR 'BACK'.
       CALL METHOD go_grid->free.
       CALL METHOD go_container->free.
       FREE: go_grid, go_container.
       LEAVE TO SCREEN 0.
     WHEN 'CREATE'.
       PERFORM create.

     WHEN OTHERS.
       CALL METHOD cl_gui_cfw=>dispatch.
   ENDCASE.
 ENDMODULE.                 " USER_COMMAND_9000  INPU

6,zexcelup_forms内容

*&---------------------------------------------------------------------*
*& 包含               ZSD0140_FORMS
*&---------------------------------------------------------------------*

FORM get_data.

  DATA: ls_data TYPE gy_data.
  DATA:lv_kunnr TYPE kunnr,
       lv_matnr TYPE matnr18.
  CLEAR:gt_data_create,gv_check_result,gv_create_result.
  IF gt_data IS INITIAL.
    MESSAGE '数据列表为空' TYPE 'E'.
    EXIT.
  ENDIF.
  CLEAR gs_data.
  IF gv_check_result NE 'N'.
    gv_check_result 'X'.
  ENDIF.
  CLEAR: gt_data_create,gs_data,gs_data_create.
  LOOP AT gt_data ASSIGNING <gs_data>.
    IF <gs_data>-check_result NE 'N'.
      <gs_data>-check_result 'X'.
    ELSE.
      CONTINUE.
    ENDIF.
    IF <gs_data>-number IS INITIAL OR <gs_data>-vkorg IS INITIAL OR <gs_data>-auart IS INITIAL OR <gs_data>-vtweg IS INITIAL
    OR <gs_data>-spart IS INITIAL OR <gs_data>-vkbur IS INITIAL OR <gs_data>-vkgrp IS INITIAL OR <gs_data>-kunnr IS INITIAL
    OR <gs_data>-bstnk IS INITIAL OR <gs_data>-matnr IS INITIAL OR <gs_data>-zmeng IS INITIAL OR <gs_data>-price IS INITIAL
      .
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONCATENATE '列表A-L列不能为空' <gs_data>-check_message INTO <gs_data>-check_message.
      CONTINUE.
    ENDIF.

    IF <gs_data>-auart NE 'ZRB'.
      CONCATENATE '订单类型必须为ZRB!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.

    IF <gs_data>-vkorg NE p_vkorg.
      CONCATENATE '所选销售组织不匹配!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.

    IF strlen( <gs_data>-bstnk ) > 35.
      CONCATENATE '客户参考最多只能35个字符!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.


    CLEAR ls_data.
    SELECT SINGLE  vkorg vtweg spart vkbur INTO CORRESPONDING FIELDS OF ls_data FROM tvkbz
      WHERE  tvkbz~vkorg EQ <gs_data>-vkorg AND tvkbz~vtweg EQ <gs_data>-vtweg AND tvkbz~spart EQ <gs_data>-spart AND tvkbz~vkbur EQ <gs_data>-vkbur.
    IF sy-subrc NE 0.
      CONCATENATE '销售范围与销售办公室不匹配!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.

    CLEAR ls_data.
    SELECT SINGLE  vkbur vkgrp INTO CORRESPONDING FIELDS OF ls_data FROM tvbvk
      WHERE  tvbvk~vkbur EQ <gs_data>-vkbur AND tvbvk~vkgrp EQ <gs_data>-vkgrp.
    IF sy-subrc NE 0.
      CONCATENATE '销售办公室与业务员不匹配!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.

    CLEAR ls_data.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_data>-kunnr
      IMPORTING
        output = lv_kunnr.
    SELECT SINGLE  vkorg vtweg spart kunnr INTO CORRESPONDING FIELDS OF ls_data FROM knvv
      WHERE  knvv~vkorg EQ <gs_data>-vkorg AND knvv~vtweg EQ <gs_data>-vtweg AND knvv~spart EQ <gs_data>-spart AND knvv~kunnr EQ lv_kunnr.
    IF sy-subrc NE 0.
      CONCATENATE '销售范围与客户不匹配!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.

    CLEAR ls_data.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs_data>-matnr
      IMPORTING
        output = lv_matnr.
    SELECT SINGLE  matnr vkorg vtweg INTO CORRESPONDING FIELDS OF ls_data FROM mvke
      WHERE  mvke~matnr EQ lv_matnr AND mvke~vkorg EQ <gs_data>-vkorg AND mvke~vtweg EQ <gs_data>-vtweg.
    IF sy-subrc NE 0.
      CONCATENATE '销售范围与物料不匹配!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.
    IF <gs_data>-augru NE '106' AND <gs_data>-augru NE '107' AND <gs_data>-augru NE '108'  AND <gs_data>-augru NE '109' AND <gs_data>-augru NE '110' AND <gs_data>-augru NE '111'.
      CONCATENATE '订单原因不存在!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.
    SELECT SINGLE  vkorg vtweg werks INTO CORRESPONDING FIELDS OF ls_data FROM tvkwz
      WHERE  tvkwz~vkorg EQ <gs_data>-vkorg AND tvkwz~vtweg EQ <gs_data>-vtweg AND tvkwz~werks EQ <gs_data>-werks .
    IF sy-subrc NE 0.
      CONCATENATE '销售范围与工厂不匹配!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.
      <gs_data>-check_result 'N'.
      CONTINUE.
    ENDIF.

    SELECT SINGLE  matnr werks INTO CORRESPONDING FIELDS OF ls_data FROM marc
      WHERE  marc~matnr EQ <gs_data>-matnr AND marc~werks EQ <gs_data>-werks.
    IF sy-subrc NE 0.
      CONCATENATE '物料与工厂不匹配!' <gs_data>-check_message INTO <gs_data>-check_message.
      gv_check_result 'N'.       <gs_data>
-check_result 'N'.       
CONTINUE.     
ENDIF.     
CLEAR: gs_sales_items_in,gs_sales_partners,gs_sales_partners.     gs_sales_items_in
-material = <gs_data>-matnr.     gs_sales_items_in
-target_qty = <gs_data>-zmeng.     gs_sales_items_in
-plant = <gs_data>-werks.     gs_sales_conditions_in

-cond_type 'PR01'.     gs_sales_conditions_in
-cond_value = <gs_data>-price / 10.     gs_sales_conditions_in
-cond_updat 'X'.     

LOOP AT gt_data_create INTO gs_data_create WHERE number EQ <gs_data>-number.       
IF gs_data_create-sales_header_in-doc_type NE <gs_data>-auart OR gs_data_create-sales_header_in-sales_org NE <gs_data>-vkorg OR gs_data_create-sales_header_in-distr_chan NE <gs_data>-vtweg       
OR gs_data_create-sales_header_in-division NE <gs_data>-spart OR gs_data_create-sales_header_in-sales_grp NE <gs_data>-vkgrp OR gs_data_create-sales_header_in-sales_off NE <gs_data>-vkbur       
OR gs_data_create-sales_header_in-ord_reason NE <gs_data>-augru OR gs_data_create-sales_header_in-purch_no_c NE <gs_data>-bstnk.         
CONCATENATE '数据不一致!' <gs_data>-check_message INTO <gs_data>-check_message.         gv_check_result 
'N'.         <gs_data>
-check_result 'N'.         
CONTINUE.       
ENDIF.       

READ TABLE gs_data_create-sales_partners INTO gs_sales_partners WITH KEY partn_numb = <gs_data>-kunnr.       
IF sy-subrc NE 0.         
CONCATENATE '合作伙伴数据不一致!' <gs_data>-check_message INTO <gs_data>-check_message.         gv_check_result 
'N'.         <gs_data>
-check_result 'N'.         
CONTINUE.       
ENDIF.       gs_data_create
-itm_number = gs_data_create-itm_number + 10.       gs_sales_items_in
-itm_number =  gs_data_create-itm_number.       gs_sales_conditions_in
-itm_number = gs_data_create-itm_number.       

APPEND gs_sales_items_in TO gs_data_create-sales_items_in.       
APPEND gs_sales_conditions_in TO gs_data_create-sales_conditions_in.       

MODIFY gt_data_create FROM gs_data_create.     
ENDLOOP.     
"READ TABLE gt_data_create  INTO gs_data_create WITH KEY number = <gs_data>-number.     
IF sy-subrc NE 0.       gs_data_create
-number = <gs_data>-number.       gs_data_create
-itm_number 10.       gs_data_create
-sales_header_in-doc_type = <gs_data>-auart.       gs_data_create
-sales_header_in-sales_org = <gs_data>-vkorg.       gs_data_create
-sales_header_in-distr_chan = <gs_data>-vtweg.       gs_data_create
-sales_header_in-division = <gs_data>-spart.       gs_data_create
-sales_header_in-sales_grp = <gs_data>-vkgrp.       gs_data_create
-sales_header_in-sales_off = <gs_data>-vkbur.       gs_data_create
-sales_header_in-ord_reason = <gs_data>-augru.       gs_data_create
-sales_header_in-purch_no_c = <gs_data>-bstnk.       gs_data_create
-status_buffer_refresh 'X'.       gs_sales_partners

-partn_role 'AG'.       gs_sales_partners
-partn_numb = <gs_data>-kunnr.       gs_sales_items_in

-itm_number =  gs_data_create-itm_number.       gs_sales_conditions_in
-itm_number = gs_data_create-itm_number.       


APPEND gs_sales_items_in TO gs_data_create-sales_items_in.       

APPEND gs_sales_conditions_in TO gs_data_create-sales_conditions_in.       

APPEND gs_sales_partners TO gs_data_create-sales_partners.       


APPEND gs_data_create TO gt_data_create.     
ENDIF.     
CLEAR: gs_sales_items_in,gs_sales_partners,gs_sales_partners.     

CLEAR:gs_data,gs_data_create.   

ENDLOOP.   

CLEAR:gs_data,gs_data_create.   
LOOP AT gt_data ASSIGNING <gs_data>.     
IF <gs_data>-check_result EQ 'X'.       <gs_data>
-check_light '@5B@'.       <gs_data>
-check_message '检查通过'.     
ELSEIF <gs_data>-check_result EQ 'N'.       <gs_data>
-check_light '@5C@'.     
ELSE.       <gs_data>
-check_light ''.     
ENDIF.   
ENDLOOP.
ENDFORM.                    " get_data


*&---------------------------------------------------------------------*
*& Form IMPORT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM import_data.   
CLEAR:gt_data.   
IF p_file IS INITIAL.     
MESSAGE '请选择要上传的文件' TYPE 'W'.   
ELSE.     
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'       
EXPORTING         filename                
= p_file         i_begin_col             
1       "起始列号         i_begin_row             
5       "起始行号         i_end_col               
15      "终止列号         i_end_row               
65535   "终止行号       
TABLES         intern                  
= gt_excel       
EXCEPTIONS         inconsistent_parameters 
1         upload_ole              
2         
OTHERS                  3.     

IF sy-subrc <> 0.       
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno               
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.     
ENDIF.     

IF gt_excel IS INITIAL.       
MESSAGE '清单中无数据'(m04TYPE 'E'.     
ENDIF.     


DATA:       lv_char2 
TYPE char20,       lv_char3 
TYPE char20,       lv_type  
TYPE dd01v-datatype.     

DATA: string(60),           p0
(20)     VALUE '',           p1
(20)     VALUE '',           p2
(20)     VALUE '',           del
(1)     VALUE '.'.
*格式转化     
LOOP AT gt_excel ASSIGNING <gs_excel>.       
"SHIFT <gs_excel>-value LEFT DELETING LEADING space.       
"SHIFT <gs_excel>-value RIGHT DELETING TRAILING space.       
CASE <gs_excel>-col.         
WHEN '0001'.           


CALL FUNCTION 'NUMERIC_CHECK'             
EXPORTING               string_in  
= <gs_excel>-value             
IMPORTING               string_out 
= lv_char2               htype      
= lv_type.           

IF lv_type NE 'NUMC'.             
CONCATENATE '数量必须为整数!' gs_data-check_message INTO gs_data-check_message.             gv_check_result 
'N'.             gs_data
-check_result 'N'.             gs_data
-number ''."序号           
ELSE.             gs_data
-number = <gs_excel>-value."序号           
ENDIF.         

WHEN '0002'.           gs_data
-auart = <gs_excel>-value."订单类型         
WHEN '0003'.           gs_data
-vkorg = <gs_excel>-value."销售组织         
WHEN '0004'.           gs_data
-vtweg = <gs_excel>-value."分销渠道         
WHEN '0005'.           gs_data
-spart = <gs_excel>-value."产品组         
WHEN '0006'.           gs_data
-vkbur = <gs_excel>-value."销售办室         
WHEN '0007'.           gs_data
-vkgrp = <gs_excel>-value."业务员         
WHEN '0008'.           gs_data
-kunnr = <gs_excel>-value."客户编码           
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'             
EXPORTING               
input  = gs_data-kunnr             
IMPORTING               
output = gs_data-kunnr.         
WHEN '0009'.           gs_data
-bstnk = <gs_excel>-value."客户参考         
WHEN '0010'.           gs_data
-matnr = <gs_excel>-value."物料编码           
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'             
EXPORTING               
input  = gs_data-matnr             
IMPORTING               
output = gs_data-matnr.         

WHEN '0011'.           

CALL FUNCTION 'NUMERIC_CHECK'             
EXPORTING               string_in  
= <gs_excel>-value             
IMPORTING               string_out 
= lv_char3               htype      
= lv_type.           

IF lv_type NE 'NUMC'.             
CONCATENATE '数量必须为整数!' gs_data-check_message INTO gs_data-check_message.             gv_check_result 
'N'.             gs_data
-check_result 'N'.             gs_data
-zmeng ''."数量           
ELSE.             gs_data
-zmeng = <gs_excel>-value."数量           
ENDIF.         
WHEN '0012'.           p0 
= <gs_excel>-value.           
SPLIT p0 AT del INTO p1 p2.           

CALL FUNCTION 'NUMERIC_CHECK'             
EXPORTING               string_in  
= p1             
IMPORTING               string_out 
= lv_char3               htype      
= lv_type.           
IF lv_type NE 'NUMC'.             
CONCATENATE 'PR01价格只能保留两位小数' gs_data-check_message INTO gs_data-check_message.             gv_check_result 
'N'.             gs_data
-check_result 'N'.             gs_data
-price ''."数量           
ELSE.             
CALL FUNCTION 'NUMERIC_CHECK'               
EXPORTING                 string_in  
= p2               
IMPORTING                 string_out 
= lv_char3                 htype      
= lv_type.             

IF lv_type NE 'NUMC'.               
CONCATENATE 'PR01价格只能保留两位小数' gs_data-check_message INTO gs_data-check_message.               gv_check_result 
'N'.               gs_data
-check_result 'N'.               gs_data
-price ''."数量             
ELSE.               
IF strlen( p2 ) > 2.                 
CONCATENATE 'PR01价格只能保留两位小数!' <gs_data>-check_message INTO <gs_data>-check_message.                 gv_check_result 
'N'.                 <gs_data>
-check_result 'N'.                 gs_data
-price 0."价格               
ELSE.                 gs_data
-price = <gs_excel>-value."价格                 
"gs_data-price =  gs_data-price / 10.               
ENDIF.             
ENDIF.           
ENDIF.         
WHEN '0013'.           gs_data
-augru = <gs_excel>-value."订单原因         
WHEN '0014'.           gs_data
-werks = <gs_excel>-value."工厂       

ENDCASE.       
AT END OF row.         
APPEND gs_data TO gt_data.         
CLEAR gs_data.       
ENDAT.     
ENDLOOP.     

IF gt_data IS NOT INITIAL.       

IF sy-subrc EQ 0.         
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'           
EXPORTING             
wait 'X'.         
MESSAGE '上传数据成功'(m05TYPE 'S'.       
ELSE.         
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.         
MESSAGE '上传数据失败'(m06TYPE 'W'.       
ENDIF.     
ENDIF.   
ENDIF.
ENDFORM.



*&---------------------------------------------------------------------*
*&      Form  create_fieldcatalog
*&---------------------------------------------------------------------*
FORM change_fieldcatalog.   
LOOP AT gt_fieldcat INTO gs_fieldcat.     
CASE gs_fieldcat-fieldname.       
WHEN 'NUMBER'(f01).         gs_fieldcat
-col_pos 1.         gs_fieldcat
-edit = abap_false.         gs_fieldcat
-scrtext_l '序号'(t01).         gs_fieldcat
-scrtext_m '序号'(t01).         gs_fieldcat
-scrtext_s '序号'(t01).         gs_fieldcat
-reptext   '序号'(t01).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'AUART'(f25).         gs_fieldcat
-col_pos 5.         gs_fieldcat
-scrtext_l '订单类型'(t25).         gs_fieldcat
-scrtext_m '订单类型'(t25).         gs_fieldcat
-scrtext_s '订单类型'(t25).         gs_fieldcat
-reptext   '订单类型'(t25).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'VKORG'(f02).         gs_fieldcat
-col_pos 10.         gs_fieldcat
-scrtext_l '销售组织'(t02).         gs_fieldcat
-scrtext_m '销售组织'(t02).         gs_fieldcat
-scrtext_s '销售组织'(t02).         gs_fieldcat
-reptext   '销售组织'(t02).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'AUART'(f26).         gs_fieldcat
-col_pos 15.         gs_fieldcat
-scrtext_l '分销渠道'(t26).         gs_fieldcat
-scrtext_m '分销渠道'(t26).         gs_fieldcat
-scrtext_s '分销渠道'(t26).         gs_fieldcat
-reptext   '分销渠道'(t26).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'VTWEG'(f03).         gs_fieldcat
-col_pos 20.         gs_fieldcat
-scrtext_l '分销渠道'(t03).         gs_fieldcat
-scrtext_m '分销渠道'(t03).         gs_fieldcat
-scrtext_s '分销渠道'(t03).         gs_fieldcat
-reptext   '分销渠道'(t03).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'SPART'(f04).         gs_fieldcat
-col_pos 25.         gs_fieldcat
-scrtext_l '产品组'(t04).         gs_fieldcat
-scrtext_m '产品组'(t04).         gs_fieldcat
-scrtext_s '产品组'(t04).         gs_fieldcat
-reptext   '产品组'(t04).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'VKBUR'(f05).         gs_fieldcat
-col_pos 30.         gs_fieldcat
-scrtext_l '销售办公室'(t05).         gs_fieldcat
-scrtext_m '销售办公室'(t05).         gs_fieldcat
-scrtext_s '销售办公室'(t05).         gs_fieldcat
-reptext   '销售办公室'(t05).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'VKGRP'(f06).         gs_fieldcat
-col_pos 35.         gs_fieldcat
-scrtext_l '业务员'(t06).         gs_fieldcat
-scrtext_m '业务员'(t06).         gs_fieldcat
-scrtext_s '业务员'(t06).         gs_fieldcat
-reptext   '业务员'(t06).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'KUNNR'(f06).         gs_fieldcat
-scrtext_l '客户编码'(t06).         gs_fieldcat
-scrtext_m '客户编码'(t06).         gs_fieldcat
-scrtext_s '客户编码'(t06).         gs_fieldcat
-reptext   '客户编码'(t06).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'BSTNK'(f07).         gs_fieldcat
-col_pos 40.         gs_fieldcat
-scrtext_l '客户参考'(t07).         gs_fieldcat
-scrtext_m '客户参考'(t07).         gs_fieldcat
-scrtext_s '客户参考'(t07).         gs_fieldcat
-reptext   '客户参考'(t07).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'MATNR'(f08).         gs_fieldcat
-col_pos 45.         gs_fieldcat
-scrtext_l '物料编码'(t08).         gs_fieldcat
-scrtext_m '物料编码'(t08).         gs_fieldcat
-scrtext_s '物料编码'(t08).         gs_fieldcat
-reptext   '物料编码'(t08).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'ZMENG'(f09).         gs_fieldcat
-col_pos 50.         gs_fieldcat
-scrtext_l '数量'(t09).         gs_fieldcat
-scrtext_m '数量'(t09).         gs_fieldcat
-scrtext_s '数量'(t09).         gs_fieldcat
-reptext   '数量'(t09).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'PRICE'(f10).         gs_fieldcat
-col_pos 55.         gs_fieldcat
-scrtext_l '价格'(t10).         gs_fieldcat
-scrtext_m '价格'(t10).         gs_fieldcat
-scrtext_s '价格'(t10).         gs_fieldcat
-reptext   '价格'(t10).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'AUGRU'(f11).         gs_fieldcat
-col_pos 60.         gs_fieldcat
-scrtext_l '订单原因'(t11).         gs_fieldcat
-scrtext_m '订单原因'(t11).         gs_fieldcat
-scrtext_s '订单原因'(t11).         gs_fieldcat
-reptext   '订单原因'(t11).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'WERKS'(f11).         gs_fieldcat
-col_pos 61.         gs_fieldcat
-scrtext_l '工厂'(t11).         gs_fieldcat
-scrtext_m '工厂'(t11).         gs_fieldcat
-scrtext_s '工厂'(t11).         gs_fieldcat
-reptext   '工厂'(t11).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'CHECK_LIGHT'(f12).         gs_fieldcat
-col_pos 65.         gs_fieldcat
-scrtext_l '检查结果'(t12).         gs_fieldcat
-scrtext_m '检查结果'(t12).         gs_fieldcat
-scrtext_s '检查结果'(t12).         gs_fieldcat
-reptext   '检查结果'(t12).         gs_fieldcat
-just 'C'.         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'CHECK_MESSAGE'(f12).         gs_fieldcat
-col_pos 70.         gs_fieldcat
-scrtext_l '检查信息'(t12).         gs_fieldcat
-scrtext_m '检查信息'(t12).         gs_fieldcat
-scrtext_s '检查信息'(t12).         gs_fieldcat
-reptext   '检查信息'(t12).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'CREATE_LIGHT'(f13).         gs_fieldcat
-col_pos 75.         gs_fieldcat
-scrtext_l '执行结果'(t13).         gs_fieldcat
-scrtext_m '执行结果'(t13).         gs_fieldcat
-scrtext_s '执行结果'(t13).         gs_fieldcat
-reptext   '执行结果'(t13).         gs_fieldcat
-just 'C'.         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'CREATE_MESSAGE'(f13).         gs_fieldcat
-col_pos 80.         gs_fieldcat
-scrtext_l '执行信息'(t13).         gs_fieldcat
-scrtext_m '执行信息'(t13).         gs_fieldcat
-scrtext_s '执行信息'(t13).         gs_fieldcat
-reptext   '执行信息'(t13).         
MODIFY gt_fieldcat FROM gs_fieldcat.       
WHEN 'VBELN'(f14).         gs_fieldcat
-col_pos 85.         gs_fieldcat
-scrtext_l '订单号'(t14).         gs_fieldcat
-scrtext_m '订单号'(t14).         gs_fieldcat
-scrtext_s '订单号'(t14).         gs_fieldcat
-reptext   '订单号'(t14).         
MODIFY gt_fieldcat FROM gs_fieldcat.       

WHEN OTHERS.         gs_fieldcat
-no_out = abap_true.         
MODIFY gt_fieldcat FROM gs_fieldcat.     
ENDCASE.   
ENDLOOP.
ENDFORM.                    " change_fieldcatalog



*&---------------------------------------------------------------------*
*&      Form  create_fieldcatalog
*&---------------------------------------------------------------------*
FORM create_fieldcatalog.   
DATA: lv_structure_name TYPE dd02l-tabname.   lv_structure_name 
'ZSD0140_01'.   
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'     
EXPORTING       i_structure_name   
= lv_structure_name       i_bypassing_buffer 
'X'  "if you set the i_bypassing_buffer to ' '     
CHANGING       ct_fieldcat        
= gt_fieldcat[].                                                                                                                 "changes to the DDIC structure will not be   

CLEAR: gs_fieldcat.   gs_fieldcat
-col_pos '100'.   gs_fieldcat
-tabname '1'.   gs_fieldcat
-fieldname 'CHECK_LIGHT'.   gs_fieldcat
-datatype 'CHAR'.   gs_fieldcat
-inttype 'C'.   gs_fieldcat
-domname 'CHAR4'.   gs_fieldcat
-intlen '4'.   
APPEND gs_fieldcat TO gt_fieldcat.   

CLEAR: gs_fieldcat.   gs_fieldcat
-col_pos '100'.   gs_fieldcat
-tabname '1'.   gs_fieldcat
-fieldname 'CREATE_LIGHT'.   gs_fieldcat
-datatype 'CHAR'.   gs_fieldcat
-inttype 'C'.   gs_fieldcat
-domname 'CHAR4'.   gs_fieldcat
-intlen '4'.   
APPEND gs_fieldcat TO gt_fieldcat.
ENDFORM.                    " create_fieldcatalog

*&---------------------------------------------------------------------*
*& Form INITIAL_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM initial_screen .   
DATA: lv_message TYPE char50.   gv_repid          
= sy-repid.        "这个存储程序名字的   gv_save_layout    
'A'.             "这个是决定用户是否可以保存变式的,A代表都可以保存   gs_functxt

-icon_id   = icon_export.   gs_functxt
-quickinfo '模版下载'(fc3).   gs_functxt
-icon_text '模版下载'(fc3).   sscrfields
-functxt_01 = gs_functxt.

*  gs_functxt-icon_id   = icon_import.
*  gs_functxt-quickinfo = '上传数据'(fc4).
*  gs_functxt-icon_text = '上传数据'(fc4).
*  sscrfields-functxt_02 = gs_functxt.   

AUTHORITY-CHECK OBJECT 'V_VBAK_VKO'    
ID 'VKORG' FIELD p_vkorg.   

IF sy-subrc <> 0.     
CLEAR: lv_message.     
CONCATENATE'你没有权限查看销售组织' p_vkorg INTO lv_message.     
MESSAGE: lv_message TYPE 'W'.   
ENDIF.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form SELECT_PATH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM select_path .   
DATA lv_file LIKE rlgrap-filename.   
CALL FUNCTION 'WS_FILENAME_GET'     
EXPORTING       
mask             ',Excel Files,*.xls,All Files,*.*.'(t03)       
mode             '0'       
title            '请选择要上传的信息文件'(t04)     
IMPORTING       filename         
= lv_file     
EXCEPTIONS       inv_winsys       
1       no_batch         
2       selection_cancel 
3       selection_error  
4       
OTHERS           5.   
IF sy-subrc <> 0.   

ENDIF.   p_file 

= lv_file.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form TEMP_EXCEL_GET
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM temp_excel_get .   
DATA: l_objdata     LIKE wwwdatatab,         l_destination 
LIKE rlgrap-filename,         l_rc          
LIKE sy-subrc,         l_errtxt      
TYPE string.   
DATA: l_fullpath TYPE string,         l_fname    
LIKE rlgrap-filename,         l_formkey  
LIKE  wwwdatatab.   

PERFORM get_file_name USING '.xls'                               
'Excel|*.xls;'                      
CHANGING l_fullpath.   
IF l_fullpath = space.     
MESSAGE '请选择下载文件名'(m01TYPE 'E'.   
ELSE.     
CONCATENATE l_fullpath '' INTO l_fname.     
SELECT SINGLE relid objid       
FROM wwwdata       
INTO CORRESPONDING FIELDS OF l_objdata       
WHERE relid 'MI'         
AND objid text-fn1.

"下载文件TEXT-FN1是通过SMW0上传后确定对象名称。    

IF sy-subrc NE OR l_objdata-objid = space.       
MESSAGE e001(00WITH '文件不存在!'(m02).     
ELSE.       
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'         
EXPORTING           
key         = l_objdata           destination 
= l_fname         
IMPORTING           rc          
= l_rc         
CHANGING           temp        
= l_fname.       
IF l_rc NE 0.         
MESSAGE e001(00WITH '文件下载失败!'(m03).       
ENDIF.     
ENDIF.   
ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form GET_FILE_NAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_       text
*      -->P_       text
*      <--P_L_FULLPATH  text
*&---------------------------------------------------------------------*
FORM get_file_name  USING p_extension p_file_filter                     
CHANGING p_fullpath.   

DATA: l_filename TYPE string,         l_path     
TYPE string,         l_fullpath 
TYPE string,         l_titile   
TYPE string,         l_init_dir 
TYPE string.   

CLEAR p_fullpath.   
CALL METHOD cl_gui_frontend_services=>file_save_dialog     
EXPORTING       window_title         
= l_titile       default_extension    
'.xls'       initial_directory    
= l_init_dir       prompt_on_overwrite  
'X'       file_filter          
= p_file_filter     
CHANGING       filename             
= l_filename       path                 
= l_path       fullpath             
= l_fullpath     
EXCEPTIONS       cntl_error           
1       error_no_gui         
2       not_supported_by_gui 
3       
OTHERS               4.   
IF sy-subrc <> 0.     
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno           
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.   
ENDIF.   p_fullpath 
= l_fullpath.
ENDFORM.






*&---------------------------------------------------------------------*
*&      Form  EXCLUDE_TOOLBAR_FUNCTIONS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM exclude_toolbar_functions .   
FREE: gt_excl_functions.

* 需要排除的ALV标准功能按钮   
APPEND cl_gui_alv_grid=>mc_fc_graph TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_fc_help TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_style_no_delete_row TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_fg_edit TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_ly_no_delete_rows TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_ly_no_insert_rows TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_lystyle_no_delete_rows TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_lystyle_no_insert_rows TO gt_excl_functions.   
APPEND cl_gui_alv_grid=>mc_fc_unfix_columns TO gt_excl_functions.
ENDFORM.                    " EXCLUDE_TOOLBAR_FUNCTIONS

*&---------------------------------------------------------------------*
*&      Form  ADJUST_ALV_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM adjust_alv_layout .   
CLEAR: gs_layout_alv.   gs_layout_alv

-sel_mode 'A'.    "行选择模式   gs_layout_alv
-zebra 'X'.       "设置有条纹   gs_layout_alv
-cwidth_opt 'X'.  "优化grid列宽度的

ENDFORM.                    " ADJUST_ALV_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  CREATE_DEFAULT_FILTER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM create_default_filter .

ENDFORM.                    " CREATE_DEFAULT_FILTER

*&---------------------------------------------------------------------*
*&      Form  CREATE_DEFAULT_SORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM create_default_sort .

ENDFORM.                    " CREATE_DEFAULT_SORT
*&---------------------------------------------------------------------*
*& Form CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM create .   

DATA:lv_create_result  TYPE char1,        lv_create_message 
TYPE char200.   


IF gv_check_result NE 'X'.     
MESSAGE '数据检查报错,无法创建' TYPE 'E'.     
EXIT.   
ENDIF.   

IF gv_create_result EQ 'E'.     
MESSAGE '执行结果报错,无法提交' TYPE 'E'.     
EXIT.   
ENDIF.   

IF gv_create_result EQ 'S'.     
MESSAGE '数据已经提交成功,不要复执行' TYPE 'E'.     
EXIT.   
ENDIF.   gv_create_result 

'S'.   
CLEAR:gs_data_create.   

CLEAR:lv_create_result,lv_create_message.   
LOOP AT gt_data_create INTO gs_data_create.     
CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'       
EXPORTING         sales_header_in     
= gs_data_create-sales_header_in       
IMPORTING         salesdocument_ex    
= gs_data_create-create_vbeln       
TABLES         sales_items_in      
= gs_data_create-sales_items_in         sales_partners      
= gs_data_create-sales_partners         sales_conditions_in 
= gs_data_create-sales_conditions_in         
return              = gs_data_create-create_return.     

LOOP AT gs_data_create-create_return INTO gs_create_return.       
IF gs_create_return-type EQ 'S'.         
IF lv_create_result NE 'E'.           lv_create_result 
'S'.         
ENDIF.       
ENDIF.       
IF gs_create_return-type EQ 'E'.         lv_create_result 
'E'.         

CONCATENATE gs_create_return-message lv_create_message INTO lv_create_message.       
ENDIF.     
ENDLOOP.     

LOOP AT gt_data ASSIGNING <gs_data> WHERE number EQ gs_data_create-number.       
IF lv_create_result EQ 'E'.         <gs_data>
-create_result 'E'.         <gs_data>
-create_light '@5C@'.         <gs_data>
-create_message = lv_create_message.       
ELSEIF lv_create_result EQ 'S'.         <gs_data>
-create_result 'S'.         <gs_data>
-create_light '@5B@'.         <gs_data>
-vbeln = gs_data_create-create_vbeln.         <gs_data>
-create_message '执行成功'.       
ENDIF.     
ENDLOOP.     
IF lv_create_result EQ 'E'.       gv_create_result 
'E'.     
ENDIF.     

CLEAR:lv_create_result,lv_create_message.   
ENDLOOP.
*
*  CALL METHOD go_grid->set_table_for_first_display
*    EXPORTING
*      is_variant           = gs_variant
*      i_save               = gv_save_layout
*      i_default            = 'X'
*      is_layout            = gs_layout_alv
*      it_toolbar_excluding = gt_excl_functions[]
*    CHANGING
*      it_outtab            = gt_data[]
*      it_fieldcatalog      = gt_fieldcat[]
*      it_sort              = gt_sort[]
*      it_filter            = gt_filter[].   

CALL METHOD go_grid->refresh_table_display.   
IF gv_create_result EQ 'S'.     
COMMIT WORK.     
MESSAGE '执行成功' TYPE 'S'.   
ELSE.     
MESSAGE '执行失败' TYPE 'E'.   
ENDIF.



ENDFORM.

posted @ 2018-11-12 23:00  cyberpunk_blog  阅读(3)  评论(0)    收藏  举报