zsdr0006

来源:互联网 发布:打击电信网络诈骗 编辑:程序博客网 时间:2024/06/02 01:12

INCLUDE zsdi_0006_top."参数定义

INITIALIZATION.
  PERFORM frm_init"初始化

START-OF-SELECTION.
*  PERFORM frm_auth_check.
  PERFORM frm_get_data"获取数据

END-OF-SELECTION.
  CALL SCREEN 9000.

  INCLUDE zsdi_0006_pbo.

  INCLUDE zsdi_0006_pai.

  INCLUDE zsdi_0006_forms.

 

***************************************

*&---------------------------------------------------------------------*
*&  包括                ZSDI_0006_TOP
*&---------------------------------------------------------------------*
TYPE-POOLS:vrm,zzsd1.

INCLUDE <icon>.

TABLES:vbak,vbap.

TYPES:BEGIN OF ty_head,
  sel,"选择框
  status(200),"状态
  zkyed TYPE zzs_sd_003-zkyed,"可用额度
  zcqts TYPE zzs_sd_004-zcqts,"超期天数
  zhklce TYPE zzs_sd_005-zhklce,"款率差额
  vbeln  TYPE vbak-vbeln,"销售凭证
  lfstk TYPE vbuk-lfstk,"交货状态
  auart TYPE vbak-auart,"销售凭证类型
  bezei TYPE tvakt-bezei,"凭证类型描述
  kunnr TYPE vbak-kunnr,"售达方
  kunnr_txt TYPE kna1-name1,"售达方名称
  kvgr1 TYPE vbak-kvgr1,"客户分类
  kvgr1_txt TYPE tvv1t-bezei,"客户组描述
  kunwe TYPE vbak-kunnr,"送达方
  kunwe_txt TYPE kna1-name1,"送达方名称
  kunn2 TYPE vbak-kunnr,"业务员
  kunn2_txt TYPE vbak-kunnr,"业务员
  lifnr TYPE lfa1-lifnr,"货运代理
  name1 TYPE lfa1-name1,"货运代理描述
  lzone TYPE kna1-lzone,"运送区域
  lzone_txt TYPE tzont-vtext,"运送区域描述
  vkorg TYPE vbak-vkorg,"销售组织
  vtweg TYPE vbak-vtweg,"分销渠道
  vtext TYPE tvkot-vtext,"销售组织描述
  vkgrp TYPE vbak-vkgrp,"销售小组
  vkgrp_txt TYPE tvgrt-bezei,"销售小组描述
  erdat TYPE vbak-erdat,"创建日期
  audat TYPE vbak-audat,"单据日期
  vdatu TYPE vbak-vdatu,"请求交货日期
  bstnk TYPE vbak-bstnk,"客户采购订单编号
  gsber TYPE vbak-gsber,"业务范围
  gsber_txt TYPE tgsbt-gtext,"业务范围描述
  spart TYPE vbak-spart,"产品组
  spart_txt TYPE tspat-vtext,"产品组描述
  bukrs_vf TYPE vbak-bukrs_vf,"公司代码
  augru TYPE vbak-augru,"订单原因
  augru_txt TYPE tvaut-bezei,"订单原因文本
  sgtxt TYPE sgtxt,"项目文本
  lprio(5),"优先级
  cellstyles TYPE lvc_t_styl"样式
END OF ty_head.

TYPES:BEGIN OF ty_item,
  sel,"选择框
  zypno(12),"预排号
  vbeln_k TYPE likp-vbeln,"交货单
  vbeln  TYPE vbak-vbeln,"销售凭证
  posnr  TYPE vbap-posnr,"销售凭证项目
  auart TYPE vbak-auart,"销售凭证类型
  kunnr TYPE vbak-kunnr,"售达方
  kunwe TYPE vbak-kunnr,"送达方
  lfsta TYPE vbup-lfsta,"行交货状态
  matnr  TYPE vbap-matnr,"物料号
  werks TYPE vbap-werks,"工厂
  werks_txt TYPE t001w-name1,"工厂
  lgort TYPE vbap-lgort,"库存地点
  lgobe TYPE t001l-lgobe,"库存地点
  labst  TYPE mard-labst,"非限制使用的估价的库存
  maktx TYPE makt-maktx,"物料描述
  mvgr1 TYPE mvke-mvgr1,                                    "物料组4 机型定义
  mvgr4 TYPE vbap-mvgr4,                                    "物料组4 机型定义
  mvgr4_txt TYPE tvm4t-bezei,                               "物料组4描述
  kwmeng TYPE vbap-kwmeng,"数量
  vrkme TYPE vbap-vrkme,"单位
  menge TYPE vbap-kwmeng,"未清数量
  cur_menge TYPE vbap-kwmeng,"本次交货数量
  left_menge TYPE vbap-kwmeng,"剩余交货数量
  volum TYPE DECIMALS 6,"vbap-volum,"体积
  cur_volum TYPE DECIMALS 6,"本次交货体积
  voleh TYPE vbap-voleh,"体积单位
  lifnr TYPE lfa1-lifnr,"货运代理
  name1 TYPE lfa1-name1,"名称
  lzone TYPE kna1-lzone,"运送区域
  lzone_txt TYPE tzont-vtext,"描述
  gsber TYPE vbap-gsber,"业务范围
  gsber_txt TYPE tgsbt-gtext,"业务范围描述
  bukrs_vf TYPE vbak-bukrs_vf,"公司代码
  spart_head TYPE vbak-spart,"产品组
  spart TYPE vbap-spart,"产品组
  spart_txt TYPE tspat-vtext,"产品组描述
  vstel TYPE vbap-vstel,"装运点
  charg TYPE lips-charg,"交货批次
  netpr TYPE vbap-netpr,"产品单价
  sum_netpr TYPE vbap-netpr,"交货金额
  xchpf TYPE mara-xchpf,"批次管理
  sgtxt TYPE sgtxt,"项目文本
  kunnr_txt TYPE kna1-name1,"售达方
  kunn2 TYPE vbak-kunnr,"业务员
  kunn2_txt TYPE vbak-kunnr,"业务员
  werks_change,
  icon(200),"库存查看
  status(200),"状态
  message(220),"日志
  cellstyles TYPE lvc_t_styl"样式
  rowcolor(4),
END OF ty_item.

TYPES:BEGIN OF ty_mard,
  werks TYPE mard-werks,
  lgort TYPE mard-lgort,
  lgobe TYPE t001l-lgobe,
  matnr TYPE mard-matnr,
  labst TYPE mard-labst,
  lfimg TYPE lips-lfimg,
  zkykc TYPE mard-labst,
  END OF ty_mard.

TYPES:BEGIN OF ty_mchb,
  werks TYPE mchb-werks,
  lgort TYPE mchb-lgort,
  lgobe TYPE t001l-lgobe,
  matnr TYPE mchb-matnr,
  charg TYPE mchb-charg,
  clabs TYPE mchb-clabs,
  END OF ty_mchb.

*ALV变量定义
DATA:
      in_wqsl TYPE vbap-kwmeng,"未清数量
      in_jhsl TYPE vbap-kwmeng,"交货数量
      in_jhtj TYPE DECIMALS 6,"vbap-volum,"交货体积
      ok_code_9000 LIKE sy-ucomm,
      save_ok LIKE sy-ucomm,
      gs_variant_head TYPE disvariant,
      gs_variant_item TYPE disvariant,
      gt_alv_head TYPE TABLE OF ty_head WITH HEADER LINE,      "ALV头表
      gt_alv_item TYPE TABLE OF ty_item WITH HEADER LINE,      "ALV行表
      gt_alv_item_store TYPE TABLE OF ty_item WITH HEADER LINE,      "ALV行表
      gt_sort TYPE lvc_t_sort,                                                   "ALV排序
      gt_fieldcat_head   TYPE lvc_t_fcat,                                            "ALV字段目录
      gt_fieldcat_item   TYPE lvc_t_fcat,                                            "ALV字段目录
      gt_fieldcat   TYPE lvc_t_fcat,                                            "ALV字段目录
      gs_exclude  TYPE ui_functions,                                        "ALV排除按钮
      gs_layout    TYPE lvc_s_layo,                                            "ALV样式
      gcl_container_head  TYPE REF TO cl_gui_docking_container,"容器类
      gcl_container_item  TYPE REF TO cl_gui_docking_container,"容器类
      gcl_alv_head            TYPE REF TO cl_gui_alv_grid,                     "ALV类
      gcl_alv_item            TYPE REF TO cl_gui_alv_grid.                    "ALV类

*----------------------------------------------------------------------*
*       CLASS GCL_EVENT_HANDLER_HEAD DEFINITION
*----------------------------------------------------------------------*
* 处理ALV事件类声明
*----------------------------------------------------------------------*
CLASS gcl_event_handler_head DEFINITION.
  PUBLIC SECTION.
    METHODS:
*    工具栏自定义按钮
    handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
    IMPORTING e_object e_interactive,
*    监控按钮
    handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
    IMPORTING e_ucomm,
*    双击
    handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
    IMPORTING e_row e_column  es_row_no,
*    数据改变
    handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
    IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDCLASS.                    "GCL_EVENT_HANDLER_HEAD DEFINITION

*----------------------------------------------------------------------*
*       CLASS GCL_EVENT_HANDLER_ITEM DEFINITION
*----------------------------------------------------------------------*
* 处理ALV事件类声明
*----------------------------------------------------------------------*
CLASS gcl_event_handler_item DEFINITION.
  PUBLIC SECTION.
    METHODS:
*    单击事件
    handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
    IMPORTING e_row_id e_column_id es_row_no,
*    工具栏自定义按钮
    handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
    IMPORTING e_object e_interactive,
*    监控按钮
    handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
    IMPORTING e_ucomm,
*    ONF4
    handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
    IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells e_display,
*    双击
    handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
    IMPORTING e_row e_column  es_row_no,
*    数据改变
    handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
    IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm,
*    数据改变后
    handle_data_changed_finished FOR EVENT data_changed_finished OF
cl_gui_alv_grid
    IMPORTING e_modified  et_good_cells.
ENDCLASS.                    "GCL_EVENT_HANDLER_ITEM DEFINITION

*----------------------------------------------------------------------*
*       CLASS GCL_EVENT_HANDLER_HEAD IMPLEMENTATION
*----------------------------------------------------------------------*
* 处理ALV事件类实现
*----------------------------------------------------------------------*
CLASS gcl_event_handler_head IMPLEMENTATION.
*  handle toolbar
  METHOD handle_toolbar.
    PERFORM handle_toolbar USING e_object e_interactive.
  ENDMETHOD.                    "handle_toolbar
*  handler user command
  METHOD handle_user_command.
    PERFORM handle_user_command USING e_ucomm.
  ENDMETHOD.                    "handle_user_command
*  handler double click
  METHOD handle_double_click.
    PERFORM hande_double_click USING e_row e_column  es_row_no.
  ENDMETHOD.                    "handle_double_click
*  handler data changed
  METHOD handle_data_changed.
    PERFORM handle_data_changed USING er_data_changed e_onf4
e_onf4_before e_onf4_after e_ucomm.
  ENDMETHOD.                    "handle_data_changed
ENDCLASS.                    "GCL_EVENT_HANDLER_HEAD IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS GCL_EVENT_HANDLER_ITEM IMPLEMENTATION
*----------------------------------------------------------------------*
* 处理ALV事件类实现
*----------------------------------------------------------------------*
CLASS gcl_event_handler_item IMPLEMENTATION.
*  handle hot spot click
  METHOD handle_hotspot_click.
    PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.
  ENDMETHOD.                    "HANDLE_HOTSPOT_CLICK
*  handle toolbar
  METHOD handle_toolbar.
    PERFORM handle_toolbar_item USING e_object e_interactive.
  ENDMETHOD.                    "handle_toolbar
*  handler user command
  METHOD handle_user_command.
    PERFORM handle_user_command_item USING e_ucomm.
  ENDMETHOD.                    "handle_user_command
*  handler onf4
  METHOD handle_onf4.
    PERFORM hande_onf4_item USING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells e_display.
    er_event_data->m_event_handled 'X'.
  ENDMETHOD.                    "handle_double_click
*  handler double click
  METHOD handle_double_click.
    PERFORM hande_double_click_item USING e_row e_column  es_row_no.
  ENDMETHOD.                    "handle_double_click
*  handler data changed
  METHOD handle_data_changed.
    PERFORM handle_data_changed_item USING er_data_changed e_onf4
e_onf4_before e_onf4_after e_ucomm.
  ENDMETHOD.                  "handle_data_changed
*  handler data changed finished
  METHOD handle_data_changed_finished.
    PERFORM handle_data_changed_finished USING e_modified et_good_cells.
  ENDMETHOD.                    "handle_data_changed_finished
ENDCLASS.                    "GCL_EVENT_HANDLER_ITEM IMPLEMENTATION

RANGES:r_auart FOR vbak-auart.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS:
  s_vkorg FOR vbak-vkorg OBLIGATORY,"销售组织
  s_vkbur FOR vbak-vkbur,"销售部门
  s_vkgrp FOR vbak-vkgrp ,"销售组
  s_kunnr FOR vbak-kunnr,"售达方
  s_kvgr1 FOR vbak-kvgr1 NO-DISPLAY,"客户分类
  s_kunwe FOR vbak-kunnr,"送达方
  s_auart FOR vbak-auart,"销售订单类型
  s_vbeln FOR vbak-vbeln,"销售订单
  s_erdat FOR vbak-erdat,"销售订单创建日期
  s_vdatu FOR vbak-vdatu,"请求交货日期
  s_kunn2 FOR vbak-kunnr,"业务员
  s_matnr FOR vbap-matnr."业务员
PARAMETER:
  p_filter AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b1.

*************************************************************

*&---------------------------------------------------------------------*
*&  包括                ZSDI_0006_PBO
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
*       设置状态和标题
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  SET PF-STATUS 'STAT_9000'.
  SET TITLEBAR 'TIT_9000'.
ENDMODULE.                 " STATUS_9000  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  DISPLAY_ALV_9010  OUTPUT
*&---------------------------------------------------------------------*
*       显示alv
*----------------------------------------------------------------------*
MODULE display_alv_9000 OUTPUT.
  IF gcl_container_head IS INITIAL.
    PERFORM frm_create_container USING '50' cl_gui_docking_container=>dock_at_top CHANGING gcl_container_head gcl_alv_head.
    PERFORM frm_exclude.
    PERFORM frm_variant  USING '1' CHANGING gs_variant_head.
    PERFORM frm_pre_layout USING '销售订单头' space CHANGING gs_layout.
    PERFORM frm_pre_fieldcat_head.
    PERFORM frm_upload_event_head CHANGING gcl_alv_head.
    PERFORM frm_set_tab_display_head.
  ELSE.
    PERFORM frm_refresh_alv CHANGING gcl_alv_head.
  ENDIF.

  IF gcl_container_item IS INITIAL.
    PERFORM frm_create_container USING '50' cl_gui_docking_container=>dock_at_bottom CHANGING gcl_container_item gcl_alv_item.
    PERFORM frm_exclude.
    PERFORM frm_variant  USING '2' CHANGING gs_variant_item.
    PERFORM frm_pre_layout USING '行明细' space CHANGING gs_layout.
    PERFORM frm_pre_fieldcat TABLES gt_fieldcat_item.
    PERFORM frm_upload_event_item CHANGING gcl_alv_item.
    PERFORM frm_set_tab_display_item.
  ELSE.
    PERFORM frm_refresh_alv CHANGING gcl_alv_item.
  ENDIF.
