ABAP 订单-交货单-发货过账自动完成 案例

*&---------------------------------------------------------------------*
*& Report  ZSDR006
*&
*&---------------------------------------------------------------------*
*&程序名称:
*&事物代码
*&导入模板:
*&作者
*&时间
*&---------------------------------------------------------------------*
REPORT zsdr006_1 MESSAGE-ID 00.
TYPE-POOLS:ole2,slis,icon.
FIELD-SYMBOLS: <fs>.

TABLES: sscrfields,ztsd014,ztsd015,mchb,t001l.

TYPESBEGIN OF ty_output,
         sel       TYPE c,
         batno     TYPE ztsd015-batno"批导序号
         batpo     TYPE ztsd015-batpo"验单批导序号
         verno     TYPE ztsd016-verno"版本号
         indat     TYPE ztsd015-indat"日期
*         KUNNR     TYPE KUNNR, "客户号
*         NAME1     TYPE KNA1-NAME1, "客户名称
         lgort     TYPE lgort_d"库存地点
         lgobe     TYPE lgobe"库存地点描述
         matnr     TYPE ztsd015-matnr"物料号
         maktx     TYPE makt-maktx"物料描述
         menge     TYPE ztsd015-menge"退货数量
         meins     TYPE meins"数量单位
         zsl1      TYPE menge_d,
         zdw1      TYPE meins,
*         CHARG     TYPE CHARG_D, "批次
*         ZYDJG     TYPE ZTSD009-ZYDJG, "验单价格
*         ZYDDH     TYPE ZTSD009-ZYDDH, "验单单号
         zthdd     TYPE ztsd016-zthdd"退货订单
         zthdn     TYPE likp-vbeln"退货发货单号
         zmfck     TYPE ztsd016-zmfck"免费出库订单
         zdn       TYPE ztsd015-zdn"免费出库交货单
         zstat     TYPE ztsd015-zstat"退货已过帐
         ztext     TYPE char10"状态描述
         zicon1    TYPE char4"导入状态
*         VKBUR     TYPE VKBUR, "销售部门
*         BEZEI TYPE TVKBT-BEZEI, "销售部门描述
         shpto     TYPE kunnr"送达方
         name2     TYPE kna1-name1,
         sldto     TYPE kunnr"售达方
         name3     TYPE kna1-name1,
         zyddh(35)"验单单号
         zthlx     TYPE zthlx"退货类型
         zthms     TYPE char4"退货类型描述
         augru     TYPE augru"退货原因
         zthyy     TYPE ztsd015-zthyy"退货原因
         cellcolor TYPE lvc_t_scol"控制单元格颜色
         style     TYPE lvc_t_styl"控制单元格可否编辑
         zddjg     TYPE kbetr_kond"订单价格
         zddje     TYPE kbetr_kond"总金额
         zr        TYPE char30"主任
         zywy      TYPE char30"业务员
         pstyv     TYPE lips-pstyv"交货项目类型

         mssg      TYPE bapi_msg"消息内容
         zuser     TYPE ztsd014-zuser,
         zdate     TYPE ztsd014-zdate,
         wbstk1    TYPE vbuk-wbstk"货物移动状态1
         fkstk1    TYPE vbuk-fkstk"开票状态
         fkstk2    TYPE vbuk-fkstk"开票状态
         wbstk2    TYPE vbuk-wbstk"货物移动状态
         key       TYPE char15,
         budat     TYPE mkpf-budat,

       END OF ty_output.

TYPESBEGIN OF ty_load,
         indat TYPE ztsd015-indat"日期 1
         sldto TYPE kunnr"售达方       2
         shpto TYPE kunnr"送达方       3
         zywy  TYPE char30"业务员     4
         zr    TYPE char30"主任       5
         zyddh TYPE char35"退单单号   6
         augru TYPE tvau-augru"退货原因编码     7
         lgort TYPE lgort_d"库存地 点        8
         pstyv TYPE lips-pstyv"交货项目类型   9
         matnr TYPE ztsd015-matnr"物料编码   10
         menge TYPE menge_d"退货数量           11
         meins TYPE meins"数量单位               12
         zddjg TYPE kbetr_kond"订单价格    13
         zddje TYPE kbetr_kond"订单金额    14
         budat TYPE mkpf-budat,
       END OF ty_load.

TYPESBEGIN OF ty_sodata,
*         ZYDDH TYPE ZTSD009-ZYDDH, "验单单号
         zstring   TYPE string,
         indat     TYPE ztsd009-indat,
*         KUNNR TYPE KNA1-KUNNR,
         shpto     TYPE kunnr,
         sldto     TYPE kunnr,

         vkorg     TYPE vbak-vkorg"销售组织
         vtweg     TYPE vbak-vtweg"分销渠道
         spart     TYPE vbak-spart"产品组
         vkgrp     TYPE vbak-vkgrp"销售组
         vsbed     TYPE knvv-vsbed"装运条件
         augru     TYPE tvau-augru"退货原因编码

         vkbur     TYPE vbak-vkbur"销售部门
         matnr     TYPE ekpo-matnr"物料代码

         lgort     TYPE ekpo-lgort"收货库存地点 8
         werks     TYPE vbap-werks"
         menge     TYPE menge_d"数量
         meins     TYPE meins"单位
         charg     TYPE charg_d"批次
*         ZDDJG TYPE ZTSD015-ZDDJG, "退货价格
         zddje     TYPE ztsd015-zddje"退货价格
         batno     TYPE ztsd015-batno"批导序号
         batpo     TYPE ztsd015-batpo"批导行项目号
         pstyv     TYPE lips-pstyv"交货项目类型
         zyddh(35)"验单单号

         so        TYPE vbak-vbeln"销售订单号
         zdn       TYPE likp-vbeln"交货单号
*         SO1   TYPE VBAK-VBELN, "销售订单号
*         ZDN1  TYPE LIKP-VBELN, "交货单号
         kpein     TYPE komv-kpein"条件定价单位
         kmein     TYPE komv-kmein"条件单位
         key       TYPE char15,
         budat     TYPE mkpf-budat,
       END OF ty_sodata.

TYPES:  BEGIN OF typ_header,
          ztext(10),
        END OF typ_header.
TYPESBEGIN OF ty_charg,
         charg TYPE mchb-charg,
         clabs TYPE mchb-clabs,
       END OF ty_charg.

TYPESBEGIN OF ty_dn,
         kunnr TYPE kunnr,
         matnr TYPE matnr,
         lgort TYPE lgort_d,
         werks TYPE werks,
         charg TYPE charg_d.
TYPES END OF ty_dn.

TYPESBEGIN OF ty_mesg,
         mesg TYPE char255,
       END OF ty_mesg.

DATABEGIN OF gt_batno OCCURS 0,
        batno TYPE zbatno,
        batpo TYPE zbatpo,
      END OF gt_batno.
DATA: gt_mesg TYPE TABLE OF ty_mesg,
      gs_mesg TYPE ty_mesg.

DATA : gt_exclude TYPE ui_functions.

DATA: gs_layout    TYPE lvc_s_layo,
      gs_cellcolor TYPE lvc_s_scol,
      gs_style     TYPE lvc_s_styl,
      gs_stable    TYPE lvc_s_stbl,
      gs_variant   TYPE disvariant,
      gt_structure TYPE lvc_t_fcat,
      gs_structure TYPE lvc_s_fcat.

DATA: itab TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
DATA: gt_load   TYPE STANDARD TABLE OF ty_load,
      gt_output TYPE TABLE OF ty_output,
      gt_sodata TYPE TABLE OF ty_sodata,
      gt_charg  TYPE TABLE OF ty_charg,
      gs_charg  TYPE ty_charg,

      gt_f4     TYPE lvc_t_f4,
      gs_f4     TYPE lvc_s_f4.

DATA: gs_load   TYPE ty_load,
      gs_output TYPE ty_output,
      gs_sodata TYPE ty_sodata.

DATA: gds_bdcdata TYPE bdcdata,       gdt_bdcdata 
TYPE TABLE OF bdcdata.
DATA: gds_messtab TYPE bdcmsgcoll,       gdt_messtab 
TYPE TABLE OF  bdcmsgcoll.
DATA: g_message TYPE balmsgtxtp.
DATA: gds_return TYPE bapiret2,       gdt_return 
TYPE TABLE OF bapiret2.
DATA: g_check_auth TYPE c.

DATA:gt_knvp TYPE knvp OCCURS 0,      gs_knvp 
TYPE knvp.

DATA: status_buff_init      TYPE VALUE 'X',       call_activity
(4),                " Aktiver Aufrufer bei Call       g_no_dequeue_sd_sales 
TYPE c.

*DATA P_MODE TYPE C VALUE 'N'.
DATA: gv_charg TYPE charg_d VALUE 'INISTOCK'."期初库存批次
DATA: gv_charg1 TYPE charg_d VALUE 'A999999999'."期初库存批次

DATA:      gt_header TYPE STANDARD TABLE OF typ_header,            gs_header 
TYPE typ_header.

CLASS gc_event_receiver DEFINITION DEFERRED.
*   Define objects used in screen
*DATA: GCTR_ALV TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA:   gctr_alv 
TYPE REF TO cl_gui_docking_container,   gct_alv  
TYPE REF TO cl_gui_alv_grid,   g_event  
TYPE REF TO gc_event_receiver.

DATA:p_filepath TYPE string.

DATA: me TYPE REF TO cl_akb_progress_indicator.

CONSTANTS: c_yes      TYPE VALUE 'X'.
*DATA:      C_PATH      TYPE RLGRAP-FILENAME VALUE 'C:\TMP\财务批导模板.xls',
DATA:      c_path      TYPE string VALUE 'C:\TMP\',            c_fullpath  
TYPE string VALUE 'C:\TMP\退货批导模板.xls',            c_filename  
TYPE string VALUE '退货批导模板.xls',            user_action 
TYPE i,            
encoding    TYPE abap_encoding.
*定义OLE变量
DATA:g_excel    TYPE ole2_object,      g_applica  
TYPE ole2_object,      g_sheet    
TYPE ole2_object,      g_cell     
TYPE ole2_object,      g_workbook 
TYPE ole2_object.

FIELD-SYMBOLS:<wa_data>   TYPE ty_output,               <wa_sodata> 
TYPE ty_sodata.

