码迷,mamicode.com
首页 > 其他好文 > 详细

SAP 直营验单

时间:2016-05-23 18:48:13      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

*&---------------------------------------------------------------------*
*& Report  ZSDR005
*&
*&---------------------------------------------------------------------*
*&程序名称:直营平台-
*&事物代码:ZSD025
*&导入模板:直接下载
*&作者:
*&时间:2016/2/29
*&---------------------------------------------------------------------*
REPORT ZSDR046 MESSAGE-ID 00.

TYPE-POOLS:OLE2,SLIS,ICON.
FIELD-SYMBOLS: <FS>.

TABLES: SSCRFIELDS,ZTSD008,ZTSD009,MCHB.

TYPESBEGIN OF TY_OUTPUT,
         SEL       TYPE C,
         BATNO     TYPE ZTSD008-BATNO"批导序号
         BATPO     TYPE ZTSD009-BATPO"验单批导序号
         VERNO     TYPE ZTSD010-VERNO"版本号
         ZDATE     TYPE ZTSD008-ZDATE"导入日期
         INDAT     TYPE ZTSD009-INDAT"验单日期
         LFDAT     TYPE LIKP-LFDAT"实际交货日期
*         KUNNR     TYPE KUNNR, "客户号
*         NAME1     TYPE KNA1-NAME1, "客户名称
         ZSJ       TYPE KUNNR"司机

         ZR        TYPE CHAR30"主任
         ZYWY      TYPE CHAR30"业务员

         NAME2     TYPE KNA1-NAME1"司机名称
*         KUNNR1    TYPE KUNNR, "司机系统
*         NAME2     TYPE KNA1-NAME1, "司机系统名称
         MATNR     TYPE ZTSD009-MATNR"物料号
         MAKTX     TYPE MAKT-MAKTX"物料描述
         MENGE     TYPE ZTSD009-MENGE"验单数量
         MEINS     TYPE MEINS"数量单位
*         CHARG     TYPE CHARG_D, "批次
         ZYDJG     TYPE ZTSD009-ZYDJG"验单价格
         ZYDJE     TYPE ZTSD009-ZYDJE"合计金额
         ZYDDH     TYPE ZTSD009-ZYDDH"验单单号
         SO        TYPE ZTSD009-VBELN"SO
         DN        TYPE VBELN_VL"DN
         ZICON1    TYPE CHAR4"导入状态
         VKBUR     TYPE VKBUR"销售部门
         VKORG     TYPE VKORG,
         LGORT     TYPE LGORT_D,
         RESLO     TYPE RESLO"发货库存地

         SHPTO     TYPE KUNNR"送达方
         NAME_HP   TYPE NAME1"送达方名称
         SLDTO     TYPE KUNNR"售达方
         NAME_LD   TYPE NAME1"售达方名称

         CELLCOLOR TYPE LVC_T_SCOL"控制单元格颜色
         STYLE     TYPE LVC_T_STYL"控制单元格可否编辑
         MSSG      TYPE BAPI_MSG"消息内容

         ZFREE     TYPE C,
         BEIZHU    TYPE CHAR255"备注
         ZUSER     TYPE ZTSD008-ZUSER,
         WBSTK     TYPE VBUK-WBSTK"货物移动状态
         FKSTK     TYPE VBUK-FKSTK"开票状态
       END OF TY_OUTPUT.

TYPESBEGIN OF TY_LOAD,
         INDAT  TYPE ZTSD009-INDAT"验单日期
         LFDAT  TYPE LIKP-LFDAT"交货日期
*         KUNNR  TYPE KUNNR,
*         BLANK  TYPE C, "占位
         SLDTO  TYPE KUNNR"售达方
*         BLANK1 TYPE C, "占位
         SHPTO  TYPE KUNNR"送达方
*         BLANK2 TYPE C, "占位
         ZYDDH  TYPE ZTSD009-ZYDDH"验单单号
         ZSJ    TYPE KUNNR"司机
*         BLANK5 TYPE C, "占位
         ZR     TYPE CHAR30"主任
         ZYWY   TYPE CHAR30"业务员
         VKBUR  TYPE VKBUR"销售部门
*         BLANK3 TYPE C, "占位
         BEIZHU TYPE CHAR255"备注
         MEINS  TYPE MEINS"数量单位
         MATNR  TYPE ZTSD009-MATNR,
         MENGE  TYPE MENGE_D"验单数量
         ZYDJG  TYPE ZTSD009-ZYDJG"验单价格
         ZYDJE  TYPE ZTSD009-ZYDJE"验单金额
*         BLANK4 TYPE C, "
       END OF TY_LOAD.

TYPESBEGIN OF TY_SODATA,
         ZYDDH TYPE ZTSD009-ZYDDH"验单单号

         INDAT TYPE ZTSD009-INDAT,
         LFDAT TYPE LIKP-LFDAT,
*         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"销售组
         VKBUR TYPE VBAK-VKBUR"销售部门
         VSBED TYPE KNVV-VSBED"装运条件
         MATNR TYPE EKPO-MATNR"物料代码

         VSTEL TYPE VSTEL"装运点

         RESLO TYPE RESLO"发货库存地
         WERKS TYPE VBAP-WERKS"
         MENGE TYPE KWMENG"数量
         MEINS TYPE MEINS"单位
*         CHARG TYPE CHARG_D, "批次
         ZYDJE TYPE ZTSD009-ZYDJE"验单价格
         BATNO TYPE ZTSD008-BATNO"批导序号
         BATPO TYPE ZTSD009-BATPO"批导行项目号

         SO    TYPE VBAK-VBELN"销售订单号
         DN    TYPE LIKP-VBELN"交货单号

         KPEIN TYPE KOMV-KPEIN"条件定价单位
         KMEIN TYPE KOMV-KMEIN"条件单位

       END OF TY_SODATA.

TYPES:  BEGIN OF TYP_HEADER,
          ZTEXT(10),
        END OF TYP_HEADER.

TYPESBEGIN OF TY_MESG,
         MESG TYPE CHAR255,
       END OF TY_MESG.

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 TABLE OF TY_LOAD,
      GT_OUTPUT TYPE TABLE OF TY_OUTPUT,
      GT_SODATA TYPE TABLE OF TY_SODATA.

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 P_MODE TYPE VALUE ‘N‘.

DATABEGIN OF GT_BATNO OCCURS 0,
        BATNO TYPE ZBATNO,
        BATPO TYPE ZBATPO,
      END OF GT_BATNO.

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.

DATA: GT_DEL TYPE TABLE OF ZTSD009 WITH HEADER LINE.

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.
*SELECT-OPTIONS:
PARAMETERS: P_VKORG TYPE VBAK-VKORG,             P_LGORT 
TYPE T001L-LGORT.
PARAMETERS: P_UFILE LIKE RLGRAP-FILENAME MODIF ID M1."上传文件路径
SELECT-OPTIONS:                 S_ZUSER 
FOR ZTSD008-ZUSER MODIF ID M2,"导入用户                 S_INDAT 
FOR ZTSD009-INDAT MODIF ID M2,"验单日期                 S_ZDATE 
FOR ZTSD008-ZDATE MODIF ID M2,"导入日期                 S_SJ 
FOR ZTSD009-KUNNR MODIF ID M2,"客户编号                 S_MATNR 
FOR ZTSD009-MATNR MODIF ID M2,"物料编号                 S_SHPTO 
FOR ZTSD009-SHPTO MODIF ID M2"送达方                 S_SLDTO 
FOR ZTSD009-SLDTO MODIF ID M2"售达方                 S_VKBUR 
FOR ZTSD009-VKBUR MODIF ID M2"销售部门                 S_ZYDDH 
FOR ZTSD009-ZYDDH LOWER CASE MODIF ID M2"验单单号                 S_VBELN 
FOR ZTSD009-VBELN MODIF ID M2"销售订单号
*PARAMETERS: P_CB1 TYPE C AS CHECKBOX MODIF ID M4,
*            P_CB2 TYPE C AS CHECKBOX MODIF ID M4.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREENFUNCTION KEY 1.   "激活按钮

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TITLE1.
PARAMETERS: R1 RADIOBUTTON GROUP RG1 USER-COMMAND USR DEFAULT ‘X‘"上传批导             R2 
RADIOBUTTON GROUP RG1"提交验单             R3 
RADIOBUTTON GROUP RG1"显示导入数据
SELECTION-SCREEN END OF BLOCK B2.

*SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TITLE2.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: R3 RADIOBUTTON GROUP RG2 DEFAULT ‘X‘."本品
*SELECTION-SCREEN COMMENT (5) TEXT-001 FOR FIELD R1.
*PARAMETERS: R4 RADIOBUTTON GROUP RG2."赠品
*SELECTION-SCREEN COMMENT (5) TEXT-002 FOR FIELD R2."
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK B3.