ENDMODULE.                 " DISPLAY_ALV_9010  OUTPUT

*************************************************************************

*&---------------------------------------------------------------------*
*&  包括                ZSDI_0006_PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       监听
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  save_ok ok_code_9000.
*  PERFORM frm_check_changed_data USING gcl_alv_item.
  CASE save_ok.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_9000  INPUT

*&---------------------------------------------------------------------*
*&      Module  EXIT_9000  INPUT
*&---------------------------------------------------------------------*
*       退出
*----------------------------------------------------------------------*
MODULE exit_9000 INPUT.
  LEAVE PROGRAM.
ENDMODULE.                 " EXIT_9000  INPUT

***************************************************************

*&---------------------------------------------------------------------*
*&  包括                ZSDI_0006_FORMS
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT
*&---------------------------------------------------------------------*
*       初始化
*----------------------------------------------------------------------*
FORM frm_init .
* 销售组织
  s_vkorg-sign 'I'.
  s_vkorg-option 'EQ'.
  s_vkorg-low '1311'.
  APPEND s_vkorg.
*  销售订单类型
  s_auart-sign 'I'.
  s_auart-option 'EQ'.
  s_auart-low 'ZSOR'.
  s_auart-high 'ZSOR'.
  APPEND s_auart.
ENDFORM.                    " FRM_INIT