*----------------------------------------------------------------
*       SELECTION-SCREEN DEFINITION
*----------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_ufile LIKE rlgrap-filename MODIF ID m1."上传文件路径
SELECT-OPTIONS:                 s_lgort 
FOR t001l-lgort MODIF ID m2,"库存地点                 s_indat 
FOR ztsd015-indat MODIF ID m2,"退货日期                 s_zdate 
FOR ztsd014-zdate MODIF ID m2,"导入日期                 s_batno 
FOR ztsd015-batno MODIF ID m2 NO-DISPLAY,"批导编号                 s_zuser 
FOR ztsd014-zuser MODIF ID m2,"导入人                 s_sndto 
FOR ztsd015-shpto MODIF ID m2,"送达方                 s_selto 
FOR ztsd015-sldto MODIF ID m2,"客户编号                 s_matnr 
FOR ztsd015-matnr MODIF ID m2,"物料编号                 s_zyddh 
FOR ztsd015-zyddh LOWER CASE MODIF ID m2,"验单单号                 s_zthdd 
FOR ztsd015-zthdd MODIF ID m3,"退货订单                 s_zmfck 
FOR ztsd015-zmfck MODIF ID m3,"免费出库订单                 s_zthdn 
FOR ztsd015-zthdn MODIF ID m3."退货交货单
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREENFUNCTION KEY 1.   "激活按钮

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: r1 RADIOBUTTON GROUP rg1 USER-COMMAND fcode DEFAULT 'X'"上传批导             r2 
RADIOBUTTON GROUP rg1"退货审批             r3 
RADIOBUTTON GROUP rg1 MODIF ID m4 "免费发货             r6 
RADIOBUTTON GROUP rg1 "查询             
"
SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE title.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: r4 RADIOBUTTON GROUP rg2 USER-COMMAND fcode DEFAULT 'X' MODIF ID m5."实退
SELECTION-SCREEN COMMENT (5text-004 FOR FIELD r4.
PARAMETERS: r5 RADIOBUTTON GROUP rg2."空退
SELECTION-SCREEN COMMENT (5text-005 FOR FIELD r5."空退
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b3.

SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE title4.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: r7 RADIOBUTTON GROUP rg3 USER-COMMAND fcode."石家庄
SELECTION-SCREEN COMMENT (8text-007 FOR FIELD r7.
PARAMETERS: r8 RADIOBUTTON GROUP rg3 DEFAULT 'X'."外阜
SELECTION-SCREEN COMMENT (8text-008 FOR FIELD r8."
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b4.

*----------------------------------------------------------------------*
*        INITIALIZATION                                           *
*----------------------------------------------------------------------*
INITIALIZATION.   sscrfields
-functxt_01 '下载模板'.    "定义按钮文本   
title '退货类型'.   title4 
'业务类型'.

*----------------------------------------------------------------------*
*        AT SELECTION-SCREEN                                           *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.   
CASE sscrfields-ucomm.          "处理按钮命令     
WHEN'FC01'.       
PERFORM frm_download_template.   

ENDCASE.

AT SELECTION-SCREEN OUTPUT.   

IF r7 EQ 'X'.     
SUBMIT zsdr006     
WITH p_ufile = p_ufile     
WITH r1 = r1     
WITH r2 = r2     
WITH r3 = r3     
WITH r4 = r4     
WITH r5 = r5     
WITH r6 = r6     VIA 
SELECTION-SCREEN.   
ENDIF.   

LOOP AT SCREEN.     
CASE screen-group1.       
WHEN 'M1'.         
IF r1 EQ 'X'.           
screen-active 1.         
ELSE.           
screen-active 0.         
ENDIF.         
MODIFY SCREEN.       
WHEN 'M2'.         
IF ( r2 EQ 'X' OR r6 EQ 'X' OR ( r3 EQ 'X' AND r5 EQ 'X' ).           
screen-active 1.         
ELSE.           
screen-active 0.         
ENDIF.         
MODIFY SCREEN.       

WHEN 'M3'.         
IF r5 EQ 'X' AND r3 EQ 'X'.           
screen-active 1.         
ELSE.           
screen-active 0.         
ENDIF.         
MODIFY SCREEN.       
WHEN 'M4'.         
IF r5 EQ 'X'.           
screen-input 1.         
ELSE.           
screen-input 0.         
ENDIF.         
MODIFY SCREEN.       
WHEN 'M5'.         
IF r3 EQ 'X'.           
screen-input 0.         
ELSE.           
screen-input 1.         
ENDIF.         
MODIFY SCREEN.       
WHEN OTHERS.     
ENDCASE.   
ENDLOOP.
*----------------------------------------------------------------------*
*        AT SELECTION-SCREEN                                           *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ufile.   
PERFORM frm_get_filepath.

*----------------------------------------------------------------------*
*        START-OF-SELECTION                                            *
*----------------------------------------------------------------------*
START-OF-SELECTION.   
FREE MEMORY ID :'GT_OUTPUT','BATNO'.
*上传文件   
IF r1 EQ 'X'.     
IF p_ufile IS INITIAL.       
MESSAGE '请选择需要上传的文件' TYPE 'S' DISPLAY LIKE 'E'.       
EXIT.     
ENDIF.     
PERFORM frm_upload_file USING p_ufile.     
PERFORM frm_post_upload.   
ELSE."R2 EQ 'X'
*显示保存的数据     
IF s_lgort-low IS INITIAL.       
MESSAGE '请输入库存地点。' TYPE 'S' DISPLAY LIKE 'E'.       
EXIT.     
ENDIF.     

PERFORM frm_authority_check.

*DELETE FROM: ZTSD014,ZTSD015,ZTSD016. COMMIT WORK AND WAIT.     
PERFORM frm_get_data.     
PERFORM frm_process_data.   

ENDIF.   

IF gt_output IS INITIAL.     
MESSAGE '没有符合条件的数据。' TYPE 'S' DISPLAY LIKE 'E'.     
RETURN.   
ENDIF.   

IF r1 NE 'X' AND r6 NE 'X'.     
PERFORM frm_check_lock.     
CHECK gt_mesg IS NOT INITIAL.     

LOOP AT gt_mesg INTO gs_mesg.       
WRITE: / gs_mesg-mesg.     
ENDLOOP.     
RETURN.   

ENDIF.

*----------------------------------------------------------------------*
*        END-OF-SELECTION                                            *
*----------------------------------------------------------------------*
END-OF-SELECTION.   
PERFORM frm_define_layout.   
PERFORM frm_build_fieldcat.   
PERFORM frm_exclude_buttons TABLES gt_exclude.
*    PERFORM FRM_DISPLAY_DATA.   
CALL SCREEN 9000.
*----------------------------------------------------------------
*       CLASS GC_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------

CLASS gc_event_receiver DEFINITION.   
PUBLIC SECTION.     

"添加工具条     
METHODS toolbar FOR EVENT toolbar     OF cl_gui_alv_grid       
IMPORTING           e_object           e_interactive

.
*     
"字段修改时触发
*    METHODS HANDLE_DATA_CHANGED  FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
*      IMPORTING
*          ER_DATA_CHANGED.
*
*
*    METHODS HANDLE_CHANGE_FINISH FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
*      IMPORTING
*          E_MODIFIED
*          ET_GOOD_CELLS.
*    "某字段设置热键后,单击此单元格时触发
*    METHODS  HANDLE_CELL_CLICK   FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
*      IMPORTING
*          E_ROW_ID
*          E_COLUMN_ID
*          ES_ROW_NO.
*
*    "双击时触发     
METHODS handle_double_click  FOR EVENT double_click  OF cl_gui_alv_grid       
IMPORTING           e_row           e_column           es_row_no


.
*
*    "按F1时触发
*    METHODS HANDLE_ONF1          FOR EVENT ONF1          OF CL_GUI_ALV_GRID
*      IMPORTING
*          E_FIELDNAME
*          ES_ROW_NO
*          ER_EVENT_DATA.
*
*    "当用户按屏幕上按钮时触发     
METHODS handle_user_command  FOR EVENT user_command  OF cl_gui_alv_grid       
IMPORTING           e_ucomm
.
*F4帮助     
METHODS on_f4 FOR EVENT onf4 OF cl_gui_alv_grid       
IMPORTING           e_fieldname           es_row_no           er_event_data           et_bad_cells           e_display




.

ENDCLASS.                    "GC_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------
*       CLASS GC_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------
CLASS gc_event_receiver IMPLEMENTATION.   
METHOD on_f4.     
DATA: lv_menge TYPE menge_d.     

CASE e_fieldname.       
WHEN 'CHARG'.         
READ TABLE gt_output ASSIGNING <wa_data> INDEX es_row_no-row_id.         
IF sy-subrc 0.
*          PERFORM FRM_CHARG_F4 CHANGING <WA_DATA>-CHARG .
*实发数量
*          LV_MENGE = <WA_DATA>-ZSFSL.

*          IF <WA_DATA>-CHARG IS NOT INITIAL.
*            LOOP AT GT_DETAIL ASSIGNING <DETAIL>
*              WHERE INDAT EQ <WA_DATA>-INDAT
*              AND MATNR EQ <WA_DATA>-MATNR
*              AND SHPTO EQ <WA_DATA>-SHPTO
*              AND SLDTO EQ <WA_DATA>-SLDTO .
**自动分配实发数量到明细表
*              IF LV_MENGE GT 0.
*                <DETAIL>-ZSFSL = <DETAIL>-ZWFSL.
*
*                IF <DETAIL>-ZSFSL LT LV_MENGE.
*                  LV_MENGE = ABS( <DETAIL>-ZSFSL - LV_MENGE ).
*                ELSE.
*                  <DETAIL>-ZSFSL = LV_MENGE.
*                  LV_MENGE = 0.
*                ENDIF.
*              ENDIF.
**分配批次到明细表
*              MOVE <WA_DATA>-CHARG TO <DETAIL>-CHARG .
*            ENDLOOP.
*            CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY.
*          ENDIF.         
ENDIF.         UNASSIGN
: <wa_data>.     
ENDCASE.   
ENDMETHOD.   

METHOD handle_double_click.

*    BREAK B012.
*    IF R6 EQ 'X'.     
IF e_column-fieldname EQ 'ZTHDN'.       
READ TABLE gt_output INTO gs_output INDEX e_row-index.       
CHECK gs_output-zthdn IS NOT INITIAL.       

SET PARAMETER ID 'VL' FIELD gs_output-zthdn.       

CALL TRANSACTION 'VL03N' WITH AUTHORITY-CHECK AND SKIP FIRST SCREEN.

*返回时检查是否已过账
*        BREAK B012.       
WAIT UP TO 1 SECONDS.       
PERFORM frm_check_post USING gs_output-zthdn 1.     
ENDIF.     

IF e_column-fieldname EQ 'ZDN'.       
READ TABLE gt_output INTO gs_output INDEX e_row-index.       

CHECK gs_output-zdn IS NOT INITIAL.       

SET PARAMETER ID 'VL' FIELD gs_output-zdn.       

CALL TRANSACTION 'VL03N' WITH AUTHORITY-CHECK AND SKIP FIRST SCREEN.

*返回时检查是否已过账       
WAIT UP TO 1 SECONDS.       

PERFORM frm_check_post USING gs_output-zdn 2.     

ENDIF.
*    ENDIF.     

CALL METHOD gct_alv->refresh_table_display       
EXPORTING         is_stable      
= gs_stable         i_soft_refresh 
'X'.   

ENDMETHOD.   
METHOD toolbar.     
DATA: ls_toolbar  TYPE stb_button.     

CLEAR ls_toolbar.     
MOVE 3            TO ls_toolbar-butn_type.      "分隔符     
APPEND ls_toolbar TO e_object->mt_toolbar.     

CLEAR ls_toolbar.     
MOVE 'SEL_ALL'       TO ls_toolbar-function.      "添加全选     
MOVE icon_select_all TO ls_toolbar-icon.     
MOVE '全选'          TO ls_toolbar-quickinfo.     
MOVE ' '             TO ls_toolbar-disabled.     
APPEND ls_toolbar    TO e_object->mt_toolbar.     

CLEAR ls_toolbar.     
MOVE 'CAN_ALL'          TO ls_toolbar-function"取消全选     
MOVE icon_deselect_all  TO ls_toolbar-icon.     
MOVE '全部取消 '         TO ls_toolbar-quickinfo.     
MOVE ' '                TO ls_toolbar-disabled.     
APPEND ls_toolbar       TO e_object->mt_toolbar.     

CLEAR ls_toolbar.     
MOVE TO                ls_toolbar-butn_type."分隔符     
APPEND ls_toolbar TO e_object->mt_toolbar.     

IF r1 EQ 'X' OR r2 EQ 'X'.       
CLEAR ls_toolbar.       
MOVE 'DEL'          TO ls_toolbar-function.       
MOVE icon_delete_row  TO ls_toolbar-icon.       
MOVE '删除行'         TO ls_toolbar-quickinfo.       
MOVE ' '                TO ls_toolbar-disabled.       
APPEND ls_toolbar       TO e_object->mt_toolbar.     
ENDIF.     

IF r2 EQ 'X' OR r3 EQ 'X'.

*      CLEAR LS_TOOLBAR.
*      MOVE 'ADD'          TO LS_TOOLBAR-FUNCTION.
*      MOVE ICON_INSERT_ROW  TO LS_TOOLBAR-ICON.
*      MOVE '添加行'         TO LS_TOOLBAR-QUICKINFO.
*      MOVE ' '                TO LS_TOOLBAR-DISABLED.
*      APPEND LS_TOOLBAR       TO E_OBJECT->MT_TOOLBAR.
*
*      CLEAR LS_TOOLBAR.
*      MOVE 'DEL'          TO LS_TOOLBAR-FUNCTION.
*      MOVE ICON_DELETE_ROW  TO LS_TOOLBAR-ICON.
*      MOVE '删除行'         TO LS_TOOLBAR-QUICKINFO.
*      MOVE ' '                TO LS_TOOLBAR-DISABLED.
*      APPEND LS_TOOLBAR       TO E_OBJECT->MT_TOOLBAR.       

CLEAR ls_toolbar.       
MOVE 'OKAY'          TO ls_toolbar-function.       
MOVE icon_okay  TO ls_toolbar-icon.       
MOVE '审批通过'         TO ls_toolbar-quickinfo.       
MOVE ' '                TO ls_toolbar-disabled.       
APPEND ls_toolbar       TO e_object->mt_toolbar.     
ENDIF.

*    IF R6 EQ 'X'.
*      CLEAR LS_TOOLBAR.
*      MOVE 'POST_GMVT'          TO LS_TOOLBAR-FUNCTION.
**      MOVE ICON_OKAY  TO LS_TOOLBAR-ICON.
*      MOVE 0         TO LS_TOOLBAR-BUTN_TYPE.
*      MOVE '发货过账'         TO LS_TOOLBAR-TEXT.
*      APPEND LS_TOOLBAR       TO E_OBJECT->MT_TOOLBAR.
*    ENDIF.   

ENDMETHOD.   

METHOD handle_user_command.     
DATA(ok_code= e_ucomm.     

DATA: error     TYPE c,           lv_result 
TYPE string.     
DATA: ans TYPE string."GUI返回值     

CASE ok_code.       
WHEN 'SEL_ALL'.         
PERFORM frm_sel_all.

*        CLEAR GS_OUTPUT.
*        GS_OUTPUT-SEL = 'X'.
*        MODIFY GT_OUTPUT FROM GS_OUTPUT TRANSPORTING SEL WHERE SEL EQ SPACE AND ZICON1 NE '@0A@'."红灯       

WHEN 'CAN_ALL'.         
CLEAR gs_output.         gs_output
-sel ' '.         
MODIFY gt_output FROM gs_output TRANSPORTING sel WHERE sel EQ 'X'.       

WHEN 'OKAY'.         
PERFORM frm_confirm_data CHANGING lv_result.         
IF lv_result EQ 'S'.           
CLEAR lv_result.           
PERFORM frm_save_data USING 'APPROVAL' CHANGING lv_result.           

IF lv_result EQ 'S'.             
MESSAGE '审批成功!' TYPE 'S'.           
ELSE.             
MESSAGE '审批失败!' TYPE 'S' DISPLAY LIKE 'E'.           
ENDIF.           

CLEAR lv_result.         
ENDIF.

*        WHEN 'ADD'.
*          PERFORM FRM_ADD_ROW.
*       
WHEN 'DEL'.
*询问是否确认         
READ TABLE gt_output TRANSPORTING NO FIELDS WITH KEY sel 'X'.         
IF sy-subrc NE 0.           
MESSAGE '请至少选择一条数据!' TYPE 'S' DISPLAY LIKE 'E'.         
ENDIF.         

CALL FUNCTION 'POPUP_TO_CONFIRM'           
EXPORTING             text_question         
'确认删除所选数据?'             text_button_1         
'是'(009)             text_button_2         
'否'(010)             default_button        
'1'             display_cancel_button 
'X'             start_column          
25             start_row             
6           
IMPORTING             answer                
= ans           
EXCEPTIONS             text_not_found        
1             
OTHERS                2.         

IF ans EQ '1'."是           
IF r1 EQ 'X'.             
DELETE gt_output WHERE sel EQ 'X'.           
ELSE.             
PERFORM frm_delete_data.           
ENDIF.         
ENDIF.       

WHEN 'POST_GMVT'.         
PERFORM frm_post_gmvt CHANGING lv_result.         

IF lv_result EQ 'S'.           
CLEAR lv_result.           
PERFORM frm_save_data USING 'POST' CHANGING lv_result.           

IF lv_result EQ 'S'.             
MESSAGE '过账成功!' TYPE 'S'.           
ELSE.             
MESSAGE '过账失败!' TYPE 'S' DISPLAY LIKE 'E'.           
ENDIF.           

CLEAR lv_result.         
ENDIF.       
WHEN OTHERS.     

ENDCASE.     

CALL METHOD gct_alv->refresh_table_display       
EXPORTING         is_stable      
= gs_stable         i_soft_refresh 
'X'.   

ENDMETHOD.

ENDCLASS.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FILEPATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM frm_get_filepath .   

DATA: l_rc TYPE i.   
DATA: lt_filetab TYPE  filetable.   

CREATE OBJECT me.   
CALL METHOD me->display     
EXPORTING       
message '选择上传文件路径......'.   


CALL METHOD cl_gui_frontend_services=>file_open_dialog     
EXPORTING       window_title            
'请选择本地文件'       multiselection          
= space     
CHANGING       file_table              
= lt_filetab       rc                      
= l_rc     
EXCEPTIONS       file_open_dialog_failed 
1       cntl_error              
2       error_no_gui            
3       not_supported_by_gui    
4       
OTHERS                  5.   

IF sy-subrc EQ AND l_rc EQ 1.     
READ TABLE lt_filetab INTO p_ufile INDEX 1.   
ENDIF.

ENDFORM" FRM_GET_FILEPATH
*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_UFILE  text
*----------------------------------------------------------------------*
FORM frm_upload_file USING p_ufile TYPE rlgrap-filename.   

DATA: ls_rowdata TYPE truxs_t_text_data,         lv_lines   

TYPE i,         lv_msg     

TYPE string,         lv_n       
TYPE i,         lv_count   

TYPE i"计数器   
DATA: lv_posnr(4TYPE n."批导行项目号   

CREATE OBJECT me.   
CALL METHOD me->display     
EXPORTING       
message '读取上传文件内容...'.   

CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'     
EXPORTING
*     I_FIELD_SEPERATOR    =       i_line_header        
'1'       i_tab_raw_data       
= ls_rowdata       i_filename           
= p_ufile     
TABLES       i_tab_converted_data 
= gt_load[]     
EXCEPTIONS       conversion_failed    
1.   

IF sy-subrc NE 0.
*    MESSAGE SY-MSGID  WITH 'Excel导入错误。'.     
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno     
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.   

ENDIF.

*  BREAK B012.   
CREATE OBJECT me.   
CALL METHOD me->display     
EXPORTING       
message '检查数据...'.   

DELETE gt_load WHERE menge EQ 0.   

DESCRIBE TABLE gt_load LINES lv_lines.   

LOOP AT gt_load INTO gs_load.     lv_msg 
'检查数据...' && sy-tabix && '/' && lv_lines.     

CALL METHOD me->display       
EXPORTING         
message = lv_msg.
*检查日期格式     
ASSIGN COMPONENT OF STRUCTURE gs_load TO <fs>.     

CALL FUNCTION 'RP_CHECK_DATE'       
EXPORTING         
date         = <fs>       
EXCEPTIONS         date_invalid 
1         
OTHERS       2.     

IF sy-subrc NE 0.
*        MESSAGE '日期格式不正确' TYPE 'S' DISPLAY LIKE 'E'.
*        STOP.       
PERFORM set_callsytle USING 1 gs_load '日期格式错误' CHANGING gs_output-cellcolor gs_output-mssg.     
ELSEIF <fs> GT sy-datum.       
PERFORM set_callsytle USING 1 gs_load '日期大于当天' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.
*检查客户编号是否存在
*    ASSIGN COMPONENT 2 OF STRUCTURE GS_LOAD TO <FS>.
*
*    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*      EXPORTING
*        INPUT  = <FS>
*      IMPORTING
*        OUTPUT = <FS>.
*
**    SELECT SINGLE NAME1 INTO GS_OUTPUT-NAME1
**      FROM KNA1
**      WHERE KUNNR EQ <FS>
**        AND KTOKD EQ 'Z003'
*      .
*
*    IF SY-SUBRC NE 0.
*      PERFORM SET_CALLSYTLE USING 2 GS_LOAD '客户不存在' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*    ENDIF.
*检查送达方售达方是否存在
*添加前置零     
ASSIGN COMPONENT OF STRUCTURE gs_load TO <fs>.     

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'       
EXPORTING         
input  = <fs>       
IMPORTING         
output = <fs>.     

SELECT SINGLE name1 INTO gs_output-name3       
FROM kna1       
WHERE kunnr EQ <fs>
*        AND KTOKD EQ 'Z003'       
.     
IF sy-subrc NE 0.       
PERFORM set_callsytle USING 2 gs_load '售达方不存在' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.

*添加前置零     
ASSIGN COMPONENT OF STRUCTURE gs_load TO <fs>.     

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'       
EXPORTING         
input  = <fs>       
IMPORTING         
output = <fs>.     

SELECT SINGLE name1 INTO gs_output-name2       
FROM kna1       
WHERE kunnr EQ <fs>       
.     
IF sy-subrc NE 0.       
PERFORM set_callsytle USING 3 gs_load '送达方不存在' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.

*检查退货原因是否存在     
ASSIGN COMPONENT OF STRUCTURE gs_load TO <fs>.     

PERFORM add_lead_zero USING CHANGING <fs>.     

SELECT SINGLE bezei INTO gs_output-zthyy       
FROM tvaut       
WHERE augru EQ <fs>.     

IF sy-subrc NE 0.       
PERFORM set_callsytle USING 7 gs_load '原因代码不存在' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.

*检查产品是否存在
*取物料描述
*添加前置零     
ASSIGN COMPONENT 10 OF STRUCTURE gs_load TO <fs>.     

UNPACK <fs> TO <fs>.     

SELECT SINGLE maktx INTO gs_output-maktx       
FROM makt       
WHERE matnr EQ <fs>       
AND spras EQ 1.     

IF sy-subrc NE 0.       
PERFORM set_callsytle USING 10 gs_load '物料不存在' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.
****检查单位     
ASSIGN COMPONENT 12 OF STRUCTURE gs_load TO <fs>.     

CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'       
EXPORTING         
input          = <fs>         
language       = sy-langu       
IMPORTING         
output         = <fs>       
EXCEPTIONS         unit_not_found 
1         
OTHERS         2.     

IF sy-subrc NE 0.       
PERFORM set_callsytle USING 12 gs_load '单位不存在' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.

*检查库存地点     
ASSIGN COMPONENT OF STRUCTURE gs_load TO <fs>.     

SELECT SINGLE lgort FROM t001l       
INTO @DATA(lv_lgort)       
WHERE lgort EQ @<fs>.     

IF sy-subrc NE 0.       
PERFORM set_callsytle USING 8 gs_load '库存地不存在' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.

*检查订单行项目类型     
ASSIGN COMPONENT OF STRUCTURE gs_load TO <fs>.     
TRANSLATE <fs> TO UPPER CASE.     

IF <fs> NE 'REN' AND <fs> NE 'REN4'.       
PERFORM set_callsytle USING 9 gs_load '行项目类型不正确' CHANGING gs_output-cellcolor gs_output-mssg.     
ENDIF.     

MOVE-CORRESPONDING gs_load TO gs_output.     

ADD TO lv_posnr.     
MOVE lv_posnr TO gs_output-batpo.     

APPEND gs_output TO gt_output.     

CLEAR:gs_load,gs_output.   
ENDLOOP.

*  DATA: LV_LENTH TYPE I.
*  DATA: LV_FLAG TYPE C.
*  DATA: LV_POSNR(4) TYPE N."批导行项目号
*  DATA: L_EXCEPTION TYPE REF TO CX_ROOT.
*
*  DATA: LV_LINES TYPE I,
*        LV_ROW   TYPE I,
*        LV_COL   TYPE I,
*        LV_COL1  TYPE I,
*        LV_COL2  TYPE I,
*        LV_FIXED TYPE I.
*
*  DATA: LT_TAB  TYPE TABLE OF ALSMEX_TABLINE,
*        LT_TAB1 TYPE TABLE OF ALSMEX_TABLINE,
*        LS_TAB  TYPE ALSMEX_TABLINE,
*        LS_TAB1 TYPE ALSMEX_TABLINE.
*
*  DATA: X TYPE I."两个物料列的间隔
*
*  FIELD-SYMBOLS: <L_FS> TYPE   ALSMEX_TABLINE.
*
*  CLEAR: LV_COUNT,X,LV_LINES.
*  CREATE OBJECT ME.
*  CALL METHOD ME->DISPLAY
*    EXPORTING
*      MESSAGE = '读取上传文件内容...'.
*
*  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
*    EXPORTING
*      FILENAME                = P_UFILE
*      I_BEGIN_COL             = 1
*      I_BEGIN_ROW             = 1
*      I_END_COL               = 13555
*      I_END_ROW               = 65536
*    TABLES
*      INTERN                  = ITAB[]
*    EXCEPTIONS
*      INCONSISTENT_PARAMETERS = 1
*      UPLOAD_OLE              = 2
*      OTHERS                  = 3.
*  IF SY-SUBRC NE 0.
*    MESSAGE E001 WITH 'Excel导入错误。'.
*  ENDIF.
*
**行列转换
*  CALL FUNCTION 'ZSDF001'
*    IMPORTING
*      FIXED_COL = LV_FIXED
*    TABLES
*      ITAB_IN   = ITAB[]
*      ITAB_OUT  = ITAB[].
*
*
*  SORT ITAB[] BY ROW COL.
**删除不必要的列
*  DELETE ITAB[] WHERE COL EQ 3 AND COL EQ 5 AND COL EQ 7 AND COL EQ 12.
*  DESCRIBE TABLE ITAB[] LINES LV_LINES.
*
*  LOOP AT ITAB.
*    LV_MSG = '检查数据...' && SY-TABIX && '/' && LV_LINES.
*
*    ON CHANGE OF ITAB-ROW.
*      IF SY-TABIX NE 1.
*
*        IF GS_LOAD-MENGE GT 0.
*          APPEND GS_LOAD TO GT_LOAD.
*          MOVE-CORRESPONDING GS_LOAD TO GS_OUTPUT.
*
*          ADD 1 TO LV_POSNR.
*          MOVE LV_POSNR TO GS_OUTPUT-BATPO.
*
*          IF GS_OUTPUT-CELLCOLOR IS NOT INITIAL.
*            GS_OUTPUT-ZICON1 = '@0A@'."红灯
*          ELSE.
*            GS_OUTPUT-ZICON1 = '@08@'."绿灯
*
*          ENDIF.
*
*          IF GS_OUTPUT-ZICON1 = '@0A@'."红灯
*            PERFORM SET_STYLE USING 'SEL' 'DISABLE' CHANGING GS_OUTPUT-STYLE.
*          ENDIF.
*          APPEND GS_OUTPUT TO GT_OUTPUT.
*
*          CLEAR GS_LOAD.
*          CLEAR GS_OUTPUT.
*          CLEAR GS_CELLCOLOR.
*        ELSE.
*          CLEAR GS_LOAD.
*          CLEAR GS_OUTPUT.
*          CLEAR GS_CELLCOLOR.
*        ENDIF.
*      ENDIF.
*    ENDON.
*
*    ASSIGN COMPONENT ITAB-COL OF STRUCTURE GS_LOAD TO <FS>.
*    IF SY-SUBRC NE 0.
*      CONTINUE.
*    ENDIF.
*
*    "动态方法将值传到相应的内表
**    <FS> = ITAB-VALUE.
*    TRY.
*        MOVE ITAB-VALUE TO <FS>.
*      CATCH CX_ROOT INTO L_EXCEPTION.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '数据格式不正确' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*        CONTINUE.
*    ENDTRY.
*
*    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*      EXPORTING
*        PERCENTAGE = 0
**       TEXT       = '检查数据... '.
*        TEXT       = LV_MSG.
*
**检查日期格式
*    IF ITAB-COL EQ 1.
*
*      CALL FUNCTION 'RP_CHECK_DATE'
*        EXPORTING
*          DATE         = <FS>
*        EXCEPTIONS
*          DATE_INVALID = 1
*          OTHERS       = 2.
*
*      IF SY-SUBRC NE 0.
**        MESSAGE '日期格式不正确' TYPE 'S' DISPLAY LIKE 'E'.
**        STOP.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '日期格式错误' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ELSEIF <FS> GT SY-DATUM.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '日期大于当天' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*    ENDIF.
**检查客户编号是否存在
*    IF ITAB-COL EQ 2.
**取客户名称
**添加前置零
*      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*        EXPORTING
*          INPUT  = <FS>
*        IMPORTING
*          OUTPUT = <FS>.
*
*      SELECT SINGLE NAME1 INTO GS_OUTPUT-NAME1
*        FROM KNA1
*        WHERE KUNNR EQ <FS>
**        AND KTOKD EQ 'Z003'
*        .
*
*      IF SY-SUBRC NE 0.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '客户不存在' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*    ENDIF.
*
**检查送达方售达方是否存在
*    IF ITAB-COL EQ 4.
**添加前置零
*      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*        EXPORTING
*          INPUT  = <FS>
*        IMPORTING
*          OUTPUT = <FS>.
*
*      SELECT SINGLE NAME1 INTO GS_OUTPUT-NAME3
*        FROM KNA1
*        WHERE KUNNR EQ <FS>
**        AND KTOKD EQ 'Z003'
*        .
*      IF SY-SUBRC NE 0.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '售达方不存在' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*
*    ENDIF.
*
*    IF ITAB-COL EQ 6.
**添加前置零
*      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*        EXPORTING
*          INPUT  = <FS>
*        IMPORTING
*          OUTPUT = <FS>.
*
*      SELECT SINGLE NAME1 INTO GS_OUTPUT-NAME2
*        FROM KNA1
*        WHERE KUNNR EQ <FS>
**        AND KTOKD EQ 'Z003'
*        .
*
*    ENDIF.
*
*    IF ITAB-COL EQ 11.
**检查退货原因是否存在
*      PERFORM ADD_LEAD_ZERO USING 3 CHANGING <FS>.
*
*      SELECT SINGLE * INTO @DATA(LS_TVAU)
*        FROM TVAU
*        WHERE AUGRU EQ @<FS>.
*
*      IF SY-SUBRC NE 0.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '原因代码不存在' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*    ENDIF.
*
**检查产品是否存在
*    IF ITAB-COL EQ LV_FIXED.
**取物料描述
**添加前置零
*
*      UNPACK <FS> TO <FS>.
*
*      SELECT SINGLE MAKTX INTO GS_OUTPUT-MAKTX
*        FROM MAKT
*        WHERE MATNR EQ <FS>
*        AND SPRAS EQ 1.
*
*      IF SY-SUBRC NE 0.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '物料不存在' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*
*****检查单位
*    IF ITAB-COL EQ 15.
*
*      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
*        EXPORTING
*          INPUT          = <FS>
*          LANGUAGE       = SY-LANGU
*        IMPORTING
*          OUTPUT         = <FS>
*        EXCEPTIONS
*          UNIT_NOT_FOUND = 1
*          OTHERS         = 2.
*
*      IF SY-SUBRC NE 0.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '单位不存在' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*    ENDIF.
*
**检查库存地点
*    IF ITAB-COL EQ 13.
*      SELECT SINGLE LGORT FROM T001L
*        INTO @DATA(LV_LGORT)
*        WHERE LGORT EQ @<FS>.
*
*      IF SY-SUBRC NE 0.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '库存地不存在' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*
*    ENDIF.
*
**检查订单行项目类型
*    IF ITAB-COL EQ 14.
*      IF <FS> NE 'REN' AND <FS> NE 'REN2'.
*        PERFORM SET_CALLSYTLE USING ITAB-COL GS_LOAD '行项目类型不正确' CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.
*      ENDIF.
*
*    ENDIF.
*
**    ENDIF.
**    AT END OF ROW.
**      IF SY-TABIX NE 1.
**        APPEND GS_LOAD TO GT_LOAD.
**        MOVE-CORRESPONDING GS_LOAD TO GS_OUTPUT.
**
**        ADD 1 TO LV_POSNR.
**        MOVE LV_POSNR TO GS_OUTPUT-BATPO.
**
**        IF GS_OUTPUT-CELLCOLOR IS NOT INITIAL.
**          GS_OUTPUT-ZICON1 = '@0A@'."红灯
**        ELSE.
**          GS_OUTPUT-ZICON1 = '@08@'."绿灯
**
**        ENDIF.
**
***        GS_OUTPUT-ZICON2 = ICON_SET_STATE.
**        IF GS_OUTPUT-ZICON1 = '@0A@'."红灯
**          PERFORM SET_STYLE USING 'SEL' 'DISABLE' CHANGING GS_OUTPUT-STYLE.
**        ENDIF.
**        APPEND GS_OUTPUT TO GT_OUTPUT.
**
**        CLEAR GS_LOAD.
**        CLEAR GS_OUTPUT.
**        CLEAR GS_CELLCOLOR.
**      ENDIF.
**    ENDAT.
*  ENDLOOP.
*
*  IF GS_LOAD-MENGE GT 0.
*
*    APPEND GS_LOAD TO GT_LOAD.
*
*    MOVE-CORRESPONDING GS_LOAD TO GS_OUTPUT.
**  MOVE GS_LOAD-ZJHSL TO GS_OUTPUT-ZTZSL.
*    ADD 1 TO LV_POSNR.
*    MOVE LV_POSNR TO GS_OUTPUT-BATPO.
*
*    IF GS_OUTPUT-CELLCOLOR IS NOT INITIAL.
*      GS_OUTPUT-ZICON1 = '@0A@'."红灯
*    ELSE.
*      GS_OUTPUT-ZICON1 = '@08@'."绿灯
*    ENDIF.
*
**  GS_OUTPUT-ZICON2 = ICON_SET_STATE.
*    IF GS_OUTPUT-ZICON1 = '@0A@'."红灯
*      PERFORM SET_STYLE USING 'SEL' 'DISABLE' CHANGING GS_OUTPUT-STYLE.
*    ENDIF.
*    APPEND GS_OUTPUT TO GT_OUTPUT.
*    CLEAR: GS_OUTPUT,GS_CELLCOLOR.
*  ELSE.
*    CLEAR: GS_OUTPUT,GS_CELLCOLOR.
*  ENDIF.
*
*  IF GT_LOAD[] IS INITIAL.
*    MESSAGE '文件名或数据为空,请确认后重试!' TYPE 'I'.
*  ELSE.
*  ENDIF.

ENDFORM" FRM_UPLOAD_FILE
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_download_template .   
CLEAR: gt_header.
*填充抬头
*财务批导模板抬头   gs_header
-ztext '日期'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.

*  GS_HEADER-ZTEXT = '客户编码'.
*  APPEND GS_HEADER TO GT_HEADER.
*  CLEAR GS_HEADER.
*   gs_header
-ztext '售达方编码'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.
*   gs_header
-ztext '送达方编码'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.
*   gs_header
-ztext '业务员'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.
*   gs_header
-ztext '主任'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '退单单号'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '退货原因编码'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '库存地点编码'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '退货项目类型'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '产品编号'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '退货数量'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '数量单位'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '退货价格'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '金额'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.   gs_header

-ztext '过账日期'.   
APPEND gs_header TO gt_header.   
CLEAR gs_header.

*下载模板   

CALL METHOD cl_gui_frontend_services=>file_save_dialog     
EXPORTING       window_title         
'财务批导模板'       with_encoding        
'X'       initial_directory    
= c_path       prompt_on_overwrite  
'X'       default_file_name    
= c_filename     
CHANGING       filename             
= c_filename       path                 
= c_path       fullpath             
= c_fullpath       user_action          
= user_action       file_encoding        
encoding     
EXCEPTIONS       cntl_error           
1       error_no_gui         
2       not_supported_by_gui 
3       
OTHERS               4.   

IF user_action <> cl_gui_frontend_services=>action_ok.     

EXIT.   

ENDIF.   

CALL FUNCTION 'GUI_DOWNLOAD'     
EXPORTING       filename                
= c_fullpath       filetype                
'DAT'     
TABLES       data_tab                
= gt_load       fieldnames              
= gt_header     
EXCEPTIONS       file_write_error        
1       no_batch                
2       gui_refuse_filetransfer 
3       invalid_type            
4.

*  DATA: LV_OBJDATA     LIKE WWWDATATAB,
*        LV_OBJ_NAME    LIKE WWWDATATAB-OBJID,
*        LV_DESTINATION LIKE RLGRAP-FILENAME,
*        LV_OBJID       LIKE SY-REPID,
*        LV_SUBRC       LIKE SY-SUBRC.
*  DATA:L_RET     TYPE ABAP_BOOL,
*       LV_ANSWER.
*  DATA:LV_FILE TYPE STRING.
*
*  MOVE C_PATH TO LV_FILE.
*  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
*    EXPORTING
*      WINDOW_TITLE         = '退货批导模板'
*      WITH_ENCODING        = 'X'
*      INITIAL_DIRECTORY    = C_PATH
*      PROMPT_ON_OVERWRITE  = 'X'
*      DEFAULT_FILE_NAME    = C_FILENAME
*    CHANGING
*      FILENAME             = C_FILENAME
*      PATH                 = C_PATH
*      FULLPATH             = C_FULLPATH
*      USER_ACTION          = USER_ACTION
*      FILE_ENCODING        = ENCODING
*    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.
*    EXIT.
*  ENDIF.
*
*  CREATE OBJECT G_EXCEL 'EXCEL.APPLICATION'.
*  GET PROPERTY OF G_EXCEL 'Workbooks' = G_WORKBOOK .
*  CALL METHOD OF
*    G_WORKBOOK
*    'Close'.
*
*  IF USER_ACTION EQ '0'.
*    MOVE 'ZSD_XLS_005' TO LV_OBJ_NAME.
*    SELECT SINGLE RELID OBJID
*      FROM WWWDATA
*      INTO  CORRESPONDING FIELDS OF LV_OBJDATA
*      WHERE SRTF2 = 0 AND RELID = 'MI'
*        AND OBJID = LV_OBJ_NAME.
*
*    LV_DESTINATION = C_FULLPATH.
*
*    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
*      EXPORTING
*        KEY         = LV_OBJDATA
*        DESTINATION = LV_DESTINATION
*      IMPORTING
*        RC          = LV_SUBRC.
*    IF LV_SUBRC = 0.
*      P_FILEPATH = C_PATH.
*    ENDIF.
*  ENDIF.
*
*  CALL METHOD OF
*    G_WORKBOOK
*    'open'
*    EXPORTING
*      #1 = C_FULLPATH.
*
*  CALL METHOD OF
*    G_EXCEL
*    'worksheets' = G_SHEET
*    EXPORTING
*    #1 = 1.
*
*  CALL METHOD OF
*    G_SHEET
*    'activate'.
*
*  SET PROPERTY OF G_EXCEL 'visible' = 1.
*
*  FREE OBJECT G_SHEET.
*  FREE OBJECT G_APPLICA.
*  FREE OBJECT G_WORKBOOK.
*  FREE OBJECT G_EXCEL.

ENDFORM.                    " FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .   

IF r4 EQ 'X'.
*IF R2 EQ 'X'.     
SELECT       a
~*,       b
~zthlx,       b
~zuser,       b
~zdate       
INTO CORRESPONDING FIELDS OF TABLE @gt_output       
FROM ztsd015 AS a       INNER 
JOIN ztsd014 AS b ON a~batno EQ b~batno       
WHERE a~batno IN @s_batno       
AND a~indat IN @s_indat       
AND a~zyddh IN @s_zyddh       
AND a~lgort IN @s_lgort
*      AND KUNNR IN @S_KUNNR       
AND shpto IN @s_sndto       
AND sldto IN @s_selto       
AND matnr IN @s_matnr       
AND b~zdate IN @s_zdate       
AND b~zuser IN @s_zuser
*      AND A~ZSTAT EQ 'A'"初始状态       
AND b~zthlx EQ 'A'."实退
*elseIF R6 EQ 'X'."过账货物移动
*      SELECT
*      A~*,
*      B~ZTHLX
*      INTO CORRESPONDING FIELDS OF TABLE @GT_OUTPUT
*      FROM ZTSD015 AS A
*      INNER JOIN ZTSD014 AS B ON A~BATNO EQ B~BATNO
*      WHERE A~BATNO IN @S_BATNO
*      AND A~INDAT IN @S_INDAT
*      AND KUNNR IN @S_KUNNR
*      AND SHPTO IN @S_SNDTO
*      AND SLDTO IN @S_SELTO
*      AND MATNR IN @S_MATNR
*      AND A~ZSTAT EQ 'B'"未过账
*      AND B~ZTHLX EQ 'A'."实退   

ELSEIF r5 EQ 'X'.     
SELECT       a
~*,       b
~zthlx,       b
~zuser,       b
~zdate       
INTO CORRESPONDING FIELDS OF TABLE @gt_output       
FROM ztsd015 AS a       INNER 
JOIN ztsd014 AS b ON a~batno EQ b~batno       
WHERE a~batno IN @s_batno       
AND a~indat IN @s_indat       
AND a~zyddh IN @s_zyddh       
AND a~lgort IN @s_lgort
*      AND KUNNR IN @S_KUNNR       
AND shpto IN @s_sndto       
AND sldto IN @s_selto       
AND matnr IN @s_matnr       
AND zthdd IN @s_zthdd       
AND zmfck IN @s_zmfck       
AND zdn IN @s_zthdn       
AND b~zdate IN @s_zdate       
AND b~zuser IN @s_zuser       
AND b~zthlx EQ 'B'."空退   

ENDIF.
ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_process_data .   
DATA: lt_output TYPE TABLE OF ty_output.   
DATA lv_meins TYPE meins.   
DATA:lv_auart TYPE auart.   
"  DATA:lv_bstkd TYPE vbkd-bstkd_e.   

LOOP AT gt_output ASSIGNING <wa_data>.     gt_batno
-batno = <wa_data>-batno.     gt_batno
-batpo = <wa_data>-batpo.     
APPEND gt_batno.     <wa_data>

-key = <wa_data>-batno && <wa_data>-batpo.
*客户名称     
SELECT SINGLE name1 INTO <wa_data>-name2       
FROM kna1       
WHERE kunnr EQ <wa_data>-shpto.
*客户名称     
SELECT SINGLE name1 INTO <wa_data>-name3       
FROM kna1       
WHERE kunnr EQ <wa_data>-sldto.
*物料描述     
SELECT SINGLE maktx INTO <wa_data>-maktx       
FROM makt       
WHERE matnr EQ <wa_data>-matnr       
AND spras EQ 1.
*库存底单描述     
SELECT SINGLE lgobe INTO <wa_data>-lgobe       
FROM t001l       
WHERE werks EQ '1000'       
AND lgort EQ <wa_data>-lgort.     

IF <wa_data>-zthlx EQ 'A'.       <wa_data>
-zthms '实退'.     

ELSEIF <wa_data>-zthlx EQ 'B'.       <wa_data>
-zthms '空退'.     
ENDIF.     <wa_data>

-zddjg = <wa_data>-zddje / <wa_data>-menge.     lv_meins 

'EA'.     <wa_data>
-zdw1 = lv_meins.     

PERFORM frm_convert_unit(zsdr019USING <wa_data>-matnr       <wa_data>
-meins       lv_meins       <wa_data>

-menge       
CHANGING <wa_data>-zsl1.     

PERFORM frm_get_stat USING <wa_data>-zthdd.

*已审批的不允许再选择     
IF <wa_data>-zthdd NE space       
OR <wa_data>-zmfck NE space.
*      <WA_DATA>-SEL = '-'.       gs_style
-fieldname 'MENGE'.       gs_style
-style = cl_gui_alv_grid=>mc_style_disabled.       
READ TABLE <wa_data>-style TRANSPORTING NO FIELDS WITH KEY fieldname = gs_style-fieldname.       
IF sy-subrc EQ 0.         
MODIFY <wa_data>-style FROM gs_style INDEX sy-tabix.       
ELSE.         
INSERT gs_style INTO TABLE <wa_data>-style .       
ENDIF.       
CLEAR gs_style.       gs_style

-fieldname 'ZDDJE'.       gs_style
-style = cl_gui_alv_grid=>mc_style_disabled.       
READ TABLE <wa_data>-style TRANSPORTING NO FIELDS WITH KEY fieldname = gs_style-fieldname.       
IF sy-subrc EQ 0.         
MODIFY <wa_data>-style FROM gs_style INDEX sy-tabix.       
ELSE.         
INSERT gs_style INTO TABLE <wa_data>-style .       
ENDIF.       
CLEAR gs_style.       gs_style

-fieldname 'ZYDDH'.       gs_style
-style = cl_gui_alv_grid=>mc_style_disabled.       
READ TABLE <wa_data>-style TRANSPORTING NO FIELDS WITH KEY fieldname = gs_style-fieldname.       
IF sy-subrc EQ 0.         
MODIFY <wa_data>-style FROM gs_style INDEX sy-tabix.       
ELSE.         
INSERT gs_style INTO TABLE <wa_data>-style .       
ENDIF.       
CLEAR gs_style.     

ENDIF.     

SELECT SINGLE mseg~budat_mkpf INTO <wa_data>-budat       
FROM vbkd       INNER 
JOIN lips ON vbkd~vbeln EQ lips~vgbel AND vbkd~posnr EQ lips~vgpos       INNER 
JOIN mseg ON lips~vbeln EQ mseg~vbeln_im AND lips~posnr EQ mseg~vbelp_im       
WHERE vbkd~bstkd_e EQ <wa_data>-key.   
ENDLOOP.

*  IF R6 EQ 'X'.
*过账只显示生成了交货单且未过账的项目
*    DELETE GT_OUTPUT WHERE ( ZTHDN IS INITIAL AND ZDN IS INITIAL )
*    OR ( WBSTK1 EQ 'C' OR WBSTK2 EQ 'C' ).
*  ENDIF.   

IF r3 EQ 'X'.
*空退免费发货只显示已退货过账且未生成免费订单的项目     
DELETE gt_output WHERE ( zthdd IS INITIAL OR zmfck IS NOT INITIAL )     
OR wbstk1 NE 'C'.   
ENDIF.   
IF r2 EQ 'X'.     
DELETE gt_output WHERE zthdd IS NOT INITIAL."  AND wbstk1 EQ 'C'.   
ENDIF.   
SORT gt_output BY indat zyddh matnr.
*将初始内表放入内存   lt_output 
= gt_output.   

EXPORT lt_output TO MEMORY ID 'GT_OUTPUT'.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DEFINE_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_define_layout .   gs_layout

-zebra 'X'.   gs_layout
-cwidth_opt 'A'.   gs_layout
-ctab_fname 'CELLCOLOR'.   gs_layout
-stylefname 'STYLE'.
*  GS_LAYOUT-NO_ROWMARK = 'X'.   gs_variant

-report = sy-repid.   gs_stable

-row 'X'.   gs_stable
-col 'X'.
ENDFORM.                    " FRM_DEFINE_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_build_fieldcat .   
DEFINE build_fc.     GS_STRUCTURE
-FIELDNAME = &1.     GS_STRUCTURE
-COLTEXT = &2.     GS_STRUCTURE
-JUST = &3.     GS_STRUCTURE
-REF_TABLE = &4.     GS_STRUCTURE
-REF_FIELD = &5.     GS_STRUCTURE
-NO_ZERO 'X'.     GS_STRUCTURE
-EMPHASIZE = &6.     

IF &1 EQ 'SEL'.      GS_STRUCTURE
-CHECKBOX 'X'.      GS_STRUCTURE
-EDIT 'X'.     
ENDIF.     

IF &1 EQ 'ZYDDH' .       GS_STRUCTURE
-NO_ZERO ' '.     
ENDIF.     

IF ( &1 EQ 'MENGE' OR &1 EQ 'ZDDJE' OR &1 EQ 'ZYDDH' OR &1 EQ 'BUDAT' AND ( R1 EQ 'X' OR R2 EQ 'X' ).       GS_STRUCTURE
-EDIT 'X'.     
ENDIF.

*批次F4
*    IF GS_STRUCTURE-FIELDNAME EQ 'CHARG'.
*      GS_STRUCTURE-F4AVAILABL = 'X'.
*      GS_STRUCTURE-EDIT = 'X'.
*    ENDIF.     

APPEND GS_STRUCTURE TO GT_STRUCTURE.     
CLEAR GS_STRUCTURE.   
END-OF-DEFINITION.   

IF r6 NE 'X'.     build_fc
:     
'SEL' '选择列' '' '' '' ''.   
ENDIF.   build_fc

:    
'INDAT' '退货日期' '' 'ZTSD015' 'INDAT' '',    
'BUDAT' '过账日期' '' 'MKPF' 'BUDAT' '',    
'SHPTO' '送达方编号' '' 'KNA1' 'KUNNR' '',    
'NAME2' '送达方名称' '' 'KNA1' 'NAME1' '',    
'SLDTO' '售达方编号' '' 'KNA1' 'KUNNR' '',    
'NAME3' '售达方名称' '' 'KNA1' 'NAME1' '',    
'ZYDDH' '退货单号' '' 'ZTSD015' 'ZYDDH' '',
*  'VKBUR' '销售部门' '' '' '' '',    
'ZR' '主任' '' 'ZTSD015' 'ZR' '',    
'ZYWY' '业务员' '' 'ZTSD015' 'ZYWY' '',    

'LGORT' '库存地点编号' '' 'T001L' 'LGORT' '',    
'LGOBE' '库存地点' '' 'T001L' 'LGOBE' '',
*  'ZDATE' '导入日期' '' 'ZTSD014' 'ZDATE' '',    
'MATNR' '物料编号' '' 'MARA' 'MATNR' '',    
'MAKTX' '物料名称' '' 'MAKT' 'MAKTX' '',
*  'CHARG' '批次' '' '' '',    
'MENGE' '退货数量' '' 'LIPS' 'LFIMG' '',    
'MEINS' '单位' '' 'MARA' 'MEINS' '',    
'ZDDJG' '价格' '' 'ZTSD015' 'ZDDJG' '' ,    
'ZDDJE' '金额' '' 'ZTSD015' 'ZDDJG' '',    
'ZSL1' '基本单位数量' '' 'LIPS' 'LFIMG' '',    
'ZDW1' '基本单位' '' 'MARA' 'MEINS' '',    
'ZTHMS' '退货类型' '' '' '' '',    
'PSTYV' '行项目类型' '' 'LIPS' 'PSTYV' 'C111',    
'AUGRU' '退货原因编码' '' 'TVAU' 'AUGRU' '',    
'ZTHYY' '退货原因' '' 'ZTSD015' 'ZTHYY' '',    
'ZTHDD' '退货订单号' '' 'ZTSD015' 'ZTHDD' '',    
'ZTHDN' '退货交货单' '' 'ZTSD015' 'ZDN' 'C111',     
'WBSTK1' '退货状态' '' 'VBUK' 'WBSTK' '',   "退货货物移动状态    
'FKSTK1' '退货开票状态' '' 'VBUK' 'FKSTK' '',    "退货开票状态    
'ZMFCK' '免费出库单号' '' 'ZTSD015' 'ZMFCK' '',    
'ZDN' '免费交货单号' '' 'ZTSD015' 'ZTHDN' 'C111',
*  'ZTEXT' '发货状态' '' '' '' ''.    

'WBSTK2' '免费发货状态' '' 'VBUK' 'WBSTK' '',   "免费发货货物移动状态    
'FKSTK2' '免费开票状态' '' 'VBUK' 'FKSTK' '',    "退货开票状态    
'ZUSER' '导入人员' '' 'ZTSD014' 'ZUSER' '',    
'ZDATE' '导入日期' '' 'ZTSD014' 'ZDATE' ''.   

IF r1 EQ 'X'.     build_fc

:
'ZICON1' '指示灯' '' 'ICON' 'ID' '',
'MSSG' '消息' '' '' '' ''.   

ENDIF.   gs_f4
-fieldname 'CHARG'.   gs_f4
-register 'X'.   gs_f4
-getbefore 'X'.   gs_f4
-chngeafter 'X'.   
INSERT gs_f4 INTO TABLE gt_f4.

ENDFORM.                    " FRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*&      Module  STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.   
DATA: lv_lines TYPE i.   
DESCRIBE TABLE gt_output LINES lv_lines.   

SET PF-STATUS '9000' .   
SET TITLEBAR 'TITLE01'  WITH '条目数:' lv_lines.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.   
DATA(ok_code= sy-ucomm.   
DATA lv_result TYPE string.   

DATA: lt_output TYPE TABLE OF ty_output.   

CLEAR lt_output.   

CASE  ok_code.     
WHEN 'SAVE'.       
IF r1 NE 'X'.         
RETURN.       
ENDIF.       

PERFORM frm_save_data USING ' ' CHANGING lv_result.       
IF lv_result EQ 'S'.         
MESSAGE '保存成功!' TYPE 'S'.
*更新内存         lt_output 
= gt_output.         
EXPORT lt_output TO MEMORY ID 'GT_OUTPUT'.       
ELSEIF lv_result EQ 'E'.         
MESSAGE '保存失败!' TYPE 'S' DISPLAY LIKE 'E'.       
ELSEIF lv_result EQ 'N'.         
MESSAGE '数据没有修改!' TYPE 'S'.       
ENDIF.     

WHEN 'BACK'.       
LEAVE TO SCREEN 0.     
WHEN OTHERS.   
ENDCASE.   

CALL METHOD gct_alv->refresh_table_display     
EXPORTING       is_stable      
= gs_stable       i_soft_refresh 
'X'.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  MOD_ALV_DISPLAY  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE mod_alv_display OUTPUT.   

IF gctr_alv IS INITIAL.

*创建底层容器     
CREATE OBJECT gctr_alv       
EXPORTING         repid                       
= sy-repid         dynnr                       
'9000'         side                        
= cl_gui_docking_container=>dock_at_left       "ALV贴屏幕左边,从左边算屏幕宽度,         extension                   
1500                                         "屏幕宽度
*       STYLE                       = CL_GUI_CONTROL=>WS_CHILD                     "可选参数,设置ALV是否可用手动拖动大小       
EXCEPTIONS         cntl_error                  
1         cntl_system_error           
2         create_error                
3         lifetime_error              
4         lifetime_dynpro_dynpro_link 
5         
OTHERS                      6.     

IF sy-subrc <> 0.       
MESSAGE s001(00WITH '屏幕初始化失败'.       
LEAVE LIST-PROCESSING.     
ENDIF.
*创建ALV控件     
CREATE OBJECT gct_alv       
EXPORTING         i_parent 
= gctr_alv.     

IF r6 EQ 'X'.       
CALL METHOD gct_alv->set_ready_for_input         
EXPORTING           i_ready_for_input 
0.     
ENDIF.     

CREATE OBJECT g_event.
*注册自定义工具条     
SET HANDLER g_event->toolbar             FOR gct_alv.     

CALL METHOD gct_alv->register_f4_for_fields       
EXPORTING         it_f4 
= gt_f4[].

*显示ALV     
CALL METHOD gct_alv->set_table_for_first_display       
EXPORTING         is_variant           
= gs_variant         i_save               
'A'         i_default            
'X'         is_layout            
= gs_layout         it_toolbar_excluding 
= gt_exclude       
CHANGING         it_outtab            
= gt_output         it_fieldcatalog      
= gt_structure[].

*注册F4     
SET HANDLER g_event->on_f4 FOR gct_alv.

**注册double click     
SET HANDLER g_event->handle_double_click FOR gct_alv.

*注册User command     
SET HANDLER g_event->handle_user_command FOR gct_alv.
*注册data_change
*    SET HANDLER G_EVENT->HANDLE_DATA_CHANGED FOR GCT_ALV.

*    SET HANDLER G_EVENT->HANDLE_CHANGE_FINISH FOR GCT_ALV.
*以下两个方法达到的效果是:光标离开正在编辑的单元格时,就触发handle_data_changed     

CALL METHOD gct_alv->register_edit_event       
EXPORTING         i_event_id 
= cl_gui_alv_grid=>mc_evt_modified.     

CALL METHOD gct_alv->register_edit_event       
EXPORTING         i_event_id 
= cl_gui_alv_grid=>mc_evt_enter.

*     
CALL METHOD cl_gui_control=>set_focus    "设置焦点在REF_ALVG1上       
EXPORTING         
control = gct_alv.   
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Form  FRM_EXCLUDE_BUTTONS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_exclude_buttons TABLES t_exclude TYPE ui_functions.   

CLEAR gt_exclude.   

DATA: ls_exclude TYPE ui_func.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_MAXIMUM .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_MINIMUM .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SUBTOT .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SUM .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_AVERAGE .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_MB_SUM .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_MB_SUBTOT .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SORT_ASC.
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SORT_DSC .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_find .   
APPEND ls_exclude TO gt_exclude.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_FILTER .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_print .   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_print_prev .   
APPEND ls_exclude TO gt_exclude.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_MB_EXPORT .
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_graph .   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_mb_view .   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_detail .   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_help .   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_info .   
APPEND ls_exclude TO gt_exclude.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_MB_VARIANT.
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_delete_row.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_cut.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_copy.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_copy_row.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_insert_row.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_append_row.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_paste.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_paste_new_row.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_loc_undo.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_check.   
APPEND ls_exclude TO gt_exclude.   ls_exclude 
= cl_gui_alv_grid=>mc_fc_refresh.   
APPEND ls_exclude TO gt_exclude.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
*  APPEND LS_EXCLUDE TO GT_EXCLUDE.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SAVE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_save_data USING u_str TYPE string CHANGING c_result TYPE string.   
DATA:     lt_ztsd014 
TYPE TABLE OF ztsd014,     lt_ztsd015 
TYPE TABLE OF ztsd015,     lt_ztsd016 
TYPE TABLE OF ztsd016,     lt_output  

TYPE TABLE OF ty_output,     ls_ztsd014 

TYPE ztsd014"直营平台-销售退货抬头     ls_ztsd015 
TYPE ztsd015"直营平台-销售退货行项目     ls_ztsd016 
TYPE ztsd016"直营平台-销售退货行项目修改日志     ls_output  

TYPE ty_output.   

DATA: lv_batno TYPE char10"批导编号         lv_verno 
TYPE char3"版本号   
DATA: check_ok TYPE string.   

DATA: check_okay TYPE string.   

CLEAR c_result.   
CLEAR:   lt_ztsd014
,   lt_ztsd015
,   lt_ztsd016
,   lt_output

,   ls_ztsd014

,   ls_ztsd015
,   ls_ztsd016
,   ls_output 

.

*检查数据是否有修改   
PERFORM frm_check_changes CHANGING check_okay.

*如果是批导数据,则生成批导序号和版本号   
IF r1 EQ 'X'.
*检查是否选择了数据     
READ TABLE gt_output TRANSPORTING NO FIELDS WITH KEY sel 'X'.     
IF sy-subrc NE 0.       
MESSAGE '请至少选择一条数据!' TYPE 'S' DISPLAY LIKE 'E'.       
EXIT.     
ENDIF.     

LOOP AT gt_output INTO gs_output WHERE sel 'X'.       
IF gs_output-zicon1 EQ '@0A@'.         
MESSAGE '数据有误,请检查。' TYPE 'S' DISPLAY LIKE 'E'.         
RETURN.       
ENDIF.     
ENDLOOP.

*检查是否当前已经生成了批导流水号
*    BREAK-POINT.     
IMPORT lv_batno FROM MEMORY ID 'BATNO'.     

IF lv_batno IS INITIAL.
*若没有生成则新生成       
CALL FUNCTION 'NUMBER_GET_NEXT'         
EXPORTING           nr_range_nr             
'03'           object                  
'ZSD001'
*         QUANTITY                = '1'
*         SUBOBJECT               = ' '
*         TOYEAR                  = '0000'
*         IGNORE_BUFFER           = ' '         
IMPORTING           
number                  = lv_batno
*         QUANTITY                =
*         RETURNCODE              =         
EXCEPTIONS           interval_not_found      
1           number_range_not_intern 
2           object_not_found        
3           quantity_is_0           
4           quantity_is_not_1       
5           interval_overflow       
6           buffer_overflow         
7           
OTHERS                  8.

*将生成的流水号保存到内存       
EXPORT lv_batno TO MEMORY ID 'BATNO'.
*新版本号       
MOVE TO lv_verno.

*填充抬头表ZTSD014       
MOVE lv_batno TO ls_ztsd014-batno.       
MOVE sy-uname TO ls_ztsd014-zuser.       
MOVE sy-datum TO ls_ztsd014-zdate.       
MOVE sy-uzeit TO ls_ztsd014-ztime.       
IF r4 EQ 'X'.         
MOVE 'A' TO ls_ztsd014-zthlx.       
ELSEIF r5 EQ 'X'.         
MOVE 'B' TO ls_ztsd014-zthlx.       
ENDIF.       

MODIFY ztsd014 FROM ls_ztsd014.

*若已生成流水号     
ELSEIF lv_batno IS NOT INITIAL       
AND check_okay EQ 'F'.
*若没有修改则不进行保存       c_result 
'N'."表示没有修改       
EXIT.     
ENDIF.     

LOOP AT gt_output INTO gs_output WHERE sel EQ 'X'.
*更新内表       
MOVE lv_batno TO gs_output-batno.       

IF lv_verno IS NOT INITIAL.         
MOVE lv_verno TO gs_output-verno.       
ENDIF.       

MODIFY gt_output FROM gs_output.
*填充退货订单明细表       
MOVE-CORRESPONDING gs_output TO ls_ztsd015.       

APPEND ls_ztsd015 TO lt_ztsd015.       
CLEAR ls_ztsd015.
*填充退货订单日志表       
MOVE-CORRESPONDING gs_output TO ls_ztsd016.

*      MOVE LV_BATNO TO LS_ZTSD003-BATNO.
*      MOVE LV_VERNO TO LS_ZTSD003-VERNO.       
MOVE sy-uname TO ls_ztsd016-zuser.       
MOVE sy-datum TO ls_ztsd016-zdate.       
MOVE sy-uzeit TO ls_ztsd016-ztime.       

APPEND ls_ztsd016 TO lt_ztsd016.       
CLEAR ls_ztsd016.     

ENDLOOP.   


ELSE."IF." R2 EQ 'X' ."如果是显示已导入数据,则检查是否有修改数据     c_result 
'N'.

*    LT_OUTPUT = GT_OUTPUT.     

SORT gt_output BY batno."按批导编号排序
*    SORT LT_OUTPUT BY BATNO."按批导编号排序     

LOOP AT gt_output ASSIGNING <wa_data> WHERE sel EQ 'X'.       ls_output 
= <wa_data>.       
AT NEW batno.         lv_verno 
= ls_output-verno + 1."产生下一个版本,否则C_RESULT EQ SPACE         ls_output
-verno = lv_verno.
*填充抬头表ZTSD014
*        MOVE LS_OUTPUT-BATNO TO LS_ZTSD014-BATNO.
*        MOVE LS_OUTPUT-ZTHLX TO LS_ZTSD014-ZTHLX.
*        MOVE SY-UNAME TO LS_ZTSD014-ZUSER.
*        MOVE SY-DATUM TO LS_ZTSD014-ZDATE.
*        MOVE SY-UZEIT TO LS_ZTSD014-ZTIME.
*
*        MODIFY ZTSD014 FROM LS_ZTSD014.

*按批导编号更新版本号         
MODIFY gt_output FROM ls_output TRANSPORTING verno         
WHERE batno EQ ls_output-batno.
*        CLEAR LS_OUTPUT.       
ENDAT.

*填充退货订单日志表       
MOVE-CORRESPONDING ls_output TO ls_ztsd016.

*      MOVE LS_OUTPUT-BATNO TO LS_ZTSD003-BATNO.
*      MOVE LS_OUTPUT-VERNO TO LS_ZTSD003-VERNO.
*      MOVE LS_OUTPUT-ZMFCK TO LS_ZTSD016-ZMFCK.
*      MOVE LS_OUTPUT-ZTHDD TO LS_ZTSD016-ZTHDD.       
MOVE sy-uname TO ls_ztsd016-zuser.       
MOVE sy-datum TO ls_ztsd016-zdate.       
MOVE sy-uzeit TO ls_ztsd016-ztime.       

APPEND ls_ztsd016 TO lt_ztsd016.       
CLEAR ls_ztsd016.
*填充退货订单明细表
*      MOVE-CORRESPONDING LS_OUTPUT TO LS_ZTSD015.       

CLEAR ls_output.     
ENDLOOP.   
ENDIF.   

DELETE gt_output WHERE sel EQ 'X'.   UNASSIGN <wa_data>

.
*更新数据库表   
IF lt_ztsd014 IS NOT INITIAL.     
MODIFY ztsd014 FROM TABLE lt_ztsd014.     

IF sy-subrc EQ 0.       
COMMIT WORK AND WAIT.       c_result 
'S'.     
ELSE.       
ROLLBACK WORK.       c_result 
'E'.     
ENDIF.   
ENDIF.   

IF lt_ztsd015 IS NOT INITIAL.     

MODIFY ztsd015 FROM TABLE lt_ztsd015.     

IF sy-subrc EQ 0.       
COMMIT WORK AND WAIT.       c_result 
'S'.     
ELSE.       
ROLLBACK WORK.       c_result 
'E'.     
ENDIF.   

ENDIF.   

IF lt_ztsd016 IS NOT INITIAL.     
MODIFY ztsd016 FROM TABLE lt_ztsd016.     

IF sy-subrc EQ 0.       
COMMIT WORK AND WAIT.       c_result 
'S'.     
ELSE.       
ROLLBACK WORK.       c_result 
'E'.     
ENDIF.   

ENDIF.   lt_output 

= gt_output.   
EXPORT lt_output TO MEMORY ID 'GT_OUTPUT'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CONFIRM_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LV_RESULT  text
*----------------------------------------------------------------------*
FORM frm_confirm_data  CHANGING c_result.   
DATA:
*        LT_OUTPUT TYPE TABLE OF TY_OUTPUT,         ls_output 
TYPE ty_output.   
DATA: lv_csyd TYPE char10"超市验单         lv_so   
TYPE vbeln"SO   

DATA: lv_result TYPE string.   
CLEAR:c_result,lv_csyd,ls_output.   

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'     
EXPORTING       percentage 
0       
text       '正在操作销售订单... '.

*整理创建SO的数据   
PERFORM frm_prepare_so_data CHANGING lv_result.
*创建SO   
IF lv_result EQ 'E'.     c_result 
'E'.     
EXIT.   
ENDIF.   
PERFORM frm_create_so CHANGING lv_result.   

CHECK lv_result EQ 'S'.   

MOVE 'S' TO c_result.   

LOOP AT gt_sodata INTO gs_sodata.     
READ TABLE gt_output ASSIGNING <wa_data>     
WITH KEY batno = gs_sodata-batno batpo = gs_sodata-batpo.     
IF sy-subrc EQ 0.

*        IF R4 EQ 'X'.       
IF r2 EQ 'X'.         
MOVE: gs_sodata-so TO <wa_data>-zthdd,         gs_sodata

-zdn TO <wa_data>-zthdn         
.       
ENDIF.
*        ELSEIF R5 EQ 'X'.       
IF r3 EQ 'X'.         
MOVE: gs_sodata-so TO <wa_data>-zmfck,         gs_sodata

-zdn TO <wa_data>-zdn         
.       
ENDIF.     
ENDIF.   
ENDLOOP.   

PERFORM frm_show_message.   UNASSIGN <wa_data>

.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_PREPARE_SO_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_prepare_so_data CHANGING c_result.   
DATA:     ls_a515    
TYPE a515,     ls_ztsd007 
TYPE ztsd007.   

DATA: lv_result TYPE string.   
DATA lv_msg TYPE string.   

CLEAR gt_sodata.   

LOOP AT gt_output INTO gs_output WHERE sel EQ 'X' ."AND SO IS INITIAL.     

IF r2 EQ 'X' AND gs_output-zthdd NE space.       
CONTINUE.     
ENDIF.     

IF r3 EQ 'X' AND gs_output-zmfck NE space.       
CONTINUE.     
ENDIF.     

MOVE-CORRESPONDING gs_output TO gs_sodata.     gs_sodata
-zstring = gs_sodata-sldto && gs_sodata-shpto && gs_sodata-zyddh && gs_sodata-budat.     

MOVE gs_output-menge TO gs_sodata-kpein.     
MOVE gs_output-meins TO gs_sodata-kmein.     

MOVE '1000' TO gs_sodata-werks.     

PERFORM frm_check_partner USING gs_sodata-sldto CHANGING lv_result.     

IF lv_result EQ 'E'.       c_result 
'E'.       
RETURN.     
ENDIF.

*检查销售组织对应的成本中心是否存在     

SELECT SINGLE * INTO ls_ztsd007       
FROM ztsd007       
WHERE vkbur EQ gs_sodata-vkbur       
AND vkgrp EQ gs_sodata-vkgrp.     

IF sy-subrc NE 0.       c_result 
'E'.
*      LV_MSG = '售达方' && GS_SODATA-SLDTO && '的销售组' && GS_SODATA-VKBUR && '和销售部门' && GS_SODATA-VKGRP && '对应的成本中心不存在。'.       lv_msg 
'销售组' && gs_sodata-vkbur && '和销售部门' && gs_sodata-vkgrp && '对应的成本中心不存在。'.       
MESSAGE s001 WITH lv_msg DISPLAY LIKE 'E'.
*      MESSAGE '客户的销售组和销售办部门对应的成本中心不存在。' TYPE 'S' DISPLAY LIKE 'E'.       
RETURN.     
ENDIF.     

APPEND gs_sodata TO gt_sodata.     
CLEAR: gs_sodata,gs_output.     c_result 

'S'.   
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_SO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LV_RESULT  text
*----------------------------------------------------------------------*
FORM frm_create_so  CHANGING c_result.   
DATA:lt_sodata TYPE TABLE OF ty_sodata,        ls_sodata 
TYPE ty_sodata.   

DATA:lv_posnr(6TYPE n,        lv_string   
TYPE string.   

DATA: lv_so    TYPE vbeln,
*        LV_SO1   TYPE VBELN,         lv_dn    
TYPE vbeln_vl,
*        LV_DN1   TYPE VBELN_VL,         l_update
,         l_kschl  
TYPE kschl"条件类型         l_st_no  

TYPE stunr.   

DATA: ls_output TYPE ty_output.   

DATA:     ls_header  
TYPE bapisdhd1,     ls_headerx 
TYPE bapisdhd1x,     testrun    

TYPE bapiflag-bapiflag VALUE 'X',     lt_return  

TYPE TABLE OF bapiret2,     ls_return  
TYPE bapiret2,     lt_item    

TYPE TABLE OF bapisditm,     ls_item    
TYPE bapisditm,     lt_itemx   

TYPE TABLE OF bapisditmx,     ls_itemx   
TYPE bapisditmx,     lt_pnr     

TYPE TABLE OF bapiparnr,     ls_pnr     
TYPE bapiparnr,     lt_sch     

TYPE TABLE OF bapischdl,     ls_sch     
TYPE bapischdl,     lt_schx    

TYPE TABLE OF bapischdlx,     ls_schx    
TYPE bapischdlx,     lt_cond    

TYPE TABLE OF bapicond,     ls_cond    
TYPE bapicond,     lt_condx   

TYPE TABLE OF bapicondx,     ls_condx   
TYPE bapicondx.   

DATA: lt_so_item TYPE TABLE OF bapidlvreftosalesorder,         ls_so_item 
TYPE bapidlvreftosalesorder.
*  DATA: LV_POSNR   TYPE POSNR.   
DATA: status_buff_init      TYPE VALUE 'X',         call_activity
(4),                " Aktiver Aufrufer bei Call         g_no_dequeue_sd_sales 
TYPE c.


*  DATA: LV_POSNR   TYPE POSNR.   
CALL FUNCTION 'RV_DELIVERY_INIT'     
EXPORTING       status_buff_init 
= status_buff_init       i_call_activity  
= call_activity       if_no_deque      
= g_no_dequeue_sd_sales.   

SORT gt_sodata BY zstring.

*  PERFORM FRM_CHECK_SODATA CHANGING C_RESULT.   

LOOP AT gt_sodata ASSIGNING <wa_sodata>.
*做标记     <wa_sodata>
-so 'X'.     <wa_sodata>
-zdn 'X'.
*    <WA_SODATA>-SO1 = 'X'.
*    <WA_SODATA>-ZDN1 = 'X'.
*     ls_sodata 
= <wa_sodata>.     

ADD 10 TO lv_posnr.     ls_item

-itm_number = lv_posnr.     ls_item
-material = <wa_sodata>-matnr.     ls_item
-target_qty = <wa_sodata>-menge.     ls_item
-plant = <wa_sodata>-werks.     ls_item
-store_loc = <wa_sodata>-lgort.     ls_item
-target_qu = <wa_sodata>-meins.     ls_item
-sales_unit = <wa_sodata>-meins.     ls_item
-purch_no_s = <wa_sodata>-key.

*    IF <wa_sodata>-key IS NOT INITIAL.
*
*      IF r3 EQ 'X'.
*        SELECT SINGLE  vbeln INTO @DATA(lv_vbelnso)
*                FROM vbkd
*                WHERE bstkd_e EQ @<wa_sodata>-key AND bstkd EQ 'WFZYTH'.
*        IF sy-subrc EQ 0.
*          MESSAGE '已有免费订单:' && lv_vbelnso && '生成!'  TYPE 'S' DISPLAY LIKE 'E'.
*          EXIT.
*        ENDIF.
*      ENDIF.
*
**      IF r2 EQ 'X'.
**        SELECT SINGLE  vbeln INTO @DATA(lv_vbelnso1)
**               FROM vbkd
**               WHERE bstkd_e EQ @<wa_sodata>-key AND bstkd NE 'WFZYTH'.
**        IF sy-subrc EQ 0.
**          MESSAGE '已有退货订单:' && lv_vbelnso1 && '生成!'  TYPE 'S' DISPLAY LIKE 'E'.
**          EXIT.
**        ENDIF.
**      ENDIF.
*
*    ENDIF.     
IF r5 EQ 'X' OR r4 EQ 'X'.
*检查物料是否启用了批次管理       
SELECT SINGLE xchpf INTO @DATA(xchpf)         
FROM mara         
WHERE matnr EQ @ls_item-material.       
IF xchpf EQ 'X'.         ls_item
-batch = gv_charg.         
IF R4 EQ 'X'.         ls_item
-batch = gv_charg1.         
ENDIF.         ls_itemx
-batch 'X'.       
ENDIF.     
ENDIF.
*    LS_ITEM-SHIP_POINT = <WA_SODATA>-LGORT."装运点与库存地点相同     
IF r3 EQ 'X'."       ls_item
-item_categ 'ZTN1'.       ls_itemx
-item_categ 'X'.     
ENDIF.     
IF r2 EQ 'X'."实退需指定行项目类型       ls_item
-item_categ = <wa_sodata>-pstyv.       ls_itemx
-item_categ 'X'.     
ENDIF.     
APPEND ls_item TO lt_item.     
CLEAR ls_item.     ls_itemx

-itm_number = lv_posnr.     ls_itemx
-material 'X'.     ls_itemx
-target_qty 'X'.     ls_itemx
-plant 'X'.     ls_itemx
-store_loc 'X'.     ls_itemx
-target_qu 'X'.     ls_itemx
-sales_unit 'X'.     ls_itemx
-purch_no_s 'X'.
*    LS_ITEMX-SHIP_POINT = 'X'.     
APPEND ls_itemx TO lt_itemx.     
CLEAR ls_itemx.     ls_pnr

-partn_role 'AG'." 'SP'."售达方     ls_pnr
-partn_numb = <wa_sodata>-sldto.     
APPEND ls_pnr TO lt_pnr.     
CLEAR ls_pnr.     ls_pnr

-partn_role 'WE'." 'SH'."送达方     ls_pnr
-partn_numb = <wa_sodata>-shpto.     
APPEND ls_pnr TO lt_pnr.     
CLEAR ls_pnr.     ls_sch

-itm_number = lv_posnr.     ls_sch
-sched_line 1.     ls_sch
-req_qty = <wa_sodata>-menge.     

APPEND ls_sch TO lt_sch.     
CLEAR ls_sch.     ls_schx

-itm_number = lv_posnr.     ls_schx
-sched_line 1.     ls_schx
-req_qty 'X'.     

APPEND ls_schx TO lt_schx.     
CLEAR ls_schx.

*费用类型退货不需要检查手工条件     
IF <wa_sodata>-pstyv NE 'REN4'.       

PERFORM get_kschl(zsdr021)         
USING 'ZRE1'               <wa_sodata>
-vkorg               <wa_sodata>
-vtweg               <wa_sodata>
-spart               <wa_sodata>
-sldto             
CHANGING l_kschl l_update l_st_no.       ls_cond

-itm_number = lv_posnr.       ls_cond
-cond_st_no = l_st_no.       ls_cond
-cond_count 1.       ls_cond
-cond_type = l_kschl.       ls_cond
-cond_updat = l_update.
*    LS_COND-COND_VALUE = <WA_SODATA>-ZDDJG.       ls_cond
-cond_value = <wa_sodata>-zddje.       ls_cond
-cond_p_unt = <wa_sodata>-kpein.       ls_cond
-cond_unit = <wa_sodata>-kmein.

*LS_COND-CONDCHAMAN = 'X'.       ls_cond
-currency 'CNY'.       
APPEND ls_cond TO lt_cond.       
CLEAR ls_cond.       ls_condx

-itm_number = lv_posnr.       ls_condx
-cond_st_no = l_st_no.       ls_condx
-cond_count 1.       ls_condx

-cond_type = l_kschl.       ls_condx
-updateflag = l_update.       ls_condx
-cond_value 'X'.       ls_condx
-cond_p_unt 'X'.       ls_condx
-cond_unit 'X'.       

APPEND ls_condx TO lt_condx.       
CLEAR ls_condx.     

ENDIF.     

UPDATE ztsd015 SET zthdd 'X'     
WHERE batno EQ <wa_sodata>-batno     
AND batpo EQ <wa_sodata>-batpo.     

AT END OF zstring.       

CLEAR lv_posnr.       ls_header

-sales_org = <wa_sodata>-vkorg.       ls_header
-distr_chan = <wa_sodata>-vtweg.       ls_header
-division = <wa_sodata>-spart.       ls_header
-sales_grp = <wa_sodata>-vkgrp.       ls_header
-sales_off = <wa_sodata>-vkbur.       ls_header
-ord_reason = <wa_sodata>-augru."退货原因       ls_header
-purch_no_s = <wa_sodata>-zyddh.       ls_header
-purch_no_c 'WFZYTH'.
*实退
*SO       
IF r2 EQ 'X'.         ls_header
-doc_type 'ZRE1'."不关联退货订单         

PERFORM frm_create_returnso         
TABLES lt_item lt_itemx lt_pnr lt_sch lt_schx lt_cond lt_condx         
USING ls_header         
CHANGING lv_so c_result.

*创建DN         
IF c_result EQ 'S'.           
"WAIT UP TO  1  SECONDS.           
DO 1000 TIMES.             
SELECT SINGLE  vbeln INTO @DATA(kk)                         
FROM vbak                         
WHERE vbeln EQ @lv_so.               
IF sy-subrc EQ 0.                   
EXIT.               
ENDIF.           
ENDDO.           
"IF sy-subrc EQ 0.           
"PERFORM frm_create_dn USING lv_so CHANGING lv_dn c_result.           
"ENDIF.           
PERFORM frm_create_dn(zsdr006)             
USING lv_so CHANGING lv_dn c_result.         
ENDIF.         

CALL FUNCTION 'RV_DELIVERY_INIT'           
EXPORTING             status_buff_init 
= status_buff_init             i_call_activity  
= call_activity             if_no_deque      
= g_no_dequeue_sd_sales.         

WAIT UP TO 1 SECONDS.         
IF lv_so IS NOT INITIAL.           
IF lv_dn IS INITIAL.             
DO 1000 TIMES.               
SELECT SINGLE vbeln INTO lv_dn FROM vbfa                 
WHERE ( vbelv EQ lv_so                 
AND vbtyp_n EQ 'J' )                 
OR ( vbelv EQ lv_so                 
AND vbtyp_n EQ 'T' ).                 
IF sy-subrc EQ 0.                     
EXIT.                 
ENDIF.             
ENDDO.           
ENDIF.           

PERFORM frm_modify_sodata USING lv_so lv_dn                 
CHANGING c_result.         
ENDIF.       
ENDIF.
*空退后继免费       
IF r3 EQ 'X'.         ls_header
-doc_type 'ZSD9'."后继免费订单
*SO         
PERFORM frm_create_returnso1         
TABLES lt_item lt_itemx lt_pnr lt_sch lt_schx lt_cond lt_condx         
USING ls_header         
CHANGING lv_so c_result.

*DN         
IF c_result EQ 'S'.           
DO 1000 TIMES.             
SELECT SINGLE  vbeln INTO @DATA(kkk)                         
FROM vbak                         
WHERE vbeln EQ @lv_so.               
IF sy-subrc EQ 0.                   
EXIT.               
ENDIF.           
ENDDO.           
"IF sy-subrc EQ 0.           
"PERFORM frm_create_dn USING lv_so CHANGING lv_dn c_result.           
"ENDIF.           
PERFORM frm_create_dn(zsdr006)             
USING lv_so CHANGING lv_dn c_result.         
ENDIF.         

CALL FUNCTION 'RV_DELIVERY_INIT'           
EXPORTING             status_buff_init 
= status_buff_init             i_call_activity  
= call_activity             if_no_deque      
= g_no_dequeue_sd_sales.         

WAIT UP TO 1 SECONDS.         
IF lv_so IS NOT INITIAL.           
IF lv_dn IS INITIAL.             
DO 1000 TIMES.               
SELECT SINGLE vbeln INTO lv_dn FROM vbfa                 
WHERE ( vbelv EQ lv_so                 
AND vbtyp_n EQ 'J' )                 
OR ( vbelv EQ lv_so                 
AND vbtyp_n EQ 'T' ).                 
IF sy-subrc EQ 0.                   
EXIT.                 
ENDIF.             

ENDDO.           
ENDIF.           

PERFORM frm_modify_sodata USING lv_so lv_dn                 
CHANGING c_result.         
ENDIF.       

ENDIF.       

CLEAR:    lt_return,                 lt_item
,                 lt_itemx
,                 lt_pnr
,                 lt_sch
,                 lt_schx
,                 lt_cond
,                 lt_condx
,                 ls_header                 

.     

ENDAT.   
ENDLOOP.   UNASSIGN <wa_sodata>

.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_CHANGES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_CHECK_OKAY  text
*----------------------------------------------------------------------*
FORM frm_check_changes  CHANGING  c_ok TYPE string.   
DATA: lt_output  TYPE TABLE OF ty_output,         lt_output1 
TYPE TABLE OF ty_output.   

DATA: ls_output  TYPE ty_output,         ls_output1 
TYPE ty_output.   

MOVE 'F' TO c_ok.   

CLEAR: lt_output,lt_output1.
*从内存读取最初的内表   
IMPORT lt_output FROM MEMORY ID 'GT_OUTPUT'.
*将当前全局内表赋予本地内表   lt_output1 
= gt_output.
*排序
*  SORT: LT_OUTPUT1 BY INDAT KUNNR ZCSDD.   
SORT: lt_output BY batno batpo.

*检查勾选项是否有修改   
LOOP AT lt_output1 INTO ls_output1 WHERE sel EQ 'X'.     
READ TABLE lt_output INTO ls_output     
WITH KEY batno = ls_output1-batno     batpo 
= ls_output1-batpo BINARY SEARCH.     
IF sy-subrc EQ 0.
*比较当前数据与初始数据是否有区别       
CLEAR: ls_output1-sel,       ls_output
-sel.       

IF ls_output1 NE ls_output.         
MOVE 'T' TO c_ok."有区别         
EXIT."只要有一个数据有区别就要记录       
ELSE.         
MOVE 'F' TO c_ok."没有区别       
ENDIF.     

ENDIF.   

ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_POST_GOODS_ISSUE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_post_dn USING u_dn TYPE vbeln_vl.   
DATA: lt_sodata TYPE TABLE OF ty_sodata,         ls_sodata 
TYPE ty_sodata.   

DATA: lv_result TYPE c,         lv_vbeln  
TYPE vbeln_vl,         lv_posnr  
TYPE posnr.   

DATA: lv_tstmp TYPE tzntstmps.   

DATA:     lv_vbkok  
TYPE vbkok,     lv_wabuc  
TYPE wabuc VALUE 'X',     lt_vbpok  

TYPE TABLE OF vbpok,     ls_vbpok  
TYPE vbpok,     lt_prott  

TYPE TABLE OF prott WITH HEADER LINE,     ls_prott  
TYPE prott,     lt_return 

TYPE TABLE OF bapiret2,     wa_return 
TYPE bapiret2     

.

*  LT_SODATA = GT_SODATA.
*
*  SORT LT_SODATA BY ZDN.
*
*  DELETE ADJACENT DUPLICATES FROM LT_SODATA COMPARING ZDN.
*
*  LOOP AT LT_SODATA INTO LS_SODATA.
*    LV_VBELN = LS_SODATA-ZDN.   lv_vbeln 
= u_dn.   

UNPACK lv_vbeln TO lv_vbeln.   lv_posnr 

10.   lv_vbkok

-vbeln_vl  = lv_vbeln .
*    LV_VBKOK-KOMUE     = 'X' .   lv_vbkok
-wabuc     = lv_wabuc .   lv_vbkok
-wadat_ist = <wa_sodata>-budat .   lv_vbkok
-bldat     = <wa_sodata>-budat .   

WAIT UP TO 1 SECONDS.   

CALL FUNCTION 'SD_DELIVERY_UPDATE_PICKING'     
EXPORTING       vbkok_wa  
= lv_vbkok
*     SYNCHRON  = ' '
*     NO_MESSAGES_UPDATE           = ' '
*     NICHT_SPERREN                = ' '
*     AUFRUFER_T                   = ' '
*     IF_ERROR_MESSAGES_SEND       = 'X'     
TABLES       vbpok_tab 
= lt_vbpok[]       prot      
= lt_prott[].   

READ TABLE lt_prott TRANSPORTING NO FIELDS WITH KEY msgty 'E'.   
IF sy-subrc EQ 0.     
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.     
LOOP AT lt_prott WHERE msgty EQ 'E'.       
CLEAR wa_return.       wa_return
-type 'E'.       

CALL FUNCTION 'MESSAGE_TEXT_BUILD'         
EXPORTING           msgid               
= lt_prott-msgid           msgnr               
= lt_prott-msgno           msgv1               
= lt_prott-msgv1           msgv2               
= lt_prott-msgv2           msgv3               
= lt_prott-msgv3           msgv4               
= lt_prott-msgv4         
IMPORTING           message_text_output 
= wa_return-message.       

APPEND wa_return TO gdt_return.       

CLEAR lt_prott.     
ENDLOOP.     

RETURN.   
ENDIF.   

CLEAR wa_return.   
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'     
EXPORTING       
wait   'X'     
IMPORTING       
return = wa_return.   

IF wa_return-type EQ 'E'.     
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.     
APPEND wa_return TO lt_return.     

EXPORT lt_return TO MEMORY ID 'LT_RETURN'.     
PERFORM frm_show_message.
*      C_RESULT = 'E'.     
EXIT.   
ELSE.
*      C_RESULT = 'S'.

*      RETURN.   
ENDIF.

*  ENDLOOP.   
CLEAR: lv_vbkok,lt_vbpok,lt_prott.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  bdc_dynpro
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PROGRAM    text
*      -->DYNPRO     text
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.   
CLEAR gds_bdcdata.   gds_bdcdata
-program  program.   gds_bdcdata
-dynpro   dynpro.   gds_bdcdata
-dynbegin 'X'.   
APPEND gds_bdcdata TO gdt_bdcdata.
ENDFORM"bdc_dynpro
*&---------------------------------------------------------------------*
*&      Form  bdc_field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FNAM       text
*      -->FVAL       text
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.   
CLEAR gds_bdcdata.   gds_bdcdata
-fnam = fnam.   gds_bdcdata
-fval = fval.   
CONDENSE gds_bdcdata-fval NO-GAPS.   

APPEND gds_bdcdata TO gdt_bdcdata.
ENDFORM"bdc_field
*&---------------------------------------------------------------------*
*&      Form  FRM_OUT_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_out_message .   
LOOP AT gdt_return INTO gds_return.     
WRITE:gds_return-type, gds_return-message.   
ENDLOOP.

ENDFORM" FRM_OUT_MESSAGE
*&---------------------------------------------------------------------*
*&      Form  GET_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GDS_MESSTAB  text
*      <--P_G_MESSAGE  text
*----------------------------------------------------------------------*
FORM get_message USING u_message TYPE bdcmsgcoll                   
CHANGING cg_message TYPE balmsgtxtp.   
CLEAR cg_message.   
CALL FUNCTION 'MESSAGE_TEXT_BUILD'     
EXPORTING       msgid               
= u_message-msgid       msgnr               
= u_message-msgnr       msgv1               
= u_message-msgv1       msgv2               
= u_message-msgv2       msgv3               
= u_message-msgv3       msgv4               
= u_message-msgv4     
IMPORTING       message_text_output 
= cg_message.

ENDFORM" GET_MESSAGE
*&---------------------------------------------------------------------*
*&      Form  FRM_CALL_TRANSACTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
*FORM FRM_CALL_TRANSACTION CHANGING C_SO TYPE VBELN
*                                   C_DN TYPE VBELN_VL.
**  DATA L_MODE TYPE C VALUE 'N'.
**  BREAK B012.
*  CALL TRANSACTION 'VA01' USING GDT_BDCDATA MODE P_MODE MESSAGES INTO GDT_MESSTAB.
*
*  LOOP AT GDT_MESSTAB INTO GDS_MESSTAB.
**提取SO和DN号
*    IF GDS_MESSTAB-MSGTYP EQ 'S'.
*      MOVE GDS_MESSTAB-MSGV3+0(10) TO C_DN.
*      MOVE GDS_MESSTAB-MSGV2+0(10) TO C_SO.
*
*      CONDENSE C_DN NO-GAPS.
*      CONDENSE C_SO NO-GAPS.
*    ENDIF.
*    PERFORM GET_MESSAGE USING GDS_MESSTAB
*                        CHANGING  G_MESSAGE .
*    GDS_RETURN-TYPE = GDS_MESSTAB-MSGTYP.
**    CONCATENATE GS_OUTPUT-IDNRK GS_OUTPUT-POSNR G_MESSAGE INTO  GDS_RETURN-MESSAGE SEPARATED BY ''.
*    MOVE G_MESSAGE TO GDS_RETURN-MESSAGE.
*    APPEND GDS_RETURN TO GDT_RETURN.
*    CLEAR GDS_RETURN.
*    CLEAR G_MESSAGE.
*  ENDLOOP.
*  SORT GDT_RETURN BY MESSAGE.
*  DELETE ADJACENT DUPLICATES FROM GDT_RETURN COMPARING MESSAGE.
*
*ENDFORM. " FRM_CALL_TRANSACTION
*&---------------------------------------------------------------------*
*&      Form  FRM_CALL_TRANSACTION1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
*FORM FRM_CALL_TRANSACTION1 CHANGING C_RESULT TYPE C .
*  CLEAR:GDT_MESSTAB.
*
*  CALL TRANSACTION 'VL02N' USING GDT_BDCDATA MODE P_MODE MESSAGES INTO GDT_MESSTAB.
*  LOOP AT GDT_MESSTAB INTO GDS_MESSTAB.
*    PERFORM GET_MESSAGE USING GDS_MESSTAB
*                        CHANGING  G_MESSAGE .
*    GDS_RETURN-TYPE = GDS_MESSTAB-MSGTYP.
*    IF GDS_MESSTAB-MSGTYP EQ 'E'.
*      C_RESULT = 'E'.
*    ELSEIF GDS_MESSTAB-MSGTYP EQ 'S'.
*      C_RESULT = 'S'.
*    ENDIF.
*
**    CONCATENATE GS_OUTPUT-IDNRK GS_OUTPUT-POSNR G_MESSAGE INTO  GDS_RETURN-MESSAGE SEPARATED BY ''.
*    MOVE G_MESSAGE TO GDS_RETURN-MESSAGE.
*    APPEND GDS_RETURN TO GDT_RETURN.
*    CLEAR GDS_RETURN.
*    CLEAR G_MESSAGE.
*
*  ENDLOOP.
*  SORT GDT_RETURN BY MESSAGE.
*  DELETE ADJACENT DUPLICATES FROM GDT_RETURN COMPARING MESSAGE.
*
*ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CALL_TRANSACTION2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
*FORM FRM_CALL_TRANSACTION2 .
*  CLEAR: GDT_MESSTAB.
**  BREAK B012.
*  WAIT UP TO 1 SECONDS.
*
*  CALL TRANSACTION 'VF01' USING GDT_BDCDATA MODE P_MODE MESSAGES INTO GDT_MESSTAB.
*
*  LOOP AT GDT_MESSTAB INTO GDS_MESSTAB.
*    PERFORM GET_MESSAGE USING GDS_MESSTAB
*                        CHANGING  G_MESSAGE .
*    GDS_RETURN-TYPE = GDS_MESSTAB-MSGTYP.
**    CONCATENATE GS_OUTPUT-IDNRK GS_OUTPUT-POSNR G_MESSAGE INTO  GDS_RETURN-MESSAGE SEPARATED BY ''.
*    MOVE G_MESSAGE TO GDS_RETURN-MESSAGE.
*    APPEND GDS_RETURN TO GDT_RETURN.
*    CLEAR GDS_RETURN.
*    CLEAR G_MESSAGE.
*  ENDLOOP.
*  SORT GDT_RETURN BY MESSAGE.
*  DELETE ADJACENT DUPLICATES FROM GDT_RETURN COMPARING MESSAGE.
*
*
*ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_show_message .   
DATA       lv_title  TYPE string.   
DATA:lt_return TYPE TABLE OF bapiret2,        ls_return 
TYPE bapiret2,        ls_layout 

TYPE slis_layout_alv.   

DATA: lt_fieldcat TYPE slis_t_fieldcat_alv.   
CLEAR: lt_return,ls_layout.   
CLEAR:lt_fieldcat.   ls_layout

-zebra 'X'.   ls_layout
-colwidth_optimize 'A'.   

PERFORM frm_set_catalog CHANGING lt_fieldcat.   
IMPORT lt_return FROM MEMORY ID 'LT_RETURN'.   
APPEND LINES OF gdt_return TO lt_return.   

CHECK lt_return IS NOT INITIAL.   lv_title 
'退货操作日志'.   
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'     
EXPORTING       is_layout             
= ls_layout       it_fieldcat           
= lt_fieldcat       i_screen_start_column 
10       i_screen_start_line   
1       i_screen_end_column   
120       i_screen_end_line     
25     
TABLES       t_outtab              
= lt_return     
EXCEPTIONS       program_error         
1       
OTHERS                2.   
IF sy-subrc <> 0.
* Implement suitable error handling here   
ENDIF.   

FREE MEMORY ID 'LT_RETURN'.   
REFRESH gdt_return.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM frm_set_catalog  CHANGING c_fieldcat TYPE slis_t_fieldcat_alv.   
DATA: ls_fieldcat TYPE slis_fieldcat_alv.   

DEFINE add_fieldcat.     LS_FIELDCAT
-FIELDNAME = &1.     LS_FIELDCAT
-SELTEXT_L = &2.     

APPEND LS_FIELDCAT TO C_FIELDCAT.     
CLEAR LS_FIELDCAT.   
END-OF-DEFINITION.   add_fieldcat

:   
'TYPE' '消息类型',   
'NUMBER' '消息编号',   
'MESSAGE' '消息文本',   
'MESSAGE_V1' '消息变量',   
'MESSAGE_V2' '消息变量',   
'MESSAGE_V3' '消息变量',   
'MESSAGE_V4' '消息变量',   
'PARAMETER' '参数名称',   
'ROW' '参数中的行',   
'FIELD' '参数中的字段'.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_POST_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_post_upload .   
DATA: lt_output TYPE TABLE OF ty_output.   
DATA: lv_meins TYPE mara-meins.   

DATA: l_line1 TYPE i,         l_line2 
TYPE i.   
DATA:     lv_string1 
TYPE string,     s1         
TYPE string,     s2         
TYPE string.   
DATA:           lv_zthlx_con 
TYPE string.   

CLEAR: lt_output,lt_output[].   
APPEND LINES OF gt_output TO lt_output.   
SORT lt_output BY zyddh sldto shpto matnr.   
DELETE ADJACENT DUPLICATES FROM lt_output COMPARING zyddh sldto shpto matnr.   l_line1 

lines( gt_output[] ).   l_line2 
lines( lt_output[] ).   

IF l_line1 NE l_line2.     
CLEAR gs_output.     gs_output
-zicon1 '@0A@'.     
CONCATENATE gs_output-mssg '数据存在重复' INTO gs_output-mssg.     
MODIFY gt_output FROM gs_output TRANSPORTING zicon1 mssg WHERE matnr IS NOT INITIAL.   
ENDIF.   

CLEAR: lt_output,lt_output[].   

IF gt_output IS NOT INITIAL.     
SELECT  *       
INTO CORRESPONDING FIELDS OF TABLE gt_knvp       
FROM knvp       
FOR ALL ENTRIES IN gt_output       
WHERE kunnr EQ gt_output-sldto          
AND  parvw EQ 'WE'.   

ENDIF.   
SORT gt_knvp BY kunnr kunn2.   

LOOP AT gt_output ASSIGNING <wa_data> WHERE zicon1 NE '@0A@'."红灯.

*检查单位是否为空     
IF <wa_data>-meins IS INITIAL.       
PERFORM set_callsytle USING 12 gs_load '单位不能为空' CHANGING <wa_data>-cellcolor <wa_data>-mssg.     
ENDIF.

*判断数量是否含小数     
IF <wa_data>-menge IS NOT INITIAL.       lv_string1 
= <wa_data>-menge.       
SPLIT lv_string1 AT '.' INTO s1 s2.       
IF s2 NE 0.         

PERFORM set_callsytle USING 17 gs_load '数量不能有小数' CHANGING <wa_data>-cellcolor <wa_data>-mssg.       

ENDIF.     
ENDIF.

*    TRANSLATE <WA_DATA>-ZYDDH TO UPPER CASE.     

IF r4 EQ 'X'."实退       lv_zthlx_con 
'B~ZTHLX EQ ''A'''.
*      <WA_DATA>-ZTHLX = 'A'.
*      <WA_DATA>-ZTHMS = '实退'.     
ELSEIF r5 EQ 'X'.       lv_zthlx_con 
'B~ZTHLX EQ ''B'''.
*      <WA_DATA>-ZTHLX = 'B'."空退
*      <WA_DATA>-ZTHMS = '空退'.     
ENDIF.

*****检查是否存在重复  的已导入     
SELECT SINGLE zyddh INTO <wa_data>-zyddh       
FROM ztsd015 AS a       INNER 
JOIN ztsd014 AS b       
ON a~batno EQ b~batno       
WHERE zyddh = <wa_data>-zyddh       
AND (lv_zthlx_con)       
AND sldto = <wa_data>-sldto       
AND matnr = <wa_data>-matnr.     

IF sy-subrc EQ 0.       <wa_data>
-zicon1 '@0A@'.       <wa_data>
-mssg '系统已存在该条目'.       
CONTINUE.     
ENDIF.     

IF <wa_data>-pstyv IS INITIAL.       
PERFORM set_callsytle USING 9 gs_load '行项目类型不能为空' CHANGING <wa_data>-cellcolor <wa_data>-mssg.     
ENDIF.     

IF <wa_data>-zr IS INITIAL.       
PERFORM set_callsytle USING 5 gs_load '主任不能为空' CHANGING <wa_data>-cellcolor <wa_data>-mssg.     
ENDIF.     

IF <wa_data>-zywy IS INITIAL.       
PERFORM set_callsytle USING 5 gs_load '业务员不能为空' CHANGING <wa_data>-cellcolor <wa_data>-mssg.     
ENDIF.     

IF <wa_data>-lgort IS INITIAL.       
PERFORM set_callsytle USING 8 gs_load '库存地点不能为空' CHANGING <wa_data>-cellcolor <wa_data>-mssg.     
ENDIF.     

IF <wa_data>-augru IS INITIAL.       
PERFORM set_callsytle USING 7 gs_load '退货原因不能为空' CHANGING <wa_data>-cellcolor <wa_data>-mssg.     
ENDIF.     

IF <wa_data>-zyddh IS INITIAL.       
PERFORM set_callsytle USING 6 gs_load '退单号不能为空' CHANGING <wa_data>-cellcolor <wa_data>-mssg.     
ENDIF.

*****
*    SELECT SINGLE meins INTO lv_meins
*      FROM mara
*      WHERE matnr EQ <wa_data>-matnr.
**数量单位转换
*
*    TRANSLATE <wa_data>-meins TO UPPER CASE.
*
*    CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
*      EXPORTING
*        i_matnr              = <wa_data>-matnr
*        i_in_me              = <wa_data>-meins
*        i_out_me             = lv_meins
*        i_menge              = <wa_data>-menge
*      IMPORTING
*        e_menge              = <wa_data>-menge
*      EXCEPTIONS
*        error_in_application = 1
*        error                = 2
*        OTHERS               = 3.
*    IF sy-subrc <> 0.
** Implement suitable error handling here
*    ENDIF.
*
*    MOVE lv_meins TO <wa_data>-meins.

*    MODIFY GT_OUTPUT FROM GS_OUTPUT TRANSPORTING MENGE MEINS.
*    CLEAR GS_OUTPUT.
*    IF <WA_DATA>-SHPTO IS INITIAL.
*      MOVE <WA_DATA>-KUNNR TO <WA_DATA>-SHPTO.
*
*      SELECT SINGLE NAME1 INTO <WA_DATA>-NAME2
*        FROM KNA1
*        WHERE KUNNR EQ <WA_DATA>-KUNNR
**        AND KTOKD EQ 'Z003'
*        .
*
*    ENDIF.
*    IF <WA_DATA>-SLDTO IS INITIAL.
*      MOVE <WA_DATA>-KUNNR TO <WA_DATA>-SLDTO.
*    ENDIF.     
READ TABLE gt_knvp INTO gs_knvp WITH KEY kunnr = <wa_data>-sldto kunn2 = <wa_data>-shpto BINARY SEARCH.     
IF sy-subrc NE .       
PERFORM set_callsytle(zsdr006USING 10 gs_load '客户与送达方没有对应关系' CHANGING <wa_data>-cellcolor <wa_data>-mssg.       <wa_data>
-zicon1 '@0A@'."红灯     
ENDIF.     

SELECT SINGLE name1 INTO <wa_data>-name3       
FROM kna1       
WHERE kunnr EQ <wa_data>-sldto
*      AND KTOKD EQ 'Z003'       
.     

IF r4 EQ 'X'."实退       <wa_data>
-zthlx 'A'.       <wa_data>
-zthms '实退'.     
ELSEIF r5 EQ 'X'.       <wa_data>
-zthlx 'B'."空退       <wa_data>
-zthms '空退'.     
ENDIF.     

SELECT SINGLE lgobe INTO <wa_data>-lgobe       
FROM t001l       
WHERE lgort EQ <wa_data>-lgort       
AND werks EQ '1000'.

*    <WA_DATA>-ZDDJE = <WA_DATA>-ZDDJG * <WA_DATA>-MENGE.     <wa_data>
-zddjg = <wa_data>-zddje / <wa_data>-menge.     

IF <wa_data>-mssg IS NOT INITIAL.       <wa_data>
-zicon1 '@0A@'."红灯     
ELSE.       <wa_data>
-zicon1 '@08@'."绿灯     

ENDIF.     

IF <wa_data>-zicon1 '@0A@'."红灯       
MOVE '-' TO <wa_data>-sel.       
PERFORM set_style USING 'SEL' 'DISABLE' CHANGING <wa_data>-style.     
ENDIF.   

ENDLOOP.   UNASSIGN <wa_data>

.
*将初始内表放入内存   lt_output 
= gt_output.   

EXPORT gt_output TO MEMORY ID 'GT_OUTPUT'.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_SODATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_C_RESULT  text
*----------------------------------------------------------------------*
FORM frm_check_sodata  CHANGING c_result.   
DATA:     ls_header  
TYPE bapisdhd1,     ls_headerx 
TYPE bapisdhd1x,     testrun    

TYPE bapiflag-bapiflag VALUE 'X',     lt_return  

TYPE TABLE OF bapiret2,     ls_return  
TYPE bapiret2,     lt_item    

TYPE TABLE OF bapisditm,     ls_item    
TYPE bapisditm,     lt_itemx   

TYPE TABLE OF bapisditmx,     ls_itemx   
TYPE bapisditmx,     lt_pnr     

TYPE TABLE OF bapiparnr,     ls_pnr     
TYPE bapiparnr,     lt_sch     

TYPE TABLE OF bapischdl,     ls_sch     
TYPE bapischdl,     lt_schx    

TYPE TABLE OF bapischdlx,     ls_schx    
TYPE bapischdlx     
.   


DATA: lv_posnr   TYPE posnr.

*  LOOP AT GT_SODATA ASSIGNING <WA_SODATA>.
*
*    ADD 10 TO LV_POSNR.
*
*    LS_ITEM-ITM_NUMBER = LV_POSNR.
*    LS_ITEM-MATERIAL = <WA_SODATA>-MATNR.
*    LS_ITEM-TARGET_QTY = <WA_SODATA>-MENGE.
*    LS_ITEM-PLANT = <WA_SODATA>-WERKS.
*    LS_ITEM-STORE_LOC = <WA_SODATA>-LGORT.
*    LS_ITEM-TARGET_QU = <WA_SODATA>-MEINS.
*    LS_ITEM-BATCH = <WA_SODATA>-CHARG.
*    LS_ITEM-SHIP_POINT = <WA_SODATA>-LGORT."装运点与库存地点相同
**    LS_ITEM-ITEM_CATEG = 'REN'.
*    APPEND LS_ITEM TO LT_ITEM.
*    CLEAR LS_ITEM.
*
*    LS_ITEMX-ITM_NUMBER = LV_POSNR.
*    LS_ITEMX-MATERIAL = 'X'.
*    LS_ITEMX-TARGET_QTY = 'X'.
*    LS_ITEMX-PLANT = 'X'.
*    LS_ITEMX-STORE_LOC = 'X'.
*    LS_ITEMX-TARGET_QU = 'X'.
*    LS_ITEMX-BATCH = 'X'.
*    LS_ITEMX-SHIP_POINT = 'X'.
**    LS_ITEMX-ITEM_CATEG = 'X'.
*    APPEND LS_ITEMX TO LT_ITEMX.
*    CLEAR LS_ITEMX.
*
*    LS_PNR-PARTN_ROLE = 'AG'." 'SP'."售达方
*    LS_PNR-PARTN_NUMB = <WA_SODATA>-SLDTO.
*    APPEND LS_PNR TO LT_PNR.
*    CLEAR LS_PNR.
*
*    LS_PNR-PARTN_ROLE = 'WE'." 'SH'."送达方
*    LS_PNR-PARTN_NUMB = <WA_SODATA>-SHPTO.
*    APPEND LS_PNR TO LT_PNR.
*    CLEAR LS_PNR.
*
*    LS_SCH-ITM_NUMBER = LV_POSNR.
*    LS_SCH-SCHED_LINE = 1.
*    LS_SCH-REQ_QTY = <WA_SODATA>-MENGE.
*
*    APPEND LS_SCH TO LT_SCH.
*    CLEAR LS_SCH.
*
*    LS_SCHX-ITM_NUMBER = LV_POSNR.
*    LS_SCHX-SCHED_LINE = 1.
*    LS_SCHX-REQ_QTY = 'X'.
*
*    APPEND LS_SCHX TO LT_SCHX.
*    CLEAR LS_SCHX.
*
*    AT END OF KUNNR.
*
*      CLEAR LV_POSNR.
*
*      LS_HEADER-DOC_TYPE = 'ZRE1'."不关联退货订单
*      LS_HEADER-SALES_ORG = <WA_SODATA>-VKORG.
*      LS_HEADER-DISTR_CHAN = <WA_SODATA>-VTWEG.
*      LS_HEADER-DIVISION = <WA_SODATA>-SPART.
*      LS_HEADER-SALES_GRP = <WA_SODATA>-VKGRP.
*      LS_HEADER-SALES_OFF = <WA_SODATA>-VKBUR.
*      LS_HEADER-ORD_REASON = <WA_SODATA>-AUGRU."退货原因
**实退
*      CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
*        EXPORTING
*          SALES_HEADER_IN = LS_HEADER
**         SALES_HEADER_INX              =
*          TESTRUN         = TESTRUN
*        TABLES
*          RETURN          = LT_RETURN
*          SALES_ITEMS_IN  = LT_ITEM
*          SALES_ITEMS_INX = LT_ITEMX
*          SALES_PARTNERS  = LT_PNR.
**空退后继免费
*      IF R5 EQ 'X'.
*        LS_HEADER-DOC_TYPE = 'ZSD9'."后继免费订单
*
*        CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
*          EXPORTING
*            ORDER_HEADER_IN     = LS_HEADER
*            TESTRUN             = TESTRUN
*          TABLES
*            RETURN              = LT_RETURN
*            ORDER_ITEMS_IN      = LT_ITEM
*            ORDER_ITEMS_INX     = LT_ITEMX
*            ORDER_PARTNERS      = LT_PNR
*            ORDER_SCHEDULES_IN  = LT_SCH
*            ORDER_SCHEDULES_INX = LT_SCHX.
*
*      ENDIF.
*    ENDAT.
*
*    READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'W'.
*    IF SY-SUBRC EQ 0.
*      C_RESULT = 'E'.
*
*      EXPORT LT_RETURN TO MEMORY ID 'LT_RETURN'.
*      PERFORM FRM_SHOW_MESSAGE.
*      RETURN.
*    ENDIF.
*
*    READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.
*
*    IF SY-SUBRC EQ 0.
*      C_RESULT = 'E'.
*
*      EXPORT LT_RETURN TO MEMORY ID 'LT_RETURN'.
*      PERFORM FRM_SHOW_MESSAGE.
*      RETURN.
*    ELSE.
*      C_RESULT = 'S'.
*    ENDIF.
*  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_BILLING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LV_RESULT  text
*----------------------------------------------------------------------*
*FORM FRM_BILLING  CHANGING C_RESULT.
*  DATA: LT_SODATA TYPE TABLE OF TY_SODATA,
*        LS_SODATA TYPE TY_SODATA.
*
*  DATA: LV_RESULT TYPE C.
*  LT_SODATA = GT_SODATA.
*
*  SORT LT_SODATA BY ZDN.
*
*  DELETE ADJACENT DUPLICATES FROM LT_SODATA COMPARING ZDN.
*
*  LOOP AT LT_SODATA INTO LS_SODATA.
*
*    CLEAR GDT_BDCDATA.
*    PERFORM BDC_DYNPRO      USING 'SAPMV60A' '0102'.
*    PERFORM BDC_FIELD       USING 'BDC_CURSOR' 'KOMFK-VBELN(01)'.
*    PERFORM BDC_FIELD       USING 'BDC_OKCODE' '=SICH'.
*    PERFORM BDC_FIELD       USING 'KOMFK-VBELN(01)' LS_SODATA-SO.
*
*    PERFORM FRM_CALL_TRANSACTION2."调用事务
*
*    IF LV_RESULT EQ 'E'.
*      PERFORM FRM_SHOW_MESSAGE.
*      C_RESULT = 'E'.
*      EXIT.
*    ELSE.
*      C_RESULT = 'S'.
*    ENDIF.
*  ENDLOOP.
*
*ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHARG_F4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_<WA_DATA>_CHARG  text
*      <--P_<WA_DATA>_ZSFSL  text
*----------------------------------------------------------------------*
FORM frm_charg_f4 CHANGING         c_charg 
TYPE charg_d"批次
*        C_ZSFSL TYPE MENGE_D      "实发数量         
.   

DATA: lt_ddshretval TYPE STANDARD TABLE OF ddshretval,         ls_return     
TYPE ddshretval,         l_it_cells    
TYPE lvc_t_cell,         l_gw_cells    
TYPE lvc_s_cell.   

DATA: lt_ftab TYPE TABLE OF dfies,         ls_ftab 
TYPE dfies,         lt_dn   

TYPE TABLE OF ty_dn,         ls_dn   
TYPE ty_dn.   

DATA:     l_tabname   
TYPE dd03v-tabname,     l_fieldname 
TYPE dd03v-fieldname,     l_help_valu 
TYPE help_info-fldvalue.   

REFRESH     gt_charg.   
REFRESH lt_ddshretval.

*取已发货的批次   
SELECT     a
~kunnr     b
~matnr     b
~charg     b
~werks     b
~lgort     
INTO CORRESPONDING FIELDS OF TABLE lt_dn     
FROM likp AS a     INNER 
JOIN lips AS b ON a~vbeln EQ b~vbeln     
WHERE a~kunnr EQ <wa_data>-shpto     
AND b~matnr EQ <wa_data>-matnr     
AND b~werks EQ 1000     
AND b~lgort EQ <wa_data>-lgort.
*取批次数量   

IF lt_dn IS NOT INITIAL.

*  SELECT CHARG CLABS
*    FROM MCHB INTO TABLE GT_CHARG
*    WHERE MATNR EQ <WA_DATA>-MATNR
*    AND WERKS = '1000'
*    AND LGORT = <WA_DATA>-LGORT.     
SELECT charg clabs       
FROM mchb INTO TABLE gt_charg       
FOR ALL ENTRIES IN lt_dn       
WHERE matnr EQ lt_dn-matnr       
AND werks '1000'       
AND lgort = lt_dn-lgort       
AND charg EQ lt_dn-charg   
.   
ENDIF.   

SORT gt_charg BY charg.   

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'     
EXPORTING       retfield        
'CHARG'    "指定ALV用F4的字段       dynpprog        
= sy-repid       value_org       
'S'     
TABLES       value_tab       
= gt_charg       field_tab       
= lt_ftab       return_tab      
= lt_ddshretval     
EXCEPTIONS       parameter_error 
1       no_values_found 
2       
OTHERS          3.   

IF sy-subrc AND lt_ddshretval IS NOT INITIAL .     
CLEAR ls_return.     
READ TABLE lt_ddshretval INTO ls_return INDEX 1.     c_charg 

= ls_return-fieldval.     

READ TABLE gt_charg INTO gs_charg WITH KEY charg = c_charg BINARY SEARCH.     
IF sy-subrc EQ 0.       
IF gs_charg-clabs LT <wa_data>-menge."批次数量大于实发数量         
MESSAGE '批次数量小于退货数量' TYPE 'S' DISPLAY LIKE 'E'.         
CLEAR c_charg.       
ENDIF.     

ENDIF.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_POST_GMVT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_post_gmvt CHANGING c_result.   
DATA:     lv_vbkok  
TYPE vbkok,     lv_wabuc  
TYPE wabuc VALUE 'X',     lt_vbpok  

TYPE TABLE OF vbpok,     ls_vbpok  
TYPE vbpok,     lt_prott  

TYPE TABLE OF prott WITH HEADER LINE,     ls_prott  
TYPE prott,     lt_return 

TYPE TABLE OF bapiret2,     wa_return 
TYPE bapiret2.   

DATA: lv_result TYPE c,         lv_vbeln  
TYPE vbeln_vl,         lv_posnr  
TYPE posnr_vl.   


DATA: lt_output TYPE TABLE OF ty_output,         ls_output 
TYPE ty_output.
*
*  DATA:
*    LS_HEADER  TYPE BAPIOBDLVHDRCON,
*    LS_CONTROL TYPE BAPIOBDLVHDRCTRLCON,
*    DELIVERY   TYPE BAPIOBDLVHDRCON-DELIV_NUMB,
*    LS_TECH    TYPE BAPIDLVCONTROL,
*    LV_VBELN   TYPE VBELN_VL,
*    LT_RETURN  TYPE TABLE OF BAPIRET2 WITH HEADER LINE
*    .   c_result 
'S'.   lt_output 

= gt_output.   
DELETE lt_output WHERE sel NE 'X'.

*  IF R4 EQ 'X'.   
SORT lt_output BY zthdn.   
DELETE ADJACENT DUPLICATES FROM lt_output COMPARING zthdn.
*  ELSEIF R5 EQ 'X'.
*    SORT LT_OUTPUT BY ZDN.
*  ENDIF.   
LOOP AT lt_output INTO ls_output.     
IF r6 EQ 'X'.       lv_vbkok
-vbeln_vl = ls_output-zthdn.       lv_vbkok
-wabuc     = lv_wabuc .       lv_vbkok
-wadat_ist = sy-datum .       lv_vbkok
-bldat     = sy-datum .

*      LS_CONTROL-DELIV_NUMB = LS_OUTPUT-ZTHDN.
*
*      LS_CONTROL-POST_GI_FLG = 'X'.
*
*      DELIVERY = LS_OUTPUT-ZTHDN.     
ENDIF.     

IF r3 EQ 'X'.       lv_vbkok

-vbeln_vl = ls_output-zdn.       lv_vbkok
-wabuc     = lv_wabuc .       lv_vbkok
-wadat_ist = sy-datum .       lv_vbkok
-bldat     = sy-datum .

*      LS_CONTROL-DELIV_NUMB = LS_OUTPUT-ZDN.
*
*      LS_CONTROL-POST_GI_FLG = 'X'.
*
*      DELIVERY = LS_OUTPUT-ZDN.     
ENDIF.     

WAIT UP TO 1 SECONDS.     

CALL FUNCTION 'SD_DELIVERY_UPDATE_PICKING'       
EXPORTING         vbkok_wa  
= lv_vbkok
*       SYNCHRON  = ' '
*       NO_MESSAGES_UPDATE           = ' '
*       NICHT_SPERREN                = ' '
*       AUFRUFER_T                   = ' '
*       IF_ERROR_MESSAGES_SEND       = 'X'       
TABLES         vbpok_tab 
= lt_vbpok[]         prot      
= lt_prott[].     

READ TABLE lt_prott TRANSPORTING NO FIELDS WITH KEY msgty 'E'.     
IF sy-subrc EQ 0.       
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.       
LOOP AT lt_prott WHERE msgty EQ 'E'.         
CLEAR wa_return.         wa_return
-type 'E'.         

CALL FUNCTION 'MESSAGE_TEXT_BUILD'           
EXPORTING             msgid               
= lt_prott-msgid             msgnr               
= lt_prott-msgno             msgv1               
= lt_prott-msgv1             msgv2               
= lt_prott-msgv2             msgv3               
= lt_prott-msgv3             msgv4               
= lt_prott-msgv4           
IMPORTING             message_text_output 
= wa_return-message.         

APPEND wa_return TO lt_return.         
CLEAR lt_prott.       
ENDLOOP.       

RETURN.     
ENDIF.     

CLEAR wa_return.     
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       
EXPORTING         
wait   'X'       
IMPORTING         
return = wa_return.     

IF wa_return-type EQ 'E'.       
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.       
APPEND wa_return TO lt_return.       

EXPORT lt_return TO MEMORY ID 'LT_RETURN'.       
PERFORM frm_show_message.
*      C_RESULT = 'E'.       
RETURN.     
ELSE.
*      C_RESULT = 'S'.

*      RETURN.     
ENDIF.
*    LS_TECH-UPD_IND = 'U'.
**发货过账
*    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
*      EXPORTING
*        HEADER_DATA    = LS_HEADER
*        HEADER_CONTROL = LS_CONTROL
*        DELIVERY       = DELIVERY
*        TECHN_CONTROL  = LS_TECH
*      TABLES
*        RETURN         = LT_RETURN[].

*    READ TABLE LT_RETURN TRANSPORTING NO FIELDS WITH KEY TYPE = 'E'.
*    IF SY-SUBRC EQ 0.
*      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
**       IMPORTING
**         RETURN        =
*        .
*      C_RESULT = 'E'.
*      EXPORT LT_RETURN TO MEMORY ID 'LT_RETURN'.
*      PERFORM FRM_SHOW_MESSAGE.
*
*      RETURN.
*    ENDIF.   

ENDLOOP.

*  IF C_RESULT EQ 'S'.
*    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*      EXPORTING
*        WAIT = 'X'
**     IMPORTING
**       RETURN        =
*      .
*  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_STYLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_style  USING   fieldname                         style 
TYPE string                 
CHANGING   it_styles TYPE lvc_t_styl.   

DATA: ls_style TYPE lvc_s_styl.   
CLEAR ls_style.   ls_style

-fieldname = fieldname.   
IF style EQ 'ENABLE'.     ls_style
-style = cl_gui_alv_grid=>mc_style_enabled.   
ELSE.     ls_style
-style = cl_gui_alv_grid=>mc_style_disabled.   
ENDIF.   
READ TABLE it_styles TRANSPORTING NO FIELDS WITH KEY fieldname = fieldname.   
IF sy-subrc EQ 0.     
MODIFY it_styles FROM ls_style INDEX sy-tabix.   
ELSE.     
INSERT ls_style INTO TABLE it_styles.   
ENDIF.   

FREE: ls_style.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_CALLSYTLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_callsytle  USING    p_pos                              wa_struct                              p_mssg                     


CHANGING it_cellcolor TYPE lvc_t_scol e_mssg.   

DATA:  wa_cellcolor TYPE lvc_s_scol.   

CLEAR wa_cellcolor.   

PERFORM get_fieldname_load USING p_pos wa_struct CHANGING wa_cellcolor-fname.   wa_cellcolor
-color-col '6'.   wa_cellcolor
-color-int '1'.   wa_cellcolor
-color-inv '1'.   

SORT it_cellcolor BY fname.   
READ TABLE it_cellcolor TRANSPORTING NO FIELDS WITH KEY fname = wa_cellcolor-fname BINARY SEARCH.   
IF sy-subrc EQ 0.     
MODIFY it_cellcolor FROM wa_cellcolor INDEX sy-tabix.   
ELSE.     
APPEND wa_cellcolor TO it_cellcolor.   
ENDIF.   

PERFORM biuld_message USING wa_cellcolor-fname p_mssg CHANGING e_mssg.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_FIELDNAME_LOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_fieldname_load  USING    p_pos gs_struct                          
CHANGING p_fname.   

DATA:  po_struct  TYPE REF TO cl_abap_structdescr,          lt_comptab 
TYPE cl_abap_structdescr=>component_table.   

FIELD-SYMBOLS: <f_comp>         TYPE cl_abap_structdescr=>component.   po_struct ?= cl_abap_structdescr

=>describe_by_data( gs_struct ).   lt_comptab 

= po_struct->get_components).   

CHECK lt_comptab[] IS NOT INITIAL.   

READ TABLE lt_comptab ASSIGNING <f_comp> INDEX p_pos.   

CHECK sy-subrc EQ 0.   p_fname 

= <f_comp>-name.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  ADD_LEAD_ZERO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM add_lead_zero  USING  p_len                     
CHANGING e_field.   

DATA: l_line TYPE i.   

CLEAR l_line.   l_line 

strlen( e_field ).   l_line 

= p_len - l_line.   

DO l_line TIMES.     
CONCATENATE '0' e_field INTO e_field.   
ENDDO.   

FREE: l_line.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  BIULD_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM biuld_message  USING    p_fname                              p_mssg                     

CHANGING e_mssg.   

DATA: l_temp TYPE string.   
CONCATENATE p_fname ':' p_mssg INTO l_temp.   

IF e_mssg IS INITIAL.     e_mssg 
= l_temp.   
ELSE.     
CONCATENATE e_mssg ';' l_temp INTO e_mssg.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_POST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_post USING u_vbeln u_flag.   
DATA lv_result TYPE string.   

SELECT SINGLE wbstk INTO @DATA(lv_wbstk)     
FROM vbuk     
WHERE vbeln EQ @u_vbeln.

*BREAK B012.   

IF lv_wbstk EQ 'C'.     gs_output
-sel 'X'.     
IF u_flag EQ 1.       
MODIFY gt_output FROM gs_output TRANSPORTING sel       
WHERE zthdn EQ u_vbeln.       

PERFORM frm_save_data USING 'POST1' CHANGING lv_result.     

ELSEIF u_flag EQ 2.       
MODIFY gt_output FROM gs_output TRANSPORTING sel     
WHERE zdn EQ u_vbeln.       

PERFORM frm_save_data USING 'POST2' CHANGING lv_result.     

ENDIF.
*    IF LV_RESULT EQ 'S'.
*      MESSAGE '过账成功!' TYPE 'S'.
*    ELSE.
*      MESSAGE '过账失败!' TYPE 'S' DISPLAY LIKE 'E'.
*    ENDIF.     

CLEAR lv_result.   

ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_RETURNSO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_HEADER  text
*      -->P_LT_ITEM  text
*      -->P_LT_ITEMX  text
*      -->P_LT_PNR  text
*      -->P_LT_SCH  text
*      -->P_LT_SCHX  text
*      -->P_LT_COND  text
*      -->P_LT_CONDX  text
*      <--P_LV_SO  text
*      <--P_LT_RETURN  text
*----------------------------------------------------------------------*
FORM frm_create_returnso   
TABLES
*    ,T_RETURN STRUCTURE BAPIRET2   t_item 
STRUCTURE bapisditm   t_itemx 
STRUCTURE bapisditmx   t_pnr 
STRUCTURE bapiparnr   t_sch 
STRUCTURE bapischdl   t_schx 
STRUCTURE bapischdlx   t_cond 
STRUCTURE bapicond   t_condx 
STRUCTURE bapicondx   
USING    u_header   


CHANGING c_so c_result.   

DATA:     lt_return 
TYPE TABLE OF bapiret2,     ls_return 
TYPE bapiret2.   


CALL FUNCTION 'BAPI_CUSTOMERRETURN_CREATE'     
EXPORTING       return_header_in     
= u_header
*     return_header_inx    = ls_bapisdhdx     
IMPORTING       salesdocument        
= c_so     
TABLES       
return               = lt_return[]       return_items_in      
= t_item[]       return_items_inx     
= t_itemx[]       return_partners      
= t_pnr[]       return_schedules_in  
= t_sch[]       return_schedules_inx 
= t_schx[]       return_conditions_in 
= t_cond[].

*  READ TABLE lt_return INTO ls_return WITH KEY type = 'W'.
*  IF sy-subrc EQ 0.
*    c_result = 'E'.
*    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
**       IMPORTING
**         RETURN        =
*      .
*
*    EXPORT lt_return TO MEMORY ID 'LT_RETURN'.
*    PERFORM frm_show_message.
*    RETURN.
*  ENDIF.   

READ TABLE lt_return INTO ls_return WITH KEY type 'E'.   

IF sy-subrc EQ 0.     c_result 
'E'.     
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*       IMPORTING
*         RETURN        =       
.     

EXPORT lt_return TO MEMORY ID 'LT_RETURN'.     
PERFORM frm_show_message.     
RETURN.   
ELSE.     
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       
EXPORTING         
wait 'X'.     c_result 
'S'.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_RETURNSO1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_RETURN  text
*      -->P_LS_HEADER  text
*      -->P_LT_ITEM  text
*      -->P_LT_ITEMX  text
*      -->P_LT_PNR  text
*      -->P_LT_SCH  text
*      -->P_LT_SCHX  text
*      -->P_LT_COND  text
*      -->P_LT_CONDX  text
*      <--P_LV_SO  text
*----------------------------------------------------------------------*
FORM frm_create_returnso1   
TABLES
*    T_RETURN STRUCTURE BAPIRET2   t_item 
STRUCTURE bapisditm   t_itemx 
STRUCTURE bapisditmx   t_pnr 
STRUCTURE bapiparnr   t_sch 
STRUCTURE bapischdl   t_schx 
STRUCTURE bapischdlx   t_cond 
STRUCTURE bapicond   t_condx 
STRUCTURE bapicondx   
USING    u_header   


CHANGING c_so            c_result                            
.   

DATA:     lt_return 
TYPE TABLE OF bapiret2,     ls_return 
TYPE bapiret2.

*  BREAK B012.   
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'     
EXPORTING       order_header_in     
= u_header     
IMPORTING       salesdocument       
= c_so     
TABLES       
return              = lt_return[]       order_items_in      
= t_item[]       order_items_inx     
= t_itemx[]       order_partners      
= t_pnr[]       order_schedules_in  
= t_sch[]       order_schedules_inx 
= t_schx[]
*     ORDER_CONDITIONS_IN = T_COND[]
*     ORDER_CONDITIONS_INX = T_CONDX[]     
.

*  READ TABLE lt_return INTO ls_return WITH KEY type = 'W'.
*  IF sy-subrc EQ 0.
*    c_result = 'E'.
*    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
**       IMPORTING
**         RETURN        =
*      .
*
*    EXPORT lt_return TO MEMORY ID 'LT_RETURN'.
*    PERFORM frm_show_message.
*    RETURN.
*  ENDIF.   

READ TABLE lt_return INTO ls_return WITH KEY type 'E'.   

IF sy-subrc EQ 0.     c_result 
'E'.     
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*       IMPORTING
*         RETURN        =       
.     

EXPORT lt_return TO MEMORY ID 'LT_RETURN'.     
PERFORM frm_show_message.     
RETURN.   
ELSE.     

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       
EXPORTING         
wait 'X'.     c_result 
'S'.   
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_DN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_SO  text
*      <--P_LV_DN  text
*----------------------------------------------------------------------*
FORM frm_create_dn  USING    u_so                     
CHANGING c_dn c_result.   

DATA: lt_so_item TYPE TABLE OF bapidlvreftosalesorder,         ls_so_item 
TYPE bapidlvreftosalesorder,         lt_return  

TYPE TABLE OF bapiret2,         ls_return  
TYPE bapiret2.   ls_so_item

-ref_doc = u_so.   
APPEND ls_so_item TO lt_so_item.   
CLEAR ls_so_item.   

CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'     
IMPORTING       delivery          
= c_dn     
TABLES       sales_order_items 
= lt_so_item       
return            = lt_return.   

READ TABLE lt_return INTO ls_return WITH KEY type 'E'.   

IF sy-subrc EQ 0.     c_result 
'E'.     
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*       IMPORTING
*         RETURN        =       
.     

EXPORT lt_return TO MEMORY ID 'LT_RETURN'.     
PERFORM frm_show_message.     
RETURN.   
ELSE.     

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       
EXPORTING         
wait 'X'.     c_result 
'S'.   
ENDIF.   

CALL FUNCTION 'RV_DELIVERY_INIT'     
EXPORTING       status_buff_init 
= status_buff_init       i_call_activity  
= call_activity       if_no_deque      
= g_no_dequeue_sd_sales.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_MODIFY_SODATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_SO  text
*      -->P_LV_DN  text
*----------------------------------------------------------------------*
FORM frm_modify_sodata  USING   u_so                                 u_dn   

CHANGING c_result.   
DATA  ls_sodata TYPE ty_sodata.   
DATA: lv_so TYPE vbeln,         lv_dn 
TYPE vbeln_vl.   lv_so 

= u_so.   lv_dn 
= u_dn.   

IF lv_so IS NOT INITIAL.     ls_sodata
-so = lv_so.     
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'       
EXPORTING         
input  = ls_sodata-so       
IMPORTING         
output = ls_sodata-so.     ls_sodata

-zdn = lv_dn.     
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'       
EXPORTING         
input  = ls_sodata-zdn       
IMPORTING         
output = ls_sodata-zdn.     


MODIFY gt_sodata FROM ls_sodata TRANSPORTING so zdn     
WHERE so EQ 'X' AND zdn EQ 'X'.     

PERFORM frm_post_dn USING lv_dn .     

CALL FUNCTION 'RV_DELIVERY_INIT'       
EXPORTING         status_buff_init 
= status_buff_init         i_call_activity  
= call_activity         if_no_deque      
= g_no_dequeue_sd_sales.     

CLEAR:lv_so,lv_dn.   

ELSE.     
PERFORM frm_show_message.     c_result 
'E'.     
EXIT.   
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_MODIFY_SODATA1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_SO1  text
*      -->P_LV_DN1  text
*      <--P_C_RESULT  text
*----------------------------------------------------------------------*
*FORM FRM_MODIFY_SODATA  USING   U_SO
*                                U_DN
*  CHANGING C_RESULT.
*  DATA  LS_SODATA TYPE TY_SODATA.
*  DATA: LV_SO TYPE VBELN,
*        LV_DN TYPE VBELN_VL.
*
*  LV_SO = U_SO.
*  LV_DN = U_DN.
*
*  IF LV_SO IS NOT INITIAL.
*    LS_SODATA-SO = LV_SO.
*    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*      EXPORTING
*        INPUT  = LS_SODATA-SO1
*      IMPORTING
*        OUTPUT = LS_SODATA-SO1.
*
*    LS_SODATA-ZDN = LV_DN.
*    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*      EXPORTING
*        INPUT  = LS_SODATA-ZDN1
*      IMPORTING
*        OUTPUT = LS_SODATA-ZDN1.
*
*
*    MODIFY GT_SODATA FROM LS_SODATA TRANSPORTING SO1 ZDN1
*    WHERE SO1 EQ 'X' AND ZDN1 EQ 'X'.
*
*    CLEAR:LV_SO,LV_DN.
*
*  ELSE.
*    PERFORM FRM_SHOW_MESSAGE.
*    C_RESULT = 'E'.
*    EXIT.
*  ENDIF.
*ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_PARTNER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GS_OUTPUT_SLDTO  text
*      <--P_LV_RESULT  text
*----------------------------------------------------------------------*
FORM frm_check_partner  USING    u_sldto                         
CHANGING c_result.   

DATA:lv_msg TYPE string.   
DATA:     ls_a515 
TYPE a515,     lt_a515 
TYPE TABLE OF a515.   

SELECT SINGLE vkorg vtweg spart vkbur vkgrp vsbed     
INTO ( gs_sodata-vkorg,gs_sodata-vtweg,gs_sodata-spart,     gs_sodata
-vkbur,gs_sodata-vkgrp,gs_sodata-vsbed )     
FROM knvv     
WHERE kunnr EQ u_sldto     
AND vtweg EQ '20'"直营     
AND loevm NE 'X'"删除标记
*      AND VSBED EQ '99'"装运条件     
.   

IF sy-subrc NE 0.     c_result 
'E'.     lv_msg 
'售达方' && u_sldto && '销售组织数据不正确,请检查。'.     
MESSAGE s001 WITH lv_msg DISPLAY LIKE 'E'.     
RETURN.   
ENDIF.

*  SELECT SINGLE SPOFI INTO @DATA(LV_SPOFI)
*    FROM TVLK
*    WHERE LFART EQ 'ZLR'."退货交货
*
*  IF SY-SUBRC EQ 0.
*
*    IF LV_SPOFI EQ SPACE. "特定工厂装运点
*      SELECT SINGLE VSTEL INTO @DATA(LV_VSTEL)
*        FROM TVSTZ
*        WHERE VSBED EQ @GS_SODATA-VSBED
*        AND LADGR EQ '0001'
*        AND WERKS EQ '1000'.
*      IF SY-SUBRC NE 0.
*        C_RESULT = 'E'.
*        LV_MSG = '售达方' && U_SLDTO && '按工厂1000确定的装运点不存在。'.
*        MESSAGE S001 WITH LV_MSG DISPLAY LIKE 'E'.
*        RETURN.
*      ENDIF.
*    ELSE."按库存地点确定装运点
*
*      SELECT SINGLE LGORT INTO @DATA(LV_LGORT)
*        FROM KNA1
*        WHERE KUNNR EQ @U_SLDTO.
*
*      SELECT SINGLE VSTEL INTO LV_VSTEL
*        FROM TVSTZ_STORLOC
*        WHERE VSBED EQ GS_SODATA-VSBED
*        AND LADGR EQ '0001'
*        AND WERKS EQ '1000'
*        AND LGORT EQ LV_LGORT.
*
*      IF SY-SUBRC NE 0.
*        C_RESULT = 'E'.
*        LV_MSG = '售达方' && U_SLDTO && '按库存地点' && LV_LGORT && '确定的装运点不存在。'.
*        MESSAGE S001 WITH LV_MSG DISPLAY LIKE 'E'.
*        RETURN.
*      ENDIF.
*    ENDIF.
*
**检查条件记录是否存在
*    SELECT
*      *
*      INTO TABLE LT_A515
*      FROM A515
*      WHERE KSCHL EQ 'PRZ0'
*      AND KUNNR EQ U_SLDTO
*      AND MATNR EQ GS_SODATA-MATNR.
*
*    IF SY-SUBRC NE 0.
*      C_RESULT = 'E'.
*
*      LV_MSG = '售达方' && U_SLDTO && '物料' && GS_SODATA-MATNR && '条件记录PRZ0不存在。'.
*      MESSAGE S001 WITH LV_MSG DISPLAY LIKE 'E'.
*
*      RETURN.
*
*    ELSE.
*      SORT LT_A515 BY DATBI DESCENDING.
*      DELETE ADJACENT DUPLICATES FROM LT_A515 COMPARING KAPPL KSCHL  KUNNR        MATNR.
*
*      READ TABLE LT_A515 INTO LS_A515 INDEX 1.
*
*      SELECT SINGLE KBETR INTO @DATA(KBETR)
*        FROM KONP
*        WHERE KNUMH EQ @LS_A515-KNUMH
*        AND   KSCHL EQ 'PRZ0'
*        AND KBETR EQ 0.
*
*      IF SY-SUBRC  EQ 0.
*        C_RESULT = 'E'.
*
*        LV_MSG = '售达方' && U_SLDTO && '物料' && GS_SODATA-MATNR && '条件记录PRZ0价格不能为0。'.
*        MESSAGE S001 WITH LV_MSG DISPLAY LIKE 'E'.
*
*        RETURN.
*      ENDIF.
*    ENDIF.
*   c_result 
'S'.
*  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEL_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_sel_all .   
DATA : lt_filtered_entries TYPE lvc_t_fidx.   
FREE lt_filtered_entries.   

CALL METHOD gct_alv->get_filtered_entries     
IMPORTING       et_filtered_entries 
= lt_filtered_entries.   

LOOP AT gt_output ASSIGNING <wa_data> WHERE sel EQ space.     
READ TABLE lt_filtered_entries  TRANSPORTING NO FIELDS WITH KEY table_line = sy-tabix.     
IF sy-subrc NE 0.       <wa_data>
-sel 'X'.     
ENDIF.   
ENDLOOP.   UNASSIGN <wa_data>

.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_LOCK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_lock .   
SORT gt_batno[] BY batno batpo.   
DELETE ADJACENT DUPLICATES FROM gt_batno[] COMPARING ALL FIELDS.   

LOOP AT gt_batno.     
CALL FUNCTION 'ENQUEUE_EZSD001'       
EXPORTING         mode_ztsd002   
'E'         batno          
= gt_batno-batno         batpo          
= gt_batno-batpo
*       X_BATNO        = ' '
*       X_BATPO        = ' '
*       _SCOPE         = '2'
*       _WAIT          = ' '
*       _COLLECT       = ' '       
EXCEPTIONS         foreign_lock   
1         system_failure 
2         
OTHERS         3.     
IF sy-subrc <> 0.       gs_mesg
-mesg '批导编号' && gt_batno-batno && '行号' && gt_batno-batpo && '的订单' && '被用户' && sy-msgv1 && '锁定'.
*      GS_MESG-MSGNO = SY-MSGNO.
*      GS_MESG-MSGTY = SY-MSGTY.
*      GS_MESG-MSGV1 = SY-MSGV1.
*      GS_MESG-MSGV2 = SY-MSGV2.
*      GS_MESG-MSGV3 = SY-MSGV3.
*      GS_MESG-MSGV4 = SY-MSGV4.       
APPEND gs_mesg TO gt_mesg.       
CLEAR gs_mesg.     
ENDIF.   

ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_RESET_LOCK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_reset_lock .   

LOOP AT gt_batno.     
CALL FUNCTION 'DEQUEUE_EZSD001'       
EXPORTING         mode_ztsd002 
'E'         batno        
= gt_batno-batno         batpo        
= gt_batno-batpo         x_batno      
' '         x_batpo      
' '         _scope       
'3'         _synchron    
' '         _collect     
' '.   

ENDLOOP.   

FREE gt_batno.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DELETE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_delete_data .   
DATA: lt_del TYPE TABLE OF ztsd015 WITH HEADER LINE.   

LOOP AT gt_output INTO gs_output WHERE sel EQ 'X'.
*    IF GS_OUTPUT-ZTHDD IS INITIAL.
*      DELETE GT_OUTPUT.
*      DELETE FROM ZTSD015 WHERE BATNO EQ GS_OUTPUT-BATNO AND BATPO EQ GS_OUTPUT-BATPO.
**            DELETE FROM ZTSD016 WHERE BATNO EQ GS_OUTPUT-BATNO AND BATPO EQ GS_OUTPUT-BATPO.
*    ELSE.     
SELECT SINGLE vbeln INTO @DATA(lv_vbeln)       
FROM likp       
WHERE vbeln EQ @gs_output-zthdd.     
IF sy-subrc EQ 0.       
MESSAGE '已生成退货订单不允许删除。' TYPE 'S' DISPLAY LIKE 'E'.       
RETURN.     
ENDIF.
*    ENDIF.   
ENDLOOP.   

CLEAR gs_output.   
LOOP AT gt_output INTO gs_output WHERE sel EQ 'X'.     
IF gs_output-zuser NE sy-uname.       
MESSAGE '不允许删除其他用户的验单数据。' TYPE 'S' DISPLAY LIKE 'E'.       
RETURN.     
ENDIF.     

CLEAR lt_del.     lt_del
-batno = gs_output-batno.     lt_del
-batpo = gs_output-batpo.     lt_del
-sldto = gs_output-sldto.     lt_del
-shpto = gs_output-shpto.     lt_del
-matnr = gs_output-matnr.     
APPEND lt_del TO lt_del.     
CLEAR gs_output.   
ENDLOOP.   

DELETE gt_output WHERE sel EQ 'X'.   

IF lt_del[] IS NOT INITIAL.     
DELETE ztsd015 FROM TABLE lt_del[].     
IF sy-subrc EQ 0.       
COMMIT WORK AND WAIT.       
MESSAGE '删除成功!' TYPE 'S'.     
ELSE.       
ROLLBACK WORK.       
MESSAGE '删除失败!' TYPE 'S' DISPLAY LIKE 'E'.     
ENDIF.     
CLEAR: lt_del,lt_del[].   
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_STAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_<WA_DATA>_ZTHDD  text
*----------------------------------------------------------------------*
FORM frm_get_stat  USING u_so TYPE vbeln.   
DATA: lv_so TYPE vbeln,         lv_dn 
TYPE vbeln_vl.   lv_so 

= u_so.   

CHECK lv_so  IS NOT INITIAL.   

SELECT SINGLE a~vbeln INTO <wa_data>-zthdd     
FROM vbkd AS a     INNER 
JOIN vbap AS b     
ON a~vbeln EQ b~vbeln     
AND a~posnr EQ b~posnr     INNER 
JOIN vbak AS c     
ON a~vbeln EQ c~vbeln     
WHERE bstkd_e EQ <wa_data>-key     
AND b~abgru EQ space     
AND c~auart EQ 'ZRE1'.
*  SELECT SINGLE A~VBELN INTO <WA_DATA>-ZTHDD
*    FROM VBKD AS A
*    INNER JOIN VBAK AS B
*    ON A~VBELN EQ B~VBELN
*    WHERE ( BSTKD_E = <WA_DATA>-KEY
*    AND B~AUART EQ 'ZRE1'
*    AND A~POSNR NE SPACE )
*    OR ( BSTKD_E = <WA_DATA>-ZYDDH
*    AND B~AUART EQ 'ZRE1'
*    AND A~POSNR EQ SPACE )
*    OR ( BSTKD = <WA_DATA>-ZYDDH
*    AND B~AUART EQ 'ZRE1'
*    AND A~POSNR EQ SPACE ).   

IF sy-subrc EQ 0.     
SELECT SINGLE vbeln INTO <wa_data>-zthdn       
FROM vbfa       
WHERE ( vbelv EQ <wa_data>-zthdd       
AND vbtyp_n EQ 'J' )       
OR ( vbelv EQ <wa_data>-zthdd AND vbtyp_n EQ 'T' ).     
IF sy-subrc EQ 0.     
ELSE.       
CLEAR <wa_data>-zthdn.     
ENDIF.   
ELSE.     
CLEAR <wa_data>-zthdd.     
CLEAR <wa_data>-zthdn.   

ENDIF.

*取状态   lv_dn 
= <wa_data>-zthdn.   

SELECT SINGLE wbstk fkstk     
INTO ( <wa_data>-wbstk1, <wa_data>-fkstk1 )     
FROM vbuk     
WHERE vbeln EQ lv_dn.   

CLEAR lv_dn.   

SELECT SINGLE a~vbeln INTO <wa_data>-zmfck     
FROM vbkd AS a     INNER 
JOIN vbap AS b     
ON a~vbeln EQ b~vbeln     
AND a~posnr EQ b~posnr     INNER 
JOIN vbak AS c     
ON a~vbeln EQ c~vbeln     
WHERE bstkd_e EQ <wa_data>-key     
AND b~abgru EQ space     
AND c~auart EQ 'ZSD9'.

*  SELECT SINGLE A~VBELN INTO <WA_DATA>-ZMFCK
*    FROM VBKD AS A
*    INNER JOIN VBAK AS B
*    ON A~VBELN EQ B~VBELN
*    WHERE ( BSTKD_E = <WA_DATA>-KEY
*    AND B~AUART EQ 'ZSD9'
*    AND A~POSNR NE SPACE )
*    OR ( BSTKD_E = <WA_DATA>-ZYDDH
*    AND B~AUART EQ 'ZSD9'
*    AND A~POSNR EQ SPACE )
*    OR ( BSTKD = <WA_DATA>-ZYDDH
*    AND B~AUART EQ 'ZSD9'
*    AND A~POSNR EQ SPACE ).   

IF sy-subrc EQ 0.     
SELECT SINGLE vbeln INTO <wa_data>-zdn       
FROM vbfa       
WHERE ( vbelv EQ <wa_data>-zmfck       
AND vbtyp_n EQ 'J' )       
OR ( vbelv EQ <wa_data>-zmfck AND vbtyp_n EQ 'T' ).     
IF sy-subrc EQ 0.     
ELSE.       
"CLEAR <wa_data>-zmfck.       
CLEAR <wa_data>-zdn.     
ENDIF.   
ELSE.     
CLEAR <wa_data>-zdn.     
CLEAR <wa_data>-zmfck.   


ENDIF.

*取状态   lv_dn 
= <wa_data>-zdn.   
IF lv_dn IS NOT INITIAL.     
SELECT SINGLE wbstk fkstk       
INTO ( <wa_data>-wbstk2,<wa_data>-fkstk2 )       
FROM vbuk       
WHERE vbeln EQ lv_dn.   
ENDIF.   


CLEAR lv_dn.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_authority_check .   
DATA: l_temp TYPE string.   
DATA: lt_t001l TYPE TABLE OF t001l WITH HEADER LINE.   

SELECT lgort     
INTO CORRESPONDING FIELDS OF TABLE lt_t001l     
FROM t001l     
WHERE werks EQ 1000     
AND lgort IN s_lgort.   

IF lt_t001l[] IS INITIAL.     
MESSAGE '没有库存地点记录' TYPE 'S' DISPLAY LIKE 'E'.     
STOP.   
ENDIF.   

LOOP AT lt_t001l.     
AUTHORITY-CHECK OBJECT 'M_MSEG_LGO'              
ID 'ACTVT' DUMMY              
ID 'WERKS' FIELD '1000'              
ID 'LGORT' FIELD lt_t001l-lgort              
ID 'BWART' DUMMY.     
IF sy-subrc <> 0.       
MESSAGE '您没有库存地点' && lt_t001l-lgort && '的权限' TYPE 'E'.       
RETURN.
* Implement a suitable exception handling here     
ENDIF.   
ENDLOOP.   
FREE lt_t001l.   
FREE: l_temp.
ENDFORM.

posted @ 2016-12-28 10:10  東東東東  阅读(1466)  评论(0)    收藏  举报