SELECTION-SCREEN BEGIN OF BLOCK B4 WITH FRAME TITLE TEXT-007.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R5 RADIOBUTTON GROUP RG3 USER-COMMAND USR2 DEFAULT ‘X‘."石家庄直营
SELECTION-SCREEN COMMENT (7TEXT-005 FOR FIELD R5.
PARAMETERS: R6 RADIOBUTTON GROUP RG3 ."未打印
SELECTION-SCREEN COMMENT (7TEXT-006 FOR FIELD R6."外阜直营
*PARAMETERS: R6 RADIOBUTTON GROUP RG2."全部
*SELECTION-SCREEN COMMENT (5) TEXT-005 FOR FIELD R6."全部
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK B4.

*----------------------------------------------------------------------*
*        INITIALIZATION                                           *
*----------------------------------------------------------------------*
INITIALIZATION.   SSCRFIELDS
-FUNCTXT_01 ‘下载模板‘.    "定义按钮文本   TITLE1 
‘操作类型‘.
*  TITLE2 = ‘验收产品类型‘.
*----------------------------------------------------------------------*
*        AT SELECTION-SCREEN                                           *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.   

CASE SSCRFIELDS-UCOMM.          "处理按钮命令     
WHEN‘FC01‘.       
PERFORM FRM_DOWNLOAD_TEMPLATE.   

ENDCASE.

AT SELECTION-SCREEN OUTPUT.   
IF R5 EQ ‘X‘.
*    SUBMIT ZSDR005 VIA SELECTION-SCREEN .   

ELSEIF R6 EQ ‘X‘.     
SUBMIT ZSDR019 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 R3 EQ ‘X‘.           
SCREEN-ACTIVE 1.         
ELSE.           
SCREEN-ACTIVE 0.         
ENDIF.         
MODIFY SCREEN.       
WHEN ‘M3‘.         
IF R3 EQ ‘X‘.           
SCREEN-ACTIVE 1.         
ELSE.           
SCREEN-ACTIVE 0.         
ENDIF.         
MODIFY SCREEN.       
WHEN ‘M4‘.         
IF R2 EQ ‘X‘.           
SCREEN-ACTIVE 1.         
ELSE.           
SCREEN-ACTIVE 0.         
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‘,‘LT_RETURN‘.   

IF P_VKORG IS INITIAL.     
MESSAGE ‘请输入销售组织。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
EXIT.   
ENDIF.   

IF P_LGORT IS INITIAL.     
MESSAGE ‘请输入库存地点。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
EXIT.   
ENDIF.   

PERFORM FRM_AUTHORITY_CHECK.

*上传文件   
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‘
*显示保存的数据

*DELETE FROM: ZTSD008,ZTSD009,ZTSD010,ZTSD011. COMMIT WORK AND WAIT.     
PERFORM FRM_GET_DATA.     
PERFORM FRM_PROCESS_DATA.   

ENDIF.   
IF GT_OUTPUT IS INITIAL.     
MESSAGE ‘没有符合要求的数据‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
EXIT.   
ENDIF.   

IF R2 EQ ‘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
.   

PRIVATE SECTION.     
DATA ROWS TYPE LVC_T_ROW.     
DATA RS TYPE LVC_S_ROW.     
DATA ERROR_IN_DATA TYPE C.     
DATA LS_MODI TYPE LVC_S_MODI.     
DATA G_IND TYPE I.     
DATA LV_SEL TYPE C.     

METHODS:       GET_ZYDJE         

IMPORTING           E_MODI         
TYPE LVC_S_MODI           E_DATA_CHANGED 
TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL,       GET_MENGE         


IMPORTING           E_MODI         
TYPE LVC_S_MODI           E_DATA_CHANGED 
TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.

ENDCLASS.                    "GC_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------
*       CLASS GC_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------
CLASS GC_EVENT_RECEIVER IMPLEMENTATION.   
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.     

IF R3 NE ‘X‘.       
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.     
ENDIF.     

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‘.       
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-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@‘."红灯.

*        LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘ AND SO IS INITIAL.
*        ENDLOOP.

*        CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY
*          EXPORTING
*            IS_STABLE      = GS_STABLE
*            I_SOFT_REFRESH = ‘X‘.       

WHEN ‘CAN_ALL‘.         
CLEAR GS_OUTPUT.         GS_OUTPUT
-SEL ‘ ‘.         
MODIFY GT_OUTPUT FROM GS_OUTPUT TRANSPORTING SEL WHERE SEL EQ ‘X‘.         

LOOP AT GT_OUTPUT INTO GS_OUTPUT.           
PERFORM SET_STYLE USING ‘‘ SY-TABIX.         
ENDLOOP.

*        CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY
*          EXPORTING
*            IS_STABLE      = GS_STABLE
*            I_SOFT_REFRESH = ‘X‘.       

WHEN ‘DEL‘.
*询问是否确认         
CALL FUNCTION ‘POPUP_TO_CONFIRM‘           
EXPORTING             TEXT_QUESTION         
‘确认删除所选数据?‘             TEXT_BUTTON_1         
‘是‘(003)             TEXT_BUTTON_2         
‘否‘(004)             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 ‘OKAY‘.         
PERFORM FRM_CONFIRM_DATA CHANGING LV_RESULT.         
CHECK 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.

*DN过账         
PERFORM FRM_POST_DN.       

WHEN OTHERS.     

ENDCASE.     

CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY       
EXPORTING         IS_STABLE      
= GS_STABLE         I_SOFT_REFRESH 
‘X‘.   

ENDMETHOD.   
METHOD HANDLE_DATA_CHANGED.     
LOOP AT ER_DATA_CHANGED->MT_MOD_CELLS INTO LS_MODI.       
CASE LS_MODI-FIELDNAME.         

WHEN ‘MENGE‘.           
CALL METHOD GET_MENGE             
EXPORTING               E_MODI         
= LS_MODI               E_DATA_CHANGED 
= ER_DATA_CHANGED.         

WHEN ‘ZYDJE‘.           
CALL METHOD GET_ZYDJE             
EXPORTING               E_MODI         
= LS_MODI               E_DATA_CHANGED 
= ER_DATA_CHANGED.       
ENDCASE.     
ENDLOOP.     

CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY       
EXPORTING         IS_STABLE      
= GS_STABLE         I_SOFT_REFRESH 
‘X‘.   

ENDMETHOD.   

METHOD HANDLE_CHANGE_FINISH.     

DATA: LS_CELL TYPE LVC_S_MODI.     

CLEAR LS_CELL.     
READ TABLE ET_GOOD_CELLS INTO LS_CELL INDEX 1.     

CASE LS_CELL-FIELDNAME.       
WHEN ‘SEL‘.         
PERFORM SET_STYLE USING LS_CELL-VALUE LS_CELL-ROW_ID.         

CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY           
EXPORTING             IS_STABLE      
= GS_STABLE             I_SOFT_REFRESH 
‘X‘.     

ENDCASE.   

ENDMETHOD.   
METHOD GET_ZYDJE.     
DATA LV_YDJE TYPE ZTSD009-ZYDJE.     

DATA LV_TABIX LIKE SY-TABIX.     

CALL METHOD E_DATA_CHANGED->GET_CELL_VALUE       
EXPORTING         I_ROW_ID    
= E_MODI-ROW_ID         I_FIELDNAME 
= E_MODI-FIELDNAME       
IMPORTING         E_VALUE     
= LV_YDJE.
*    CHECK NOT LV_YDJE IS  INITIAL.     
READ TABLE GT_OUTPUT ASSIGNING <WA_DATA> INDEX E_MODI-ROW_ID.
*    CHECK <WA_DATA>-MEINS IS NOT INITIAL.     
IF SY-SUBRC EQ 0.       <WA_DATA>
-MSSG ‘ ‘.       

IF LV_YDJE LE 0.         <WA_DATA>
-MSSG ‘合计金额不能为零,请修改!‘.         ERROR_IN_DATA 

‘X‘.
*        CALL METHOD E_DATA_CHANGED->ADD_PROTOCOL_ENTRY
*          EXPORTING
*            I_MSGID     = ‘ZSD001‘
*            I_MSGNO     = ‘000‘
*            I_MSGTY     = ‘E‘
*            I_MSGV1     = LV_YDJE
*            I_MSGV2     = ‘合计金额不能为零,请修改!‘
*            I_MSGV3     = ‘‘
*            I_FIELDNAME = E_MODI-FIELDNAME
*            I_ROW_ID    = E_MODI-ROW_ID.
*        IF ERROR_IN_DATA = ‘X‘.
*          CALL METHOD E_DATA_CHANGED->DISPLAY_PROTOCOL.
*        ENDIF.       
ELSE.
*        BREAK B012.         
IF <WA_DATA>-MENGE NE 0.           <WA_DATA>
-ZYDJG = LV_YDJE / <WA_DATA>-MENGE.         
ELSE.           <WA_DATA>
-ZYDJG 0.         
ENDIF.       
ENDIF.     
ENDIF.     UNASSIGN <WA_DATA>

.     
FREE:LV_YDJE.   
ENDMETHOD.   

METHOD GET_MENGE.     
DATA LV_MENGE TYPE ZTSD009-MENGE.     
DATA LV_MEINS TYPE MEINS.     
DATA LV_TABIX LIKE SY-TABIX.     
DATA:       LV_STRING 
TYPE STRING,       S1        
TYPE STRING,       S2        
TYPE STRING.     

CALL METHOD E_DATA_CHANGED->GET_CELL_VALUE       
EXPORTING         I_ROW_ID    
= E_MODI-ROW_ID         I_FIELDNAME 
= E_MODI-FIELDNAME       
IMPORTING         E_VALUE     
= LV_MENGE.     

READ TABLE GT_OUTPUT ASSIGNING <WA_DATA> INDEX E_MODI-ROW_ID.     

IF SY-SUBRC EQ 0.       <WA_DATA>
-MSSG ‘ ‘.       

IF LV_MENGE LE 0.         <WA_DATA>
-MSSG ‘验收数量不能为零,请修改!‘.         ERROR_IN_DATA 

‘X‘.
*        CALL METHOD E_DATA_CHANGED->ADD_PROTOCOL_ENTRY
*          EXPORTING
*            I_MSGID     = ‘ZSD001‘
*            I_MSGNO     = ‘000‘
*            I_MSGTY     = ‘E‘
*            I_MSGV1     = LV_MENGE
*            I_MSGV2     = ‘验收数量不能为零,请修改!‘
*            I_MSGV3     = ‘‘
*            I_FIELDNAME = E_MODI-FIELDNAME
*            I_ROW_ID    = E_MODI-ROW_ID.
*        IF ERROR_IN_DATA = ‘X‘.
*          CALL METHOD E_DATA_CHANGED->DISPLAY_PROTOCOL.
*        ENDIF.       
ELSE.         LV_STRING 

= LV_MENGE.         
SPLIT LV_STRING AT ‘.‘ INTO S1 S2.         
IF S2 NE 0.           <WA_DATA>

-MSSG ‘验收数量不能含小数。‘.           ERROR_IN_DATA 
‘X‘.
*          CALL METHOD E_DATA_CHANGED->ADD_PROTOCOL_ENTRY
*            EXPORTING
*              I_MSGID     = ‘ZSD001‘
*              I_MSGNO     = ‘000‘
*              I_MSGTY     = ‘E‘
*              I_MSGV1     = LV_MENGE
*              I_MSGV2     = ‘验收数量不能含小数。请修改!‘
*              I_MSGV3     = ‘‘
*              I_FIELDNAME = E_MODI-FIELDNAME
*              I_ROW_ID    = E_MODI-ROW_ID.
*          IF ERROR_IN_DATA = ‘X‘.
*            CALL METHOD E_DATA_CHANGED->DISPLAY_PROTOCOL.
*          ENDIF.

*        ENDIF.         
ENDIF.

*更新验单价格         <WA_DATA>
-ZYDJG = <WA_DATA>-ZYDJE / <WA_DATA>-MENGE.       

ENDIF.     
ENDIF.     UNASSIGN <WA_DATA>

.     
FREE:LV_MEINS, LV_MENGE.   
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.   
DATA: LV_LENTH TYPE I.   
DATA: LV_FLAG TYPE C.   
DATA: LV_POSNR(4TYPE 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:LV_MSG TYPE STRING.   
DATA: LS_ROWDATA TYPE TRUXS_T_TEXT_DATA.   

DATATYPE I."两个物料列的间隔   
DATA:LV_N TYPE I.   

DATA: LV_COUNT 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             
2       I_END_COL               
255       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 DESCENDING.   
READ TABLE ITAB INDEX 1.   
MOVE ITAB-ROW TO LV_LINES.   

SORT ITAB[] BY ROW COL.   

LOOP AT ITAB.     LV_MSG 
‘检查数据...‘ && ITAB-ROW && ‘/‘ && LV_LINES.     

ON CHANGE OF ITAB-ROW.       
IF SY-TABIX NE 1.         
APPEND GS_LOAD TO GT_LOAD.         
MOVE-CORRESPONDING GS_LOAD TO GS_OUTPUT.         

ADD 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(ZSDR018USING ‘SEL‘ ‘DISABLE‘ CHANGING GS_OUTPUT-STYLE.         
ENDIF.         

APPEND GS_OUTPUT TO GT_OUTPUT.         

CLEAR GS_LOAD.         
CLEAR GS_OUTPUT.         
CLEAR GS_CELLCOLOR.       
ENDIF.     
ENDON.     

ASSIGN COMPONENT ITAB-COL OF STRUCTURE GS_LOAD TO <FS>.     

"动态方法将值传到相应的内表
*    <FS> = ITAB-VALUE.     
TRY.         
MOVE ITAB-VALUE TO <FS>.       
CATCH CX_ROOT INTO L_EXCEPTION.         
PERFORM SET_CALLSYTLE(ZSDR006USING 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 OR ITAB-COL EQ 2.       

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(ZSDR006USING ITAB-COL GS_LOAD ‘日期格式错误‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       
ENDIF.     
ENDIF.

*检查送达方售达方是否存在     
IF ITAB-COL EQ OR ITAB-COL EQ 4.
*添加前置零       
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT‘         
EXPORTING           
INPUT  = <FS>         
IMPORTING           
OUTPUT = <FS>.     

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‘         
.       

IF SY-SUBRC NE 0.         
PERFORM SET_CALLSYTLE(ZSDR006USING ITAB-COL GS_LOAD ‘司机编号不存在‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       

ENDIF.     
ENDIF.     

IF ITAB-COL EQ 9.       
SELECT SINGLE BEZEI INTO @DATA(BEZEI)         
FROM TVKBT         
WHERE VKBUR EQ @<FS>         
AND SPRAS EQ @SY-LANGU.       
IF SY-SUBRC NE 0.         
PERFORM SET_CALLSYTLE(ZSDR006USING ITAB-COL GS_LOAD ‘部门编码不存在‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       

ENDIF.     
ENDIF.
*检查产品是否存在     
IF ITAB-COL EQ 12.
*取物料描述
*添加前置零
*判断是否含非数字的字符       
IF <FS> CN ‘1234567890 ‘.       

ELSE.         
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(ZSDR006USING ITAB-COL GS_LOAD ‘物料编码不正确‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.         

ENDIF.       
ENDIF.
*
**检查验单单号是否已导入       
SELECT SINGLE ZYDDH INTO @DATA(LV_ZYDDH)         
FROM ZTSD009         
WHERE ZYDDH EQ @GS_LOAD-ZYDDH         
AND MATNR EQ @GS_LOAD-MATNR         
AND SHPTO EQ @GS_LOAD-SHPTO.       

IF SY-SUBRC EQ 0.         
PERFORM SET_CALLSYTLE(ZSDR006USING 6 GS_LOAD ‘含相同产品的验单号已存在‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       
ENDIF.     
ENDIF.   

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 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(ZSDR018USING ‘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.

*下载模板   

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_004‘ 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 .   
DATA: LV_COND TYPE CHAR100.   

IF R3 EQ ‘X‘.     
SELECT       A
~* ,       A
~VBELN AS SO,       A
~VBELN_VL AS DN,       B
~ZDATE,       B
~VKORG,       B
~LGORT,       B
~ZUSER,
*    B~NAME1,       
C~MAKTX       
INTO CORRESPONDING FIELDS OF TABLE @GT_OUTPUT       
FROM ZTSD009 AS A       INNER 
JOIN ZTSD008 AS B       
ON A~BATNO EQ B~BATNO
*    INNER JOIN KNA1 AS B ON A~KUNNR EQ B~KUNNR       INNER 
JOIN MAKT AS ON A~MATNR EQ C~MATNR       
WHERE INDAT IN @S_INDAT       
AND A~ZSJ IN @S_SJ       
AND A~MATNR IN @S_MATNR       
AND A~SHPTO IN @S_SHPTO "送达方       
AND A~SLDTO IN @S_SLDTO "售达方       
AND A~VKBUR IN @S_VKBUR "销售部门       
AND A~ZYDDH IN @S_ZYDDH       
AND A~VBELN IN @S_VBELN       
AND B~ZDATE IN @S_ZDATE       
AND B~VKORG EQ @P_VKORG       
AND B~LGORT EQ @P_LGORT       
AND B~ZUSER IN @S_ZUSER       
.   
ELSEIF R2 EQ ‘X‘.
*    IF P_CB1 EQ ‘X‘.
*      LV_COND = ‘A~VBELN     
SELECT       A
~* ,       A
~VBELN AS SO,       A
~VBELN_VL AS DN,       B
~ZDATE,       B
~VKORG,       B
~LGORT,       B
~ZUSER,
*    B~NAME1,       
C~MAKTX       
INTO CORRESPONDING FIELDS OF TABLE @GT_OUTPUT       
FROM ZTSD009 AS A       INNER 
JOIN ZTSD008 AS B       
ON A~BATNO EQ B~BATNO
*    INNER JOIN KNA1 AS B ON A~KUNNR EQ B~KUNNR       INNER 
JOIN MAKT AS ON A~MATNR EQ C~MATNR       
WHERE INDAT IN @S_INDAT       
AND A~ZSJ IN @S_SJ       
AND A~MATNR IN @S_MATNR       
AND A~SHPTO IN @S_SHPTO "送达方       
AND A~SLDTO IN @S_SLDTO "售达方       
AND A~VKBUR IN @S_VKBUR "销售部门       
AND A~ZYDDH IN @S_ZYDDH
*      AND A~VBELN EQ @SPACE       
AND A~VBELN IN @S_VBELN       
AND B~ZDATE IN @S_ZDATE       
AND B~VKORG EQ @P_VKORG       
AND B~LGORT EQ @P_LGORT       
AND B~ZUSER IN @S_ZUSER       
.   

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.   

LOOP AT GT_OUTPUT ASSIGNING <WA_DATA>.     GT_BATNO
-BATNO = <WA_DATA>-BATNO.     GT_BATNO
-BATPO = <WA_DATA>-BATPO.     
APPEND GT_BATNO.

*    IF <WA_DATA>-SO NE SPACE.
*      MOVE ‘-‘ TO <WA_DATA>-SEL.
*    ENDIF.     <WA_DATA>

-RESLO = <WA_DATA>-LGORT(3) && ‘9‘.

*    SELECT SINGLE NAME1 INTO <WA_DATA>-NAME1
*      FROM KNA1
*      WHERE KUNNR = <WA_DATA>-KUNNR.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME2     
FROM KNA1     
WHERE KUNNR EQ <WA_DATA>-ZSJ.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_HP         
FROM KNA1         
WHERE KUNNR EQ <WA_DATA>-SHPTO.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_LD       
FROM KNA1       
WHERE KUNNR EQ <WA_DATA>-SLDTO.

*价格     
IF <WA_DATA>-MENGE NE 0.       <WA_DATA>
-ZYDJG = <WA_DATA>-ZYDJE / <WA_DATA>-MENGE.     
ELSE.       <WA_DATA>
-ZYDJG 0.     
ENDIF.
*    <WA_DATA>-ZYDJE = <WA_DATA>-ZYDJG * <WA_DATA>-MENGE.     

PERFORM SET_STYLE(ZSDR018USING ‘ZYDJE‘ ‘DISABLE‘ CHANGING <WA_DATA>-STYLE.     
PERFORM SET_STYLE(ZSDR018USING ‘ZYDDH‘ ‘DISABLE‘ CHANGING <WA_DATA>-STYLE.     
PERFORM SET_STYLE(ZSDR018USING ‘MENGE‘ ‘DISABLE‘ CHANGING <WA_DATA>-STYLE.     

IF R3 EQ ‘X‘.
*取状态       
SELECT SINGLE WBSTK FKSTK         
INTO ( <WA_DATA>-WBSTK, <WA_DATA>-FKSTK )         
FROM VBUK         
WHERE VBELN EQ <WA_DATA>-DN.     
ENDIF.   

ENDLOOP.   UNASSIGN <WA_DATA>
.
*将初始内表放入内存   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
-KEY = &6.     GS_STRUCTURE
-NO_ZERO ‘X‘.

*    IF R4 EQ ‘X‘ AND R2 EQ ‘X‘.
*    IF R2 EQ ‘X‘.
*    ELSE.      
IF &1 EQ ‘SEL‘.       GS_STRUCTURE
-CHECKBOX ‘X‘.       GS_STRUCTURE
-EDIT ‘X‘.      
ENDIF.
*    ENDIF.   

IF R2 EQ ‘X‘.     
IF &1 EQ ‘ZYDJE‘       
OR &1 EQ ‘ZYDDH‘       
OR &1 EQ ‘MENGE‘.         GS_STRUCTURE
-EDIT ‘X‘.      
ENDIF.   
ENDIF.   

IF &1 EQ ‘ZYDDH‘.     GS_STRUCTURE
-LOWERCASE ‘X‘.   
ENDIF.     

APPEND GS_STRUCTURE TO GT_STRUCTURE.     
CLEAR GS_STRUCTURE.   
END-OF-DEFINITION.   
IF R3 NE ‘X‘.     BUILD_FC
:     
‘SEL‘ ‘选择列‘ ‘‘ ‘‘ ‘‘ ‘X‘,     
‘MSSG‘ ‘错误消息‘ ‘‘ ‘‘ ‘‘ ‘‘.   
ENDIF.   

IF R1 EQ ‘X‘.     BUILD_FC
:     
‘ZICON1‘ ‘指示灯‘ ‘‘ ‘ICON‘ ‘ID‘ ‘X‘.   
ENDIF.   BUILD_FC

:
‘INDAT‘ ‘验单日期‘ ‘‘ ‘ZTSD009‘ ‘INDAT‘ ‘X‘,

‘ZSJ‘ ‘司机‘ ‘‘ ‘KNA1‘ ‘KUNNR‘ ‘X‘,
‘NAME2‘ ‘司机名称‘ ‘‘ ‘KNA1‘ ‘NAME1‘ ‘X‘,
‘SHPTO‘ ‘送达方编号‘ ‘‘ ‘KNA1‘ ‘KUNNR‘ ‘X‘,
‘NAME_HP‘ ‘送达方名称‘ ‘‘ ‘KNA1‘ ‘NAME1‘ ‘X‘,
‘SLDTO‘ ‘售达方编号‘ ‘‘ ‘KNA1‘ ‘KUNNR‘ ‘X‘,
‘NAME_LD‘ ‘售达方名称‘ ‘‘ ‘KNA1‘ ‘NAME1‘ ‘X‘,
*‘ZDATE‘ ‘导入日期‘ ‘‘ ‘ZTSD008‘ ‘ZDATE‘ ‘‘,
‘LFDAT‘ ‘交货日期‘ ‘‘ ‘LIKP‘ ‘LFDAT‘ ‘‘,
‘BATNO‘ ‘导入编号‘ ‘‘ ‘ZTSD002‘ ‘BATNO‘ ‘‘,
‘BATPO‘ ‘导入项目‘ ‘‘ ‘ZTSD002‘ ‘BATPO‘ ‘‘,
‘VKBUR‘ ‘销售部门‘ ‘‘ ‘VBAK‘ ‘VKBUR‘ ‘‘,
‘ZR‘ ‘主任‘ ‘‘ ‘ZTSD009‘ ‘ZR‘ ‘‘,
‘ZYWY‘ ‘业务员‘ ‘‘ ‘ZTSD009‘ ‘ZYWY‘ ‘‘,
‘MATNR‘ ‘物料编号‘ ‘‘ ‘MARA‘ ‘MATNR‘ ‘‘,
‘MAKTX‘ ‘物料名称‘ ‘‘ ‘MAKT‘ ‘MAKTX‘ ‘‘,
‘MENGE‘ ‘验收数量‘ ‘‘ ‘LIPS‘ ‘LFIMG‘ ‘‘,
‘MEINS‘ ‘数量单位‘ ‘‘ ‘MARA‘ ‘MEINS‘ ‘‘,
*  ‘CHARG‘ ‘批次‘ ‘‘ ‘‘ ‘‘,
‘ZYDJG‘ ‘验收单价格‘ ‘‘ ‘ZTSD009‘ ‘ZYDJG‘ ‘‘,
‘ZYDJE‘ ‘合计金额‘ ‘‘ ‘ZTSD009‘ ‘ZYDJE‘ ‘‘,
‘ZYDDH‘ ‘验收单号‘ ‘‘ ‘ZTSD009‘ ‘ZYDDH‘ ‘‘,
‘SO‘ ‘销售订单号‘ ‘‘ ‘VBAK‘ ‘VBELN‘ ‘‘,
‘DN‘ ‘交货单号‘ ‘‘ ‘LIKP‘ ‘VBELN‘ ‘‘,
‘BEIZHU‘ ‘备注‘ ‘‘ ‘‘ ‘‘ ‘‘,
‘ZUSER‘ ‘导入人员‘ ‘‘ ‘ZTSD008‘ ‘ZUSER‘ ‘‘.   
IF R3 EQ ‘X‘.     BUILD_FC
:     
‘WBSTK‘ ‘发货状态‘ ‘‘ ‘VBUK‘ ‘WBSTK‘ ‘‘,     
‘FKSTK‘ ‘开票状态‘ ‘‘ ‘VBUK‘ ‘FKSTK‘ ‘‘.   
ENDIF.

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: CHECK_OKAY TYPE STRING.   
CLEAR OK_CODE.   OK_CODE 
= SY-UCOMM.   
DATA: ANS TYPE STRING."GUI返回值   

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‘.       
PERFORM FRM_CHECK_CHANGES CHANGING CHECK_OKAY.       

IF CHECK_OKAY EQ ‘F‘."没做修改
*释放内存
*        FREE MEMORY.         
"直接退出         
PERFORM FRM_RESET_LOCK.         

LEAVE TO SCREEN 0.       
ELSEIF CHECK_OKAY EQ ‘T‘."做了修改
*询问是否保存         
CALL FUNCTION ‘POPUP_TO_CONFIRM‘           
EXPORTING             TEXT_QUESTION         
‘数据已修改,是否保存?‘             TEXT_BUTTON_1         
‘是‘(003)             TEXT_BUTTON_2         
‘否‘(004)             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‘."是           
PERFORM FRM_SAVE_DATA USING ‘ ‘ CHANGING LV_RESULT.           
IF LV_RESULT EQ ‘S‘.             
MESSAGE ‘保存成功!‘ TYPE ‘S‘.           
ELSEIF LV_RESULT EQ ‘E‘.             
MESSAGE ‘保存失败!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.           
ELSEIF LV_RESULT EQ ‘N‘.             
MESSAGE ‘数据没有修改!‘ TYPE ‘S‘.           
ENDIF.
**释放内存
*          FREE MEMORY.
*          "直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.
*         
ELSEIF ANS EQ ‘A‘."取消           
RETURN.         
ELSE."否
**释放内存
*          FREE MEMORY.           
"直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.

*         
ENDIF.       
ENDIF.     
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 R3 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.


*显示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[].


*注册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.
*&---------------------------------------------------------------------*
*&      Module  MOD_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE MOD_COMMAND_9000 INPUT.

*  DATA: CHECK_OKAY TYPE STRING.   
CLEAR OK_CODE.   OK_CODE 
= SY-UCOMM.
*  DATA: ANS TYPE STRING."GUI返回值   

CASE  OK_CODE.     
WHEN ‘BACK‘.       
PERFORM FRM_CHECK_CHANGES CHANGING CHECK_OKAY.       

IF CHECK_OKAY EQ ‘F‘."没做修改
*释放内存
*        FREE MEMORY.         
"直接退出         
PERFORM FRM_RESET_LOCK.         

LEAVE TO SCREEN 0.       
ELSEIF CHECK_OKAY EQ ‘T‘."做了修改
*询问是否保存         
CALL FUNCTION ‘POPUP_TO_CONFIRM‘           
EXPORTING             TEXT_QUESTION         
‘未保存数据将丢失,是否退出?‘             TEXT_BUTTON_1         
‘是‘(001)             TEXT_BUTTON_2         
‘否‘(002)             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‘."是           
PERFORM FRM_SAVE_DATA USING ‘ ‘ CHANGING LV_RESULT.           
IF LV_RESULT EQ ‘S‘.             
MESSAGE ‘保存成功!‘ TYPE ‘S‘.           
ELSEIF LV_RESULT EQ ‘E‘.             
MESSAGE ‘保存失败!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.           
ELSEIF LV_RESULT EQ ‘N‘.             
MESSAGE ‘数据没有修改!‘ TYPE ‘S‘.           
ENDIF.
**释放内存
*          FREE MEMORY.
*          "直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.
*         
ELSEIF ANS EQ ‘A‘."取消           
RETURN.         
ELSE."否
**释放内存
*          FREE MEMORY.           
"直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.

*         
ENDIF.       
ENDIF.     

WHEN OTHERS.   
ENDCASE.
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_ZTSD008 
TYPE TABLE OF ZTSD008,     LT_ZTSD009 
TYPE TABLE OF ZTSD009,     LT_ZTSD010 
TYPE TABLE OF ZTSD010,     LT_ZTSD011 
TYPE TABLE OF ZTSD011,     LT_OUTPUT  

TYPE TABLE OF TY_OUTPUT,     LS_ZTSD008 

TYPE ZTSD008"超市验收单抬头     LS_ZTSD009 
TYPE ZTSD009"验收单明细     LS_ZTSD010 
TYPE ZTSD010"验收单修改日志     LS_ZTSD011 
TYPE ZTSD011"验收单与SO对应关系     LS_OUTPUT  

TYPE TY_OUTPUT.   

DATA: LV_BATNO TYPE CHAR10"批导编号         LV_VERNO 
TYPE CHAR3"版本号   
DATA: CHECK_OK TYPE STRING.   

CLEAR:LV_BATNO, C_RESULT.   
CLEAR:   LT_ZTSD008
,   LT_ZTSD009
,   LT_ZTSD010
,   LT_ZTSD011
,   LT_OUTPUT

,   LS_ZTSD008

,   LS_ZTSD009
,   LS_ZTSD010
,   LS_ZTSD011
,   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.

*生成批导编号     
CALL FUNCTION ‘NUMBER_GET_NEXT‘       
EXPORTING         NR_RANGE_NR             
‘02‘         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.

*新版本号     
MOVE TO LV_VERNO.

*填充抬头表ZTSD008     
MOVE LV_BATNO TO LS_ZTSD008-BATNO.     
MOVE SY-UNAME TO LS_ZTSD008-ZUSER.     
MOVE SY-DATUM TO LS_ZTSD008-ZDATE.     
MOVE SY-UZEIT TO LS_ZTSD008-ZTIME.     
MOVE P_VKORG TO LS_ZTSD008-VKORG.     
MOVE P_LGORT TO LS_ZTSD008-LGORT.     

MODIFY ZTSD008 FROM LS_ZTSD008.     

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_ZTSD009.       

APPEND LS_ZTSD009 TO LT_ZTSD009.       
CLEAR LS_ZTSD009.
*填充超市验单日志表       
MOVE-CORRESPONDING GS_OUTPUT TO LS_ZTSD010.

*      MOVE LV_BATNO TO LS_ZTSD003-BATNO.
*      MOVE LV_VERNO TO LS_ZTSD003-VERNO.       
MOVE SY-UNAME TO LS_ZTSD010-ZUSER.       
MOVE SY-DATUM TO LS_ZTSD010-ZDATE.       
MOVE SY-UZEIT TO LS_ZTSD010-ZTIME.       

APPEND LS_ZTSD010 TO LT_ZTSD010.       
CLEAR LS_ZTSD010.     

ENDLOOP.   

ELSEIF R2 EQ ‘X‘ ."如果是显示已导入数据,则检查是否有修改数据     C_RESULT 
‘N‘.     

SORT GT_OUTPUT BY BATNO."按批导编号排序     

LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘.       LS_OUTPUT 
= GS_OUTPUT.       
AT NEW BATNO.         LV_VERNO 
= LS_OUTPUT-VERNO + 1."产生下一个版本,否则C_RESULT EQ SPACE         LS_OUTPUT
-VERNO = LV_VERNO.

*按批导编号更新版本号         
MODIFY GT_OUTPUT FROM LS_OUTPUT TRANSPORTING VERNO         
WHERE BATNO EQ LS_OUTPUT-BATNO.
*        CLEAR LS_OUTPUT.       
ENDAT.

*填充超市订单日志表       
MOVE-CORRESPONDING LS_OUTPUT TO LS_ZTSD010.

*      MOVE LS_OUTPUT-BATNO TO LS_ZTSD003-BATNO.
*      MOVE LS_OUTPUT-VERNO TO LS_ZTSD003-VERNO.       
MOVE LS_OUTPUT-SO TO LS_ZTSD010-VBELN.       
MOVE LS_OUTPUT-DN TO LS_ZTSD010-VBELN_VL.       
MOVE SY-UNAME TO LS_ZTSD010-ZUSER.       
MOVE SY-DATUM TO LS_ZTSD010-ZDATE.       
MOVE SY-UZEIT TO LS_ZTSD010-ZTIME.       

APPEND LS_ZTSD010 TO LT_ZTSD010.       
CLEAR LS_ZTSD010.
*填充超市订单明细表       
MOVE-CORRESPONDING LS_OUTPUT TO LS_ZTSD009.       
MOVE LS_OUTPUT-SO TO LS_ZTSD009-VBELN.       
MOVE LS_OUTPUT-DN TO LS_ZTSD009-VBELN_VL.

*如果是审批通过则修改状态
*      IF U_STR EQ ‘APPROVAL‘.
*        MOVE ‘B‘ TO LS_ZTSD002-ZSTAT.
*      ENDIF.       

APPEND LS_ZTSD009 TO LT_ZTSD009.       
CLEAR LS_ZTSD009.
*填充ZTSD011  销售订单表       
IF U_STR EQ ‘APPROVAL‘.         

MOVE: LS_OUTPUT-BATNO TO LS_ZTSD011-BATNO,               LS_OUTPUT
-BATPO TO LS_ZTSD011-BATPO,               LS_OUTPUT
-SO TO LS_ZTSD011-VBELN,               LS_OUTPUT
-ZYDDH TO LS_ZTSD011-ZYDDH.         

MOVE SY-UNAME TO LS_ZTSD011-ZUSER.         
MOVE SY-DATUM TO LS_ZTSD011-ZDATE.         
MOVE SY-UZEIT TO LS_ZTSD011-ZTIME.         
APPEND LS_ZTSD011 TO LT_ZTSD011.         
CLEAR LS_ZTSD011.       
ENDIF.       

CLEAR LS_OUTPUT.     
ENDLOOP.   
ENDIF.   

DELETE GT_OUTPUT WHERE SEL EQ ‘X‘.

*更新数据库表   
MODIFY ZTSD009 FROM TABLE LT_ZTSD009.   

IF SY-SUBRC EQ 0.     
COMMIT WORK AND WAIT.     C_RESULT 
‘S‘.   
ELSE.     
ROLLBACK WORK.     C_RESULT 
‘E‘.   
ENDIF.   

MODIFY ZTSD010 FROM TABLE LT_ZTSD010.   

IF SY-SUBRC EQ 0.     
COMMIT WORK AND WAIT.     C_RESULT 
‘S‘.   
ELSE.     
ROLLBACK WORK.     C_RESULT 
‘E‘.   
ENDIF.   

MODIFY ZTSD011 FROM TABLE LT_ZTSD011.   

IF SY-SUBRC EQ 0.     
COMMIT WORK AND WAIT.     C_RESULT 
‘S‘.   
ELSE.     
ROLLBACK WORK.     C_RESULT 
‘E‘.   
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.       

MOVE: GS_SODATA-SO TO <WA_DATA>-SO,       GS_SODATA
-DN TO <WA_DATA>-DN.     

ENDIF.   
ENDLOOP.   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_MSG TYPE STRING.   

CLEAR GT_SODATA.   

LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘ AND SO EQ SPACE.     
IF GS_OUTPUT-MSSG IS NOT INITIAL.       
MESSAGE ‘存在错误数据,请检查!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.       C_RESULT 
‘E‘.       
RETURN.     
ENDIF.     
MOVE-CORRESPONDING GS_OUTPUT TO GS_SODATA.     

MOVE GS_OUTPUT-MENGE TO GS_SODATA-KPEIN.     
MOVE GS_OUTPUT-MEINS TO GS_SODATA-KMEIN.     

MOVE ‘1000‘ TO GS_SODATA-WERKS.

*    IF GS_SODATA-SHPTO IS INITIAL.
*      GS_SODATA-SHPTO = GS_SODATA-KUNNR.
*    ENDIF.
*    IF GS_SODATA-SLDTO IS INITIAL.
*      GS_SODATA-SLDTO = GS_SODATA-KUNNR.
*    ENDIF.     GS_SODATA

-VSTEL = GS_SODATA-RESLO.
*    PERFORM FRM_GET_SHIPPOINT USING GS_SODATA CHANGING GS_SODATA-VSTEL.

*售达方数据
*    SELECT SINGLE VKORG VTWEG SPART VKBUR VKGRP
*      INTO ( GS_SODATA-VKORG,GS_SODATA-VTWEG,GS_SODATA-SPART,
*      GS_SODATA-VKBUR,GS_SODATA-VKGRP )
*      FROM KNVV
*      WHERE KUNNR EQ GS_OUTPUT-SLDTO
*      AND VTWEG EQ ‘20‘"直营
*      AND LOEVM NE ‘X‘"删除标记
**      AND VSBED EQ ‘99‘"装运条件
*      .     
PERFORM FRM_CHECK_PARTNER USING GS_SODATA-SLDTO CHANGING LV_RESULT.     

IF LV_RESULT EQ ‘E‘.       C_RESULT 
‘E‘.       
RETURN.     
ENDIF.
*    IF SY-SUBRC NE 0.
*      MESSAGE ‘销售组织数据不正确,请检查分销渠道(20)。‘ TYPE ‘S‘.
*      RETURN.
*    ENDIF.

*检查条件记录是否存在
*    SELECT SINGLE * INTO LS_A502
*      FROM A502
*      WHERE KSCHL EQ ‘PRZ0‘
*      AND MATNR EQ GS_SODATA-MATNR.

*    SELECT SINGLE * INTO LS_A515
*      FROM A515
*      WHERE KSCHL EQ ‘PRZ0‘
*      AND KUNNR EQ GS_SODATA-KUNNR
*      AND MATNR EQ GS_SODATA-MATNR.
*
*    IF SY-SUBRC NE 0.
*      MESSAGE ‘条件记录PRZ0不存在。‘ TYPE ‘S‘.
*
*      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 && ‘对应的成本中心不存在。‘.
*      MESSAGE S001 WITH LV_MSG 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  TYPE CHAR3,        LV_STRING 
TYPE STRING.   

DATA: LV_SO    TYPE VBELN,         LV_DN    
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: 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 ZYDDH.   

LOOP AT GT_SODATA ASSIGNING <WA_SODATA>.
*做标记     <WA_SODATA>
-SO ‘X‘.     <WA_SODATA>
-DN ‘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>-RESLO."司机库     LS_ITEM
-TARGET_QU = <WA_SODATA>-MEINS.     LS_ITEM
-SALES_UNIT = <WA_SODATA>-MEINS.

*    PERFORM FRM_GET_SHIPPOINT USING <WA_SODATA> CHANGING LS_ITEM-SHIP_POINT.
*    LS_ITEM-SHIP_POINT = 9079.     LS_ITEM
-SHIP_POINT = <WA_SODATA>-VSTEL.     LS_ITEM
-ITEM_CATEG ‘TAN1‘.

*    LS_ITEM-CUST_MAT35 = <WA_SODATA>-ZYDDH."售达方客户物料记验单单号

*    LS_ITEM-BATCH = <WA_SODATA>-CHARG.
*    LS_ITEM-ITEM_CATEG = ‘ZTN‘.     
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
-SHIP_POINT ‘X‘.
*    LS_ITEMX-CUST_MAT35 = ‘X‘.

*    LS_ITEMX-BATCH = ‘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.     

PERFORM GET_KSCHL(ZSDR021)       
USING ‘ZSO1‘             <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>-ZYDJE.     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.     

IF LV_POSNR EQ ‘300‘.       

CLEAR LV_POSNR.       LS_HEADER

-DOC_TYPE ‘ZSO1‘.       LS_HEADER
-DOC_DATE = <WA_SODATA>-INDAT.       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
-PURCH_NO_C ‘ZY‘.       LS_HEADER
-PURCH_NO_S = <WA_SODATA>-ZYDDH.       

CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘         
EXPORTING           ORDER_HEADER_IN      
= LS_HEADER           TESTRUN              
= TESTRUN         
IMPORTING           SALESDOCUMENT        
= LV_SO         
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           ORDER_CONDITIONS_IN  
= LT_COND           ORDER_CONDITIONS_INX 
= LT_CONDX.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘W‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ENDIF.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘E‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ELSE.         
CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘           
EXPORTING             ORDER_HEADER_IN      
= LS_HEADER
*           TESTRUN              = TESTRUN           
IMPORTING             SALESDOCUMENT        
= LV_SO           
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             ORDER_CONDITIONS_IN  
= LT_COND             ORDER_CONDITIONS_INX 
= LT_CONDX.         C_RESULT 

‘S‘.         
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT‘           
EXPORTING             
WAIT ‘X‘.         

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.         

DO TIMES .           
SELECT SINGLE VBELN INTO LV_DN FROM VBFA             
WHERE VBELV EQ LV_SO             
AND VBTYP_N EQ ‘J‘.         
ENDDO.       

ENDIF.       

CLEAR:    LT_RETURN,                 LT_ITEM
,                 LT_ITEMX
,                 LT_PNR
,                 LT_SCH
,                 LT_SCHX
,                 LT_COND
,                 LT_CONDX
,                 LS_HEADER                 

.

*将单据号更新到内表
*      IF LV_SO IS NOT INITIAL AND LV_DN IS NOT INITIAL.       
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.         

IF LV_DN IS NOT INITIAL.           LS_SODATA
-DN = LV_DN.           
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT‘             
EXPORTING               
INPUT  = LS_SODATA-DN             
IMPORTING               
OUTPUT = LS_SODATA-DN.         
ELSE.           

DO TIMES.             

SELECT SINGLE VBELN INTO LS_SODATA-DN FROM VBFA               
WHERE VBELV EQ LV_SO               
AND VBTYP_N EQ ‘J‘.             

IF SY-SUBRC NE 0.               
CLEAR LS_SODATA-DN .             
ENDIF.           

ENDDO.         

ENDIF.         

MODIFY GT_SODATA FROM LS_SODATA TRANSPORTING SO DN         
WHERE SO EQ ‘X‘ AND DN EQ ‘X‘.         

CLEAR:LV_SO,LV_DN.       

ELSE.
*        PERFORM FRM_SHOW_MESSAGE.         C_RESULT 
‘E‘.         
EXIT.       
ENDIF.       

CONTINUE.     

ENDIF.     

AT END OF ZYDDH.       

CLEAR LV_POSNR.       LS_HEADER

-DOC_TYPE ‘ZSO1‘.       LS_HEADER
-DOC_DATE = <WA_SODATA>-INDAT.       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
-PURCH_NO_C ‘ZY‘.       LS_HEADER
-PURCH_NO_S = <WA_SODATA>-ZYDDH.       

CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘         
EXPORTING           ORDER_HEADER_IN      
= LS_HEADER           TESTRUN              
= TESTRUN         
IMPORTING           SALESDOCUMENT        
= LV_SO         
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           ORDER_CONDITIONS_IN  
= LT_COND           ORDER_CONDITIONS_INX 
= LT_CONDX.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘W‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ENDIF.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘E‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ELSE.         
CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘           
EXPORTING             ORDER_HEADER_IN      
= LS_HEADER
*           TESTRUN              = TESTRUN           
IMPORTING             SALESDOCUMENT        
= LV_SO           
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             ORDER_CONDITIONS_IN  
= LT_COND             ORDER_CONDITIONS_INX 
= LT_CONDX.         C_RESULT 

‘S‘.         
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT‘           
EXPORTING             
WAIT ‘X‘.         

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.         

DO TIMES .           
SELECT SINGLE VBELN INTO LV_DN FROM VBFA             
WHERE VBELV EQ LV_SO             
AND VBTYP_N EQ ‘J‘.         
ENDDO.       

ENDIF.       

CLEAR:    LT_RETURN,                 LT_ITEM
,                 LT_ITEMX
,                 LT_PNR
,                 LT_SCH
,                 LT_SCHX
,                 LT_COND
,                 LT_CONDX
,                 LS_HEADER                 

.

*将单据号更新到内表
*      IF LV_SO IS NOT INITIAL AND LV_DN IS NOT INITIAL.       
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.         

IF LV_DN IS NOT INITIAL.           LS_SODATA
-DN = LV_DN.           
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT‘             
EXPORTING               
INPUT  = LS_SODATA-DN             
IMPORTING               
OUTPUT = LS_SODATA-DN.         
ELSE.           

DO TIMES.             

SELECT SINGLE VBELN INTO LS_SODATA-DN FROM VBFA               
WHERE VBELV EQ LV_SO               
AND VBTYP_N EQ ‘J‘.             

IF SY-SUBRC NE 0.               
CLEAR LS_SODATA-DN .             
ENDIF.           

ENDDO.         

ENDIF.         

MODIFY GT_SODATA FROM LS_SODATA TRANSPORTING SO DN         
WHERE SO EQ ‘X‘ AND DN EQ ‘X‘.         

CLEAR:LV_SO,LV_DN.       

ELSE.
*        PERFORM FRM_SHOW_MESSAGE.         C_RESULT 
‘E‘.         
EXIT.       
ENDIF.       

CONTINUE.     
ENDAT.   

ENDLOOP.   

IF C_RESULT IS INITIAL.     C_RESULT 
‘S‘.   
ENDIF.   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_OUTPUT1
-STYLE,       LS_OUTPUT
-SEL,       LS_OUTPUT
-STYLE.       

IF LS_OUTPUT1 NE LS_OUTPUT.         
MOVE ‘T‘ TO C_OK."有区别         
EXIT."只要有一个数据有区别就要记录       
ELSE.         
MOVE ‘F‘ TO C_OK."没有区别       
ENDIF.     
ELSE.
*没读到初始数据说明是新数据       
MOVE ‘T‘ TO C_OK."有区别       
EXIT."只要有一个数据有区别就要记录     

ENDIF.   

ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_POST_GOODS_ISSUE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_POST_DN.   
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     
.   

FREE LT_SODATA.   LT_SODATA 

= GT_SODATA.   

SORT LT_SODATA BY DN.   

DELETE ADJACENT DUPLICATES FROM LT_SODATA COMPARING DN.   

LOOP AT LT_SODATA INTO LS_SODATA.     LV_VBELN 
= LS_SODATA-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 = LS_SODATA-LFDAT .
*    LV_VBKOK-BLDAT     = SY-DATUM .     

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‘.       
EXIT.     
ELSE.
*      C_RESULT = ‘S‘.

*      RETURN.     
ENDIF.   

ENDLOOP.   
CLEAR: LV_VBKOK,LT_VBPOK,LT_PROTT.
*  CLEAR:LS_HEADER1,LS_CONTROL1,DELIVERY1,LS_TECH,HEADER_DEADLINE[],
*  HEADER_DEADLINE,LT_RETURN[],LT_RETURN.
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(10TO C_DN.       
MOVE GDS_MESSTAB-MSGV2+0(10TO 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 .   
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.   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: LT_ZTSD009 TYPE TABLE OF ZTSD009,         LS_ZTSD009 
TYPE ZTSD009,         LT_ZTSD006 

TYPE TABLE OF ZTSD006,         LS_ZTSD006 
TYPE ZTSD006.   

DATA: L_LINE1 TYPE I,         L_LINE2 
TYPE I.

*删除数量为0的行   
DELETE GT_OUTPUT WHERE MENGE EQ 0.   

CLEAR: LT_OUTPUT,LT_OUTPUT[].   LT_OUTPUT 
= GT_OUTPUT.   
SORT LT_OUTPUT BY ZYDDH MATNR ZSJ SLDTO SHPTO.   
DELETE ADJACENT DUPLICATES FROM LT_OUTPUT COMPARING ZYDDH MATNR ZSJ SLDTO SHPTO.   L_LINE1 
LINES( LT_OUTPUT[] ).   L_LINE2 
LINES( GT_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.   

LOOP AT GT_OUTPUT ASSIGNING <WA_DATA> WHERE ZICON1 NE ‘@0A@‘.     

IF <WA_DATA>-INDAT IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 1 GS_LOAD ‘请填写订单日期‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-LFDAT IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 2 GS_LOAD ‘请填写发货日期‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-SLDTO IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 3 GS_LOAD ‘请填写售达方‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-SHPTO IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 4 GS_LOAD ‘请填写送达方‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-ZYDDH IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 5 GS_LOAD ‘请填写验单单号‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-ZSJ IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 6 GS_LOAD ‘请填写司机‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-VKBUR IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 9 GS_LOAD ‘请填写销售部门‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     <WA_DATA>

-SEL ‘X‘.     <WA_DATA>
-ZDATE = SY-DATUM.     <WA_DATA>
-VKORG = P_VKORG.     <WA_DATA>
-LGORT = P_LGORT.
*    IF R4 EQ ‘X‘.
*      <WA_DATA>-ZFREE = ‘X‘.
*    ENDIF.     
SELECT SINGLE NAME1 INTO <WA_DATA>-NAME2       
FROM KNA1       
WHERE KUNNR EQ <WA_DATA>-ZSJ.     

SELECT SINGLE MEINS INTO LV_MEINS       
FROM MARA       
WHERE MATNR EQ <WA_DATA>-MATNR.
*数量单位转换     

TRANSLATE <WA_DATA>-MEINS TO UPPER CASE.

*    IF <WA_DATA>-SHPTO IS INITIAL.
*      MOVE <WA_DATA>-KUNNR TO <WA_DATA>-SHPTO.
*    ENDIF.
*    IF <WA_DATA>-SLDTO IS INITIAL.
*      MOVE <WA_DATA>-KUNNR TO <WA_DATA>-SLDTO.
*    ENDIF.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_HP       
FROM KNA1       
WHERE KUNNR = <WA_DATA>-SHPTO.     
IF SY-SUBRC NE 0.       
PERFORM SET_CALLSYTLE(ZSDR006USING 4 GS_LOAD ‘送达方不正确‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.     
ENDIF.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_LD      
FROM KNA1      
WHERE KUNNR = <WA_DATA>-SLDTO.     
IF SY-SUBRC NE 0.       
PERFORM SET_CALLSYTLE(ZSDR006USING 3 GS_LOAD ‘售达方不正确‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.     
ENDIF.     

IF <WA_DATA>-MENGE GT ‘99999‘.       
PERFORM SET_CALLSYTLE(ZSDR006USING 13 GS_LOAD ‘数量只能小于10万‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.     
ENDIF.
*价格     <WA_DATA>
-ZYDJG = <WA_DATA>-ZYDJE / <WA_DATA>-MENGE.
*    <WA_DATA>-ZHJJE = <WA_DATA>-ZYDJG * <WA_DATA>-MENGE.   
ENDLOOP.   UNASSIGN <WA_DATA>

.
*将初始内表放入内存
*  LT_OUTPUT = GT_OUTPUT.   
FREE LT_OUTPUT.   

EXPORT LT_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.   

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 ‘9079‘."司机库     LS_ITEM
-TARGET_QU = <WA_SODATA>-MEINS.
*    LS_ITEM-BATCH = <WA_SODATA>-CHARG.     LS_ITEM
-ITEM_CATEG ‘TAN1‘.     
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
-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.     

AT END OF SHPTO.       

CLEAR LV_POSNR.       LS_HEADER

-DOC_TYPE ‘ZSO1‘.       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.       

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.     
ENDAT.     

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_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 VKORG EQ GS_SODATA-VKORG     
AND VTWEG EQ ‘20‘"直营     
AND VKBUR EQ GS_SODATA-VKBUR     
AND LOEVM NE ‘X‘"删除标记     
.   

IF SY-SUBRC NE 0.     C_RESULT 
‘E‘.     LV_MSG 
‘售达方‘ && U_SLDTO && ‘销售组织数据不正确,请检查。‘.     
MESSAGE S001 WITH LV_MSG DISPLAY LIKE ‘E‘.
*    MESSAGE ‘销售组织数据不正确,请检查。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
RETURN.   
ENDIF.

*  SELECT SINGLE SPOFI INTO @DATA(LV_SPOFI)
*    FROM TVLK
*    WHERE LFART EQ ‘ZLF‘."直营交货
*
*  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‘.
**        MESSAGE ‘售达方按工厂1000确定的装运点不存在。‘ TYPE ‘S‘ 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‘.
**      MESSAGE ‘条件记录PRZ0不存在。‘ TYPE ‘S‘ 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‘.
**        MESSAGE ‘条件记录PRZ0价格不能为0。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.
*
*      RETURN.
*    ENDIF.
*  ENDIF.   C_RESULT 

‘S‘.
*  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_STYLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SET_STYLE USING P_VALUE P_ROWID.   

DATA: L_STYPE TYPE STRING,         L_ROWID 
TYPE I.   L_ROWID 

= P_ROWID.   
CLEAR GS_OUTPUT.   
READ TABLE GT_OUTPUT INTO GS_OUTPUT INDEX L_ROWID.   L_STYPE 

‘DISABLE‘.   

IF P_VALUE EQ ‘X‘.     
CHECK GS_OUTPUT-SO IS INITIAL.     L_STYPE 
‘ENABLE‘.   
ELSE.     L_STYPE 
‘DISABLE‘.   
ENDIF.   

PERFORM SET_STYLE(ZSDR018USING ‘ZYDJE‘ L_STYPE CHANGING GS_OUTPUT-STYLE.   
PERFORM SET_STYLE(ZSDR018USING ‘ZYDDH‘ L_STYPE CHANGING GS_OUTPUT-STYLE.   
PERFORM SET_STYLE(ZSDR018USING ‘MENGE‘ L_STYPE CHANGING GS_OUTPUT-STYLE.   

MODIFY GT_OUTPUT FROM GS_OUTPUT INDEX L_ROWID.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_SHIPPOINT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_<WA_DATA>  text
*      <--P_LS_ITEM_SHIP_POINT  text
*----------------------------------------------------------------------*
FORM FRM_GET_SHIPPOINT  USING    U_WA TYPE TY_SODATA                         
CHANGING C_SHIP_POINT.   

DATA: LV_VSBED TYPE KNVV-VSBED,         LV_VWERK 
TYPE KNVV-VWERK,         LV_LGORT 
TYPE LGORT_D,         LV_LFARV 

TYPE TVAK-LFARV,         LV_SPOFI 
TYPE TVLK-SPOFI,         LV_VSTEL 

TYPE TVSTZ-VSTEL.   

SELECT SINGLE VSBED VWERK     
INTO ( LV_VSBED, LV_VWERK )     
FROM KNVV     
WHERE KUNNR EQ U_WA-SHPTO     
AND VKORG EQ U_WA-VKORG
*    AND VTWEG EQ U_WA-VTWEG     
AND VTWEG EQ ‘20‘"直营     

AND SPART EQ U_WA-SPART     
AND LOEVM NE ‘X‘"删除标记     
.   

SELECT SINGLE LFARV INTO LV_LFARV     
FROM TVAK     
WHERE AUART EQ ‘ZSO1‘.   

SELECT SINGLE SPOFI INTO LV_SPOFI     
FROM TVLK     
WHERE LFART EQ LV_LFARV.   

IF SY-SUBRC EQ 0.     

IF LV_SPOFI EQ SPACE"特定工厂装运点       
SELECT SINGLE VSTEL INTO C_SHIP_POINT         
FROM TVSTZ         
WHERE VSBED EQ LV_VSBED         
AND LADGR EQ ‘0001‘         
AND WERKS EQ LV_VWERK.     
ELSE."按库存地点确定装运点       LV_LGORT 

= U_WA-RESLO."司机库
*将库存地点带入行项目中       

SELECT SINGLE VSTEL INTO C_SHIP_POINT         
FROM TVSTZ_STORLOC         
WHERE VSBED EQ LV_VSBED         
AND LADGR EQ ‘0001‘         
AND WERKS EQ LV_VWERK         
AND LGORT EQ LV_LGORT.     
ENDIF.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEL_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SEL_ALL .   
DATA : LT_FILTERED_ENTRIES TYPE LVC_T_FIDX,          LV_INDEX            
TYPE SY-TABIX.   

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.     LV_INDEX 
= SY-TABIX.     
READ TABLE LT_FILTERED_ENTRIES  TRANSPORTING NO FIELDS WITH KEY TABLE_LINE = LV_INDEX.     
IF SY-SUBRC NE 0.       <WA_DATA>
-SEL ‘X‘.       
PERFORM SET_STYLE USING ‘X‘ LV_INDEX.     
ENDIF.     
CLEAR LV_INDEX.   
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_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_AUTHORITY_CHECK .   
AUTHORITY-CHECK OBJECT ‘V_VBAK_VKO‘            
ID ‘VKORG‘ FIELD P_VKORG            
ID ‘VTWEG‘ DUMMY            
ID ‘SPART‘ DUMMY            
ID ‘ACTVT‘ DUMMY.   
IF SY-SUBRC <> 0.     
MESSAGE ‘您没有销售组织‘ && P_VKORG && ‘的权限‘ TYPE ‘E‘.     
RETURN.   
ENDIF.   

AUTHORITY-CHECK OBJECT ‘M_MSEG_LGO‘            
ID ‘ACTVT‘ DUMMY            
ID ‘WERKS‘ FIELD ‘1000‘            
ID ‘LGORT‘ FIELD P_LGORT            
ID ‘BWART‘ DUMMY.   
IF SY-SUBRC <> 0.     

MESSAGE ‘您没有库存地点‘ && P_LGORT && ‘的权限‘ TYPE ‘E‘.     
RETURN.   

ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DELETE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DELETE_DATA .   
LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘ AND SO IS NOT INITIAL.

*判断销售订单是否被删除     
SELECT SINGLE VBELN INTO @DATA(LV_VBELN)       
FROM VBAK       
WHERE VBELN EQ @GS_OUTPUT-SO.     
IF SY-SUBRC EQ 0.       
MESSAGE ‘所选择数据存在已创建订单,不允许删除‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.       
RETURN.     
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 GT_DEL.     GT_DEL
-BATNO = GS_OUTPUT-BATNO.     GT_DEL
-BATPO = GS_OUTPUT-BATPO.     GT_DEL
-INDAT = GS_OUTPUT-INDAT.     
APPEND GT_DEL TO GT_DEL.     
CLEAR GS_OUTPUT.   
ENDLOOP.   

DELETE GT_OUTPUT WHERE SEL EQ ‘X‘.   

IF GT_DEL[] IS NOT INITIAL.     
DELETE ZTSD009 FROM TABLE GT_DEL[].     
IF SY-SUBRC EQ 0.       
COMMIT WORK AND WAIT.       
MESSAGE ‘删除成功!‘ TYPE ‘S‘.     *&---------------------------------------------------------------------*
*& Report  ZSDR005
*&
*&---------------------------------------------------------------------*
*&程序名称:直营平台-超市验单导入
*&事物代码:ZSD025
*&导入模板:直接下载
*&作者:侯康明
*&时间:2016/2/29
*&---------------------------------------------------------------------*
REPORT ZSDR046 MESSAGE-ID 00.

TYPE-POOLS:OLE2,SLIS,ICON.
FIELD-SYMBOLS: <FS>.

TABLES: SSCRFIELDS,ZTSD008,ZTSD009,MCHB.

TYPESBEGIN OF TY_OUTPUT,          SEL       
TYPE C,          BATNO     
TYPE ZTSD008-BATNO"批导序号          BATPO     
TYPE ZTSD009-BATPO"验单批导序号          VERNO     
TYPE ZTSD010-VERNO"版本号          ZDATE     
TYPE ZTSD008-ZDATE"导入日期          INDAT     
TYPE ZTSD009-INDAT"验单日期          LFDAT     
TYPE LIKP-LFDAT"实际交货日期
*         KUNNR     TYPE KUNNR, "客户号
*         NAME1     TYPE KNA1-NAME1, "客户名称          ZSJ       
TYPE KUNNR"司机          ZR        

TYPE CHAR30"主任          ZYWY      
TYPE CHAR30"业务员          NAME2     

TYPE KNA1-NAME1"司机名称
*         KUNNR1    TYPE KUNNR, "司机系统
*         NAME2     TYPE KNA1-NAME1, "司机系统名称          MATNR     
TYPE ZTSD009-MATNR"物料号          MAKTX     
TYPE MAKT-MAKTX"物料描述          MENGE     
TYPE ZTSD009-MENGE"验单数量          MEINS     
TYPE MEINS"数量单位
*         CHARG     TYPE CHARG_D, "批次          ZYDJG     
TYPE ZTSD009-ZYDJG"验单价格          ZYDJE     
TYPE ZTSD009-ZYDJE"合计金额          ZYDDH     
TYPE ZTSD009-ZYDDH"验单单号          SO        
TYPE ZTSD009-VBELN"SO          DN        
TYPE VBELN_VL"DN          ZICON1    
TYPE CHAR4"导入状态          VKBUR     
TYPE VKBUR"销售部门          VKORG     
TYPE VKORG,          LGORT     
TYPE LGORT_D,          RESLO     
TYPE RESLO"发货库存地          SHPTO     

TYPE KUNNR"送达方          NAME_HP   
TYPE NAME1"送达方名称          SLDTO     
TYPE KUNNR"售达方          NAME_LD   
TYPE NAME1"售达方名称          CELLCOLOR 

TYPE LVC_T_SCOL"控制单元格颜色          STYLE     
TYPE LVC_T_STYL"控制单元格可否编辑          MSSG      
TYPE BAPI_MSG"消息内容          ZFREE     

TYPE C,          BEIZHU    
TYPE CHAR255"备注          ZUSER     
TYPE ZTSD008-ZUSER,          WBSTK     
TYPE VBUK-WBSTK"货物移动状态          FKSTK     
TYPE VBUK-FKSTK"开票状态        
END OF TY_OUTPUT.

TYPESBEGIN OF TY_LOAD,          INDAT  
TYPE ZTSD009-INDAT"验单日期          LFDAT  
TYPE LIKP-LFDAT"交货日期
*         KUNNR  TYPE KUNNR,
*         BLANK  TYPE C, "占位          SLDTO  
TYPE KUNNR"售达方
*         BLANK1 TYPE C, "占位          SHPTO  
TYPE KUNNR"送达方
*         BLANK2 TYPE C, "占位          ZYDDH  
TYPE ZTSD009-ZYDDH"验单单号          ZSJ    
TYPE KUNNR"司机
*         BLANK5 TYPE C, "占位          ZR     
TYPE CHAR30"主任          ZYWY   
TYPE CHAR30"业务员          VKBUR  
TYPE VKBUR"销售部门
*         BLANK3 TYPE C, "占位          BEIZHU 
TYPE CHAR255"备注          MEINS  
TYPE MEINS"数量单位          MATNR  
TYPE ZTSD009-MATNR,          MENGE  
TYPE MENGE_D"验单数量          ZYDJG  
TYPE ZTSD009-ZYDJG"验单价格          ZYDJE  
TYPE ZTSD009-ZYDJE"验单金额
*         BLANK4 TYPE C, "        
END OF TY_LOAD.

TYPESBEGIN OF TY_SODATA,          ZYDDH 
TYPE ZTSD009-ZYDDH"验单单号          INDAT 

TYPE ZTSD009-INDAT,          LFDAT 
TYPE LIKP-LFDAT,
*         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"销售组          VKBUR 
TYPE VBAK-VKBUR"销售部门          VSBED 
TYPE KNVV-VSBED"装运条件          MATNR 
TYPE EKPO-MATNR"物料代码          VSTEL 

TYPE VSTEL"装运点          RESLO 

TYPE RESLO"发货库存地          WERKS 
TYPE VBAP-WERKS"          MENGE 
TYPE KWMENG"数量          MEINS 
TYPE MEINS"单位
*         CHARG TYPE CHARG_D, "批次          ZYDJE 
TYPE ZTSD009-ZYDJE"验单价格          BATNO 
TYPE ZTSD008-BATNO"批导序号          BATPO 
TYPE ZTSD009-BATPO"批导行项目号          SO    

TYPE VBAK-VBELN"销售订单号          DN    
TYPE LIKP-VBELN"交货单号          KPEIN 

TYPE KOMV-KPEIN"条件定价单位          KMEIN 
TYPE KOMV-KMEIN"条件单位        

END OF TY_SODATA.

TYPES:  BEGIN OF TYP_HEADER,           ZTEXT
(10),         
END OF TYP_HEADER.

TYPESBEGIN OF TY_MESG,          MESG 
TYPE CHAR255,        
END OF TY_MESG.

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 TABLE OF TY_LOAD,       GT_OUTPUT 
TYPE TABLE OF TY_OUTPUT,       GT_SODATA 
TYPE TABLE OF TY_SODATA.

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 P_MODE TYPE VALUE ‘N‘.

DATABEGIN OF GT_BATNO OCCURS 0,         BATNO 
TYPE ZBATNO,         BATPO 
TYPE ZBATPO,       
END OF GT_BATNO.

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.

DATA: GT_DEL TYPE TABLE OF ZTSD009 WITH HEADER LINE.

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.
*SELECT-OPTIONS:
PARAMETERS: P_VKORG TYPE VBAK-VKORG,             P_LGORT 
TYPE T001L-LGORT.
PARAMETERS: P_UFILE LIKE RLGRAP-FILENAME MODIF ID M1."上传文件路径
SELECT-OPTIONS:                 S_ZUSER 
FOR ZTSD008-ZUSER MODIF ID M2,"导入用户                 S_INDAT 
FOR ZTSD009-INDAT MODIF ID M2,"验单日期                 S_ZDATE 
FOR ZTSD008-ZDATE MODIF ID M2,"导入日期                 S_SJ 
FOR ZTSD009-KUNNR MODIF ID M2,"客户编号                 S_MATNR 
FOR ZTSD009-MATNR MODIF ID M2,"物料编号                 S_SHPTO 
FOR ZTSD009-SHPTO MODIF ID M2"送达方                 S_SLDTO 
FOR ZTSD009-SLDTO MODIF ID M2"售达方                 S_VKBUR 
FOR ZTSD009-VKBUR MODIF ID M2"销售部门                 S_ZYDDH 
FOR ZTSD009-ZYDDH LOWER CASE MODIF ID M2"验单单号                 S_VBELN 
FOR ZTSD009-VBELN MODIF ID M2"销售订单号
*PARAMETERS: P_CB1 TYPE C AS CHECKBOX MODIF ID M4,
*            P_CB2 TYPE C AS CHECKBOX MODIF ID M4.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREENFUNCTION KEY 1.   "激活按钮

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TITLE1.
PARAMETERS: R1 RADIOBUTTON GROUP RG1 USER-COMMAND USR DEFAULT ‘X‘"上传批导             R2 
RADIOBUTTON GROUP RG1"提交验单             R3 
RADIOBUTTON GROUP RG1"显示导入数据
SELECTION-SCREEN END OF BLOCK B2.

*SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TITLE2.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS: R3 RADIOBUTTON GROUP RG2 DEFAULT ‘X‘."本品
*SELECTION-SCREEN COMMENT (5) TEXT-001 FOR FIELD R1.
*PARAMETERS: R4 RADIOBUTTON GROUP RG2."赠品
*SELECTION-SCREEN COMMENT (5) TEXT-002 FOR FIELD R2."
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK B3.

SELECTION-SCREEN BEGIN OF BLOCK B4 WITH FRAME TITLE TEXT-007.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: R5 RADIOBUTTON GROUP RG3 USER-COMMAND USR2 DEFAULT ‘X‘."石家庄直营
SELECTION-SCREEN COMMENT (7TEXT-005 FOR FIELD R5.
PARAMETERS: R6 RADIOBUTTON GROUP RG3 ."未打印
SELECTION-SCREEN COMMENT (7TEXT-006 FOR FIELD R6."外阜直营
*PARAMETERS: R6 RADIOBUTTON GROUP RG2."全部
*SELECTION-SCREEN COMMENT (5) TEXT-005 FOR FIELD R6."全部
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK B4.

*----------------------------------------------------------------------*
*        INITIALIZATION                                           *
*----------------------------------------------------------------------*
INITIALIZATION.   SSCRFIELDS
-FUNCTXT_01 ‘下载模板‘.    "定义按钮文本   TITLE1 
‘操作类型‘.
*  TITLE2 = ‘验收产品类型‘.
*----------------------------------------------------------------------*
*        AT SELECTION-SCREEN                                           *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.   

CASE SSCRFIELDS-UCOMM.          "处理按钮命令     
WHEN‘FC01‘.       
PERFORM FRM_DOWNLOAD_TEMPLATE.   

ENDCASE.

AT SELECTION-SCREEN OUTPUT.   
IF R5 EQ ‘X‘.
*    SUBMIT ZSDR005 VIA SELECTION-SCREEN .   

ELSEIF R6 EQ ‘X‘.     
SUBMIT ZSDR019 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 R3 EQ ‘X‘.           
SCREEN-ACTIVE 1.         
ELSE.           
SCREEN-ACTIVE 0.         
ENDIF.         
MODIFY SCREEN.       
WHEN ‘M3‘.         
IF R3 EQ ‘X‘.           
SCREEN-ACTIVE 1.         
ELSE.           
SCREEN-ACTIVE 0.         
ENDIF.         
MODIFY SCREEN.       
WHEN ‘M4‘.         
IF R2 EQ ‘X‘.           
SCREEN-ACTIVE 1.         
ELSE.           
SCREEN-ACTIVE 0.         
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‘,‘LT_RETURN‘.   

IF P_VKORG IS INITIAL.     
MESSAGE ‘请输入销售组织。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
EXIT.   
ENDIF.   

IF P_LGORT IS INITIAL.     
MESSAGE ‘请输入库存地点。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
EXIT.   
ENDIF.   

PERFORM FRM_AUTHORITY_CHECK.

*上传文件   
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‘
*显示保存的数据

*DELETE FROM: ZTSD008,ZTSD009,ZTSD010,ZTSD011. COMMIT WORK AND WAIT.     
PERFORM FRM_GET_DATA.     
PERFORM FRM_PROCESS_DATA.   

ENDIF.   
IF GT_OUTPUT IS INITIAL.     
MESSAGE ‘没有符合要求的数据‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
EXIT.   
ENDIF.   

IF R2 EQ ‘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
.   

PRIVATE SECTION.     
DATA ROWS TYPE LVC_T_ROW.     
DATA RS TYPE LVC_S_ROW.     
DATA ERROR_IN_DATA TYPE C.     
DATA LS_MODI TYPE LVC_S_MODI.     
DATA G_IND TYPE I.     
DATA LV_SEL TYPE C.     

METHODS:       GET_ZYDJE         

IMPORTING           E_MODI         
TYPE LVC_S_MODI           E_DATA_CHANGED 
TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL,       GET_MENGE         


IMPORTING           E_MODI         
TYPE LVC_S_MODI           E_DATA_CHANGED 
TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.

ENDCLASS.                    "GC_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------
*       CLASS GC_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------
CLASS GC_EVENT_RECEIVER IMPLEMENTATION.   
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.     

IF R3 NE ‘X‘.       
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.     
ENDIF.     

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‘.       
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-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@‘."红灯.

*        LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘ AND SO IS INITIAL.
*        ENDLOOP.

*        CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY
*          EXPORTING
*            IS_STABLE      = GS_STABLE
*            I_SOFT_REFRESH = ‘X‘.       

WHEN ‘CAN_ALL‘.         
CLEAR GS_OUTPUT.         GS_OUTPUT
-SEL ‘ ‘.         
MODIFY GT_OUTPUT FROM GS_OUTPUT TRANSPORTING SEL WHERE SEL EQ ‘X‘.         

LOOP AT GT_OUTPUT INTO GS_OUTPUT.           
PERFORM SET_STYLE USING ‘‘ SY-TABIX.         
ENDLOOP.

*        CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY
*          EXPORTING
*            IS_STABLE      = GS_STABLE
*            I_SOFT_REFRESH = ‘X‘.       

WHEN ‘DEL‘.
*询问是否确认         
CALL FUNCTION ‘POPUP_TO_CONFIRM‘           
EXPORTING             TEXT_QUESTION         
‘确认删除所选数据?‘             TEXT_BUTTON_1         
‘是‘(003)             TEXT_BUTTON_2         
‘否‘(004)             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 ‘OKAY‘.         
PERFORM FRM_CONFIRM_DATA CHANGING LV_RESULT.         
CHECK 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.

*DN过账         
PERFORM FRM_POST_DN.       

WHEN OTHERS.     

ENDCASE.     

CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY       
EXPORTING         IS_STABLE      
= GS_STABLE         I_SOFT_REFRESH 
‘X‘.   

ENDMETHOD.   
METHOD HANDLE_DATA_CHANGED.     
LOOP AT ER_DATA_CHANGED->MT_MOD_CELLS INTO LS_MODI.       
CASE LS_MODI-FIELDNAME.         

WHEN ‘MENGE‘.           
CALL METHOD GET_MENGE             
EXPORTING               E_MODI         
= LS_MODI               E_DATA_CHANGED 
= ER_DATA_CHANGED.         

WHEN ‘ZYDJE‘.           
CALL METHOD GET_ZYDJE             
EXPORTING               E_MODI         
= LS_MODI               E_DATA_CHANGED 
= ER_DATA_CHANGED.       
ENDCASE.     
ENDLOOP.     

CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY       
EXPORTING         IS_STABLE      
= GS_STABLE         I_SOFT_REFRESH 
‘X‘.   

ENDMETHOD.   

METHOD HANDLE_CHANGE_FINISH.     

DATA: LS_CELL TYPE LVC_S_MODI.     

CLEAR LS_CELL.     
READ TABLE ET_GOOD_CELLS INTO LS_CELL INDEX 1.     

CASE LS_CELL-FIELDNAME.       
WHEN ‘SEL‘.         
PERFORM SET_STYLE USING LS_CELL-VALUE LS_CELL-ROW_ID.         

CALL METHOD GCT_ALV->REFRESH_TABLE_DISPLAY           
EXPORTING             IS_STABLE      
= GS_STABLE             I_SOFT_REFRESH 
‘X‘.     

ENDCASE.   

ENDMETHOD.   
METHOD GET_ZYDJE.     
DATA LV_YDJE TYPE ZTSD009-ZYDJE.     

DATA LV_TABIX LIKE SY-TABIX.     

CALL METHOD E_DATA_CHANGED->GET_CELL_VALUE       
EXPORTING         I_ROW_ID    
= E_MODI-ROW_ID         I_FIELDNAME 
= E_MODI-FIELDNAME       
IMPORTING         E_VALUE     
= LV_YDJE.
*    CHECK NOT LV_YDJE IS  INITIAL.     
READ TABLE GT_OUTPUT ASSIGNING <WA_DATA> INDEX E_MODI-ROW_ID.
*    CHECK <WA_DATA>-MEINS IS NOT INITIAL.     
IF SY-SUBRC EQ 0.       <WA_DATA>
-MSSG ‘ ‘.       

IF LV_YDJE LE 0.         <WA_DATA>
-MSSG ‘合计金额不能为零,请修改!‘.         ERROR_IN_DATA 

‘X‘.
*        CALL METHOD E_DATA_CHANGED->ADD_PROTOCOL_ENTRY
*          EXPORTING
*            I_MSGID     = ‘ZSD001‘
*            I_MSGNO     = ‘000‘
*            I_MSGTY     = ‘E‘
*            I_MSGV1     = LV_YDJE
*            I_MSGV2     = ‘合计金额不能为零,请修改!‘
*            I_MSGV3     = ‘‘
*            I_FIELDNAME = E_MODI-FIELDNAME
*            I_ROW_ID    = E_MODI-ROW_ID.
*        IF ERROR_IN_DATA = ‘X‘.
*          CALL METHOD E_DATA_CHANGED->DISPLAY_PROTOCOL.
*        ENDIF.       
ELSE.
*        BREAK B012.         
IF <WA_DATA>-MENGE NE 0.           <WA_DATA>
-ZYDJG = LV_YDJE / <WA_DATA>-MENGE.         
ELSE.           <WA_DATA>
-ZYDJG 0.         
ENDIF.       
ENDIF.     
ENDIF.     UNASSIGN <WA_DATA>

.     
FREE:LV_YDJE.   
ENDMETHOD.   

METHOD GET_MENGE.     
DATA LV_MENGE TYPE ZTSD009-MENGE.     
DATA LV_MEINS TYPE MEINS.     
DATA LV_TABIX LIKE SY-TABIX.     
DATA:       LV_STRING 
TYPE STRING,       S1        
TYPE STRING,       S2        
TYPE STRING.     

CALL METHOD E_DATA_CHANGED->GET_CELL_VALUE       
EXPORTING         I_ROW_ID    
= E_MODI-ROW_ID         I_FIELDNAME 
= E_MODI-FIELDNAME       
IMPORTING         E_VALUE     
= LV_MENGE.     

READ TABLE GT_OUTPUT ASSIGNING <WA_DATA> INDEX E_MODI-ROW_ID.     

IF SY-SUBRC EQ 0.       <WA_DATA>
-MSSG ‘ ‘.       

IF LV_MENGE LE 0.         <WA_DATA>
-MSSG ‘验收数量不能为零,请修改!‘.         ERROR_IN_DATA 

‘X‘.
*        CALL METHOD E_DATA_CHANGED->ADD_PROTOCOL_ENTRY
*          EXPORTING
*            I_MSGID     = ‘ZSD001‘
*            I_MSGNO     = ‘000‘
*            I_MSGTY     = ‘E‘
*            I_MSGV1     = LV_MENGE
*            I_MSGV2     = ‘验收数量不能为零,请修改!‘
*            I_MSGV3     = ‘‘
*            I_FIELDNAME = E_MODI-FIELDNAME
*            I_ROW_ID    = E_MODI-ROW_ID.
*        IF ERROR_IN_DATA = ‘X‘.
*          CALL METHOD E_DATA_CHANGED->DISPLAY_PROTOCOL.
*        ENDIF.       
ELSE.         LV_STRING 

= LV_MENGE.         
SPLIT LV_STRING AT ‘.‘ INTO S1 S2.         
IF S2 NE 0.           <WA_DATA>

-MSSG ‘验收数量不能含小数。‘.           ERROR_IN_DATA 
‘X‘.
*          CALL METHOD E_DATA_CHANGED->ADD_PROTOCOL_ENTRY
*            EXPORTING
*              I_MSGID     = ‘ZSD001‘
*              I_MSGNO     = ‘000‘
*              I_MSGTY     = ‘E‘
*              I_MSGV1     = LV_MENGE
*              I_MSGV2     = ‘验收数量不能含小数。请修改!‘
*              I_MSGV3     = ‘‘
*              I_FIELDNAME = E_MODI-FIELDNAME
*              I_ROW_ID    = E_MODI-ROW_ID.
*          IF ERROR_IN_DATA = ‘X‘.
*            CALL METHOD E_DATA_CHANGED->DISPLAY_PROTOCOL.
*          ENDIF.

*        ENDIF.         
ENDIF.

*更新验单价格         <WA_DATA>
-ZYDJG = <WA_DATA>-ZYDJE / <WA_DATA>-MENGE.       

ENDIF.     
ENDIF.     UNASSIGN <WA_DATA>

.     
FREE:LV_MEINS, LV_MENGE.   
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.   
DATA: LV_LENTH TYPE I.   
DATA: LV_FLAG TYPE C.   
DATA: LV_POSNR(4TYPE 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:LV_MSG TYPE STRING.   
DATA: LS_ROWDATA TYPE TRUXS_T_TEXT_DATA.   

DATATYPE I."两个物料列的间隔   
DATA:LV_N TYPE I.   

DATA: LV_COUNT 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             
2       I_END_COL               
255       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 DESCENDING.   
READ TABLE ITAB INDEX 1.   
MOVE ITAB-ROW TO LV_LINES.   

SORT ITAB[] BY ROW COL.   

LOOP AT ITAB.     LV_MSG 
‘检查数据...‘ && ITAB-ROW && ‘/‘ && LV_LINES.     

ON CHANGE OF ITAB-ROW.       
IF SY-TABIX NE 1.         
APPEND GS_LOAD TO GT_LOAD.         
MOVE-CORRESPONDING GS_LOAD TO GS_OUTPUT.         

ADD 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(ZSDR018USING ‘SEL‘ ‘DISABLE‘ CHANGING GS_OUTPUT-STYLE.         
ENDIF.         

APPEND GS_OUTPUT TO GT_OUTPUT.         

CLEAR GS_LOAD.         
CLEAR GS_OUTPUT.         
CLEAR GS_CELLCOLOR.       
ENDIF.     
ENDON.     

ASSIGN COMPONENT ITAB-COL OF STRUCTURE GS_LOAD TO <FS>.     

"动态方法将值传到相应的内表
*    <FS> = ITAB-VALUE.     
TRY.         
MOVE ITAB-VALUE TO <FS>.       
CATCH CX_ROOT INTO L_EXCEPTION.         
PERFORM SET_CALLSYTLE(ZSDR006USING 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 OR ITAB-COL EQ 2.       

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(ZSDR006USING ITAB-COL GS_LOAD ‘日期格式错误‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       
ENDIF.     
ENDIF.

*检查送达方售达方是否存在     
IF ITAB-COL EQ OR ITAB-COL EQ 4.
*添加前置零       
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT‘         
EXPORTING           
INPUT  = <FS>         
IMPORTING           
OUTPUT = <FS>.     

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‘         
.       

IF SY-SUBRC NE 0.         
PERFORM SET_CALLSYTLE(ZSDR006USING ITAB-COL GS_LOAD ‘司机编号不存在‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       

ENDIF.     
ENDIF.     

IF ITAB-COL EQ 9.       
SELECT SINGLE BEZEI INTO @DATA(BEZEI)         
FROM TVKBT         
WHERE VKBUR EQ @<FS>         
AND SPRAS EQ @SY-LANGU.       
IF SY-SUBRC NE 0.         
PERFORM SET_CALLSYTLE(ZSDR006USING ITAB-COL GS_LOAD ‘部门编码不存在‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       

ENDIF.     
ENDIF.
*检查产品是否存在     
IF ITAB-COL EQ 12.
*取物料描述
*添加前置零
*判断是否含非数字的字符       
IF <FS> CN ‘1234567890 ‘.       

ELSE.         
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(ZSDR006USING ITAB-COL GS_LOAD ‘物料编码不正确‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.         

ENDIF.       
ENDIF.
*
**检查验单单号是否已导入       
SELECT SINGLE ZYDDH INTO @DATA(LV_ZYDDH)         
FROM ZTSD009         
WHERE ZYDDH EQ @GS_LOAD-ZYDDH         
AND MATNR EQ @GS_LOAD-MATNR         
AND SHPTO EQ @GS_LOAD-SHPTO.       

IF SY-SUBRC EQ 0.         
PERFORM SET_CALLSYTLE(ZSDR006USING 6 GS_LOAD ‘含相同产品的验单号已存在‘ CHANGING GS_OUTPUT-CELLCOLOR GS_OUTPUT-MSSG.       
ENDIF.     
ENDIF.   

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 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(ZSDR018USING ‘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.

*下载模板   

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_004‘ 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 .   
DATA: LV_COND TYPE CHAR100.   

IF R3 EQ ‘X‘.     
SELECT       A
~* ,       A
~VBELN AS SO,       A
~VBELN_VL AS DN,       B
~ZDATE,       B
~VKORG,       B
~LGORT,       B
~ZUSER,
*    B~NAME1,       
C~MAKTX       
INTO CORRESPONDING FIELDS OF TABLE @GT_OUTPUT       
FROM ZTSD009 AS A       INNER 
JOIN ZTSD008 AS B       
ON A~BATNO EQ B~BATNO
*    INNER JOIN KNA1 AS B ON A~KUNNR EQ B~KUNNR       INNER 
JOIN MAKT AS ON A~MATNR EQ C~MATNR       
WHERE INDAT IN @S_INDAT       
AND A~ZSJ IN @S_SJ       
AND A~MATNR IN @S_MATNR       
AND A~SHPTO IN @S_SHPTO "送达方       
AND A~SLDTO IN @S_SLDTO "售达方       
AND A~VKBUR IN @S_VKBUR "销售部门       
AND A~ZYDDH IN @S_ZYDDH       
AND A~VBELN IN @S_VBELN       
AND B~ZDATE IN @S_ZDATE       
AND B~VKORG EQ @P_VKORG       
AND B~LGORT EQ @P_LGORT       
AND B~ZUSER IN @S_ZUSER       
.   
ELSEIF R2 EQ ‘X‘.
*    IF P_CB1 EQ ‘X‘.
*      LV_COND = ‘A~VBELN     
SELECT       A
~* ,       A
~VBELN AS SO,       A
~VBELN_VL AS DN,       B
~ZDATE,       B
~VKORG,       B
~LGORT,       B
~ZUSER,
*    B~NAME1,       
C~MAKTX       
INTO CORRESPONDING FIELDS OF TABLE @GT_OUTPUT       
FROM ZTSD009 AS A       INNER 
JOIN ZTSD008 AS B       
ON A~BATNO EQ B~BATNO
*    INNER JOIN KNA1 AS B ON A~KUNNR EQ B~KUNNR       INNER 
JOIN MAKT AS ON A~MATNR EQ C~MATNR       
WHERE INDAT IN @S_INDAT       
AND A~ZSJ IN @S_SJ       
AND A~MATNR IN @S_MATNR       
AND A~SHPTO IN @S_SHPTO "送达方       
AND A~SLDTO IN @S_SLDTO "售达方       
AND A~VKBUR IN @S_VKBUR "销售部门       
AND A~ZYDDH IN @S_ZYDDH
*      AND A~VBELN EQ @SPACE       
AND A~VBELN IN @S_VBELN       
AND B~ZDATE IN @S_ZDATE       
AND B~VKORG EQ @P_VKORG       
AND B~LGORT EQ @P_LGORT       
AND B~ZUSER IN @S_ZUSER       
.   

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.   

LOOP AT GT_OUTPUT ASSIGNING <WA_DATA>.     GT_BATNO
-BATNO = <WA_DATA>-BATNO.     GT_BATNO
-BATPO = <WA_DATA>-BATPO.     
APPEND GT_BATNO.

*    IF <WA_DATA>-SO NE SPACE.
*      MOVE ‘-‘ TO <WA_DATA>-SEL.
*    ENDIF.     <WA_DATA>

-RESLO = <WA_DATA>-LGORT(3) && ‘9‘.

*    SELECT SINGLE NAME1 INTO <WA_DATA>-NAME1
*      FROM KNA1
*      WHERE KUNNR = <WA_DATA>-KUNNR.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME2     
FROM KNA1     
WHERE KUNNR EQ <WA_DATA>-ZSJ.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_HP         
FROM KNA1         
WHERE KUNNR EQ <WA_DATA>-SHPTO.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_LD       
FROM KNA1       
WHERE KUNNR EQ <WA_DATA>-SLDTO.

*价格     
IF <WA_DATA>-MENGE NE 0.       <WA_DATA>
-ZYDJG = <WA_DATA>-ZYDJE / <WA_DATA>-MENGE.     
ELSE.       <WA_DATA>
-ZYDJG 0.     
ENDIF.
*    <WA_DATA>-ZYDJE = <WA_DATA>-ZYDJG * <WA_DATA>-MENGE.     

PERFORM SET_STYLE(ZSDR018USING ‘ZYDJE‘ ‘DISABLE‘ CHANGING <WA_DATA>-STYLE.     
PERFORM SET_STYLE(ZSDR018USING ‘ZYDDH‘ ‘DISABLE‘ CHANGING <WA_DATA>-STYLE.     
PERFORM SET_STYLE(ZSDR018USING ‘MENGE‘ ‘DISABLE‘ CHANGING <WA_DATA>-STYLE.     

IF R3 EQ ‘X‘.
*取状态       
SELECT SINGLE WBSTK FKSTK         
INTO ( <WA_DATA>-WBSTK, <WA_DATA>-FKSTK )         
FROM VBUK         
WHERE VBELN EQ <WA_DATA>-DN.     
ENDIF.   

ENDLOOP.   UNASSIGN <WA_DATA>
.
*将初始内表放入内存   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
-KEY = &6.     GS_STRUCTURE
-NO_ZERO ‘X‘.

*    IF R4 EQ ‘X‘ AND R2 EQ ‘X‘.
*    IF R2 EQ ‘X‘.
*    ELSE.      
IF &1 EQ ‘SEL‘.       GS_STRUCTURE
-CHECKBOX ‘X‘.       GS_STRUCTURE
-EDIT ‘X‘.      
ENDIF.
*    ENDIF.   

IF R2 EQ ‘X‘.     
IF &1 EQ ‘ZYDJE‘       
OR &1 EQ ‘ZYDDH‘       
OR &1 EQ ‘MENGE‘.         GS_STRUCTURE
-EDIT ‘X‘.      
ENDIF.   
ENDIF.   

IF &1 EQ ‘ZYDDH‘.     GS_STRUCTURE
-LOWERCASE ‘X‘.   
ENDIF.     

APPEND GS_STRUCTURE TO GT_STRUCTURE.     
CLEAR GS_STRUCTURE.   
END-OF-DEFINITION.   
IF R3 NE ‘X‘.     BUILD_FC
:     
‘SEL‘ ‘选择列‘ ‘‘ ‘‘ ‘‘ ‘X‘,     
‘MSSG‘ ‘错误消息‘ ‘‘ ‘‘ ‘‘ ‘‘.   
ENDIF.   

IF R1 EQ ‘X‘.     BUILD_FC
:     
‘ZICON1‘ ‘指示灯‘ ‘‘ ‘ICON‘ ‘ID‘ ‘X‘.   
ENDIF.   BUILD_FC

:
‘INDAT‘ ‘验单日期‘ ‘‘ ‘ZTSD009‘ ‘INDAT‘ ‘X‘,

‘ZSJ‘ ‘司机‘ ‘‘ ‘KNA1‘ ‘KUNNR‘ ‘X‘,
‘NAME2‘ ‘司机名称‘ ‘‘ ‘KNA1‘ ‘NAME1‘ ‘X‘,
‘SHPTO‘ ‘送达方编号‘ ‘‘ ‘KNA1‘ ‘KUNNR‘ ‘X‘,
‘NAME_HP‘ ‘送达方名称‘ ‘‘ ‘KNA1‘ ‘NAME1‘ ‘X‘,
‘SLDTO‘ ‘售达方编号‘ ‘‘ ‘KNA1‘ ‘KUNNR‘ ‘X‘,
‘NAME_LD‘ ‘售达方名称‘ ‘‘ ‘KNA1‘ ‘NAME1‘ ‘X‘,
*‘ZDATE‘ ‘导入日期‘ ‘‘ ‘ZTSD008‘ ‘ZDATE‘ ‘‘,
‘LFDAT‘ ‘交货日期‘ ‘‘ ‘LIKP‘ ‘LFDAT‘ ‘‘,
‘BATNO‘ ‘导入编号‘ ‘‘ ‘ZTSD002‘ ‘BATNO‘ ‘‘,
‘BATPO‘ ‘导入项目‘ ‘‘ ‘ZTSD002‘ ‘BATPO‘ ‘‘,
‘VKBUR‘ ‘销售部门‘ ‘‘ ‘VBAK‘ ‘VKBUR‘ ‘‘,
‘ZR‘ ‘主任‘ ‘‘ ‘ZTSD009‘ ‘ZR‘ ‘‘,
‘ZYWY‘ ‘业务员‘ ‘‘ ‘ZTSD009‘ ‘ZYWY‘ ‘‘,
‘MATNR‘ ‘物料编号‘ ‘‘ ‘MARA‘ ‘MATNR‘ ‘‘,
‘MAKTX‘ ‘物料名称‘ ‘‘ ‘MAKT‘ ‘MAKTX‘ ‘‘,
‘MENGE‘ ‘验收数量‘ ‘‘ ‘LIPS‘ ‘LFIMG‘ ‘‘,
‘MEINS‘ ‘数量单位‘ ‘‘ ‘MARA‘ ‘MEINS‘ ‘‘,
*  ‘CHARG‘ ‘批次‘ ‘‘ ‘‘ ‘‘,
‘ZYDJG‘ ‘验收单价格‘ ‘‘ ‘ZTSD009‘ ‘ZYDJG‘ ‘‘,
‘ZYDJE‘ ‘合计金额‘ ‘‘ ‘ZTSD009‘ ‘ZYDJE‘ ‘‘,
‘ZYDDH‘ ‘验收单号‘ ‘‘ ‘ZTSD009‘ ‘ZYDDH‘ ‘‘,
‘SO‘ ‘销售订单号‘ ‘‘ ‘VBAK‘ ‘VBELN‘ ‘‘,
‘DN‘ ‘交货单号‘ ‘‘ ‘LIKP‘ ‘VBELN‘ ‘‘,
‘BEIZHU‘ ‘备注‘ ‘‘ ‘‘ ‘‘ ‘‘,
‘ZUSER‘ ‘导入人员‘ ‘‘ ‘ZTSD008‘ ‘ZUSER‘ ‘‘.   
IF R3 EQ ‘X‘.     BUILD_FC
:     
‘WBSTK‘ ‘发货状态‘ ‘‘ ‘VBUK‘ ‘WBSTK‘ ‘‘,     
‘FKSTK‘ ‘开票状态‘ ‘‘ ‘VBUK‘ ‘FKSTK‘ ‘‘.   
ENDIF.

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: CHECK_OKAY TYPE STRING.   
CLEAR OK_CODE.   OK_CODE 
= SY-UCOMM.   
DATA: ANS TYPE STRING."GUI返回值   

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‘.       
PERFORM FRM_CHECK_CHANGES CHANGING CHECK_OKAY.       

IF CHECK_OKAY EQ ‘F‘."没做修改
*释放内存
*        FREE MEMORY.         
"直接退出         
PERFORM FRM_RESET_LOCK.         

LEAVE TO SCREEN 0.       
ELSEIF CHECK_OKAY EQ ‘T‘."做了修改
*询问是否保存         
CALL FUNCTION ‘POPUP_TO_CONFIRM‘           
EXPORTING             TEXT_QUESTION         
‘数据已修改,是否保存?‘             TEXT_BUTTON_1         
‘是‘(003)             TEXT_BUTTON_2         
‘否‘(004)             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‘."是           
PERFORM FRM_SAVE_DATA USING ‘ ‘ CHANGING LV_RESULT.           
IF LV_RESULT EQ ‘S‘.             
MESSAGE ‘保存成功!‘ TYPE ‘S‘.           
ELSEIF LV_RESULT EQ ‘E‘.             
MESSAGE ‘保存失败!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.           
ELSEIF LV_RESULT EQ ‘N‘.             
MESSAGE ‘数据没有修改!‘ TYPE ‘S‘.           
ENDIF.
**释放内存
*          FREE MEMORY.
*          "直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.
*         
ELSEIF ANS EQ ‘A‘."取消           
RETURN.         
ELSE."否
**释放内存
*          FREE MEMORY.           
"直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.

*         
ENDIF.       
ENDIF.     
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 R3 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.


*显示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[].


*注册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.
*&---------------------------------------------------------------------*
*&      Module  MOD_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE MOD_COMMAND_9000 INPUT.

*  DATA: CHECK_OKAY TYPE STRING.   
CLEAR OK_CODE.   OK_CODE 
= SY-UCOMM.
*  DATA: ANS TYPE STRING."GUI返回值   

CASE  OK_CODE.     
WHEN ‘BACK‘.       
PERFORM FRM_CHECK_CHANGES CHANGING CHECK_OKAY.       

IF CHECK_OKAY EQ ‘F‘."没做修改
*释放内存
*        FREE MEMORY.         
"直接退出         
PERFORM FRM_RESET_LOCK.         

LEAVE TO SCREEN 0.       
ELSEIF CHECK_OKAY EQ ‘T‘."做了修改
*询问是否保存         
CALL FUNCTION ‘POPUP_TO_CONFIRM‘           
EXPORTING             TEXT_QUESTION         
‘未保存数据将丢失,是否退出?‘             TEXT_BUTTON_1         
‘是‘(001)             TEXT_BUTTON_2         
‘否‘(002)             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‘."是           
PERFORM FRM_SAVE_DATA USING ‘ ‘ CHANGING LV_RESULT.           
IF LV_RESULT EQ ‘S‘.             
MESSAGE ‘保存成功!‘ TYPE ‘S‘.           
ELSEIF LV_RESULT EQ ‘E‘.             
MESSAGE ‘保存失败!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.           
ELSEIF LV_RESULT EQ ‘N‘.             
MESSAGE ‘数据没有修改!‘ TYPE ‘S‘.           
ENDIF.
**释放内存
*          FREE MEMORY.
*          "直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.
*         
ELSEIF ANS EQ ‘A‘."取消           
RETURN.         
ELSE."否
**释放内存
*          FREE MEMORY.           
"直接退出           
PERFORM FRM_RESET_LOCK.           

LEAVE TO SCREEN 0.

*         
ENDIF.       
ENDIF.     

WHEN OTHERS.   
ENDCASE.
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_ZTSD008 
TYPE TABLE OF ZTSD008,     LT_ZTSD009 
TYPE TABLE OF ZTSD009,     LT_ZTSD010 
TYPE TABLE OF ZTSD010,     LT_ZTSD011 
TYPE TABLE OF ZTSD011,     LT_OUTPUT  

TYPE TABLE OF TY_OUTPUT,     LS_ZTSD008 

TYPE ZTSD008"超市验收单抬头     LS_ZTSD009 
TYPE ZTSD009"验收单明细     LS_ZTSD010 
TYPE ZTSD010"验收单修改日志     LS_ZTSD011 
TYPE ZTSD011"验收单与SO对应关系     LS_OUTPUT  

TYPE TY_OUTPUT.   

DATA: LV_BATNO TYPE CHAR10"批导编号         LV_VERNO 
TYPE CHAR3"版本号   
DATA: CHECK_OK TYPE STRING.   

CLEAR:LV_BATNO, C_RESULT.   
CLEAR:   LT_ZTSD008
,   LT_ZTSD009
,   LT_ZTSD010
,   LT_ZTSD011
,   LT_OUTPUT

,   LS_ZTSD008

,   LS_ZTSD009
,   LS_ZTSD010
,   LS_ZTSD011
,   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.

*生成批导编号     
CALL FUNCTION ‘NUMBER_GET_NEXT‘       
EXPORTING         NR_RANGE_NR             
‘02‘         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.

*新版本号     
MOVE TO LV_VERNO.

*填充抬头表ZTSD008     
MOVE LV_BATNO TO LS_ZTSD008-BATNO.     
MOVE SY-UNAME TO LS_ZTSD008-ZUSER.     
MOVE SY-DATUM TO LS_ZTSD008-ZDATE.     
MOVE SY-UZEIT TO LS_ZTSD008-ZTIME.     
MOVE P_VKORG TO LS_ZTSD008-VKORG.     
MOVE P_LGORT TO LS_ZTSD008-LGORT.     

MODIFY ZTSD008 FROM LS_ZTSD008.     

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_ZTSD009.       

APPEND LS_ZTSD009 TO LT_ZTSD009.       
CLEAR LS_ZTSD009.
*填充超市验单日志表       
MOVE-CORRESPONDING GS_OUTPUT TO LS_ZTSD010.

*      MOVE LV_BATNO TO LS_ZTSD003-BATNO.
*      MOVE LV_VERNO TO LS_ZTSD003-VERNO.       
MOVE SY-UNAME TO LS_ZTSD010-ZUSER.       
MOVE SY-DATUM TO LS_ZTSD010-ZDATE.       
MOVE SY-UZEIT TO LS_ZTSD010-ZTIME.       

APPEND LS_ZTSD010 TO LT_ZTSD010.       
CLEAR LS_ZTSD010.     

ENDLOOP.   

ELSEIF R2 EQ ‘X‘ ."如果是显示已导入数据,则检查是否有修改数据     C_RESULT 
‘N‘.     

SORT GT_OUTPUT BY BATNO."按批导编号排序     

LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘.       LS_OUTPUT 
= GS_OUTPUT.       
AT NEW BATNO.         LV_VERNO 
= LS_OUTPUT-VERNO + 1."产生下一个版本,否则C_RESULT EQ SPACE         LS_OUTPUT
-VERNO = LV_VERNO.

*按批导编号更新版本号         
MODIFY GT_OUTPUT FROM LS_OUTPUT TRANSPORTING VERNO         
WHERE BATNO EQ LS_OUTPUT-BATNO.
*        CLEAR LS_OUTPUT.       
ENDAT.

*填充超市订单日志表       
MOVE-CORRESPONDING LS_OUTPUT TO LS_ZTSD010.

*      MOVE LS_OUTPUT-BATNO TO LS_ZTSD003-BATNO.
*      MOVE LS_OUTPUT-VERNO TO LS_ZTSD003-VERNO.       
MOVE LS_OUTPUT-SO TO LS_ZTSD010-VBELN.       
MOVE LS_OUTPUT-DN TO LS_ZTSD010-VBELN_VL.       
MOVE SY-UNAME TO LS_ZTSD010-ZUSER.       
MOVE SY-DATUM TO LS_ZTSD010-ZDATE.       
MOVE SY-UZEIT TO LS_ZTSD010-ZTIME.       

APPEND LS_ZTSD010 TO LT_ZTSD010.       
CLEAR LS_ZTSD010.
*填充超市订单明细表       
MOVE-CORRESPONDING LS_OUTPUT TO LS_ZTSD009.       
MOVE LS_OUTPUT-SO TO LS_ZTSD009-VBELN.       
MOVE LS_OUTPUT-DN TO LS_ZTSD009-VBELN_VL.

*如果是审批通过则修改状态
*      IF U_STR EQ ‘APPROVAL‘.
*        MOVE ‘B‘ TO LS_ZTSD002-ZSTAT.
*      ENDIF.       

APPEND LS_ZTSD009 TO LT_ZTSD009.       
CLEAR LS_ZTSD009.
*填充ZTSD011  销售订单表       
IF U_STR EQ ‘APPROVAL‘.         

MOVE: LS_OUTPUT-BATNO TO LS_ZTSD011-BATNO,               LS_OUTPUT
-BATPO TO LS_ZTSD011-BATPO,               LS_OUTPUT
-SO TO LS_ZTSD011-VBELN,               LS_OUTPUT
-ZYDDH TO LS_ZTSD011-ZYDDH.         

MOVE SY-UNAME TO LS_ZTSD011-ZUSER.         
MOVE SY-DATUM TO LS_ZTSD011-ZDATE.         
MOVE SY-UZEIT TO LS_ZTSD011-ZTIME.         
APPEND LS_ZTSD011 TO LT_ZTSD011.         
CLEAR LS_ZTSD011.       
ENDIF.       

CLEAR LS_OUTPUT.     
ENDLOOP.   
ENDIF.   

DELETE GT_OUTPUT WHERE SEL EQ ‘X‘.

*更新数据库表   
MODIFY ZTSD009 FROM TABLE LT_ZTSD009.   

IF SY-SUBRC EQ 0.     
COMMIT WORK AND WAIT.     C_RESULT 
‘S‘.   
ELSE.     
ROLLBACK WORK.     C_RESULT 
‘E‘.   
ENDIF.   

MODIFY ZTSD010 FROM TABLE LT_ZTSD010.   

IF SY-SUBRC EQ 0.     
COMMIT WORK AND WAIT.     C_RESULT 
‘S‘.   
ELSE.     
ROLLBACK WORK.     C_RESULT 
‘E‘.   
ENDIF.   

MODIFY ZTSD011 FROM TABLE LT_ZTSD011.   

IF SY-SUBRC EQ 0.     
COMMIT WORK AND WAIT.     C_RESULT 
‘S‘.   
ELSE.     
ROLLBACK WORK.     C_RESULT 
‘E‘.   
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.       

MOVE: GS_SODATA-SO TO <WA_DATA>-SO,       GS_SODATA
-DN TO <WA_DATA>-DN.     

ENDIF.   
ENDLOOP.   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_MSG TYPE STRING.   

CLEAR GT_SODATA.   

LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘ AND SO EQ SPACE.     
IF GS_OUTPUT-MSSG IS NOT INITIAL.       
MESSAGE ‘存在错误数据,请检查!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.       C_RESULT 
‘E‘.       
RETURN.     
ENDIF.     
MOVE-CORRESPONDING GS_OUTPUT TO GS_SODATA.     

MOVE GS_OUTPUT-MENGE TO GS_SODATA-KPEIN.     
MOVE GS_OUTPUT-MEINS TO GS_SODATA-KMEIN.     

MOVE ‘1000‘ TO GS_SODATA-WERKS.

*    IF GS_SODATA-SHPTO IS INITIAL.
*      GS_SODATA-SHPTO = GS_SODATA-KUNNR.
*    ENDIF.
*    IF GS_SODATA-SLDTO IS INITIAL.
*      GS_SODATA-SLDTO = GS_SODATA-KUNNR.
*    ENDIF.     GS_SODATA

-VSTEL = GS_SODATA-RESLO.
*    PERFORM FRM_GET_SHIPPOINT USING GS_SODATA CHANGING GS_SODATA-VSTEL.

*售达方数据
*    SELECT SINGLE VKORG VTWEG SPART VKBUR VKGRP
*      INTO ( GS_SODATA-VKORG,GS_SODATA-VTWEG,GS_SODATA-SPART,
*      GS_SODATA-VKBUR,GS_SODATA-VKGRP )
*      FROM KNVV
*      WHERE KUNNR EQ GS_OUTPUT-SLDTO
*      AND VTWEG EQ ‘20‘"直营
*      AND LOEVM NE ‘X‘"删除标记
**      AND VSBED EQ ‘99‘"装运条件
*      .     
PERFORM FRM_CHECK_PARTNER USING GS_SODATA-SLDTO CHANGING LV_RESULT.     

IF LV_RESULT EQ ‘E‘.       C_RESULT 
‘E‘.       
RETURN.     
ENDIF.
*    IF SY-SUBRC NE 0.
*      MESSAGE ‘销售组织数据不正确,请检查分销渠道(20)。‘ TYPE ‘S‘.
*      RETURN.
*    ENDIF.

*检查条件记录是否存在
*    SELECT SINGLE * INTO LS_A502
*      FROM A502
*      WHERE KSCHL EQ ‘PRZ0‘
*      AND MATNR EQ GS_SODATA-MATNR.

*    SELECT SINGLE * INTO LS_A515
*      FROM A515
*      WHERE KSCHL EQ ‘PRZ0‘
*      AND KUNNR EQ GS_SODATA-KUNNR
*      AND MATNR EQ GS_SODATA-MATNR.
*
*    IF SY-SUBRC NE 0.
*      MESSAGE ‘条件记录PRZ0不存在。‘ TYPE ‘S‘.
*
*      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 && ‘对应的成本中心不存在。‘.
*      MESSAGE S001 WITH LV_MSG 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  TYPE CHAR3,        LV_STRING 
TYPE STRING.   

DATA: LV_SO    TYPE VBELN,         LV_DN    
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: 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 ZYDDH.   

LOOP AT GT_SODATA ASSIGNING <WA_SODATA>.
*做标记     <WA_SODATA>
-SO ‘X‘.     <WA_SODATA>
-DN ‘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>-RESLO."司机库     LS_ITEM
-TARGET_QU = <WA_SODATA>-MEINS.     LS_ITEM
-SALES_UNIT = <WA_SODATA>-MEINS.

*    PERFORM FRM_GET_SHIPPOINT USING <WA_SODATA> CHANGING LS_ITEM-SHIP_POINT.
*    LS_ITEM-SHIP_POINT = 9079.     LS_ITEM
-SHIP_POINT = <WA_SODATA>-VSTEL.     LS_ITEM
-ITEM_CATEG ‘TAN1‘.

*    LS_ITEM-CUST_MAT35 = <WA_SODATA>-ZYDDH."售达方客户物料记验单单号

*    LS_ITEM-BATCH = <WA_SODATA>-CHARG.
*    LS_ITEM-ITEM_CATEG = ‘ZTN‘.     
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
-SHIP_POINT ‘X‘.
*    LS_ITEMX-CUST_MAT35 = ‘X‘.

*    LS_ITEMX-BATCH = ‘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.     

PERFORM GET_KSCHL(ZSDR021)       
USING ‘ZSO1‘             <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>-ZYDJE.     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.     

IF LV_POSNR EQ ‘300‘.       

CLEAR LV_POSNR.       LS_HEADER

-DOC_TYPE ‘ZSO1‘.       LS_HEADER
-DOC_DATE = <WA_SODATA>-INDAT.       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
-PURCH_NO_C ‘ZY‘.       LS_HEADER
-PURCH_NO_S = <WA_SODATA>-ZYDDH.       

CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘         
EXPORTING           ORDER_HEADER_IN      
= LS_HEADER           TESTRUN              
= TESTRUN         
IMPORTING           SALESDOCUMENT        
= LV_SO         
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           ORDER_CONDITIONS_IN  
= LT_COND           ORDER_CONDITIONS_INX 
= LT_CONDX.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘W‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ENDIF.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘E‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ELSE.         
CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘           
EXPORTING             ORDER_HEADER_IN      
= LS_HEADER
*           TESTRUN              = TESTRUN           
IMPORTING             SALESDOCUMENT        
= LV_SO           
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             ORDER_CONDITIONS_IN  
= LT_COND             ORDER_CONDITIONS_INX 
= LT_CONDX.         C_RESULT 

‘S‘.         
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT‘           
EXPORTING             
WAIT ‘X‘.         

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.         

DO TIMES .           
SELECT SINGLE VBELN INTO LV_DN FROM VBFA             
WHERE VBELV EQ LV_SO             
AND VBTYP_N EQ ‘J‘.         
ENDDO.       

ENDIF.       

CLEAR:    LT_RETURN,                 LT_ITEM
,                 LT_ITEMX
,                 LT_PNR
,                 LT_SCH
,                 LT_SCHX
,                 LT_COND
,                 LT_CONDX
,                 LS_HEADER                 

.

*将单据号更新到内表
*      IF LV_SO IS NOT INITIAL AND LV_DN IS NOT INITIAL.       
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.         

IF LV_DN IS NOT INITIAL.           LS_SODATA
-DN = LV_DN.           
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT‘             
EXPORTING               
INPUT  = LS_SODATA-DN             
IMPORTING               
OUTPUT = LS_SODATA-DN.         
ELSE.           

DO TIMES.             

SELECT SINGLE VBELN INTO LS_SODATA-DN FROM VBFA               
WHERE VBELV EQ LV_SO               
AND VBTYP_N EQ ‘J‘.             

IF SY-SUBRC NE 0.               
CLEAR LS_SODATA-DN .             
ENDIF.           

ENDDO.         

ENDIF.         

MODIFY GT_SODATA FROM LS_SODATA TRANSPORTING SO DN         
WHERE SO EQ ‘X‘ AND DN EQ ‘X‘.         

CLEAR:LV_SO,LV_DN.       

ELSE.
*        PERFORM FRM_SHOW_MESSAGE.         C_RESULT 
‘E‘.         
EXIT.       
ENDIF.       

CONTINUE.     

ENDIF.     

AT END OF ZYDDH.       

CLEAR LV_POSNR.       LS_HEADER

-DOC_TYPE ‘ZSO1‘.       LS_HEADER
-DOC_DATE = <WA_SODATA>-INDAT.       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
-PURCH_NO_C ‘ZY‘.       LS_HEADER
-PURCH_NO_S = <WA_SODATA>-ZYDDH.       

CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘         
EXPORTING           ORDER_HEADER_IN      
= LS_HEADER           TESTRUN              
= TESTRUN         
IMPORTING           SALESDOCUMENT        
= LV_SO         
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           ORDER_CONDITIONS_IN  
= LT_COND           ORDER_CONDITIONS_INX 
= LT_CONDX.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘W‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ENDIF.       

READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE ‘E‘.       
IF SY-SUBRC EQ 0.         
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK‘
*       IMPORTING
*         RETURN        =           
.         

EXPORT LT_RETURN TO MEMORY ID ‘LT_RETURN‘.         
PERFORM FRM_SHOW_MESSAGE.         C_RESULT 

‘E‘.         
RETURN.       
ELSE.         
CALL FUNCTION ‘BAPI_SALESORDER_CREATEFROMDAT2‘           
EXPORTING             ORDER_HEADER_IN      
= LS_HEADER
*           TESTRUN              = TESTRUN           
IMPORTING             SALESDOCUMENT        
= LV_SO           
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             ORDER_CONDITIONS_IN  
= LT_COND             ORDER_CONDITIONS_INX 
= LT_CONDX.         C_RESULT 

‘S‘.         
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT‘           
EXPORTING             
WAIT ‘X‘.         

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.         

DO TIMES .           
SELECT SINGLE VBELN INTO LV_DN FROM VBFA             
WHERE VBELV EQ LV_SO             
AND VBTYP_N EQ ‘J‘.         
ENDDO.       

ENDIF.       

CLEAR:    LT_RETURN,                 LT_ITEM
,                 LT_ITEMX
,                 LT_PNR
,                 LT_SCH
,                 LT_SCHX
,                 LT_COND
,                 LT_CONDX
,                 LS_HEADER                 

.

*将单据号更新到内表
*      IF LV_SO IS NOT INITIAL AND LV_DN IS NOT INITIAL.       
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.         

IF LV_DN IS NOT INITIAL.           LS_SODATA
-DN = LV_DN.           
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT‘             
EXPORTING               
INPUT  = LS_SODATA-DN             
IMPORTING               
OUTPUT = LS_SODATA-DN.         
ELSE.           

DO TIMES.             

SELECT SINGLE VBELN INTO LS_SODATA-DN FROM VBFA               
WHERE VBELV EQ LV_SO               
AND VBTYP_N EQ ‘J‘.             

IF SY-SUBRC NE 0.               
CLEAR LS_SODATA-DN .             
ENDIF.           

ENDDO.         

ENDIF.         

MODIFY GT_SODATA FROM LS_SODATA TRANSPORTING SO DN         
WHERE SO EQ ‘X‘ AND DN EQ ‘X‘.         

CLEAR:LV_SO,LV_DN.       

ELSE.
*        PERFORM FRM_SHOW_MESSAGE.         C_RESULT 
‘E‘.         
EXIT.       
ENDIF.       

CONTINUE.     
ENDAT.   

ENDLOOP.   

IF C_RESULT IS INITIAL.     C_RESULT 
‘S‘.   
ENDIF.   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_OUTPUT1
-STYLE,       LS_OUTPUT
-SEL,       LS_OUTPUT
-STYLE.       

IF LS_OUTPUT1 NE LS_OUTPUT.         
MOVE ‘T‘ TO C_OK."有区别         
EXIT."只要有一个数据有区别就要记录       
ELSE.         
MOVE ‘F‘ TO C_OK."没有区别       
ENDIF.     
ELSE.
*没读到初始数据说明是新数据       
MOVE ‘T‘ TO C_OK."有区别       
EXIT."只要有一个数据有区别就要记录     

ENDIF.   

ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_POST_GOODS_ISSUE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_POST_DN.   
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     
.   

FREE LT_SODATA.   LT_SODATA 

= GT_SODATA.   

SORT LT_SODATA BY DN.   

DELETE ADJACENT DUPLICATES FROM LT_SODATA COMPARING DN.   

LOOP AT LT_SODATA INTO LS_SODATA.     LV_VBELN 
= LS_SODATA-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 = LS_SODATA-LFDAT .
*    LV_VBKOK-BLDAT     = SY-DATUM .     

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‘.       
EXIT.     
ELSE.
*      C_RESULT = ‘S‘.

*      RETURN.     
ENDIF.   

ENDLOOP.   
CLEAR: LV_VBKOK,LT_VBPOK,LT_PROTT.
*  CLEAR:LS_HEADER1,LS_CONTROL1,DELIVERY1,LS_TECH,HEADER_DEADLINE[],
*  HEADER_DEADLINE,LT_RETURN[],LT_RETURN.
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(10TO C_DN.       
MOVE GDS_MESSTAB-MSGV2+0(10TO 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 .   
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.   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: LT_ZTSD009 TYPE TABLE OF ZTSD009,         LS_ZTSD009 
TYPE ZTSD009,         LT_ZTSD006 

TYPE TABLE OF ZTSD006,         LS_ZTSD006 
TYPE ZTSD006.   

DATA: L_LINE1 TYPE I,         L_LINE2 
TYPE I.

*删除数量为0的行   
DELETE GT_OUTPUT WHERE MENGE EQ 0.   

CLEAR: LT_OUTPUT,LT_OUTPUT[].   LT_OUTPUT 
= GT_OUTPUT.   
SORT LT_OUTPUT BY ZYDDH MATNR ZSJ SLDTO SHPTO.   
DELETE ADJACENT DUPLICATES FROM LT_OUTPUT COMPARING ZYDDH MATNR ZSJ SLDTO SHPTO.   L_LINE1 
LINES( LT_OUTPUT[] ).   L_LINE2 
LINES( GT_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.   

LOOP AT GT_OUTPUT ASSIGNING <WA_DATA> WHERE ZICON1 NE ‘@0A@‘.     

IF <WA_DATA>-INDAT IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 1 GS_LOAD ‘请填写订单日期‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-LFDAT IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 2 GS_LOAD ‘请填写发货日期‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-SLDTO IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 3 GS_LOAD ‘请填写售达方‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-SHPTO IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 4 GS_LOAD ‘请填写送达方‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-ZYDDH IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 5 GS_LOAD ‘请填写验单单号‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-ZSJ IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 6 GS_LOAD ‘请填写司机‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     
IF <WA_DATA>-VKBUR IS INITIAL.       
PERFORM SET_CALLSYTLE(ZSDR006USING 9 GS_LOAD ‘请填写销售部门‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.       <WA_DATA>
-ZICON1 ‘@0A@‘."红灯     
ENDIF.     <WA_DATA>

-SEL ‘X‘.     <WA_DATA>
-ZDATE = SY-DATUM.     <WA_DATA>
-VKORG = P_VKORG.     <WA_DATA>
-LGORT = P_LGORT.
*    IF R4 EQ ‘X‘.
*      <WA_DATA>-ZFREE = ‘X‘.
*    ENDIF.     
SELECT SINGLE NAME1 INTO <WA_DATA>-NAME2       
FROM KNA1       
WHERE KUNNR EQ <WA_DATA>-ZSJ.     

SELECT SINGLE MEINS INTO LV_MEINS       
FROM MARA       
WHERE MATNR EQ <WA_DATA>-MATNR.
*数量单位转换     

TRANSLATE <WA_DATA>-MEINS TO UPPER CASE.

*    IF <WA_DATA>-SHPTO IS INITIAL.
*      MOVE <WA_DATA>-KUNNR TO <WA_DATA>-SHPTO.
*    ENDIF.
*    IF <WA_DATA>-SLDTO IS INITIAL.
*      MOVE <WA_DATA>-KUNNR TO <WA_DATA>-SLDTO.
*    ENDIF.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_HP       
FROM KNA1       
WHERE KUNNR = <WA_DATA>-SHPTO.     
IF SY-SUBRC NE 0.       
PERFORM SET_CALLSYTLE(ZSDR006USING 4 GS_LOAD ‘送达方不正确‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.     
ENDIF.     

SELECT SINGLE NAME1 INTO <WA_DATA>-NAME_LD      
FROM KNA1      
WHERE KUNNR = <WA_DATA>-SLDTO.     
IF SY-SUBRC NE 0.       
PERFORM SET_CALLSYTLE(ZSDR006USING 3 GS_LOAD ‘售达方不正确‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.     
ENDIF.     

IF <WA_DATA>-MENGE GT ‘99999‘.       
PERFORM SET_CALLSYTLE(ZSDR006USING 13 GS_LOAD ‘数量只能小于10万‘ CHANGING <WA_DATA>-CELLCOLOR <WA_DATA>-MSSG.     
ENDIF.
*价格     <WA_DATA>
-ZYDJG = <WA_DATA>-ZYDJE / <WA_DATA>-MENGE.
*    <WA_DATA>-ZHJJE = <WA_DATA>-ZYDJG * <WA_DATA>-MENGE.   
ENDLOOP.   UNASSIGN <WA_DATA>

.
*将初始内表放入内存
*  LT_OUTPUT = GT_OUTPUT.   
FREE LT_OUTPUT.   

EXPORT LT_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.   

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 ‘9079‘."司机库     LS_ITEM
-TARGET_QU = <WA_SODATA>-MEINS.
*    LS_ITEM-BATCH = <WA_SODATA>-CHARG.     LS_ITEM
-ITEM_CATEG ‘TAN1‘.     
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
-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.     

AT END OF SHPTO.       

CLEAR LV_POSNR.       LS_HEADER

-DOC_TYPE ‘ZSO1‘.       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.       

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.     
ENDAT.     

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_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 VKORG EQ GS_SODATA-VKORG     
AND VTWEG EQ ‘20‘"直营     
AND VKBUR EQ GS_SODATA-VKBUR     
AND LOEVM NE ‘X‘"删除标记     
.   

IF SY-SUBRC NE 0.     C_RESULT 
‘E‘.     LV_MSG 
‘售达方‘ && U_SLDTO && ‘销售组织数据不正确,请检查。‘.     
MESSAGE S001 WITH LV_MSG DISPLAY LIKE ‘E‘.
*    MESSAGE ‘销售组织数据不正确,请检查。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
RETURN.   
ENDIF.

*  SELECT SINGLE SPOFI INTO @DATA(LV_SPOFI)
*    FROM TVLK
*    WHERE LFART EQ ‘ZLF‘."直营交货
*
*  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‘.
**        MESSAGE ‘售达方按工厂1000确定的装运点不存在。‘ TYPE ‘S‘ 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‘.
**      MESSAGE ‘条件记录PRZ0不存在。‘ TYPE ‘S‘ 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‘.
**        MESSAGE ‘条件记录PRZ0价格不能为0。‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.
*
*      RETURN.
*    ENDIF.
*  ENDIF.   C_RESULT 

‘S‘.
*  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_STYLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SET_STYLE USING P_VALUE P_ROWID.   

DATA: L_STYPE TYPE STRING,         L_ROWID 
TYPE I.   L_ROWID 

= P_ROWID.   
CLEAR GS_OUTPUT.   
READ TABLE GT_OUTPUT INTO GS_OUTPUT INDEX L_ROWID.   L_STYPE 

‘DISABLE‘.   

IF P_VALUE EQ ‘X‘.     
CHECK GS_OUTPUT-SO IS INITIAL.     L_STYPE 
‘ENABLE‘.   
ELSE.     L_STYPE 
‘DISABLE‘.   
ENDIF.   

PERFORM SET_STYLE(ZSDR018USING ‘ZYDJE‘ L_STYPE CHANGING GS_OUTPUT-STYLE.   
PERFORM SET_STYLE(ZSDR018USING ‘ZYDDH‘ L_STYPE CHANGING GS_OUTPUT-STYLE.   
PERFORM SET_STYLE(ZSDR018USING ‘MENGE‘ L_STYPE CHANGING GS_OUTPUT-STYLE.   

MODIFY GT_OUTPUT FROM GS_OUTPUT INDEX L_ROWID.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_SHIPPOINT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_<WA_DATA>  text
*      <--P_LS_ITEM_SHIP_POINT  text
*----------------------------------------------------------------------*
FORM FRM_GET_SHIPPOINT  USING    U_WA TYPE TY_SODATA                         
CHANGING C_SHIP_POINT.   

DATA: LV_VSBED TYPE KNVV-VSBED,         LV_VWERK 
TYPE KNVV-VWERK,         LV_LGORT 
TYPE LGORT_D,         LV_LFARV 

TYPE TVAK-LFARV,         LV_SPOFI 
TYPE TVLK-SPOFI,         LV_VSTEL 

TYPE TVSTZ-VSTEL.   

SELECT SINGLE VSBED VWERK     
INTO ( LV_VSBED, LV_VWERK )     
FROM KNVV     
WHERE KUNNR EQ U_WA-SHPTO     
AND VKORG EQ U_WA-VKORG
*    AND VTWEG EQ U_WA-VTWEG     
AND VTWEG EQ ‘20‘"直营     

AND SPART EQ U_WA-SPART     
AND LOEVM NE ‘X‘"删除标记     
.   

SELECT SINGLE LFARV INTO LV_LFARV     
FROM TVAK     
WHERE AUART EQ ‘ZSO1‘.   

SELECT SINGLE SPOFI INTO LV_SPOFI     
FROM TVLK     
WHERE LFART EQ LV_LFARV.   

IF SY-SUBRC EQ 0.     

IF LV_SPOFI EQ SPACE"特定工厂装运点       
SELECT SINGLE VSTEL INTO C_SHIP_POINT         
FROM TVSTZ         
WHERE VSBED EQ LV_VSBED         
AND LADGR EQ ‘0001‘         
AND WERKS EQ LV_VWERK.     
ELSE."按库存地点确定装运点       LV_LGORT 

= U_WA-RESLO."司机库
*将库存地点带入行项目中       

SELECT SINGLE VSTEL INTO C_SHIP_POINT         
FROM TVSTZ_STORLOC         
WHERE VSBED EQ LV_VSBED         
AND LADGR EQ ‘0001‘         
AND WERKS EQ LV_VWERK         
AND LGORT EQ LV_LGORT.     
ENDIF.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEL_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SEL_ALL .   
DATA : LT_FILTERED_ENTRIES TYPE LVC_T_FIDX,          LV_INDEX            
TYPE SY-TABIX.   

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.     LV_INDEX 
= SY-TABIX.     
READ TABLE LT_FILTERED_ENTRIES  TRANSPORTING NO FIELDS WITH KEY TABLE_LINE = LV_INDEX.     
IF SY-SUBRC NE 0.       <WA_DATA>
-SEL ‘X‘.       
PERFORM SET_STYLE USING ‘X‘ LV_INDEX.     
ENDIF.     
CLEAR LV_INDEX.   
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_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_AUTHORITY_CHECK .   
AUTHORITY-CHECK OBJECT ‘V_VBAK_VKO‘            
ID ‘VKORG‘ FIELD P_VKORG            
ID ‘VTWEG‘ DUMMY            
ID ‘SPART‘ DUMMY            
ID ‘ACTVT‘ DUMMY.   
IF SY-SUBRC <> 0.     
MESSAGE ‘您没有销售组织‘ && P_VKORG && ‘的权限‘ TYPE ‘E‘.     
RETURN.   
ENDIF.   

AUTHORITY-CHECK OBJECT ‘M_MSEG_LGO‘            
ID ‘ACTVT‘ DUMMY            
ID ‘WERKS‘ FIELD ‘1000‘            
ID ‘LGORT‘ FIELD P_LGORT            
ID ‘BWART‘ DUMMY.   
IF SY-SUBRC <> 0.     

MESSAGE ‘您没有库存地点‘ && P_LGORT && ‘的权限‘ TYPE ‘E‘.     
RETURN.   

ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DELETE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DELETE_DATA .   
LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE SEL EQ ‘X‘ AND SO IS NOT INITIAL.

*判断销售订单是否被删除     
SELECT SINGLE VBELN INTO @DATA(LV_VBELN)       
FROM VBAK       
WHERE VBELN EQ @GS_OUTPUT-SO.     
IF SY-SUBRC EQ 0.       
MESSAGE ‘所选择数据存在已创建订单,不允许删除‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.       
RETURN.     
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 GT_DEL.     GT_DEL
-BATNO = GS_OUTPUT-BATNO.     GT_DEL
-BATPO = GS_OUTPUT-BATPO.     GT_DEL
-INDAT = GS_OUTPUT-INDAT.     
APPEND GT_DEL TO GT_DEL.     
CLEAR GS_OUTPUT.   
ENDLOOP.   

DELETE GT_OUTPUT WHERE SEL EQ ‘X‘.   

IF GT_DEL[] IS NOT INITIAL.     
DELETE ZTSD009 FROM TABLE GT_DEL[].     
IF SY-SUBRC EQ 0.       
COMMIT WORK AND WAIT.       
MESSAGE ‘删除成功!‘ TYPE ‘S‘.     
ELSE.       
ROLLBACK WORK.       
MESSAGE ‘删除失败!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
ENDIF.     
CLEAR: GT_DEL,GT_DEL[].   
ENDIF.

ENDFORM.
ELSE.       
ROLLBACK WORK.       
MESSAGE ‘删除失败!‘ TYPE ‘S‘ DISPLAY LIKE ‘E‘.     
ENDIF.     
CLEAR: GT_DEL,GT_DEL[].   
ENDIF.

ENDFORM.

SAP 直营验单

标签:

原文地址:http://www.cnblogs.com/eagle-dtq/p/5520768.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!