*&---------------------------------------------------------------------*
*&      Form  FRM_AUTH_CHECK  权限检查
*&---------------------------------------------------------------------*
FORM frm_auth_check.
  DATA lt_tvko LIKE TABLE OF tvko WITH HEADER LINE.

  SELECT vkorg
    INTO CORRESPONDING FIELDS OF TABLE lt_tvko
    FROM tvko
   WHERE vkorg IN s_vkorg.

  LOOP AT lt_tvko.
    AUTHORITY-CHECK OBJECT 'ZZ_SD005'
                   ID 'VKORG' FIELD lt_tvko-vkorg.
    IF sy-subrc <> 0.
      MESSAGE e007(zcommWITH lt_tvko-vkorg.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " FRM_CHECK_INPUT

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       获取数据
*----------------------------------------------------------------------*
FORM frm_get_data.
  CLEAR:
      gt_alv_head,gt_alv_head[],
      gt_alv_item,gt_alv_item[],
      gt_alv_item_store,gt_alv_item_store[].

  RANGES r_kunnr FOR vbak-kunnr.

  DATA:
        l_index LIKE sy-tabix,
        lt_sd_01 TYPE TABLE OF zzs_sd_002 WITH HEADER LINE,
        lt_sd_02 TYPE TABLE OF zzs_sd_003 WITH HEADER LINE,
        lt_sd_03 TYPE TABLE OF zzs_sd_004 WITH HEADER LINE,
        lt_sd_04 TYPE TABLE OF zzs_sd_005 WITH HEADER LINE,
        lt_mard TYPE TABLE OF mard WITH HEADER LINE,
        lt_lips TYPE TABLE OF lips WITH HEADER LINE,
        lt_tvaut TYPE TABLE OF tvaut WITH HEADER LINE,
        lt_tvv1t TYPE TABLE OF tvv1t WITH HEADER LINE,
        lt_kna1 TYPE TABLE OF kna1 WITH HEADER LINE,
        lt_tzont TYPE TABLE OF tzont WITH HEADER LINE,
        lt_knvp TYPE TABLE OF knvp WITH HEADER LINE,
        lt_knvv TYPE TABLE OF knvv WITH HEADER LINE,
        lt_lfa1 TYPE TABLE OF lfa1 WITH HEADER LINE,
        lt_vbfa TYPE TABLE OF vbfa WITH HEADER LINE,
        lt_t001w TYPE TABLE OF t001w WITH HEADER LINE,
        lt_t001l TYPE TABLE OF t001l WITH HEADER LINE,
        lt_tvkot TYPE TABLE OF tvkot WITH HEADER LINE,
        lt_tvgrt TYPE TABLE OF tvgrt WITH HEADER LINE,
        lt_tgsbt TYPE TABLE OF tgsbt WITH HEADER LINE,
        lt_tspat TYPE TABLE OF tspat WITH HEADER LINE,
*        lt_mard TYPE TABLE OF mard WITH HEADER LINE,
        lt_makt TYPE TABLE OF makt WITH HEADER LINE,
        lt_mara TYPE TABLE OF mara WITH HEADER LINE,
        lt_mvke TYPE TABLE OF mvke WITH HEADER LINE.

*  取抬头
  SELECT t01~vbeln "销售凭证
              t02~lfstk "交货状态
              t01~auart "销售凭证类型
              t04~bezei "销售凭证类型描述
              t01~kunnr "售达方
              t01~kvgr1 "客户分类
              t03~kunnr AS kunwe "送达方
              t01~vkorg "销售组织
              t01~vtweg "分销渠道
              t01~vkgrp "产品组
              t01~erdat "创建日期
              t01~audat "单据日期
              t01~vdatu "请求交货日期
              t01~bstnk "客户采购订单编号
              t01~gsber "业务范围
              t01~spart "产品组
              t01~bukrs_vf "公司代码
              t01~augru "订单原因
    FROM vbak AS t01
    INNER JOIN vbuk AS t02 ON t01~vbeln t02~vbeln
    INNER JOIN vbpa AS t03 ON t01~vbeln t03~vbeln AND t03~posnr '' AND t03~parvw 'WE'
    INNER JOIN tvakt AS t04 ON t01~auart t04~auart AND t04~spras '1'
*    INNER JOIN jest AS t05 ON t01~objnr = t05~objnr
    INTO CORRESPONDING FIELDS OF TABLE gt_alv_head
  WHERE t01~vbeln IN s_vbeln "销售订单
      AND t01~auart IN s_auart "销售订单类型
      AND t01~vkorg IN s_vkorg "销售组织
      AND t01~vkbur IN s_vkbur "销售部门
      AND t01~vkgrp IN s_vkgrp "销售组
      AND t01~kunnr IN s_kunnr "售达方
      AND t03~kunnr IN s_kunwe "送达方
      AND t01~kvgr1 IN s_kvgr1 "客户分类
*      AND t01~erdat IN s_erdat "销售订单创建日期
      AND t01~audat IN s_erdat "单据日期
      AND t01~vdatu IN s_vdatu"请求交货日期
*      AND t01~auart IN ('ZBOR','ZBCE','ZBCR','ZBFR')
      AND t01~auart NOT IN ('ZBDE','ZBDR','ZBRE','ZBYR')
      AND t02~lfstk <> 'C'"交货状态不为C
      AND t02~gbstk <> 'C'
*      AND t05~stat = 'E0002'
*      AND t05~inact = ''
.

  LOOP AT gt_alv_head.
    r_kunnr-sign 'I'.
    r_kunnr-option 'EQ'.
    r_kunnr-low gt_alv_head-kunnr.
    APPEND r_kunnr.
  ENDLOOP.

*  取客户信用信息
  CALL FUNCTION 'ZSDF_016'
*    EXPORTING
*     I_DATE  = SY-DATUM
*     I_C1    = 'X'
*     I_C2    = 'X'
*     i_C3    = 'X'
    TABLES
*     T_BUKRS =
      t_kunnr r_kunnr
      t_vkorg s_vkorg
*     T_VTWEG =
*     T_SPART =
      t_data1 lt_sd_01
      t_data2 lt_sd_02
      t_data3 lt_sd_03
      t_data4 lt_sd_04.

*Insert By Ryan Liu In 28.06.2012 16:59:37.
  DATA:gt_hkl LIKE TABLE OF zzt_sd_003a WITH HEADER LINE.
  SELECT INTO CORRESPONDING FIELDS OF TABLE gt_hkl FROM zzt_sd_003a WHERE vkorg IN s_vkorg.
  SORT gt_hkl BY vkorg.
  LOOP AT lt_sd_01.
    READ TABLE gt_hkl WITH KEY vkorg lt_sd_01-vkorg BINARY SEARCH.
    IF sy-subrc 0.
      IF gt_hkl-zhkl 'X'.
* 如果为空设置灰色灯 ICON_LED_INACTIVE
        IF lt_sd_01-status_2 IS INITIAL.
          lt_sd_01-status_2 icon_led_inactive.
        ENDIF.
        IF lt_sd_01-status_3 IS INITIAL.
          lt_sd_01-status_3 icon_led_inactive.
        ENDIF.
        IF lt_sd_01-status_4 IS INITIAL.
          lt_sd_01-status_4 icon_led_inactive.
        ENDIF.
* 为启用回款率的销售组织重置总状态灯
* 设置总状态灯
        CLEAR lt_sd_01-status.
        IF lt_sd_01-status_2 <> icon_led_green.
          lt_sd_01-status icon_led_red.
          MODIFY lt_sd_01.
          CONTINUE.
        ENDIF.
        IF lt_sd_01-status_3 <> icon_led_green.
          lt_sd_01-status icon_led_red.
          MODIFY lt_sd_01.
          CONTINUE.
        ENDIF.
        IF lt_sd_01-status_4 <> icon_led_green.
          lt_sd_01-status icon_led_red.
          MODIFY lt_sd_01.
          CONTINUE.
        ENDIF.
        lt_sd_01-status icon_led_green.
        MODIFY lt_sd_01.
      ENDIF.
    ENDIF.
  ENDLOOP.
*End Of Insert.

  IF gt_alv_head[] IS NOT INITIAL.
*    取行项目
    SELECT *
      FROM vbap AS t01
      INNER JOIN vbup AS t02 ON t01~vbeln t02~vbeln AND t01~posnr t02~posnr
      INNER JOIN mara AS t03 ON t01~matnr t03~matnr
      INTO CORRESPONDING FIELDS OF TABLE gt_alv_item_store
      FOR ALL ENTRIES IN gt_alv_head
    WHERE t01~vbeln gt_alv_head-vbeln
        AND t02~lfsta <> 'C'"交货状态不为C
        AND t01~abgru ''
        AND t01~matnr IN s_matnr.

*   删除行不存在的头数据
    LOOP AT gt_alv_head.
      l_index sy-tabix.
      READ TABLE gt_alv_item_store WITH KEY vbeln gt_alv_head-vbeln.
      IF sy-subrc <> 0.
        DELETE gt_alv_head INDEX l_index.
      ENDIF.
    ENDLOOP.

*      凭证流取对应交货单
    IF gt_alv_item_store[] IS NOT INITIAL.
      SELECT *
        FROM vbfa
        INTO TABLE lt_vbfa
        FOR ALL ENTRIES IN gt_alv_item_store
      WHERE vbelv  gt_alv_item_store-vbeln"先前的销售和分销凭证
          AND posnv  gt_alv_item_store-posnr"凭证的先前项目
          AND vbtyp_n  'J'."后继凭证的凭证类别
    ENDIF.
*      订单原因文本
    SELECT *
      FROM tvaut
      INTO TABLE lt_tvaut
      FOR ALL ENTRIES IN gt_alv_head
    WHERE spras '1'
        AND augru gt_alv_head-augru.
*      客户组
    SELECT *
      FROM tvv1t
      INTO TABLE lt_tvv1t
      FOR ALL ENTRIES IN gt_alv_head
    WHERE kvgr1 gt_alv_head-kvgr1
        AND spras sy-langu.
*      查询供货运代理应商
    SELECT *
      FROM knvp
      INTO TABLE lt_knvp
      FOR ALL ENTRIES IN gt_alv_head
    WHERE kunnr gt_alv_head-kunwe
        AND vkorg gt_alv_head-vkorg
        AND vtweg gt_alv_head-vtweg
*      AND spart = '00'"gt_alv_head-spart
        AND parvw 'SP'.
*    取客户对应的业务员数据
    SELECT *
      FROM knvp
      APPENDING TABLE lt_knvp
      FOR ALL ENTRIES IN gt_alv_head
    WHERE kunnr  gt_alv_head-kunnr"客户编号
        AND vkorg  gt_alv_head-vkorg"销售组织
        AND vtweg  gt_alv_head-vtweg"分销渠道
        AND spart  gt_alv_head-spart"产品组
        AND parvw  'ZY'."合作伙伴功能

    IF lt_knvp[] IS NOT INITIAL.
      SELECT *
        FROM lfa1
        INTO TABLE lt_lfa1
        FOR ALL ENTRIES IN lt_knvp
      WHERE lifnr lt_knvp-lifnr.
    ENDIF.
*        送达方
    SELECT *
      FROM kna1
      APPENDING TABLE lt_kna1
      FOR ALL ENTRIES IN gt_alv_head
    WHERE kunnr gt_alv_head-kunwe.
*      送达方运送区域
    IF lt_kna1[] IS NOT INITIAL.
      SELECT *
        FROM tzont
        INTO TABLE lt_tzont
        FOR ALL ENTRIES IN lt_kna1
        WHERE spras sy-langu
            AND land1 lt_kna1-land1
            AND zone1 lt_kna1-lzone.
    ENDIF.
*      售达方
    SELECT *
      FROM kna1
      APPENDING TABLE lt_kna1
*      FOR ALL ENTRIES IN gt_alv_head
*    WHERE kunnr = gt_alv_head-kunnr
      .
*      销售组织
    SELECT *
      FROM tvkot
      INTO TABLE lt_tvkot
      FOR ALL ENTRIES IN gt_alv_head
    WHERE spras sy-langu
        AND vkorg gt_alv_head-vkorg.
*      销售视图
    SELECT *
      FROM knvv
      INTO TABLE lt_knvv
      FOR ALL ENTRIES IN gt_alv_head
   WHERE kunnr gt_alv_head-kunnr
       AND vkorg gt_alv_head-vkorg"销售组织
       AND vtweg gt_alv_head-vtweg"分销渠道
       AND spart  gt_alv_head-spart."产品组
*      销售小组
    SELECT *
      FROM tvgrt
      INTO TABLE lt_tvgrt
      FOR ALL ENTRIES IN gt_alv_head
    WHERE spras sy-langu
        AND vkgrp gt_alv_head-vkgrp.
*      业务范围
    SELECT *
      FROM tgsbt
      INTO TABLE lt_tgsbt
      FOR ALL ENTRIES IN gt_alv_head
   WHERE spras sy-langu
       AND gsber gt_alv_head-gsber.
*      产品组
    SELECT *
      FROM tspat
      INTO TABLE lt_tspat
      FOR ALL ENTRIES IN gt_alv_head
   WHERE spras sy-langu
       AND spart gt_alv_head-spart.

*      取行项目描述
    IF gt_alv_item_store[] IS NOT INITIAL.
*      取物料描述
      SELECT *
        FROM makt
        INTO TABLE lt_makt
        FOR ALL ENTRIES IN gt_alv_item_store
      WHERE spras sy-langu
          AND matnr gt_alv_item_store-matnr.
*        取工厂描述
      SELECT *
        FROM t001w
        INTO TABLE lt_t001w
        FOR ALL ENTRIES IN gt_alv_item_store
      WHERE werks gt_alv_item_store-werks
          AND spras sy-langu.
*        取库存地点描述
      SELECT *
        FROM t001l
        INTO TABLE lt_t001l
        FOR ALL ENTRIES IN gt_alv_item_store
      WHERE werks gt_alv_item_store-werks
          AND lgort gt_alv_item_store-lgort.
*      业务范围
      SELECT *
        FROM tgsbt
        APPENDING TABLE lt_tgsbt
        FOR ALL ENTRIES IN gt_alv_item_store
     WHERE spras sy-langu
         AND gsber gt_alv_item_store-gsber.
*      产品组
      SELECT *
        FROM tspat
        APPENDING TABLE lt_tspat
        FOR ALL ENTRIES IN gt_alv_item_store
     WHERE spras sy-langu
         AND spart gt_alv_item_store-spart.
*        非限制库存
      SELECT *
        FROM mard
        APPENDING TABLE lt_mard
        FOR ALL ENTRIES IN gt_alv_item_store
     WHERE matnr gt_alv_item_store-matnr
*         AND werks = gt_alv_item_store-werks
*         AND lgort = gt_alv_item_store-lgort
        .

*    取出交货计划数
      SELECT *
         FROM lips AS t01
         INNER JOIN vbup AS t02 ON t01~vbeln t02~vbeln AND t01~posnr t02~posnr AND t02~wbsta <> 'C'
         INNER JOIN likp AS t03 ON t01~vbeln t03~vbeln
         INTO CORRESPONDING FIELDS OF TABLE lt_lips
        FOR ALL ENTRIES IN gt_alv_item_store
       WHERE t01~matnr gt_alv_item_store-matnr
           AND t01~werks gt_alv_item_store-werks
           AND t03~lfart <> 'LR'."排除退货
*        单位体积
      SELECT *
        FROM mara
        APPENDING TABLE lt_mara
        FOR ALL ENTRIES IN gt_alv_item_store
     WHERE matnr gt_alv_item_store-matnr.

*        取品牌
      SELECT *
        FROM mvke
        APPENDING TABLE lt_mvke
        FOR ALL ENTRIES IN gt_alv_item_store
     WHERE matnr gt_alv_item_store-matnr.
      SORT lt_mvke BY matnr mvgr1 DESCENDING.
      DELETE ADJACENT DUPLICATES FROM lt_mvke COMPARING matnr.
    ENDIF.
  ENDIF.

* 填充描述字段
  LOOP AT gt_alv_head.
*    读取长文本信息
    PERFORM frm_read_text USING gt_alv_head-vbeln CHANGING gt_alv_head-sgtxt.
*    取信用信息
    READ TABLE lt_sd_01 WITH KEY bukrs gt_alv_head-bukrs_vf
                                                    kunnr gt_alv_head-kunnr
                                                    vkorg gt_alv_head-vkorg"销售组织
                                                    vtweg gt_alv_head-vtweg"分销渠道
                                                    spart gt_alv_head-spart."产品组
    IF sy-subrc 0.
      gt_alv_head-status lt_sd_01-status.
    ELSE.
      gt_alv_head-status icon_led_inactive.
    ENDIF.
    READ TABLE lt_sd_02 WITH KEY bukrs gt_alv_head-bukrs_vf
                                                    kunnr gt_alv_head-kunnr
                                                    vkorg gt_alv_head-vkorg"销售组织
                                                    vtweg gt_alv_head-vtweg"分销渠道
                                                    spart gt_alv_head-spart."产品组
    IF sy-subrc 0.
      gt_alv_head-zkyed lt_sd_02-zkyed.
    ENDIF.
    READ TABLE lt_sd_03 WITH KEY bukrs gt_alv_head-bukrs_vf
                                                kunnr gt_alv_head-kunnr
                                                vkorg gt_alv_head-vkorg"销售组织
                                                vtweg gt_alv_head-vtweg"分销渠道
                                                spart gt_alv_head-spart."产品组
    IF sy-subrc 0.
      gt_alv_head-zcqts lt_sd_03-zcqts.
    ENDIF.
    READ TABLE lt_sd_04 WITH KEY bukrs gt_alv_head-bukrs_vf
                                                kunnr gt_alv_head-kunnr
                                                vkorg gt_alv_head-vkorg"销售组织
                                                vtweg gt_alv_head-vtweg"分销渠道
                                                spart gt_alv_head-spart."产品组
    IF sy-subrc 0.
      gt_alv_head-zhklce lt_sd_04-zhklce.
    ENDIF.
*    订单原因描述
    READ TABLE lt_tvaut WITH KEY augru gt_alv_head-augru.
    IF sy-subrc 0.
      gt_alv_head-augru_txt lt_tvaut-bezei."订单原因文本
    ENDIF.
*    售达方名称
    READ TABLE lt_kna1 WITH KEY kunnr gt_alv_head-kunnr.
    IF sy-subrc 0.
      gt_alv_head-kunnr_txt lt_kna1-name1.
    ENDIF.
*    优先级
    READ TABLE lt_knvv WITH KEY kunnr gt_alv_head-kunnr
                                                    vkorg gt_alv_head-vkorg"销售组织
                                                    vtweg gt_alv_head-vtweg"分销渠道
                                                    spart gt_alv_head-spart."产品组
    IF sy-subrc AND lt_knvv-lprio IS NOT INITIAL.
      gt_alv_head-lprio '优先'.
    ENDIF.

*    送达方名称
    READ TABLE lt_kna1 WITH KEY kunnr gt_alv_head-kunwe.
    IF sy-subrc 0.
      gt_alv_head-kunwe_txt lt_kna1-name1.
      gt_alv_head-lzone lt_kna1-lzone."运送区域
*      运送区域描述
      READ TABLE lt_tzont WITH KEY land1 lt_kna1-land1
                                                       zone1 lt_kna1-lzone.
      IF sy-subrc 0.
        gt_alv_head-lzone_txt lt_tzont-vtext.
      ENDIF.
    ENDIF.
*    货运代理
    READ TABLE lt_knvp WITH KEY kunnr gt_alv_head-kunwe
                                                    vkorg gt_alv_head-vkorg
                                                    vtweg gt_alv_head-vtweg
                                                    parvw 'SP'.
    IF sy-subrc 0.
      gt_alv_head-lifnr lt_knvp-lifnr.
      READ TABLE lt_lfa1 WITH KEY lifnr lt_knvp-lifnr."供应商名称
      IF sy-subrc 0.
        gt_alv_head-name1 lt_lfa1-name1.
      ENDIF.
    ENDIF.
*  读取业务员
    READ TABLE lt_knvp WITH KEY kunnr gt_alv_head-kunnr
                                                    vkorg gt_alv_head-vkorg
                                                    vtweg gt_alv_head-vtweg
                                                    parvw 'ZY'.
    IF sy-subrc 0.
      gt_alv_head-kunn2 lt_knvp-kunn2.
      READ TABLE lt_kna1 WITH KEY kunnr gt_alv_head-kunn2.
      IF sy-subrc 0.
        gt_alv_head-kunn2_txt lt_kna1-name1.
      ENDIF.
    ENDIF.
*    客户组1描述
    READ TABLE lt_tvv1t WITH KEY kvgr1 gt_alv_head-kvgr1.
    IF sy-subrc 0.
      gt_alv_head-kvgr1_txt lt_tvv1t-bezei.
    ENDIF.
*    销售组织描述
    READ TABLE lt_tvkot WITH KEY vkorg gt_alv_head-vkorg.
    IF sy-subrc 0.
      gt_alv_head-vtext lt_tvkot-vtext.
    ENDIF.
*    销售小组描述
    READ TABLE lt_tvgrt WITH KEY vkgrp gt_alv_head-vkgrp.
    IF sy-subrc 0.
      gt_alv_head-vkgrp_txt lt_tvgrt-bezei.
    ENDIF.
*    业务范围描述
    READ TABLE lt_tgsbt WITH KEY gsber gt_alv_head-gsber.
    IF sy-subrc 0.
      gt_alv_head-gsber_txt lt_tgsbt-gtext.
    ENDIF.
*    产品组描述
    READ TABLE lt_tspat WITH KEY spart gt_alv_head-spart.
    IF sy-subrc 0.
      gt_alv_head-spart_txt lt_tspat-vtext.
    ENDIF.
*    循环行
    LOOP AT gt_alv_item_store WHERE vbeln gt_alv_head-vbeln.
*      行文本
      PERFORM frm_read_item_text USING gt_alv_item_store-vbeln gt_alv_item_store-posnr CHANGING gt_alv_item_store-sgtxt.
*      物料描述
      READ TABLE lt_makt WITH KEY matnr gt_alv_item_store-matnr.
      IF sy-subrc 0.
        gt_alv_item_store-maktx lt_makt-maktx.
      ENDIF.
*      工厂描述
      READ TABLE lt_t001w WITH KEY werks gt_alv_item_store-werks.
      IF sy-subrc 0.
        gt_alv_item_store-werks_txt lt_t001w-name1.
      ENDIF.
*      库存地点描述
      READ TABLE lt_t001l WITH KEY werks gt_alv_item_store-werks
                                                       lgort gt_alv_item_store-lgort.
      IF sy-subrc 0.
        gt_alv_item_store-lgobe lt_t001l-lgobe.
      ENDIF.
*     业务范围描述
      READ TABLE lt_tgsbt WITH KEY gsber gt_alv_item_store-gsber.
      IF sy-subrc 0.
        gt_alv_item_store-gsber_txt lt_tgsbt-gtext.
      ENDIF.
*     产品组描述
      READ TABLE lt_tspat WITH KEY spart gt_alv_item_store-spart.
      IF sy-subrc 0.
        gt_alv_item_store-spart_txt lt_tspat-vtext.
      ENDIF.
**      非限制库存
*      READ TABLE lt_mard WITH KEY matnr = gt_alv_item_store-matnr
*                                                 werks = gt_alv_item_store-werks
*                                                 lgort = gt_alv_item_store-lgort.
*      IF sy-subrc = 0.
*        gt_alv_item_store-labst = lt_mard-labst.
*      ENDIF.
*      读取物料主数据上的体积
      READ TABLE lt_mara WITH KEY matnr gt_alv_item_store-matnr.
      IF sy-subrc 0.
        gt_alv_item_store-voleh lt_mara-voleh.
        gt_alv_item_store-volum =  lt_mara-volum.
      ENDIF.
*      读取物料组1(品牌)数据
      READ TABLE lt_mvke WITH KEY matnr gt_alv_item_store-matnr.
      IF sy-subrc 0.
        gt_alv_item_store-mvgr1 lt_mvke-mvgr1.
      ENDIF.

*      头数据存储行上
      gt_alv_item_store-icon icon_protocol.
      gt_alv_item_store-kunnr gt_alv_head-kunnr."客户
      gt_alv_item_store-kunnr_txt gt_alv_head-kunnr_txt."客户名称
      gt_alv_item_store-kunn2 gt_alv_head-kunn2."业务员
      gt_alv_item_store-kunn2_txt gt_alv_head-kunn2_txt."业务员名称
      gt_alv_item_store-lifnr gt_alv_head-lifnr."货运代理
      gt_alv_item_store-name1 gt_alv_head-name1."货运代理名称
      gt_alv_item_store-lzone gt_alv_head-lzone."货运区域
      gt_alv_item_store-lzone_txt gt_alv_head-lzone_txt."货运区域描述
      gt_alv_item_store-bukrs_vf gt_alv_head-bukrs_vf."公司代码
      gt_alv_item_store-auart gt_alv_head-auart."销售凭证类型
      gt_alv_item_store-kunnr gt_alv_head-kunnr."售达方
      gt_alv_item_store-kunwe gt_alv_head-kunwe."送达方
      gt_alv_item_store-spart_head gt_alv_head-spart."头产品组
*      凭证流
      gt_alv_item_store-menge gt_alv_item_store-kwmeng."未清数量 = 数量
      LOOP AT lt_vbfa WHERE vbelv gt_alv_item_store-vbeln"先前的销售和分销凭证
                                    AND posnv  gt_alv_item_store-posnr."凭证的先前项目
        gt_alv_item_store-menge gt_alv_item_store-menge lt_vbfa-rfmng.
      ENDLOOP.
      gt_alv_item_store-cur_menge gt_alv_item_store-menge."本次交货数量 = 未清数量
      gt_alv_item_store-sum_netpr gt_alv_item_store-netpr * gt_alv_item_store-cur_menge / 1000."交货金额 = 产品单价 * 本次交货数量

*    非限制数量
      LOOP AT lt_mard WHERE matnr gt_alv_item_store-matnr.
*                                      AND werks = gt_alv_item_store-werks.
        IF lt_mard-werks '1000'.
          CASE lt_mard-lgort.
            WHEN '1001' OR '1004' OR '1007' OR '1010' OR '1012' OR '1014' OR '1015'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ELSEIF lt_mard-werks '1010'.
          CASE lt_mard-lgort.
            WHEN '1001' OR '1004' OR '1005' OR '1010' OR '1012' OR '1015'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ELSEIF lt_mard-werks '1020'.
          CASE lt_mard-lgort.
            WHEN '1001' OR '1004' OR '1007' OR '1010' OR '1012' OR '1015'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ELSEIF lt_mard-werks '1030'.
          CASE lt_mard-lgort.
            WHEN '1001' OR '1004' OR '1005' OR '1007' OR '1010' OR '1013' OR '1015'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        ELSE."1300,1310,1320,1330,1340,1350

        ENDIF.

        ADD lt_mard-labst TO gt_alv_item_store-labst.
      ENDLOOP.
*      交货计划数
      LOOP AT lt_lips WHERE matnr gt_alv_item_store-matnr.
*                               AND werks = gt_alv_item_store-werks.
        gt_alv_item_store-labst gt_alv_item_store-labst lt_lips-lfimg.
      ENDLOOP.
*      CASE gt_alv_item_store-voleh.
*        WHEN 'CCM'.
*          gt_alv_item_store-volum = gt_alv_item_store-volum / 1000000.
*        WHEN 'CDM'.
*          gt_alv_item_store-volum = gt_alv_item_store-volum / 1000.
*      ENDCASE.
*      gt_alv_item_store-voleh = 'M3'.
*      gt_alv_item_store-cur_volum = gt_alv_item_store-volum * gt_alv_item_store-cur_menge."交货体积 = 单位体积*交货数量
      gt_alv_item_store-status icon_yellow_light.
      IF gt_alv_item_store-xchpf ''.
        PERFORM frm_set_edit USING 'CHARG' 'DISABLE' CHANGING gt_alv_item_store-cellstyles.
      ENDIF.
      MODIFY gt_alv_item_store.
    ENDLOOP.
    MODIFY gt_alv_head.
  ENDLOOP.
  DELETE gt_alv_head WHERE kunn2 NOT IN s_kunn2."筛选业务员
  IF p_filter 'X'.
    DELETE gt_alv_head WHERE status <> icon_led_green."筛选绿灯
  ENDIF.

*  gt_alv_item[] = gt_alv_item_store[].
ENDFORM.                    "FRM_GET_DATA

*&---------------------------------------------------------------------*
*&      Form  frm_create_container
*&---------------------------------------------------------------------*
*       创建ALV容器,并将类添加到容器
*----------------------------------------------------------------------*
FORM frm_create_container USING p_ratio p_side
      CHANGING pcl_container TYPE REF TO cl_gui_docking_container
                        pcl_alv TYPE REF TO cl_gui_alv_grid.

  CREATE OBJECT pcl_container
    EXPORTING
      repid sy-repid
      dynnr sy-dynnr
      ratio p_ratio
      side  p_side."cl_gui_docking_container=>dock_at_top.

  CREATE OBJECT pcl_alv
    EXPORTING
      i_parent pcl_container.

ENDFORM.                    " frm_create_container

*&---------------------------------------------------------------------*
*&      Form  FRM_EXCLUDE
*&---------------------------------------------------------------------*
*       排除按钮
*----------------------------------------------------------------------*
FORM frm_exclude.
  DATA ls_exclude TYPE ui_func.
  CLEAR gs_exclude.
*排除打印按钮
  ls_exclude cl_gui_alv_grid=>mc_fc_print .
  APPEND ls_exclude TO gs_exclude.
*排除添加、删除、插入、复制按钮
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_append_row .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_copy_row .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_copy .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_cut .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_delete_row .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_insert_row .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_move_row .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_paste .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
  APPEND ls_exclude TO gs_exclude.
  ls_exclude cl_gui_alv_grid=>mc_fc_loc_undo .
  APPEND ls_exclude TO gs_exclude.
ENDFORM.                    " FRM_EXCLUDE

*&---------------------------------------------------------------------*
*&      Form  frm_pre_layout
*&---------------------------------------------------------------------*
*       设置ALV样式
*----------------------------------------------------------------------*
FORM frm_pre_layout USING p_title  p_tool CHANGING ps_layout TYPE lvc_s_layo.
  ps_layout-zebra 'X'.
  ps_layout-no_toolbar p_tool.
  ps_layout-sel_mode 'C'.
  ps_layout-cwidth_opt 'X'.
  ps_layout-smalltitle 'X'.
  ps_layout-stylefname 'CELLSTYLES'.
  ps_layout-info_fname 'ROWCOLOR'.
  ps_layout-grid_title p_title.
ENDFORM.                    " frm_pre_layout

*&---------------------------------------------------------------------*
*&      Form  frm_pre_fieldcat
*&---------------------------------------------------------------------*
*       设置字段目录属性
*----------------------------------------------------------------------*
FORM frm_pre_fieldcat_head.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'SEL' '' 'X' 'X' 'X' 'X' space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'STATUS' '额度' 'X' space space space 'X' space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'VBELN' '销售凭证' 'X' space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'LFSTK' '交货状态' 'X' space 'X' space space space space space 'X' 'VBUK' 'LFSTK' space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'LPRIO' '发货等级' 'X' space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'KUNNR' '售达方' 'X' space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'KUNNR_TXT' '售达方名称' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'KVGR1_TXT' '客户分类' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'AUART' '凭证类型' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'BEZEI' '凭证类型名称' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'AUGRU_TXT' '订单原因' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'KUNWE' '送达方' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'KUNWE_TXT' '送达方名称' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'KUNN2' '业务员' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'KUNN2_TXT' '业务员名称' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'LIFNR' '货运代理' space space space space space space space space 'X' 'LFB1' 'LIFNR' 'LFA1'.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'NAME1' '名称' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'LZONE_TXT' '运送区域' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'ERDAT' '创建日期' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'AUDAT' '创建日期' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'VDATU' '请求交货日期' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'BSTNK' '客户采购订单号' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'VTEXT' '销售组织' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'VKGRP_TXT' '销售小组' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'GSBER_TXT' '业务范围' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'SPART_TXT' '产品组' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'ZKYED' '可用额度' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'ZCQTS' '超期天数' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'ZHKLCE' '回款率差额' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES gt_fieldcat_head USING 'SGTXT' '备注' space space space space space space space space space space space space.

ENDFORM.                    " frm_pre_fieldcat

*&---------------------------------------------------------------------*
*&      Form  frm_pre_fieldcat_it
*&---------------------------------------------------------------------*
*       设置字段目录属性
*----------------------------------------------------------------------*
FORM frm_pre_fieldcat TABLES pt_fieldcat STRUCTURE lvc_s_fcat.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'SEL' '' 'X' 'X' 'X' 'X' space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'ZYPNO' '预排号' 'X' space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'VBELN_K' '交货单' 'X' space 'X' space space space space 'X' space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'STATUS' '状态' 'X' space 'X' space 'X' space space 'X' space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'VBELN' '销售凭证' 'X' space 'X' space space space space 'X' space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'POSNR' '项目' 'X' space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'LFSTA' '行交货状态' 'X' space 'X' space space space space space 'X' 'VBUP' 'LFSTK' space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'MATNR' '物料号' 'X' space 'X' space space space space 'X' space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'MAKTX' '物料描述' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'WERKS' '交货工厂' space 'X' 'X' space space space space space 'X' 'LIPS' 'WERKS' space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'WERKS_TXT' '工厂名称' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'LGORT' '交货库位' space 'X' 'X' space space space space space 'X' 'LIPS' 'LGORT' space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'LGOBE' '库存地点' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'KWMENG' '数量' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'MENGE' '未清数量' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'CUR_MENGE' '本次交货数量' space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'LEFT_MENGE' '剩余交货数量' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'VOLUM' '体积' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'CUR_VOLUM' '本次交货体积' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'VOLEH' '体积单位' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'LIFNR' '货运代理' space 'X' 'X' space space space space space 'X' 'LFA1' 'LIFNR' 'LFA1'.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'NAME1' '名称' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'LZONE_TXT' '运送区域' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'GSBER_TXT' '业务范围线' space space space space space space space space space space space space.
*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'SPART_TXT' '产品类别线' space space space space space space space space space space space space.

*  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'CHARG' '交货批次' space 'X' space space space space space space 'X' 'LIPS' 'CHARG' space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'NETPR' '产品单价' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'SUM_NETPR' '交货金额' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'KUNNR' '售达方' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'KUNNR_TXT' '售达方名称' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'KUNN2' '业务员' space space 'X' space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'KUNN2_TXT' '业务员名称' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'LABST' '可用库存' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'ICON' '库存查看' space space space space 'X' space space 'X' space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'SGTXT' '备注' space space space space space space space space space space space space.
  PERFORM frm_fieldcat TABLES pt_fieldcat USING 'MESSAGE' '日志' space space space space space space space space space space space space.
ENDFORM.                    " frm_pre_fieldcat_it

*&---------------------------------------------------------------------*
*&      Form  frm_fieldcat
*&---------------------------------------------------------------------*
*       设置字段目录
*----------------------------------------------------------------------*
FORM frm_fieldcat TABLES pt_fieldcat USING p_field p_text p_key p_edit p_nozero p_checkbox p_icon p_decimals p_just p_hotspot p_f4 p_ref_tab p_ref_field p_checktable.
  DATA lw_fcat TYPE lvc_s_fcat.
  lw_fcat-fieldname p_field.
  lw_fcat-coltext p_text.
  lw_fcat-key p_key.
  lw_fcat-edit p_edit.
  lw_fcat-no_zero p_nozero.
  lw_fcat-checkbox p_checkbox.
  lw_fcat-icon p_icon.
  lw_fcat-decimals p_decimals.
  lw_fcat-just p_just.
  lw_fcat-hotspot p_hotspot.
  lw_fcat-f4availabl p_f4.
  lw_fcat-ref_table p_ref_tab.
  lw_fcat-ref_field p_ref_field.
  lw_fcat-checktable p_checktable.
  APPEND lw_fcat TO pt_fieldcat.
ENDFORM.                    " frm_fieldcat

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_EVENT_HEAD
*&---------------------------------------------------------------------*
*       注册事件
*----------------------------------------------------------------------*
FORM frm_upload_event_head CHANGING pcl_alv TYPE REF TO cl_gui_alv_grid.
  DATA
        lr_event_handler TYPE REF TO gcl_event_handler_head.
  CREATE OBJECT lr_event_handler.
  SET HANDLER lr_event_handler->handle_toolbar FOR pcl_alv.
  SET HANDLER lr_event_handler->handle_user_command FOR pcl_alv.
  SET HANDLER lr_event_handler->handle_double_click FOR pcl_alv.

  CALL METHOD pcl_alv->register_edit_event
    EXPORTING
      i_event_id cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      1
      OTHERS     2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  SET HANDLER lr_event_handler->handle_data_changed FOR pcl_alv.
ENDFORM.                    " FRM_UPLOAD_EVENT_HEAD

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_EVENT_ITEM
*&---------------------------------------------------------------------*
*       注册事件
*----------------------------------------------------------------------*
FORM frm_upload_event_item CHANGING pcl_alv TYPE REF TO cl_gui_alv_grid.
  DATA
        lr_event_handler TYPE REF TO gcl_event_handler_item.
  CREATE OBJECT lr_event_handler.
  SET HANDLER lr_event_handler->handle_hotspot_click FOR pcl_alv.
  SET HANDLER lr_event_handler->handle_toolbar FOR pcl_alv.
  SET HANDLER lr_event_handler->handle_user_command FOR pcl_alv.
  SET HANDLER lr_event_handler->handle_onf4 FOR pcl_alv.
  SET HANDLER lr_event_handler->handle_double_click FOR pcl_alv.
  CALL METHOD pcl_alv->register_edit_event
    EXPORTING
      i_event_id cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      1
      OTHERS     2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  SET HANDLER lr_event_handler->handle_data_changed FOR pcl_alv.
  SET HANDLER lr_event_handler->handle_data_changed_finished FOR pcl_alv.

  DATA lt_f4 TYPE lvc_t_f4 WITH HEADER LINE.
  lt_f4-fieldname 'LGORT'.
  lt_f4-register 'X'.
  lt_f4-getbefore 'X'.
  lt_f4-chngeafter 'X'.
  INSERT lt_f4 INTO TABLE lt_f4.
  lt_f4-fieldname 'CHARG'.
  INSERT lt_f4 INTO TABLE lt_f4.
  CALL METHOD pcl_alv->register_f4_for_fields
    EXPORTING
      it_f4 lt_f4[].
ENDFORM.                    " FRM_UPLOAD_EVENT_ITEM

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_TAB_DISPLAY_HEAD
*&---------------------------------------------------------------------*
*       显示ALV
*----------------------------------------------------------------------*
FORM frm_set_tab_display_head.
  CALL METHOD gcl_alv_head->set_table_for_first_display
    EXPORTING
      is_variant                    gs_variant_head
      i_save                        'A'
      i_default                     'X'
      is_layout                     gs_layout
      it_toolbar_excluding          gs_exclude
    CHANGING
      it_outtab                     gt_alv_head[]
      it_fieldcatalog               gt_fieldcat_head
    EXCEPTIONS
      invalid_parameter_combination 1
      program_error                 2
      too_many_lines                3
      OTHERS                        4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " FRM_SET_TAB_DISPLAY_HEAD

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_TAB_DISPLAY_ITEM
*&---------------------------------------------------------------------*
*       显示ALV
*----------------------------------------------------------------------*
FORM frm_set_tab_display_item.
  CALL METHOD gcl_alv_item->set_table_for_first_display
    EXPORTING
      is_variant                    gs_variant_item
      i_save                        'A'
      i_default                     'X'
      is_layout                     gs_layout
      it_toolbar_excluding          gs_exclude
    CHANGING
      it_outtab                     gt_alv_item[]
      it_fieldcatalog               gt_fieldcat_item
    EXCEPTIONS
      invalid_parameter_combination 1
      program_error                 2
      too_many_lines                3
      OTHERS                        4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " FRM_SET_TAB_DISPLAY_ITEM

*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*       刷新ALV
*----------------------------------------------------------------------*
FORM frm_refresh_alv CHANGING pcl_alv TYPE REF TO cl_gui_alv_grid.
*刷新稳定性
  DATAlw_stbl TYPE lvc_s_stbl.
  lw_stbl-row 'X'.
  lw_stbl-col 'X'.
  CALL METHOD pcl_alv->refresh_table_display
    EXPORTING
      is_stable      lw_stbl
*     I_SOFT_REFRESH =
    EXCEPTIONS
      finished       1
      OTHERS         2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " FRM_REFRESH_ALV

*&---------------------------------------------------------------------*
*&      Form  HANDE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_ROW  text
*      -->P_E_COLUMN  text
*      -->P_ES_ROW_NO  text
*----------------------------------------------------------------------*
FORM hande_double_click  USING    ps_row TYPE  lvc_s_row
                                  ps_column TYPE  lvc_s_col
                                  ps_row_no TYPE  lvc_s_roid.

  CLEAR:gt_alv_item,gt_alv_item[].
*  双击获取明细
  READ TABLE gt_alv_head INDEX ps_row-index.
  IF sy-subrc 0.
    LOOP AT gt_alv_item_store WHERE vbeln gt_alv_head-vbeln.
      MOVE-CORRESPONDING gt_alv_item_store TO gt_alv_item.
      APPEND gt_alv_item.
      CLEAR gt_alv_item.
    ENDLOOP.
  ENDIF.
  PERFORM frm_refresh_alv CHANGING gcl_alv_item.
ENDFORM.                    " HANDE_DOUBLE_CLICK

*&---------------------------------------------------------------------*
*&      Form  HANDE_DOUBLE_CLICK_ITEM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_ROW  text
*      -->P_E_COLUMN  text
*      -->P_ES_ROW_NO  text
*----------------------------------------------------------------------*
FORM hande_double_click_item  USING    ps_row TYPE  lvc_s_row
                                  ps_column TYPE  lvc_s_col
                                  ps_row_no TYPE  lvc_s_roid.
  READ TABLE gt_alv_item INDEX ps_row-index.
  IF sy-subrc 0.
    SET PARAMETER ID'AUN' FIELD gt_alv_item-vbeln.
    CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
  ENDIF.
ENDFORM.                    " HANDE_DOUBLE_CLICK_ITEM

*&---------------------------------------------------------------------*
*&      Form  HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_OBJECT  text
*      -->P_E_INTERACTIVE  text
*----------------------------------------------------------------------*
FORM handle_toolbar  USING
      p_e_object TYPE REF TO cl_alv_event_toolbar_set
      p_e_interactive.
  DATAls_toolbar TYPE stb_button.
* 添加分隔符
  CLEAR ls_toolbar.
  MOVE TO ls_toolbar-butn_type.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
*  全选按钮
  CLEAR ls_toolbar.
  MOVE 'ALLSEL' TO ls_toolbar-function.
  MOVE '全选' TO ls_toolbar-quickinfo.
  MOVE icon_select_all TO ls_toolbar-icon.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
*  取消全选按钮
  CLEAR ls_toolbar.
  MOVE 'DESEL' TO ls_toolbar-function.
  MOVE '取消全选' TO ls_toolbar-quickinfo.
  MOVE icon_deselect_all TO ls_toolbar-icon.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
*  添加显示行项目按钮
  CLEAR ls_toolbar.
  MOVE 'DETAIL' TO ls_toolbar-function.
  MOVE '显示行项目' TO ls_toolbar-text.
  MOVE '显示行项目' TO ls_toolbar-quickinfo.
  MOVE icon_select_detail TO ls_toolbar-icon.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
ENDFORM.                    " HANDLE_TOOLBAR

*&---------------------------------------------------------------------*
*&      Form  HANDLE_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
*       单击事件
*----------------------------------------------------------------------*
FORM handle_hotspot_click  USING p_row_id TYPE lvc_s_row
                                                            p_column_id TYPE lvc_s_col
                                                            p_row_no TYPE  lvc_s_roid.
  CASE p_column_id-fieldname.
    WHEN 'VBELN_K'.
      READ TABLE gt_alv_item INDEX p_row_id-index.
      IF sy-subrc AND gt_alv_item-vbeln_k <> ''.
        SET PARAMETER ID'VL' FIELD gt_alv_item-vbeln_k.
        CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
      ENDIF.
    WHEN 'VBELN'.
      READ TABLE gt_alv_item INDEX p_row_id-index.
      IF sy-subrc AND gt_alv_item-vbeln <> ''.
        SET PARAMETER ID'AUN' FIELD gt_alv_item-vbeln.
        CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
      ENDIF.
    WHEN 'MATNR'.
      READ TABLE gt_alv_item INDEX p_row_id-index.
      IF sy-subrc AND gt_alv_item-matnr <> ''.
        SET PARAMETER ID'MAT' FIELD gt_alv_item-matnr.
        CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
      ENDIF.
    WHEN 'ICON'.
      READ TABLE gt_alv_item INDEX p_row_id-index.
      IF sy-subrc 0.
        DATA:
        lt_rspar  TYPE TABLE OF rsparams,
        lw_line LIKE LINE OF lt_rspar.
        lw_line-selname 'S_WERKS'.
        lw_line-kind    'S'.
        lw_line-sign    'I'.
        lw_line-option  'CP'.
        lw_line-low     '*'.
        APPEND lw_line TO lt_rspar.

        lw_line-selname 'S_MATNR'.
        lw_line-kind    'S'.
        lw_line-sign    'I'.
        lw_line-option  'EQ'.
        lw_line-low     gt_alv_item-matnr.
        APPEND lw_line TO lt_rspar.

        lw_line-selname 'S_MVGR1'.
        lw_line-kind    'S'.
        lw_line-sign    'I'.
        lw_line-option  'EQ'.
        lw_line-low     gt_alv_item-mvgr1.
        APPEND lw_line TO lt_rspar.

        SUBMIT zsdr_0012
        WITH SELECTION-TABLE lt_rspar
        AND RETURN.
      ENDIF.
  ENDCASE.
ENDFORM.                    " HANDLE_HOTSPOT_CLICK


*&---------------------------------------------------------------------*
*&      Form  HANDLE_TOOLBAR_ITEM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_OBJECT  text
*      -->P_E_INTERACTIVE  text
*----------------------------------------------------------------------*
FORM handle_toolbar_item  USING
      p_e_object TYPE REF TO cl_alv_event_toolbar_set
      p_e_interactive.
  DATAls_toolbar TYPE stb_button.
* 添加分隔符
  CLEAR ls_toolbar.
  MOVE TO ls_toolbar-butn_type.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
*  全选按钮
  CLEAR ls_toolbar.
  MOVE 'ALLSELI' TO ls_toolbar-function.
  MOVE '全选' TO ls_toolbar-quickinfo.
  MOVE icon_select_all TO ls_toolbar-icon.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
*  取消全选按钮
  CLEAR ls_toolbar.
  MOVE 'DESELI' TO ls_toolbar-function.
  MOVE '取消全选' TO ls_toolbar-quickinfo.
  MOVE icon_deselect_all TO ls_toolbar-icon.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
*  取消保存按钮
  CLEAR ls_toolbar.
  MOVE 'ZSAVE' TO ls_toolbar-function.
  MOVE '保存' TO ls_toolbar-quickinfo.
  MOVE icon_system_save TO ls_toolbar-icon.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
*  添加生成提单按钮
  CLEAR ls_toolbar.
  MOVE 'CREATE' TO ls_toolbar-function.
  MOVE '生成提单' TO ls_toolbar-text.
  MOVE '生成提单' TO ls_toolbar-quickinfo.
  MOVE icon_allow TO ls_toolbar-icon.
  APPEND ls_toolbar TO p_e_object->mt_toolbar.
ENDFORM.                    " HANDLE_TOOLBAR_ITEM

*&---------------------------------------------------------------------*
*&      Form  handle_user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_UCOMM  text
*----------------------------------------------------------------------*
FORM handle_user_command  USING    p_e_ucomm.
  PERFORM frm_check_changed_data USING gcl_alv_head.
  CASE p_e_ucomm.
    WHEN 'ALLSEL'.
      LOOP AT gt_alv_head.
        gt_alv_head-sel 'X'.
        MODIFY gt_alv_head TRANSPORTING sel.
      ENDLOOP.
    WHEN 'DESEL'.
      LOOP AT gt_alv_head.
        gt_alv_head-sel ''.
        MODIFY gt_alv_head TRANSPORTING sel.
      ENDLOOP.
    WHEN 'DETAIL'.
      PERFORM frm_show_detail.
  ENDCASE.
  PERFORM frm_refresh_alv CHANGING gcl_alv_head.
  PERFORM frm_refresh_alv CHANGING gcl_alv_item.
ENDFORM.                    " handle_user_command

*&---------------------------------------------------------------------*
*&      Form  handle_user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_UCOMM  text
*----------------------------------------------------------------------*
FORM handle_user_command_item  USING    p_e_ucomm.
  PERFORM frm_check_changed_data USING gcl_alv_item.
  CASE p_e_ucomm.
    WHEN 'ALLSELI'.
      LOOP AT gt_alv_item WHERE vbeln_k IS INITIAL.
        gt_alv_item-sel 'X'.
        MODIFY gt_alv_item TRANSPORTING sel.
      ENDLOOP.
    WHEN 'DESELI'.
      LOOP AT gt_alv_item.
        gt_alv_item-sel ''.
        MODIFY gt_alv_item TRANSPORTING sel.
      ENDLOOP.
    WHEN 'ZSAVE'.
      PERFORM frm_save_item.
    WHEN 'CREATE'.
      PERFORM frm_create.
*      PERFORM frm_update_lgort.
*      PERFORM frm_do_bdc.
*      PERFORM frm_change_lgort.
      PERFORM frm_set_disable.
  ENDCASE.
  PERFORM frm_store_item."存储ITEM
*  PERFORM frm_sum."累计体积
*  PERFORM frm_refresh_screen."刷新SCREEN,ALV
*Inserted By Ryan Liu In 05.07.2012 10:12:00.
  PERFORM frm_refresh_alv CHANGING gcl_alv_head.
*End Of Insert.
  PERFORM frm_refresh_alv CHANGING gcl_alv_item."刷新ALV
ENDFORM.                    " handle_user_command

*&---------------------------------------------------------------------*
*&      Form  HANDE_ONF4_ITEM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_FIELDNAME  text
*      -->P_E_FIELDVALUE  text
*      -->P_ES_ROW_NO  text
*      -->P_ER_EVENT_DATA  text
*      -->P_ET_BAD_CELLS  text
*      -->P_E_DISPLAY  text
*----------------------------------------------------------------------*
FORM hande_onf4_item  USING    e_fieldname  TYPE  lvc_fname
                                                      e_fieldvalue  TYPE  lvc_value
                                                      es_row_no TYPE  lvc_s_roid
                                                      er_event_data  TYPE REF TO  cl_alv_event_data
                                                      et_bad_cells  TYPE  lvc_t_modi
                                                      e_display TYPE  char01.
  DATA:
            lt_lips TYPE TABLE OF lips WITH HEADER LINE,
            lt_mard TYPE TABLE OF ty_mard WITH HEADER LINE,
            lt_mchb TYPE TABLE OF ty_mchb WITH HEADER LINE,
            lt_ddshretval TYPE STANDARD TABLE OF ddshretval WITH HEADER LINE,
            lt_cells TYPE lvc_t_cell WITH HEADER LINE.

  READ TABLE gt_alv_item INDEX es_row_no-row_id.
  IF sy-subrc 0.
*    IF gt_alv_item-xchpf = ''."是否启用批次管理
*    取库存数量
    SELECT *
      FROM mard AS t01
      INNER JOIN t001l AS t02 ON t01~werks t02~werks AND t01~lgort t02~lgort
      INTO CORRESPONDING FIELDS OF TABLE lt_mard
    WHERE t01~matnr gt_alv_item-matnr
        AND t01~werks gt_alv_item-werks.

    SELECT matnr"物料
                werks"工厂
                lgort"库存地点
                lfimg"交货数量
       FROM lips AS t01
       INNER JOIN vbup AS t02 ON t01~vbeln t02~vbeln AND t01~posnr t02~posnr AND t02~wbsta <> 'C'
       INTO CORRESPONDING FIELDS OF TABLE lt_lips
     WHERE  t01~matnr gt_alv_item-matnr
        AND t01~werks gt_alv_item-werks.

    LOOP AT lt_mard.
      LOOP AT lt_lips WHERE matnr lt_mard-matnr
                                   AND werks lt_mard-werks
                                   AND lgort lt_mard-lgort.
        ADD lt_lips-lfimg TO lt_mard-lfimg.
      ENDLOOP.
      lt_mard-zkykc lt_mard-labst lt_mard-lfimg.
      MODIFY lt_mard.
      CLEAR lt_mard.
    ENDLOOP.

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield         'LGORT'     "指定ALV用F4的字段
        dynpprog         sy-repid
        value_org        'S'
        callback_program sy-repid
        callback_form    'FRM_F4_CB_1'
      TABLES
        value_tab        lt_mard[]
        return_tab       lt_ddshretval[]
      EXCEPTIONS
        parameter_error  1
        no_values_found  2
        OTHERS           3.

    LOOP AT lt_ddshretval.
      CASE lt_ddshretval-fieldname.
        WHEN 'F0002'.
          gt_alv_item-lgort lt_ddshretval-fieldval.
        WHEN 'F0003'.
          gt_alv_item-lgobe lt_ddshretval-fieldval.
        WHEN 'F0005'.
          gt_alv_item-charg lt_ddshretval-fieldval.
      ENDCASE.
    ENDLOOP.
    MODIFY gt_alv_item INDEX es_row_no-row_id.
*    ELSE.
**      去批次库存
*      SELECT *
*         FROM mchb AS t01
*        INNER JOIN t001l AS t02 ON t01~werks = t02~werks AND t01~lgort = t02~lgort
*         INTO CORRESPONDING FIELDS OF TABLE lt_mchb
*       WHERE t01~werks = gt_alv_item-werks
*          AND t01~matnr = gt_alv_item-matnr.
*
*      CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
*        EXPORTING
*          retfield         = 'LGORT'    "指定ALV用F4的字段
*          dynpprog         = sy-repid
*          value_org        = 'S'
*          callback_program = sy-repid
*          callback_form    = 'FRM_F4_CB'
*        TABLES
*          value_tab        = lt_mchb[]
*          return_tab       = lt_ddshretval[]
*        EXCEPTIONS
*          parameter_error  = 1
*          no_values_found  = 2
*          OTHERS           = 3.
*
*      LOOP AT lt_ddshretval.
*        CASE lt_ddshretval-fieldname.
*          WHEN 'F0002'.
*            gt_alv_item-lgort = lt_ddshretval-fieldval.
*          WHEN 'F0003'.
*            gt_alv_item-lgobe = lt_ddshretval-fieldval.
*          WHEN 'F0005'.
*            gt_alv_item-charg = lt_ddshretval-fieldval.
*        ENDCASE.
*      ENDLOOP.
*      MODIFY gt_alv_item INDEX es_row_no-row_id.
*    ENDIF.
  ENDIF.

  PERFORM frm_refresh_alv CHANGING gcl_alv_item.
  lt_cells-row_id-index es_row_no-row_id.
  lt_cells-col_id e_fieldname.
  APPEND lt_cells.

  CALL METHOD gcl_alv_item->set_selected_cells
    EXPORTING
      it_cells lt_cells[].

ENDFORM.                    " HANDE_ONF4_ITEM

*&---------------------------------------------------------------------*
*&      Form  HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ER_DATA_CHANGED  text
*      -->P_E_ONF4  text
*      -->P_E_ONF4_BEFORE  text
*      -->P_E_ONF4_AFTER  text
*      -->P_E_UCOMM  text
*----------------------------------------------------------------------*
FORM handle_data_changed  USING
      p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol
      p_e_onf4
      p_e_onf4_before
      p_e_onf4_after
      p_e_ucomm TYPE sy-ucomm.

ENDFORM.                    " HANDLE_DATA_CHANGED

*&---------------------------------------------------------------------*
*&      Form  HANDLE_DATA_CHANGED_ITEM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ER_DATA_CHANGED  text
*      -->P_E_ONF4  text
*      -->P_E_ONF4_BEFORE  text
*      -->P_E_ONF4_AFTER  text
*      -->P_E_UCOMM  text
*----------------------------------------------------------------------*
FORM handle_data_changed_item  USING
      p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol
      p_e_onf4
      p_e_onf4_before
      p_e_onf4_after
      p_e_ucomm TYPE sy-ucomm.
  DATA:
          l_lifnr TYPE lfa1-lifnr,"供应商编号
          l_name TYPE lfa1-name1."供应商名称

  FIELD-SYMBOLS<lfs_mod_rows> TYPE STANDARD TABLE,
                          <lfs_cells> TYPE lvc_t_modi ,
                          <lfs_cell_wa> TYPE lvc_s_modi ,
                          <lfs_itab_wa>  LIKE LINE OF gt_alv_item,
                          <lfs_wa> TYPE any.

  CHECK NOT p_er_data_changed->mp_mod_rows IS INITIAL.
  CHECK NOT p_er_data_changed->mt_mod_cells IS INITIAL.
  ASSIGN p_er_data_changed->mt_mod_cells TO <lfs_cells>.
  ASSIGN p_er_data_changed->mp_mod_rows->TO <lfs_mod_rows>.
  LOOP AT <lfs_cells>  ASSIGNING <lfs_cell_wa> .
    READ TABLE gt_alv_item INDEX <lfs_cell_wa>-row_id.
    IF sy-subrc 0.
*      如果是交货数量,判断其有效性
      IF <lfs_cell_wa>-fieldname 'CUR_MENGE' .
        CATCH SYSTEM-EXCEPTIONS convt_no_number 1.
          PERFORM frm_zero_input  USING CHANGING <lfs_cell_wa>-value.
          gt_alv_item-cur_menge <lfs_cell_wa>-value.
        ENDCATCH.
        IF sy-subrc  0.
          IF gt_alv_item-menge < gt_alv_item-cur_menge.
            CALL METHOD p_er_data_changed->add_protocol_entry
              EXPORTING
                i_msgid     'ZSD_001'
                i_msgty     'E'
                i_msgno     '008'
                i_fieldname 'CUR_MENGE'
                i_row_id    <lfs_cell_wa>-row_id.
          ELSE.
            gt_alv_item-left_menge gt_alv_item-menge gt_alv_item-cur_menge."剩余交货数量 = 未清数量 -本次交货数量
            gt_alv_item-sum_netpr gt_alv_item-netpr * gt_alv_item-cur_menge / 1000."交货金额 = 产品单价 * 本次交货数量
            gt_alv_item-cur_volum gt_alv_item-volum * gt_alv_item-cur_menge."本次交货体积 = 体积 * 本次交货数量
            MODIFY gt_alv_item INDEX <lfs_cell_wa>-row_id.
          ENDIF.
        ENDIF.
      ENDIF.
*      如果勾选,提前更新内表
      IF <lfs_cell_wa>-fieldname 'SEL' .
        gt_alv_item-sel <lfs_cell_wa>-value.
        MODIFY gt_alv_item INDEX <lfs_cell_wa>-row_id.
      ENDIF.
    ENDIF.
  ENDLOOP.

  PERFORM frm_store_item."存储ITEM
*  PERFORM frm_sum."累计
*  PERFORM frm_refresh_screen."刷新SCREEN,ALV
  PERFORM frm_refresh_alv CHANGING gcl_alv_item.
ENDFORM.                    " HANDLE_DATA_CHANGED_ITEM

*&---------------------------------------------------------------------*
*&      Form  handle_data_changed_finished
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_MODIFIED     text
*      -->P_ET_GOOD_CELLS  text
*----------------------------------------------------------------------*
FORM handle_data_changed_finished  USING p_e_modified
                       p_et_good_cells TYPE lvc_t_modi.
  DATA:ls_good_cells TYPE lvc_s_modi.

  LOOP AT p_et_good_cells INTO ls_good_cells .
    READ TABLE gt_alv_item INDEX ls_good_cells-row_id.
    IF sy-subrc 0.
      CASE ls_good_cells-fieldname.
        WHEN 'WERKS'.
*      读取对应描述字段
          gt_alv_item-werks_change 'X'.
*        取工厂描述
          SELECT SINGLE name1
            FROM t001w
            INTO  gt_alv_item-werks_txt
          WHERE werks gt_alv_item-werks
              AND spras sy-langu.
        WHEN 'LGORT'.
*        取库存地点描述
          SELECT SINGLE lgobe
            FROM t001l
            INTO gt_alv_item-lgobe
          WHERE werks gt_alv_item-werks
              AND lgort gt_alv_item-lgort.
      ENDCASE.
      MODIFY gt_alv_item INDEX ls_good_cells-row_id.
    ENDIF.
  ENDLOOP.
  PERFORM frm_refresh_alv CHANGING gcl_alv_item.
ENDFORM.                    " handle_data_changed_finished

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_CHANGED_DATA
*&---------------------------------------------------------------------*
*       获取改变数据
*----------------------------------------------------------------------*
FORM frm_check_changed_data USING pcl_alv TYPE REF TO cl_gui_alv_grid.
  DATA:
        l_valid.
  CALL METHOD pcl_alv->check_changed_data
    IMPORTING
      e_valid l_valid.
ENDFORM.                    "FRM_CHECK_CHANGED_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_DETAIL
*&---------------------------------------------------------------------*
*       获取明细
*----------------------------------------------------------------------*
FORM frm_show_detail .
  CLEAR:gt_alv_item,gt_alv_item[].
  PERFORM frm_check_changed_data USING gcl_alv_head.
*  获取明细
  LOOP AT gt_alv_head WHERE sel 'X'.
    LOOP AT gt_alv_item_store WHERE vbeln gt_alv_head-vbeln.
      MOVE-CORRESPONDING gt_alv_item_store TO gt_alv_item.
      APPEND gt_alv_item.
      CLEAR gt_alv_item.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    " FRM_SHOW_DETAIL

*&---------------------------------------------------------------------*
*&      Form  FRM_FILL_MSG
*&---------------------------------------------------------------------*
*       填充信息
*----------------------------------------------------------------------*
*  <--  P_MESSAGE        消息
*----------------------------------------------------------------------*
FORM frm_fill_msg TABLES pt_mtab STRUCTURE bapiret2
                            CHANGING p_message.
  DATA:
        l_i(10),
        l_message(220).
  CLEAR p_message.
  LOOP AT pt_mtab.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        msgid               pt_mtab-id
        msgnr               pt_mtab-number
        msgv1               pt_mtab-message_v1
        msgv2               pt_mtab-message_v2
        msgv3               pt_mtab-message_v3
        msgv4               pt_mtab-message_v4
      IMPORTING
        message_text_output l_message.

    CONDENSE p_message.
    CONCATENATE p_message l_message INTO p_message SEPARATED BY ' '.
  ENDLOOP.

ENDFORM.                    " FRM_FILL_MESSAGE

*&--------------------------------------------------------------------*
*&      Form  FRM_HINTMSGTXT
*&--------------------------------------------------------------------*
*       显示状态栏信息
*---------------------------------------------------------------------*
FORM frm_hintmsgtxt USING p_per p_msg.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage p_per
      text       p_msg
    EXCEPTIONS
      OTHERS     1.
ENDFORM.                    "FRM_HINTMSGTXT

*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE
*&---------------------------------------------------------------------*
*       创建提单
*----------------------------------------------------------------------*
FORM frm_create .
  DATA:
        l_continue,
        l_message(220),
        l_labst TYPE mard-labst,
        l_lfimg TYPE lips-lfimg,
        l_c_menge(20),
        l_matnr TYPE matnr,
        l_sum_netpr LIKE gt_alv_head-zkyed,
        lt_alv_item LIKE TABLE OF gt_alv_item WITH HEADER LINE,
        l_delevery TYPE bapishpdelivnumb-deliv_numb,
        lt_vbap TYPE TABLE OF vbap WITH HEADER LINE,
        lt_item TYPE TABLE OF bapidlvreftosalesorder WITH HEADER LINE,
        lt_serial TYPE TABLE OF bapidlvserialnumber WITH HEADER LINE,
        lt_ex1 TYPE TABLE OF bapiparex WITH HEADER LINE,
        lt_delnum TYPE TABLE OF bapishpdelivnumb WITH HEADER LINE,
        lt_create TYPE TABLE OF bapidlvitemcreated WITH HEADER LINE,
        lt_ex2 TYPE TABLE OF bapiparex WITH HEADER LINE,
        lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
*Changed By Ryan Liu In 04.07.2012 16:45:26."每次提单创建的时候都对该客户授信进行重新读取
        lt_sd_01 TYPE TABLE OF zzs_sd_002 WITH HEADER LINE,
        lt_sd_02 TYPE TABLE OF zzs_sd_003 WITH HEADER LINE,
        lt_sd_03 TYPE TABLE OF zzs_sd_004 WITH HEADER LINE,
        lt_sd_04 TYPE TABLE OF zzs_sd_005 WITH HEADER LINE.
*End Of Change.

*退货率
DATA L_T_SD023 LIKE ZZT_SD_023.
DATA L_V_GJAHR LIKE ZZT_SD_023-GJAHR.
L_V_GJAHR SY-DATUM+0(4).
L_V_GJAHR L_V_GJAHR .

  lt_alv_item[] gt_alv_item[].
  DELETE lt_alv_item WHERE sel ''.
  SORT lt_alv_item BY vbeln lifnr.
  DELETE ADJACENT DUPLICATES FROM lt_alv_item COMPARING vbeln lifnr.

  LOOP AT lt_alv_item.
    l_continue ''.
*    判断交货工厂是否修改
    LOOP AT gt_alv_item WHERE sel 'X'
                                       AND vbeln lt_alv_item-vbeln.
      IF gt_alv_item-werks_change 'X'.
        gt_alv_item-message '交货工厂已修改,请先保存'.
        gt_alv_item-status icon_red_light.
        l_continue 'X'.
        MODIFY gt_alv_item.
      ENDIF.

*    检查库存地点一致性
      IF gt_alv_item-lgort <> lt_alv_item-lgort.
        gt_alv_item-message '库存地点不一致'.
        gt_alv_item-status icon_red_light.
        l_continue 'X'.
        MODIFY gt_alv_item.
      ENDIF.

*    交货库存地点必输
      IF gt_alv_item-lgort ''.
        gt_alv_item-message '请输入库存地点'.
        gt_alv_item-status icon_red_light.
        l_continue 'X'.
        MODIFY gt_alv_item.
      ENDIF.

*     库存数量
      SELECT SINGLE labst
        FROM mard INTO l_labst
        WHERE matnr gt_alv_item-matnr
           AND werks gt_alv_item-werks
           AND lgort gt_alv_item-lgort.

*    交货计划数量
      SELECT SUMlfimg )
        FROM lips AS t01
        INNER JOIN vbup AS t02 ON t01~vbeln t02~vbeln AND t01~posnr t02~posnr AND t02~wbsta <> 'C'
        INTO l_lfimg
        WHERE matnr gt_alv_item-matnr
         AND werks gt_alv_item-werks
         AND lgort gt_alv_item-lgort.
      l_labst l_labst l_lfimg.
      IF l_labst < gt_alv_item-cur_menge.
        l_c_menge l_labst.
        CONDENSE l_c_menge.
        l_matnr gt_alv_item-matnr.
        PERFORM frm_alpha_output CHANGING l_matnr.
        gt_alv_item-message '仅物料 ' && l_c_menge && '的' && l_matnr && ' 可用'.
        gt_alv_item-status icon_red_light.
        l_continue 'X'.
        MODIFY gt_alv_item.
      ENDIF.

      READ TABLE gt_alv_head WITH KEY vbeln lt_alv_item-vbeln.
      IF sy-subrc 0.
            SELECT SINGLE INTO L_T_SD023 FROM ZZT_SD_023
              WHERE KUNNR gt_alv_head-KUNNR AND VKORG gt_alv_head-VKORG AND MATNR gt_alv_item-matnr AND GJAHR L_V_GJAHR.
            IF SY-SUBRC 0.
              IF L_T_SD023-ZCHEC NE 'X'.
                  gt_alv_item-message '客户该物料退货率过高'.
                  gt_alv_item-status icon_red_light.
                  l_continue 'X'.
                  MODIFY gt_alv_item.
              ENDIF.
            ENDIF.
      ENDIF.

    ENDLOOP.

    IF l_continue 'X'.
      CONTINUE.
    ENDIF.

*    判断授信额度
    READ TABLE gt_alv_head WITH KEY vbeln lt_alv_item-vbeln.
    IF sy-subrc 0.
      IF NOT gt_alv_head-auart 'ZBCE' OR gt_alv_head-auart 'ZBDE' OR gt_alv_head-auart 'ZBRE')."排除三种订单类型
        l_sum_netpr 0.
*Changed By Ryan Liu
        LOOP AT gt_alv_item WHERE sel 'X' AND kunnr lt_alv_item-kunnr."AND vbeln = lt_alv_item-vbeln.
          l_sum_netpr l_sum_netpr + gt_alv_item-sum_netpr."交货总金额
        ENDLOOP.

        IF l_sum_netpr > gt_alv_head-zkyed."交货总金额 > 可用额度
          LOOP AT gt_alv_item WHERE sel 'X' AND vbeln lt_alv_item-vbeln.
            gt_alv_item-message '可用授信额度不足'.
            gt_alv_item-status icon_red_light.
            MODIFY gt_alv_item.
          ENDLOOP.
          CONTINUE.
        ENDIF.

        IF gt_alv_head-zcqts > 0.                           "超期天数小于0
          LOOP AT gt_alv_item WHERE sel 'X' AND vbeln lt_alv_item-vbeln.
            gt_alv_item-message '超期天数大于0'.
            gt_alv_item-status icon_red_light.
            MODIFY gt_alv_item.
          ENDLOOP.
          CONTINUE.
        ENDIF.

*inserted by pym 20121231
IF SY-DATUM+0(4>= 2013.
DATA L_T_SD019 LIKE ZZT_SD_019.
SELECT SINGLE INTO L_T_SD019 FROM ZZT_SD_019
  WHERE KUNNR gt_alv_head-KUNNR AND VKORG gt_alv_head-VKORG AND ZCHEC 'X' AND GJAHR SY-DATUM+0(4).
IF SY-SUBRC NE 0.
          LOOP AT gt_alv_item WHERE sel 'X' AND vbeln lt_alv_item-vbeln.
            gt_alv_item-message '客户合同未启用'.
            gt_alv_item-status icon_red_light.
            MODIFY gt_alv_item.
          ENDLOOP.
          CONTINUE.
ENDIF.
DATA L_T_SD018 LIKE ZZT_SD_018.
*DATA L_V_GJAHR LIKE ZZT_SD_018-GJAHR.
*L_V_GJAHR = SY-DATUM+0(4).
*L_V_GJAHR = L_V_GJAHR - 1 .
SELECT SINGLE INTO L_T_SD018 FROM ZZT_SD_018 WHERE KUNNR gt_alv_head-KUNNR AND VKORG gt_alv_head-VKORG AND GJAHR SY-DATUM+0(4).
IF SY-SUBRC 0.
  IF L_T_SD018-WRBTR > AND L_T_SD018-ZCHEC NE 'X'.
          LOOP AT gt_alv_item WHERE sel 'X' AND vbeln lt_alv_item-vbeln.
            gt_alv_item-message '客户上年欠款'.
            gt_alv_item-status icon_red_light.
            MODIFY gt_alv_item.
          ENDLOOP.
          CONTINUE.
  ENDIF.
ENDIF.

SELECT SINGLE INTO L_T_SD023 FROM ZZT_SD_023
  WHERE KUNNR gt_alv_head-KUNNR AND VKORG gt_alv_head-VKORG AND MATNR '' AND GJAHR L_V_GJAHR.
IF SY-SUBRC 0.
  IF L_T_SD023-ZCHEC NE 'X'.
          LOOP AT gt_alv_item WHERE sel 'X' AND vbeln lt_alv_item-vbeln.
            gt_alv_item-message '客户退货率过高'.
            gt_alv_item-status icon_red_light.
            MODIFY gt_alv_item.
          ENDLOOP.
          CONTINUE.
  ENDIF.
ENDIF.

ENDIF.
*endofinstert

*Insert By Ryan Liu In 28.06.2012 15:15:17.
        DATA:ty_hkl TYPE zzt_sd_003a.
        SELECT SINGLE INTO ty_hkl FROM zzt_sd_003a WHERE vkorg gt_alv_head-vkorg.
        IF ty_hkl-zhkl 'X'.
          IF gt_alv_head-zhklce < 0.
            LOOP AT gt_alv_item WHERE sel 'X' AND vbeln lt_alv_item-vbeln.
              gt_alv_item-message '回款率未达标准'.
              gt_alv_item-status icon_red_light.
              MODIFY gt_alv_item.
            ENDLOOP.
            CONTINUE.
          ENDIF.
        ENDIF.
*End Of Insert.
      ENDIF.
    ENDIF.

*    相同销售订单同一交货单
    LOOP AT gt_alv_item WHERE sel 'X'
                                       AND vbeln lt_alv_item-vbeln.
      lt_item-ref_doc  gt_alv_item-vbeln."参考凭证
      lt_item-ref_item  gt_alv_item-posnr."参考项
      lt_item-dlv_qty  gt_alv_item-cur_menge."实际已交货量(按销售单位)
      lt_item-sales_unit  gt_alv_item-vrkme."销售单位
      APPEND lt_item.
      lt_vbap-vbeln gt_alv_item-vbeln."销售凭证
      lt_vbap-posnr gt_alv_item-posnr."销售凭证行
      lt_vbap-lgort gt_alv_item-lgort."库存地点
      APPEND lt_vbap.
    ENDLOOP.

    EXPORT lt_vbap TO MEMORY ID 'LT_VBAP'.
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
*      EXPORTING
*        ship_point        = gt_alv_item-werks
      IMPORTING
        delivery          l_delevery
      TABLES
        sales_order_items lt_item
*       serial_numbers    = lt_serial
*       extension_in      = lt_ex1
*       deliveries        = lt_delnu
*       created_items     = lt_create
*       extension_out     = lt_ex2
        return            lt_return.

    IF l_delevery IS NOT INITIAL.
      COMMIT WORK AND WAIT.
*      写提单号和日志消息
      LOOP AT gt_alv_item WHERE sel 'X'
                                      AND vbeln lt_alv_item-vbeln.
        gt_alv_item-vbeln_k l_delevery.
        CONCATENATE '交货单' l_delevery '成功创建;' INTO gt_alv_item-message.
        gt_alv_item-status icon_green_light.

*        更新行交货状态
        SELECT SINGLE lfsta
          FROM vbup
          INTO gt_alv_item-lfsta
          WHERE vbeln gt_alv_item-vbeln
          AND posnr gt_alv_item-posnr.

        MODIFY gt_alv_item.
      ENDLOOP.
*      更新头交货状态
      READ TABLE gt_alv_head WITH KEY vbeln lt_alv_item-vbeln.
      IF sy-subrc 0.
        SELECT SINGLE lfstk
          FROM vbuk
          INTO gt_alv_head-lfstk
        WHERE vbeln gt_alv_head-vbeln.
        MODIFY gt_alv_head INDEX sy-tabix.
      ENDIF.

*Inserted By Ryan Liu In 05.07.2012 10:42:25.
      LOOP AT gt_alv_head WHERE kunnr lt_alv_item-kunnr.
*  每次提单成功后都重新获取该客户授信信息
        RANGES:r_kunnr FOR vbak-kunnr,
               r_vkorg FOR vbak-vkorg.

        r_kunnr-sign 'I'.
        r_kunnr-option 'EQ'.
        r_kunnr-low gt_alv_head-kunnr.
        APPEND r_kunnr.

        r_vkorg-sign 'I'.
        r_vkorg-option 'EQ'.
        r_vkorg-low gt_alv_head-vkorg.
        APPEND r_vkorg.
        CLEAR:lt_sd_01[],lt_sd_02[],lt_sd_03[],lt_sd_04[].
        CALL FUNCTION 'ZSDF_016'
*          EXPORTING
*           I_DATE  = SY-DATUM
*           I_C1    = 'X'
*           I_C2    = 'X'
*           i_C3    = 'X'
          TABLES
*           T_BUKRS =
            t_kunnr r_kunnr
            t_vkorg r_vkorg
*           T_VTWEG =
*           T_SPART =
            t_data1 lt_sd_01
            t_data2 lt_sd_02
            t_data3 lt_sd_03
            t_data4 lt_sd_04.

        READ TABLE lt_sd_02 WITH KEY bukrs gt_alv_head-bukrs_vf
                                                    kunnr gt_alv_head-kunnr
                                                    vkorg gt_alv_head-vkorg"销售组织
                                                    vtweg gt_alv_head-vtweg"分销渠道
                                                    spart gt_alv_head-spart."产品组
        IF sy-subrc 0.
          gt_alv_head-zkyed lt_sd_02-zkyed.
        ENDIF.
        READ TABLE lt_sd_03 WITH KEY bukrs gt_alv_head-bukrs_vf
                                                    kunnr gt_alv_head-kunnr
                                                    vkorg gt_alv_head-vkorg"销售组织
                                                    vtweg gt_alv_head-vtweg"分销渠道
                                                    spart gt_alv_head-spart."产品组
        IF sy-subrc 0.
          gt_alv_head-zcqts lt_sd_03-zcqts.
        ENDIF.
        READ TABLE lt_sd_04 WITH KEY bukrs gt_alv_head-bukrs_vf
                                                    kunnr gt_alv_head-kunnr
                                                    vkorg gt_alv_head-vkorg"销售组织
                                                    vtweg gt_alv_head-vtweg"分销渠道
                                                    spart gt_alv_head-spart."产品组
        IF sy-subrc 0.
          gt_alv_head-zhklce lt_sd_04-zhklce.
        ENDIF.
        MODIFY gt_alv_head.
        CLEAR gt_alv_head.
      ENDLOOP.
*End Of Insert.
    ELSE.
      LOOP AT lt_return WHERE type  'E' OR type  'A'.
        CONCATENATE l_message lt_return-message INTO l_message.
      ENDLOOP.

      LOOP AT gt_alv_item WHERE sel 'X'
                                       AND vbeln lt_alv_item-vbeln.
        gt_alv_item-message l_message.
        gt_alv_item-status icon_red_light.
        MODIFY gt_alv_item.
      ENDLOOP.
    ENDIF.

    CLEAR:
    l_delevery,l_message,
    lt_item,lt_item[],
    lt_return,lt_return[].
  ENDLOOP.

ENDFORM.                    " FRM_CREATE

*&---------------------------------------------------------------------*
*&      Form  frm_update_lgort
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_update_lgort.
  DATA:
      l_message(220),
      l_mode(2),
      lt_alv_item LIKE TABLE OF gt_alv_item WITH HEADER LINE,
      lt_lips TYPE TABLE OF lips WITH HEADER LINE,
      l_vbeln LIKE likp-vbeln,
      ls_head TYPE vbkok,
      lt_prott TYPE TABLE OF prott WITH HEADER LINE,
      lt_item TYPE TABLE OF vbpok WITH HEADER LINE.

  lt_alv_item[] gt_alv_item[].
  DELETE lt_alv_item WHERE sel ''
                                    OR vbeln_k ''.
  SORT lt_alv_item BY vbeln_k.
  DELETE ADJACENT DUPLICATES FROM lt_alv_item COMPARING vbeln_k.

  LOOP AT lt_alv_item.
*    头数据
    ls_head-vbeln_vl lt_alv_item-vbeln_k.
    ls_head-vbeln lt_alv_item-vbeln_k.
    ls_head-stge_loc_change 'X'.

*    查询对应交货单行数据
    SELECT *
      INTO TABLE lt_lips
      FROM lips
    WHERE vbeln lt_alv_item-vbeln_k.

    LOOP AT gt_alv_item WHERE vbeln_k lt_alv_item-vbeln_k.
      READ TABLE lt_lips WITH KEY vgbel gt_alv_item-vbeln
                                                    vgpos gt_alv_item-posnr.
      IF sy-subrc 0.
        IF lt_lips-lgort <> gt_alv_item-lgort."如果交货库存地点不同,以内表数据为准
          lt_item-vbeln lt_lips-vbeln.
          lt_item-posnn lt_lips-posnr.
          lt_item-vbeln_vl lt_lips-vbeln.
          lt_item-posnr_vl lt_lips-posnr.
          lt_item-matnr lt_lips-matnr.
          lt_item-werks lt_lips-werks.
          lt_item-lgort gt_alv_item-lgort.
          lt_item-mdiff_lgort gt_alv_item-lgort.
          lt_item-taqui  'X'.
*          lt_item-meins = lt_lips-meins.
*          lt_item-lianp = 'X'.
          lt_item-kzpod ' '.
          APPEND lt_item.
          CLEAR lt_item.
        ENDIF.
      ENDIF.
    ENDLOOP.
    CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
      EXPORTING
        vbkok_wa                     ls_head
        synchron                     'X'
        no_messages_update_1         'X'
        commit                       'X'
        delivery                     ls_head-vbeln_vl
        update_picking               'X'
*       NICHT_SPERREN_1              = ' '
*       IF_CONFIRM_CENTRAL           = ' '
*       IF_WMPP                      = ' '
*       IF_GET_DELIVERY_BUFFERED     = ' '
*       IF_NO_GENERIC_SYSTEM_SERVICE = ' '
*       IF_DATABASE_UPDATE_1         = '1'
*       IF_NO_INIT_1                 = ' '
*       IF_NO_READ_1                 = ' '
*       IF_ERROR_MESSAGES_SEND       = 'X'
*       IF_NO_BUFFER_REFRESH         = ' '
*       IT_PARTNER_UPDATE            =
*       IT_SERNR_UPDATE              =
*       IF_NO_REMOTE_CHG_1           = ' '
*       IF_NO_MES_UPD_PACK           = ' '
*       IF_LATE_DELIVERY_UPD         = ' '
*       IF_TXT_REINITIALIZE          =
*       IF_BOR_INIT                  = ' '
*       SPE_MES_NO_SEND_NODIAL       =
*       IT_LECOMP_1                  =
      TABLES
        vbpok_tab                    lt_item
        prot                         lt_prott.

*    CALL FUNCTION ' WS_DELIVERY_UPDATE_2'
*      EXPORTING
*        vbkok_wa       = ls_head
*        synchron       = 'X'
*        commit         = 'X'
*        update_picking = 'X'
*        delivery       = ls_head-vbeln_vl
*      TABLES
**       it_packing     = lt_item
*        vbpok_tab      = lt_item
*        prot           = lt_prott
*      EXCEPTIONS
*        error_message  = 1.

    IF sy-subrc 0.
      COMMIT WORK AND WAIT.
      CONCATENATE '交货单'
                                   lt_alv_item-vbeln_k '库存地点更改成功;'
                          INTO l_message.
    ELSE.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               sy-msgid
          msgnr               sy-msgno
          msgv1               sy-msgv1
          msgv2               sy-msgv2
          msgv3               sy-msgv3
          msgv4               sy-msgv4
        IMPORTING
          message_text_output l_message.
      gt_alv_item-status icon_red_light.
    ENDIF.

*    更新日志信息
    LOOP AT gt_alv_item WHERE vbeln_k lt_alv_item-vbeln_k.
      CONCATENATE gt_alv_item-message l_message INTO gt_alv_item-message.
      MODIFY gt_alv_item TRANSPORTING message.
    ENDLOOP.

    CLEAR:ls_head,lt_item,lt_item[].
  ENDLOOP.
ENDFORM.                    "frm_update_lgort
*&---------------------------------------------------------------------*
*&      Form  frm_change_lgort
*&---------------------------------------------------------------------*
*       更改交货单库存地点
*----------------------------------------------------------------------*

FORM frm_change_lgort .
  DATA:
      l_message(220),
      l_mode(2),
      lt_alv_item LIKE TABLE OF gt_alv_item WITH HEADER LINE,
      lt_lips TYPE TABLE OF lips WITH HEADER LINE,
      ls_vbpa TYPE vbpa,
      ls_header_data TYPE bapiobdlvhdrchg,
      ls_header_control TYPE bapiobdlvhdrctrlchg,
      ls_techn_control TYPE bapidlvcontrol,
      lt_header_partner TYPE TABLE OF bapidlvpartnerchg WITH HEADER LINE,
      lt_item_data TYPE TABLE OF bapiobdlvitemchg WITH HEADER LINE,
      lt_item_control TYPE TABLE OF bapiobdlvitemctrlchg WITH HEADER LINE,
      lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.

  lt_alv_item[] gt_alv_item[].
  DELETE lt_alv_item WHERE sel ''
                                    OR vbeln_k ''.
  SORT lt_alv_item BY vbeln_k.
  DELETE ADJACENT DUPLICATES FROM lt_alv_item COMPARING vbeln_k.
  LOOP AT lt_alv_item.
    ls_header_data-deliv_numb lt_alv_item-vbeln_k.
    ls_header_control-deliv_numb lt_alv_item-vbeln_k.

*    查询对应交货单行数据
    SELECT *
      INTO TABLE lt_lips
      FROM lips
      WHERE vbeln lt_alv_item-vbeln_k.

    LOOP AT gt_alv_item WHERE vbeln_k lt_alv_item-vbeln_k.
      READ TABLE lt_lips WITH KEY vgbel gt_alv_item-vbeln
                                                 vgpos gt_alv_item-posnr.
      IF sy-subrc 0.
        IF lt_lips-lfimg <> gt_alv_item-cur_menge."如果交货单数量不同,以内表数据为准
          lt_item_data-deliv_numb lt_alv_item-vbeln_k.
          lt_item_data-deliv_item lt_lips-posnr.
          lt_item_data-material lt_lips-matnr.
          lt_item_data-dlv_qty gt_alv_item-cur_menge.
          lt_item_data-fact_unit_nom 1.
          lt_item_data-fact_unit_denom 1.
          APPEND lt_item_data.
          CLEAR lt_item_data.
          lt_item_control-deliv_numb lt_alv_item-vbeln_k.
          lt_item_control-deliv_item lt_lips-posnr.
          lt_item_control-chg_delqty 'X'.
          APPEND lt_item_control.
          CLEAR lt_item_control.
        ENDIF.
      ENDIF.
    ENDLOOP.
*    行项目,修改交货数量

    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
      EXPORTING
        header_data    ls_header_data
        header_control ls_header_control
        delivery       lt_alv_item-vbeln_k
        techn_control  ls_techn_control
      TABLES
        header_partner lt_header_partner
        item_data      lt_item_data
        item_control   lt_item_control
        return         lt_return.

    IF lt_return[] IS INITIAL.
      COMMIT WORK AND WAIT.
      IF l_mode 'X'.
        CONCATENATE '交货单'
                                     lt_alv_item-vbeln_k '库存地点'
                                     lt_alv_item-lifnr '更改成功;'
                            INTO l_message.
      ENDIF.
    ELSE.
      PERFORM frm_fill_msg TABLES lt_return CHANGING l_message.
    ENDIF.

*    更新日志信息
    LOOP AT gt_alv_item WHERE vbeln_k lt_alv_item-vbeln_k.
      CONCATENATE gt_alv_item-message l_message INTO gt_alv_item-message.
      MODIFY gt_alv_item TRANSPORTING message.
    ENDLOOP.

    CLEAR:
    l_mode,
    ls_header_data,ls_header_control,ls_techn_control,
    lt_header_partner,lt_header_partner[],
    lt_item_data,lt_item_data[],
    lt_item_control,lt_item_control[],
    lt_return,lt_return[].
  ENDLOOP.
ENDFORM.                    " frm_change_lgort

*&---------------------------------------------------------------------*
*&      Form  FRM_ALPHA_INPUT
*&---------------------------------------------------------------------*
*       补前置0
*----------------------------------------------------------------------*
FORM frm_alpha_input  CHANGING p_input.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  p_input
    IMPORTING
      output p_input.
ENDFORM.                    " FRM_ALPHA_INPUT

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_LIFNR_NAME
*&---------------------------------------------------------------------*
*       获取供应商名称
*----------------------------------------------------------------------*
*      -->P_LIFNR  供应商
*      <--P_NAME  供应商名称
*----------------------------------------------------------------------*
FORM frm_get_lifnr_name  USING    p_lifnr
                         CHANGING p_name.

  SELECT SINGLE name1
    INTO p_name
    FROM lfa1
    WHERE lifnr p_lifnr.
ENDFORM.                    " FRM_GET_LIFNR_NAME

*&---------------------------------------------------------------------*
*&      Form  FRM_STORE_ITEM
*&---------------------------------------------------------------------*
*       存储item
*----------------------------------------------------------------------*
FORM frm_store_item .
  LOOP AT gt_alv_item.
    READ TABLE gt_alv_item_store WITH KEY vbeln gt_alv_item-vbeln
                                                               posnr gt_alv_item-posnr.
    IF sy-subrc 0.
      MOVE-CORRESPONDING gt_alv_item TO gt_alv_item_store.
      MODIFY gt_alv_item_store INDEX sy-tabix.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " FRM_STORE_ITEM

*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_SCREEN
*&---------------------------------------------------------------------*
*       刷新ALV Container所在屏幕,触发PAI
*----------------------------------------------------------------------*
FORM frm_refresh_screen .
  CALL METHOD cl_gui_cfw=>set_new_ok_code
    EXPORTING
      new_code '\00'.
  CALL METHOD cl_gui_cfw=>flush.
ENDFORM.                    " FRM_REFRESH_SCREEN

*&---------------------------------------------------------------------*
*&      Form  FRM_SUM
*&---------------------------------------------------------------------*
*       累计
*----------------------------------------------------------------------*
FORM frm_sum .
  CLEAR:in_wqsl,in_jhsl,in_jhtj.
  LOOP AT gt_alv_item WHERE sel 'X'.
    in_wqsl in_wqsl + gt_alv_item-menge.
    in_jhsl in_jhsl + gt_alv_item-cur_menge.
    in_jhtj in_jhtj + gt_alv_item-cur_menge * gt_alv_item-volum.
  ENDLOOP.
ENDFORM.                    " FRM_SUM
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_DISABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_set_disable .
  LOOP AT gt_alv_item WHERE vbeln_k IS NOT INITIAL.
    CLEAR gt_alv_item-cellstyles[].
    gt_alv_item-sel ''.
    PERFORM frm_set_edit USING 'SEL' 'DISABLE' CHANGING gt_alv_item-cellstyles.
    PERFORM frm_set_edit USING 'CUR_MENGE' 'DISABLE' CHANGING gt_alv_item-cellstyles.
    PERFORM frm_set_edit USING 'WERKS' 'DISABLE' CHANGING gt_alv_item-cellstyles.
*    PERFORM frm_set_edit USING 'LGORT' 'DISABLE' CHANGING gt_alv_item-cellstyles.
*    PERFORM frm_set_edit USING 'CHARG' 'DISABLE' CHANGING gt_alv_item-cellstyles.
    MODIFY gt_alv_item.
  ENDLOOP.
ENDFORM.                    " FRM_SET_DISABLE

*&---------------------------------------------------------------------*
*&      Form  frm_set_edit
*&---------------------------------------------------------------------*
*       设置字段是否可编辑
*----------------------------------------------------------------------*
*      -->P_FIELDNAME  字段名
*      -->P_ENABLE  是否可用
*      <--P_T_STYLE  样式表
*----------------------------------------------------------------------*
FORM frm_set_edit  USING    p_fieldname
                                           p_enable
                             CHANGING pt_style TYPE lvc_t_styl.
  DATA lw_style TYPE lvc_s_styl.
  lw_style-fieldname p_fieldname.
  IF p_enable 'DISABLE'.
    lw_style-style cl_gui_alv_grid=>mc_style_disabled.
  ELSE.
    lw_style-style cl_gui_alv_grid=>mc_style_enabled.
  ENDIF.
  INSERT lw_style INTO TABLE pt_style.
ENDFORM.                    " frm_set_edit

*&---------------------------------------------------------------------*
*&      Form  FRM_DO_BDC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_do_bdc .
  DATA:
          l_mode VALUE 'N',
          l_type,
          l_message(220),
          l_delivery TYPE likp-vbeln,
          lt_bdc LIKE TABLE OF bdcdata WITH HEADER LINE,
          lt_mtab LIKE TABLE OF bdcmsgcoll WITH HEADER LINE,
          lt_alv_item LIKE TABLE OF gt_alv_item WITH HEADER LINE.

  LOOP AT gt_alv_item WHERE sel 'X'.
    MOVE-CORRESPONDING gt_alv_item TO lt_alv_item.
    APPEND lt_alv_item.
    CLEAR lt_alv_item.
  ENDLOOP.
*销售凭证类型,售达方,送达方,货运代理,装运点,头产品组
  SORT lt_alv_item BY auart kunnr kunwe lifnr vstel spart_head.
  DELETE ADJACENT DUPLICATES FROM lt_alv_item COMPARING auart kunnr kunwe lifnr vstel spart_head.

  LOOP AT lt_alv_item.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING 'X' 'SAPMV50A'  '4001'.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'BDC_OKCODE'  '/00'.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LIKP-VSTEL'  lt_alv_item-vstel.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-DATBI'  '99991231'.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-VBELN'  lt_alv_item-vbeln.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-ABPOS'  lt_alv_item-posnr.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-BIPOS'  lt_alv_item-posnr.
    LOOP AT gt_alv_item WHERE auart lt_alv_item-auart
                                        AND kunnr lt_alv_item-kunnr
                                        AND kunwe lt_alv_item-kunwe
                                        AND lifnr lt_alv_item-lifnr
                                        AND vstel lt_alv_item-vstel
                                        AND sel 'X'.
      IF gt_alv_item-vbeln lt_alv_item-vbeln
  AND gt_alv_item-posnr lt_alv_item-posnr.
        CONTINUE.
      ENDIF.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING 'X' 'SAPMV50A'  '1000'.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'BDC_OKCODE'  '=RAUF_T'.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING 'X' 'SAPMV50A'  '0105'.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'BDC_OKCODE'  '=ENT1'.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-DATBI'  '99991231'.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-VBELN'  gt_alv_item-vbeln.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-ABPOS'  gt_alv_item-posnr.
      PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'LV50C-BIPOS'  gt_alv_item-posnr.
    ENDLOOP.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING 'X' 'SAPMV50A'  '1000'.
    PERFORM frm_fill_bdc_table TABLES lt_bdc USING '' 'BDC_OKCODE'  '=SICH_T'.

    CALL TRANSACTION 'VL01N' USING lt_bdc
                          MESSAGES INTO lt_mtab
                          MODE l_mode.

    PERFORM frm_fill_bdc_msg TABLES lt_mtab CHANGING l_message.
    READ TABLE lt_mtab WITH KEY msgtyp 'E'.
    IF sy-subrc 0.
      l_type 'E'.
    ENDIF.
*    写交货单
    READ TABLE lt_mtab WITH KEY msgid 'VL'
                                                 msgnr '311'.
    IF sy-subrc 0.
      l_delivery lt_mtab-msgv2.
      CONCATENATE '交货单'l_delivery '已保存;' INTO l_message.
      PERFORM frm_alpha_input CHANGING l_delivery.
      COMMIT WORK AND WAIT.
    ENDIF.

*    写日志信息
    LOOP AT gt_alv_item WHERE auart lt_alv_item-auart
                                            AND kunnr lt_alv_item-kunnr
                                            AND kunwe lt_alv_item-kunwe
                                            AND lifnr lt_alv_item-lifnr
                                            AND vstel lt_alv_item-vstel
                                            AND sel 'X'.
      gt_alv_item-vbeln_k l_delivery.
      gt_alv_item-message l_message.
      IF l_type 'E'.
        gt_alv_item-status icon_red_light.
      ELSE.
        gt_alv_item-status icon_green_light.
      ENDIF.
      MODIFY gt_alv_item.

*      更新头交货状态
      READ TABLE gt_alv_head WITH KEY vbeln gt_alv_item-vbeln.
      IF sy-subrc 0.
        SELECT SINGLE lfstk
          FROM vbuk
          INTO gt_alv_head-lfstk
        WHERE vbeln gt_alv_head-vbeln.
        MODIFY gt_alv_head INDEX sy-tabix.
      ENDIF.
    ENDLOOP.

    CLEAR:l_delivery,l_message,
    lt_mtab,lt_mtab[],lt_bdc,lt_bdc[].
  ENDLOOP.
  WAIT UP TO SECONDS.
ENDFORM.                    " FRM_DO_BDC

*&---------------------------------------------------------------------*
*&      Form  fill_bdc_table
*&---------------------------------------------------------------------*
*       BDC填充数据
*----------------------------------------------------------------------*
FORM frm_fill_bdc_table  TABLES pt_bdc STRUCTURE bdcdata
                               USING:p_flag p_var1 p_var2.
  CLEAR pt_bdc.
  IF p_flag 'X'.
    pt_bdc-program  p_var1.
    pt_bdc-dynpro   p_var2.
    pt_bdc-dynbegin 'X'.
  ELSE.
    pt_bdc-fnam     p_var1.
    pt_bdc-fval     p_var2.
  ENDIF.

  APPEND pt_bdc.
ENDFORM.                    " fill_bdc_table

*&---------------------------------------------------------------------*
*&      Form  FRM_FILL_BDCMSG
*&---------------------------------------------------------------------*
*       填充信息
*----------------------------------------------------------------------*
*  <--  P_MESSAGE        消息
*----------------------------------------------------------------------*
FORM frm_fill_bdc_msg TABLES pt_mtab STRUCTURE bdcmsgcoll
                                   CHANGING p_message.
  DATA:
        l_message(220).

  LOOP AT pt_mtab.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        msgid               pt_mtab-msgid
        msgnr               pt_mtab-msgnr
        msgv1               pt_mtab-msgv1
        msgv2               pt_mtab-msgv2
        msgv3               pt_mtab-msgv3
        msgv4               pt_mtab-msgv4
      IMPORTING
        message_text_output l_message.

    CONDENSE p_message.
    CONCATENATE p_message l_message INTO p_message SEPARATED BY ' '.
  ENDLOOP.

ENDFORM.                    " FRM_FILL_MESSAGE

*&---------------------------------------------------------------------*
*&      Form  FRM_VARIANT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PS_VARIANT text
*----------------------------------------------------------------------*
FORM frm_variant  USING mode CHANGING ps_variant TYPE disvariant.
  ps_variant-report  sy-repid."ABAP 程序名称
  ps_variant-handle  mode."从相同程序重复调用管理标识
  ps_variant-log_group  ''."逻辑组名
  ps_variant-username  sy-uname."特定用户存储的用户名称
  ps_variant-variant  ''."格式
  ps_variant-text  ''."布局的描述
  ps_variant-dependvars  '' ."相关变式条目向量
ENDFORM.                    " FRM_VARIANT


*&---------------------------------------------------------------------*
*&      Form  frm_f4_cb
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RECORD_TAB   text
*      -->SHLP         text
*      -->CALLCONTROL  text
*----------------------------------------------------------------------*
FORM frm_f4_cb TABLES record_tab STRUCTURE seahlpres
                 CHANGING shlp TYPE shlp_descr_t
                                    callcontrol LIKE ddshf4ctrl.
  DATAinterface LIKE LINE OF shlp-interface.
  READ TABLE shlp-interface INTO interface INDEX 1.
  interface-shlpfield+4(1'5'.
  interface-valfield 'CHARG'.
  APPEND interface TO shlp-interface.
  interface-shlpfield+4(1'3'.
  interface-valfield 'LGOBE'.
  APPEND interface TO shlp-interface.
ENDFORM.                                                    "frm_f4_cb

*&---------------------------------------------------------------------*
*&      Form  frm_f4_cb_1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RECORD_TAB   text
*      -->SHLP         text
*      -->CALLCONTROL  text
*----------------------------------------------------------------------*
FORM frm_f4_cb_1 TABLES record_tab STRUCTURE seahlpres
                 CHANGING shlp TYPE shlp_descr_t
                                    callcontrol LIKE ddshf4ctrl.
  DATAinterface LIKE LINE OF shlp-interface.
  READ TABLE shlp-interface INTO interface INDEX 1.
  interface-shlpfield+4(1'3'.
  interface-valfield 'LGOBE'.
  APPEND interface TO shlp-interface.
ENDFORM.                                                    "frm_f4_cb_1

*&---------------------------------------------------------------------*
*&      Form  FRM_SAVE_ITEM
*&---------------------------------------------------------------------*
*       仅更新销售订单行交货工厂
*----------------------------------------------------------------------*
FORM frm_save_item .
  DATA:
        l_count TYPE int4,
        ls_header TYPE zzs_005,
        lt_item TYPE TABLE OF zzs_003 WITH HEADER LINE,
        lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.

  LOOP AT gt_alv_item WHERE sel 'X'
                                        AND werks_change 'X'.
    CLEAR:ls_header,
              lt_item,lt_item[],
              lt_return,lt_return[].
    ADD TO l_count.
*    头数据
    ls_header-vbeln gt_alv_item-vbeln.
*    行数据
    lt_item-posnr gt_alv_item-posnr.
    lt_item-matnr gt_alv_item-matnr.
    lt_item-werks gt_alv_item-werks.
    APPEND lt_item.

    CALL FUNCTION 'ZSDF_015'
      EXPORTING
        i_header ls_header
      TABLES
        t_item   lt_item[]
        t_return lt_return[].

    READ TABLE lt_return WITH KEY type 'E'.
    IF sy-subrc 0.
      gt_alv_item-message gt_alv_item-message && lt_return-message.
    ELSE.
      gt_alv_item-message gt_alv_item-message && '交货工厂已成功更改。'.
      gt_alv_item-werks_change ''.
    ENDIF.
    MODIFY gt_alv_item.
  ENDLOOP.

  IF l_count 0.
*  007  销售订单没有做任何更改
    MESSAGE s007.
  ENDIF.
ENDFORM.                    " FRM_SAVE_ITEM


*&---------------------------------------------------------------------*
*&      Form  FRM_ZERO_INPUT
*&---------------------------------------------------------------------*
*       补齐小数点后的零
*----------------------------------------------------------------------*
*      >--P_DIGIT  text
*      <--P_INPUT  text
*----------------------------------------------------------------------*
FORM frm_zero_input  USING p_digit CHANGING p_input.

  DATA:
        l_len TYPE i,
        l_circle TYPE i,
        l_str1 TYPE string,
        l_str2 TYPE string.

  SPLIT p_input AT '.'
                       INTO l_str1 l_str2.
  CONDENSE:l_str1,l_str2 NO-GAPS.
  l_len strlenl_str2 ).
  l_circle p_digit l_len.
  DO l_circle TIMES.
    CONCATENATE   l_str2 '0' INTO l_str2.
  ENDDO.
  CONCATENATE l_str1 '.'
                         l_str2 INTO p_input.
  CONDENSE p_input.
ENDFORM.                    " FRM_ZERO_INPUT

*&---------------------------------------------------------------------*
*&      Form  FRM_ALPHA_OUTPUT
*&---------------------------------------------------------------------*
*       去前置0
*----------------------------------------------------------------------*
FORM frm_alpha_output  CHANGING p_output.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      input  p_output
    IMPORTING
      output p_output.

ENDFORM.                    " FRM_ALPHA_OUTPUT

*&---------------------------------------------------------------------*
*&      Form  frm_read_text
*&---------------------------------------------------------------------*
*       读取文本
*----------------------------------------------------------------------*
FORM frm_read_text USING p_vbeln
                         CHANGING p_sgtxt.

  DATA:
        l_tdname TYPE thead-tdname,
        lt_line TYPE TABLE OF tline WITH HEADER LINE.

  CLEAR:lt_line,lt_line[].
  l_tdname p_vbeln.
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      client                  sy-mandt
      id                      '0001'
      language                '1'
      name                    l_tdname
      object                  'VBBK'
    TABLES
      lines                   lt_line
    EXCEPTIONS
      id                      1
      language                2
      name                    3
      not_found               4
      object                  5
      reference_check         6
      wrong_access_to_archive 7
      OTHERS                  8.

  IF sy-subrc 0.
    LOOP AT lt_line.
      CONCATENATE p_sgtxt lt_line-tdline INTO p_sgtxt.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " frm_read_text

*&---------------------------------------------------------------------*
*&      Form  frm_read_text
*&---------------------------------------------------------------------*
*       读取文本
*----------------------------------------------------------------------*
FORM frm_read_item_text USING p_vbeln
                                             p_posnr
                         CHANGING p_sgtxt.

  DATA:
        l_tdname TYPE thead-tdname,
        lt_line TYPE TABLE OF tline WITH HEADER LINE.

  CLEAR:lt_line,lt_line[].
  CONCATENATE p_vbeln p_posnr  INTO l_tdname.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      client                  sy-mandt
      id                      '0001'
      language                '1'
      name                    l_tdname
      object                  'VBBP'
    TABLES
      lines                   lt_line
    EXCEPTIONS
      id                      1
      language                2
      name                    3
      not_found               4
      object                  5
      reference_check         6
      wrong_access_to_archive 7
      OTHERS                  8.

  IF sy-subrc 0.
    LOOP AT lt_line.
      CONCATENATE p_sgtxt lt_line-tdline INTO p_sgtxt.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " frm_read_text

0 0
原创粉丝点击