abap-报价单转销售订单功能的开发

原文:http://gnolux-blog.appspot.com/2010/06/29/abap_2010062901.html

公司业务背景:
    一般是针对客户的应用领域,将相关的产品都会给一份报价,有效期一般都l较长.
    产品本身使用了可配置,报价时只针对一个常用的特性,当建订单时可以从报
    价单复制,并可以修改特性,数量,订单文本等信息,且报价单可以多次被多张订
    单作为复制原。   创建销售单时可以将已有的行,复制为新行并可修改特性为其它
    非常用的。

VA01:标准参照报价复制功能的缺陷:
    1.不能同时从多张报价单参考复制.
     2.同一张报价单只能被一张订单参照.
    3.订单行项目不能复制添加为新行,对于不同行只是少量栏位不同的情况,操作不方便.

针对以上要求重新开发功能 ZVA01:
​​​​​​​

 主界面如下图:

 

查找报价和添加界面:

 

将当前添加项目,转成销售订单 通过bapi :  'BAPI_SALESORDER_CREATEFROMDAT2' 实现

 

转到VA02修改创建的订单

源码如下:

*&---------------------------------------------------------------------*
*& PROGRAM NAME: Z_SD_ENH_036
*& T-CODE:  ZVA01
*& PORGRAM TYPE: Function
*& DESCRIPTION: 从报价单创建销售订单
*&              同时具有销售订单从文件批导入功能
*&------------------------------------------------------------------
*& AUTHOR:  LONGXU
*& DATE:    2010.04.15
*& Blog:    blog.gnolux.com
*&------------------------------------------------------------------
*& FUNCTION SPEC NO.:
*& FUNCITON DESC:
*&
*&-------------------------------------------------------------------
*& Modification Log:
*& Version   Date        Author       DESCRIPTION     CHANGE REQUEST
*& -------- ----------  -----------  -------------  -----------------
*&
*&-------------------------------------------------------------------
*& REFRENCE OBJECT :
*& NAME                   TYPE                DESC
*& ---------------------  -----------------   -----------------------
*&
*&-------------------------------------------------------------------

REPORT  Z_SD_ENH_036.





*&---------------------------------------------------------------------*
*&                  public variant define
*&---------------------------------------------------------------------*
DATA : l_rowno TYPE i.
DATA: g_order_header_in TYPE  bapisdhd1,
          g_order_header_inx TYPE  bapisdhd1x,
          g_salesdocument TYPE bapivbeln-vbeln.

DATA:     g_order_items_in LIKE TABLE OF bapisditm  WITH HEADER LINE,
          g_order_items_inx LIKE TABLE OF bapisditmx WITH HEADER LINE,
          g_order_schedules_in  LIKE TABLE OF bapischdl WITH HEADER LINE,
          g_order_schedules_inx LIKE TABLE OF bapischdlx WITH HEADER LINE,
          g_order_partners LIKE TABLE OF bapiparnr WITH HEADER LINE,
          g_order_cfgs_value LIKE TABLE OF bapicuval WITH HEADER LINE,
          g_order_cfgs_ref  LIKE TABLE OF bapicucfg WITH HEADER LINE,
          g_order_cfgs_inst LIKE  TABLE OF bapicuins WITH HEADER LINE,
          g_order_conditions_in  LIKE  TABLE OF  bapicond WITH HEADER LINE,
          g_order_conditions_inx  LIKE  TABLE OF bapicondx WITH HEADER LINE,
          g_return LIKE TABLE OF bapiret2 WITH HEADER LINE.

DATA : BEGIN OF i_upload OCCURS 0 ,
               doc_number TYPE vbeln_va ,     "凭证编号
               purch_no TYPE bstkd ,          "客户采购单号
               doc_type TYPE auart ,          "凭证类型
               sales_org TYPE vkorg ,         "销售组织
               distr_chan TYPE vtweg ,        "分销渠道
               division TYPE spart ,          "产品组

               partn_numb1 TYPE kunnr ,       "售达方
               partn_numb2 TYPE kunnr ,       "送达方
               partn_numb3 TYPE kunnr ,       "人员,雇员

               itm_number TYPE posnr_va ,     "行项目号
               material TYPE matnr,           "物料号
               req_qty TYPE wmeng,            "需求数量
               sales_unit TYPE vrkme,         "销售计量单位
               cd_unt_iso   TYPE  isocd_unit, "基本计量单位   NEW

               salqtyden  TYPE umvkn,         "转换分母,denominator  : n个销售单位
               salqtynum TYPE umvkz,          "转换分子,numerator    : m个基本单位 = n个销售单位


               cd_p_unt2 TYPE bapikbetr1,     "单价
               currency TYPE waers,           "订单币别
               cond_p_unt TYPE  kpein ,       "单价的单位数量        NEW
               cond_unit TYPE  kmein ,        "单价的单位

               cust_mat35 TYPE kdmat,         "客户物料号



               req_date    TYPE  edatu ,      "交货时间

               value1 TYPE cux_value,         "特性1-切管长度
               value2 TYPE cux_value,         "特性2-包装方式
               value3(100) ,"TYPE cux_value,  "特性3-客制包装说明
               value4(100), "TYPE cux_value,  "特性4-印字方式内容
               short_text TYPE arktx,         "暂存mat_entrd_external,更新到行项目文本字段




               "以下字段用于查看,并不作为创建订单的数据
               "-----------------------------------------------
               c_matx     TYPE arktx,         "物料中文描述
               e_matx     TYPE arktx,         "物料英文描述
               quo_number TYPE vbeln_va,      "报价单号
               quo_itemno type posnr_va,      "报价行项号
               SECL(1)                 ,      "选择标记
               EXITS(1)                ,      "是否已经在当前订单行项中添加
               cuobj      type vbap-cuobj,    "特性实例号
               knumv      type vbak-knumv,
               "-----------------------------------------------

         END OF i_upload.
Data: wa_upload like line  of i_upload.
Data: i_upload2 like table of i_upload with header line.
data: l_answer.




*&---------------------------------------------------------------------*
*&   screen variable define
*&---------------------------------------------------------------------*
"=======================
"Screen 200 variable
"=======================
DATA:FCODE_200 LIKE SY-UCOMM,
     grid_200_1 type   ref to   cl_gui_alv_grid,
     con_200_1  type   ref to   cl_gui_custom_container,
     p_kname    type   kna1-name1.
"============================================================

"=======================
"Screen 250 variable
"=======================
DATA:FCODE_250 LIKE SY-UCOMM,
     grid_250_1 type  ref to cl_gui_alv_grid,
     con_250_1 type ref to   cl_gui_custom_container.
"=============================================================








"$ Region Class Definition and implementation

CLASS lcl_event_receiver DEFINITION DEFERRED.
data event_receiver type ref to lcl_event_receiver.

****************************************************************
* LOCAL CLASSES: Definition
****************************************************************

*CLASS lcl_dragdrop_obj DEFINITION.
*  PUBLIC SECTION.
*    DATA: wa TYPE i_upload,
*          index TYPE i.   "Index of Line to be moved
*ENDCLASS.                    "LCL_DRAGDROP DEFINITION



*===============================================================
* class lcl_event_receiver: local class to
*                         define and handle own functions.
*
* Definition:
* ~~~~~~~~~~~
CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.
*-------------------------define example--------------------------
*    CLASS-METHODS  handle_menu_button               FOR EVENT MENU_BUTTON          OF cl_gui_alv_grid IMPORTING e_object e_ucomm.
*    CLASS-METHODS  handle_user_after_user_command   FOR EVENT AFTER_USER_COMMAND   OF cl_gui_alv_grid.
*    CLASS-METHODS  handle_user_befor_user_command   FOR EVENT BEFORE_USER_COMMAND  OF cl_gui_alv_grid.
*    CLASS-METHODS  handle_data_changed              FOR EVENT DATA_CHANGED         OF cl_gui_alv_grid IMPORTING e_data_changed.
*    CLASS-METHODS  handle_toolbar                   FOR EVENT TOOLBAR              OF cl_gui_alv_grid IMPORTING e_object e_interactive.
*    CLASS-METHODS  handle_user_command              FOR EVENT USER_COMMAND         OF cl_gui_alv_grid IMPORTING e_ucomm.
*    CLASS-METHODS  handle_db_click                  FOR EVENT DOUBLE_CLICK         OF cl_gui_alv_grid IMPORTING e_row e_column .
*-----------------------------------------------------------------


    CLASS-METHODS  grid_200_1_toolbar               FOR EVENT TOOLBAR              OF cl_gui_alv_grid IMPORTING e_object e_interactive.
    CLASS-METHODS  grid_200_1_user_command          FOR EVENT USER_COMMAND         OF cl_gui_alv_grid IMPORTING e_ucomm.
    CLASS-METHODS  grid_200_1_db_click              FOR EVENT DOUBLE_CLICK         OF cl_gui_alv_grid IMPORTING e_row e_column .
    CLASS-METHODS  grid_150_1_db_click              FOR EVENT DOUBLE_CLICK         OF cl_gui_alv_grid IMPORTING e_row e_column .
    CLASS-METHODS  grid_250_1_toolbar               FOR EVENT TOOLBAR              OF cl_gui_alv_grid IMPORTING e_object e_interactive.
    CLASS-METHODS  grid_250_1_user_command          FOR EVENT USER_COMMAND         OF cl_gui_alv_grid IMPORTING e_ucomm.

**    Handling Event Drag
*    CLASS-METHODS  grid_200_1_drag                  FOR EVENT ondrag               OF cl_gui_alv_grid IMPORTING e_row e_column e_dragdropobj.
**    Handling event DROP
*    CLASS-METHODS  grid_200_1_drop                  FOR EVENT ondrop               OF cl_gui_alv_grid IMPORTING e_row e_column e_dragdropobj.
*
  PRIVATE SECTION.

ENDCLASS.                    "lcl_event_receiver DEFINITION
*
* lcl_event_receiver (Definition)
*===============================================================

****************************************************************
* LOCAL CLASSES: Implementation
****************************************************************
*===============================================================
* class lcl_event_receiver (Implementation)
*
*
CLASS lcl_event_receiver IMPLEMENTATION.

*------------------Implement Example---------------------------------
*  METHOD handle_user_after_user_command .
*    "BREAK-POINT.
*  ENDMETHOD.                    "handle_user_after_user_command

*  METHOD handle_user_befor_user_command .
*    "BREAK-POINT.
*  ENDMETHOD.                    "handle_user_befor_user_command

*  METHOD handle_menu_button.
** § 3.At event MENU_BUTTON query your function code and define a
**     menu in the same way as a context menu.
**..........
** Part II: Evaluate 'e_ucomm' to see which menu button of the toolbar
**          has been clicked on.
**          Define then the corresponding menu.
**          The menu contains function codes that are evaluated
**          in 'grid_250_2_user_command'.
**...........
*
**  query e_ucomm to find out which menu button has been clicked on
*    IF e_ucomm = 'TO_SFLIGHT'.
*      CALL METHOD e_object->add_function
*                  EXPORTING fcode   = 'TO_SPFLI'
*                            text    = text-100. "Overview
**  § 3a.) choose a default function and define the same function code
**         as used for the menu.
*      CALL METHOD e_object->add_function
*                  EXPORTING fcode   = 'TO_SFLIGHT'
*                            text    = text-200. "Flights
*
*    ENDIF.
*  ENDMETHOD.                                                    "handle_menu_button


*  METHOD  handle_data_changed.
*    "BREAK-POINT.
*  ENDMETHOD.                                                    "handle_data_changed

*  METHOD handle_toolbar.
*    data:gs_toolbar  TYPE stb_button.
*    data:icount type i.
*
*    CLEAR gs_toolbar.
*    MOVE 'DELLINE' TO gs_toolbar-function.
*    MOVE ICON_DELETE_ROW TO gs_toolbar-icon.
*    MOVE '删除交货行'(200) TO gs_toolbar-quickinfo.
*    MOVE space TO gs_toolbar-disabled.
*    insert gs_toolbar inTO e_object->mt_toolbar index 1.
*
*    CLEAR gs_toolbar.
*    MOVE 'ADDLINE' TO gs_toolbar-function.
*    MOVE ICON_INSERT_ROW TO gs_toolbar-icon.
*    MOVE '添加交货行'(200) TO gs_toolbar-quickinfo.
*    MOVE space TO gs_toolbar-disabled.
*    insert gs_toolbar inTO  e_object->mt_toolbar index 1.
*  ENDMETHOD.                                                    "grid_250_1_toolbar

*  METHOD handle_db_click.
*   data wa_ZFIE023_INV like LINE OF I_ZFIE023_INV.
*   data wa_LIPS like LINE OF I_VBAP.
*   READ TABLE I_VBAP INDEX e_row-index INTO wa_LIPS.
*
*   CASE e_column.
*     WHEN 'AUBEL' or 'AUPOS'.
*        SET PARAMETER ID: 'AUN' FIELD wa_LIPS-AUBEL.
*        CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
*     WHEN 'VGBEL' or 'VGPOS'.
*        SET PARAMETER ID: 'VL' FIELD wa_LIPS-VGBEL.
*        CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
*  ENDMETHOD.                                                     "handle_db_click

*  METHOD handle_user_command.
*    DATA:gi_index_rows TYPE lvc_t_row .
*    data:wa_row like line of gi_index_rows.
*    DATA:l_lines type i.
*
*    "BREAK-POINT.
*    CASE e_ucomm.
*
*      WHEN 'ADDLINE'.
*        Clear e_ucomm.
*        CLEAR I_VBAP[].
*        SET USER-COMMAND 'OK'.
*        call SCREEN '0350'.
*        CALL METHOD grid_250_1->refresh_table_display.
*  ENDMETHOD.                                                     "handle_user_command
*--------------------------------------------------------------------------

  METHOD grid_200_1_toolbar.
*    data:gs_toolbar  TYPE stb_button.
*    data:icount type i.
*
*    CLEAR gs_toolbar.
*    MOVE 'DELLINE' TO gs_toolbar-function.
*
*    MOVE ICON_DELETE_ROW TO gs_toolbar-icon.
*    MOVE '删除交货行'(200) TO gs_toolbar-quickinfo.
*
*    MOVE space TO gs_toolbar-disabled.
*    insert gs_toolbar inTO e_object->mt_toolbar index 1.
*
*    CLEAR gs_toolbar.
*    MOVE 'ADDLINE' TO gs_toolbar-function.
*    MOVE ICON_INSERT_ROW TO gs_toolbar-icon.
*    MOVE '添加交货行'(200) TO gs_toolbar-quickinfo.
*    MOVE space TO gs_toolbar-disabled.
*    insert gs_toolbar inTO  e_object->mt_toolbar index 1.
  ENDMETHOD.                    "grid_250_1_toolbar


  METHOD grid_150_1_db_click.
*   data wa_ZFIE023_INV like LINE OF I_ZFIE023_INV.
*   data wa_LIPS like LINE OF I_VBAP.
*   READ TABLE I_VBAP INDEX e_row-index INTO wa_LIPS.
*
*
*   CASE e_column.
*     WHEN 'AUBEL' or 'AUPOS'.
*
*        SET PARAMETER ID: 'AUN' FIELD wa_LIPS-AUBEL.
*        CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
*
*
*     WHEN 'VGBEL' or 'VGPOS'.
*        SET PARAMETER ID: 'VL' FIELD wa_LIPS-VGBEL.
*        CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
  ENDMETHOD.                    "grid_150_1_db_click


  METHOD grid_200_1_db_click.
*   data wa_ZFIE023_INV like LINE OF I_ZFIE023_INV.
*   data wa_ZFIE023_RV like LINE OF I_ZFIE023_RV.
*   READ TABLE I_ZFIE023_INV INDEX e_row-index INTO wa_ZFIE023_INV.
  ENDMETHOD.                    "grid_250_1_db_click

  METHOD grid_200_1_user_command.
    DATA:gi_index_rows TYPE lvc_t_row .
    data:wa_row like line of gi_index_rows.
    DATA:l_lines type i.

    "BREAK-POINT.
*    CASE e_ucomm.
*
*      WHEN 'ADDLINE'.
*        Clear e_ucomm.
*        CLEAR I_VBAP[].
*        SET USER-COMMAND 'OK'.
*        call SCREEN '0350'.
*        CALL METHOD grid_250_1->refresh_table_display.
*
*      WHEN 'DELLINE'.
*        Clear e_ucomm.
*        CALL METHOD grid_250_1->get_selected_rows
*          IMPORTING
*            et_index_rows = gi_index_rows[].
*        DESCRIBE TABLE gi_index_rows LINES l_lines.
*        IF l_lines = 0.
*          MESSAGE '请选中一个订单行!' type 'E'.
*          EXIT.
*        ENDIF.
*
*        CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
*          EXPORTING
*            defaultoption = 'N'
*            diagnosetext1 = '系统将删除选中的发票行,'
*            textline1     = '确定继续?'
*            titel         = '询问'
*          IMPORTING
*            answer        = l_answer.
*
*        IF l_answer <> 'J'.
*          EXIT.
*        ENDIF.
*
*        data  wa_tmpcinvp LIKE LINE OF I_ZSDE029_PINVP.
*        clear wa_tmpcinvp.
*
*
*        "READ TABLE gi_index_rows into wa_row INDEX 1.
*        sort gi_index_rows by index DESCENDING.
*        loop at gi_index_rows into wa_row .
*          READ TABLE I_ZSDE029_PINVP into  wa_tmpcinvp INDEX  wa_row-index  .
*          DELETE TABLE I_ZSDE029_PINVP from  wa_tmpcinvp .
*        ENDLOOP.
*
*        CALL METHOD grid_250_1->refresh_table_display.
*
*    ENDCASE.
  ENDMETHOD.                    "grid_200_1_user_command


  METHOD grid_250_1_toolbar.
    data:gs_toolbar  TYPE stb_button.
    data:icount type i.



    CLEAR gs_toolbar.
    MOVE 'ISL' TO gs_toolbar-function.
    MOVE ICON_SKIP TO gs_toolbar-icon.
    MOVE '反选'(200) TO gs_toolbar-quickinfo.
    MOVE space TO gs_toolbar-disabled.
    insert gs_toolbar inTO e_object->mt_toolbar index 1.

    CLEAR gs_toolbar.
    MOVE 'SLN' TO gs_toolbar-function.
    MOVE ICON_DESELECT_ALL TO gs_toolbar-icon.
    MOVE '不选'(200) TO gs_toolbar-quickinfo.
    MOVE space TO gs_toolbar-disabled.
    insert gs_toolbar inTO e_object->mt_toolbar index 1.

    CLEAR gs_toolbar.
    MOVE 'SLA' TO gs_toolbar-function.
    MOVE ICON_SELECT_ALL TO gs_toolbar-icon.
    MOVE '全选'(200) TO gs_toolbar-quickinfo.
    MOVE space TO gs_toolbar-disabled.
    insert gs_toolbar inTO  e_object->mt_toolbar index 1.
  ENDMETHOD.                    "grid_250_1_toolbar



  METHOD grid_250_1_user_command.
    DATA:gi_index_rows TYPE lvc_t_row .
    data:wa_row like line of gi_index_rows.
    DATA:l_lines type i.

    "BREAK-POINT.

    data wa_upload LIKE LINE OF i_upload2.
    CASE e_ucomm.

      when 'SLA'.
        Clear e_ucomm.
        LOOP AT i_upload2 into wa_upload.
          wa_upload-SECL = 'X'.
          modify i_upload2 from wa_upload TRANSPORTING SECL.
        ENDLOOP.
        CALL METHOD grid_250_1->refresh_table_display.

      WHEN 'SLN'.
        Clear e_ucomm.
        LOOP AT i_upload2 into wa_upload.
          wa_upload-SECL = ''.
          modify i_upload2 from wa_upload TRANSPORTING SECL.
        ENDLOOP.
        CALL METHOD grid_250_1->refresh_table_display.

      WHEN 'ISL'.
        Clear e_ucomm.
        CALL METHOD grid_250_1->check_changed_data.

        LOOP AT i_upload2 into wa_upload.
          if wa_upload-SECL = ''.
            wa_upload-SECL = 'X'.
          else.
            wa_upload-SECL = ''.
          endif.
          modify i_upload2 from wa_upload TRANSPORTING SECL.
        ENDLOOP.
        CALL METHOD grid_250_1->refresh_table_display.

    ENDCASE.
  ENDMETHOD.                    "grid_250_1_user_command

**  OnDrag event is used to 'fetch' information from the drag source.
*  METHOD grid_200_1_drag.
*    DATA: dataobj TYPE REF TO lcl_dragdrop_obj,
*          line TYPE i_upload.
** Read dragged row
*    READ TABLE i_upload INDEX e_row-index INTO line.
** create and fill dataobject for events ONDROP
*    CREATE OBJECT dataobj.
** Remembering row index to move a line
*    MOVE e_row-index TO dataobj->index.
** store the dragged line.
*    READ TABLE i_upload INTO dataobj->wa INDEX e_row-index.
** Assigning data object to the refering event parameter
*    e_dragdropobj->object = dataobj.
*  ENDMETHOD.                    "HANDLE_ALV_DRAG
*
*
**Event handler for event 'OnDrop'. This event is used
**to use your dragged information in combination with your drop source.
*  METHOD grid_200_1_drop.
*    DATA: dataobj TYPE REF TO lcl_dragdrop_obj,
*          drop_index TYPE i,
*          stable TYPE lvc_s_stbl.
** Refresh Alv Grid Control without scrolling
*    stable-row = 'X'.
*    stable-col = 'X'.
** Catch-Statement to ensure the drag&drop-Operation is aborted properly.
*    CATCH SYSTEM-EXCEPTIONS move_cast_error = 1.
*      dataobj ?= e_dragdropobj->object.
*      DELETE it_t016t INDEX dataobj->index.
*      INSERT dataobj->wa INTO it_t016t INDEX e_row-index.
**Refreshing the ALV
*      CALL METHOD c_alv->refresh_table_display
*        EXPORTING
*          i_soft_refresh = 'X'
*          is_stable      = stable.
*    ENDCATCH.
*    IF sy-subrc <> 0.
** If anything went wrong aborting the drag and drop operation:
*      CALL METHOD e_dragdropobj->abort.
*    ENDIF.
*  ENDMETHOD.                    "HANDLE_ALV_DROP
*---------------------------------------------------------------------



ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION
*
* lcl_event_receiver (Implementation)
*===================================================================
"$ Endregion Class Definition and implementation




*&---------------------------------------------------------------------*
*&   public form define
*&---------------------------------------------------------------------*


*&----------------------------------------------------------------------
*&
*& 此功能用于从文件导入并创建销售订单
*&
*&----------------------------------------------------------------------
**& define selection screen.
*SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-001.
*PARAMETER: p_file LIKE rlgrap-filename OBLIGATORY.
*SELECTION-SCREEN END   OF BLOCK blk.
*&----------------------------------------------------------------------






*&---------------------------------------------------------------------*
*&      Form  get_path
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_P_PATH  text
*----------------------------------------------------------------------*
FORM frm_getpath  CHANGING p_file.
  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      program_name  = syst-cprog
      dynpro_number = syst-dynnr
      field_name    = ' '
    IMPORTING
      file_name     = p_file.
ENDFORM.                    " get_path

*&---------------------------------------------------------------------*
*&      Form  alpha_input
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_P  text
*----------------------------------------------------------------------*
FORM alpha_input  CHANGING p_p.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_p
    IMPORTING
      output = p_p.
ENDFORM.                    " alpha_input
*&---------------------------------------------------------------------*
*&      Form  frm_upfile2talbe
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_FILE  text
*      -->i_upload  text
*----------------------------------------------------------------------*
FORM frm_upfile2talbe "TABLES  i_upload STRUCTURE i_upload
                           USING value(p_p_file)
                                     value(p_p_sort).
  DATA : ls_file TYPE string.
  DATA : ls_material TYPE matnr.
  CLEAR ls_file.
  ls_file = p_p_file.
  CLEAR i_upload.
  CLEAR i_upload[].
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename            = ls_file
      filetype            = 'ASC'
      has_field_separator = '#'
      codepage            = '8400'
    TABLES
      data_tab            = i_upload.
  IF sy-subrc NE 0.
    WRITE:/ '导入文件不成功', sy-subrc.
    STOP.
  ENDIF.
  SORT i_upload ASCENDING BY   doc_number
                               purch_no
                               doc_type
                               sales_org
                               distr_chan
                               division
                               partn_numb1
                               partn_numb2
                               partn_numb3
                               itm_number.
  LOOP AT i_upload.
    PERFORM alpha_input  CHANGING i_upload-sales_org.
    PERFORM alpha_input  CHANGING i_upload-distr_chan.
    PERFORM alpha_input  CHANGING i_upload-division.
    PERFORM alpha_input  CHANGING i_upload-partn_numb1.
    PERFORM alpha_input  CHANGING i_upload-partn_numb2.
    PERFORM alpha_input  CHANGING i_upload-partn_numb3.
    CONDENSE i_upload-cust_mat35.

    IF not ( '1900' < i_upload-req_date(4) AND i_upload-req_date(4) < '9999' AND
         1 <= i_upload-req_date+4(2) AND i_upload-req_date+4(2) <= 12  AND
         1 <= i_upload-req_date+6(2) AND i_upload-req_date+6(2) <= 31  ) .
      WRITE:/ '日期期格式: YYYYMMDD'.
      STOP.
    ENDIF.

    MODIFY i_upload.
  ENDLOOP.
ENDFORM.                    " frm_upfile2talbe





FORM frm_uptable2database  .
 LOOP AT i_upload.
    move i_upload to wa_upload.
    AT NEW  doc_number.
      l_rowno = 10.
      CLEAR g_order_items_in. CLEAR g_order_items_in[].
      CLEAR g_order_items_inx. CLEAR g_order_items_inx[].
      CLEAR  g_order_partners .CLEAR g_order_partners[].
      CLEAR g_order_schedules_in. CLEAR g_order_schedules_in[].
      CLEAR g_order_schedules_inx. CLEAR g_order_schedules_inx[].
      CLEAR  g_order_cfgs_value.CLEAR g_order_cfgs_value[].
      CLEAR g_order_conditions_in. CLEAR g_order_conditions_in[].
      CLEAR g_order_conditions_inx. CLEAR g_order_conditions_inx[].
      CLEAR g_return . CLEAR g_return[].
      CLEAR g_order_header_in.CLEAR g_order_header_inx.

*      g_order_header_in-doc_number = wa_upload-doc_number.
      g_order_header_in-doc_type = wa_upload-doc_type.
      g_order_header_in-sales_org = wa_upload-sales_org.
      g_order_header_in-distr_chan = wa_upload-distr_chan.
      g_order_header_in-division = wa_upload-division.
      g_order_header_in-purch_no_c = wa_upload-purch_no.

*      g_order_header_inx-doc_number = 'X'.
      g_order_header_inx-doc_type = 'X'.
      g_order_header_inx-sales_org = 'X'.
      g_order_header_inx-distr_chan = 'X'.
      g_order_header_inx-division = 'X'.
      g_order_header_inx-purch_no_c = 'X'.



      g_order_partners-partn_role = 'AG'.
      g_order_partners-partn_numb = wa_upload-partn_numb1.
      PERFORM alpha_input CHANGING g_order_partners-partn_numb.
      APPEND g_order_partners.

      g_order_partners-partn_role = 'WE'.
      g_order_partners-partn_numb = wa_upload-partn_numb2 .
      PERFORM alpha_input CHANGING g_order_partners-partn_numb.
      APPEND g_order_partners.

      g_order_partners-partn_role = 'ZM'.
      g_order_partners-partn_numb = wa_upload-partn_numb3.
      PERFORM alpha_input CHANGING g_order_partners-partn_numb.
      APPEND g_order_partners.


    ENDAT.

    PERFORM frm_fillitems TABLES g_order_items_in
                                                  g_order_items_inx
                                                  g_order_partners
                                                  g_order_schedules_in
                                                  g_order_schedules_inx
                                                  g_order_cfgs_ref
                                                  g_order_cfgs_value
                                                  g_order_conditions_in
                                                  g_order_conditions_inx
                                       USING wa_upload.
    AT END OF doc_number.
      PERFORM frm_createso TABLES g_order_items_in
                                                     g_order_items_inx
                                                     g_order_partners
                                                     g_order_schedules_in
                                                     g_order_schedules_inx
                                                     g_order_cfgs_ref
                                                     g_order_cfgs_value
                                                     g_order_conditions_in
                                                     g_order_conditions_inx
                                                     g_return.
      CONDENSE g_salesdocument.
      IF g_salesdocument = ''.
        PERFORM  frm_printerr TABLES g_return
                                           USING 'E'.
      ELSE.

        PERFORM frm_writetext .
        WRITE: / '成功导入订单:',wa_upload-doc_number,
                      '销售订单号  :',g_salesdocument .
        ULINE .
        "PERFORM  frm_printerr TABLES g_return  USING 'W'.
      ENDIF.
    ENDAT.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  frm_createso
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_G_ORDER_ITEMS_IN        text
*      -->P_G_ORDER_ITEMS_INX       text
*      -->P_G_ORDER_PARTNERS        text
*      -->P_G_ORDER_SCHEDULES_IN    text
*      -->P_G_ORDER_SCHEDULES_INX   text
*      -->P_G_ORDER_CFGS_REF        text
*      -->P_G_ORDER_CFGS_VALUE      text
*      -->P_G_ORDER_CONDITIONS_IN   text
*      -->P_G_ORDER_CONDITIONS_INX  text
*      -->P_I_RETURN                text
*----------------------------------------------------------------------*
FORM frm_createso  TABLES p_g_order_items_in STRUCTURE  bapisditm
                                           p_g_order_items_inx STRUCTURE  bapisditmx
                                           p_g_order_partners STRUCTURE bapiparnr
                                           p_g_order_schedules_in STRUCTURE bapischdl
                                           p_g_order_schedules_inx STRUCTURE bapischdlx
                                           p_g_order_cfgs_ref STRUCTURE bapicucfg
                                           p_g_order_cfgs_value STRUCTURE bapicuval
                                           p_g_order_conditions_in  STRUCTURE bapicond
                                           p_g_order_conditions_inx STRUCTURE bapicondx
                                           p_i_return STRUCTURE bapiret2.
  "BREAK-POINT.
  CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
    EXPORTING
      order_header_in      = g_order_header_in
      order_header_inx     = g_order_header_inx
    IMPORTING
      salesdocument        = g_salesdocument
    TABLES
      return               = p_i_return
      order_items_in       = p_g_order_items_in
      order_items_inx      = p_g_order_items_inx
      order_partners       = p_g_order_partners
      order_schedules_in   = p_g_order_schedules_in
      order_schedules_inx  = p_g_order_schedules_inx
      order_conditions_in  = p_g_order_conditions_in
      order_conditions_inx = p_g_order_conditions_inx
      order_cfgs_ref       = p_g_order_cfgs_ref
      order_cfgs_value     = p_g_order_cfgs_value.
  IF    g_salesdocument IS NOT INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait   = 'X'
      IMPORTING
        return = p_i_return.
  ENDIF.
ENDFORM.                    "frm_createso
*&---------------------------------------------------------------------*
*&      Form  frm_printerr
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_I_RETURN  text
*----------------------------------------------------------------------*
FORM frm_printerr  TABLES   p_i_return STRUCTURE bapiret2
                              USING err.
  LOOP AT p_i_return WHERE type = err.
    WRITE :/(12) i_upload-doc_number,
                 (2)  p_i_return-type,
                 (30) p_i_return-message
                 .
    message p_i_return-message type err .
  ENDLOOP.
ENDFORM.                    " frm_printerr
*&---------------------------------------------------------------------*
*&      Form  frm_fillitems
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->i_upload  text
*      -->P_I_ITEMS  text
*----------------------------------------------------------------------*
FORM frm_fillitems  TABLES p_g_order_items_in STRUCTURE  bapisditm
                                          p_g_order_items_inx STRUCTURE  bapisditmx
                                          p_g_order_partners STRUCTURE bapiparnr
                                          p_g_order_schedules_in STRUCTURE bapischdl
                                          p_g_order_schedules_inx STRUCTURE bapischdlx
                                          p_g_order_cfgs_ref STRUCTURE bapicucfg
                                          p_g_order_cfgs_value STRUCTURE bapicuval
                                          p_g_order_conditions_in  STRUCTURE bapicond
                                          p_g_order_conditions_inx STRUCTURE bapicondx
                             USING    p_indexdata   STRUCTURE i_upload.
  DATA : l_kzkfg LIKE mara-kzkfg.
  DATA  : l_kalks TYPE kalks.
  CLEAR p_g_order_items_in .     CLEAR p_g_order_items_inx .
  CLEAR p_g_order_partners.
  CLEAR p_g_order_schedules_in.  CLEAR p_g_order_schedules_inx.

  CLEAR p_g_order_conditions_in. CLEAR  p_g_order_conditions_inx.
  CLEAR p_g_order_cfgs_ref.
  CLEAR p_g_order_cfgs_value.

  PERFORM alpha_input  CHANGING  i_upload-material.
  CLEAR l_kzkfg.
  SELECT SINGLE kzkfg
  INTO l_kzkfg
  FROM mara
  WHERE matnr =  i_upload-material.

  PERFORM alpha_input  CHANGING i_upload-sales_org.
  PERFORM alpha_input  CHANGING i_upload-distr_chan.
  PERFORM alpha_input  CHANGING i_upload-division.
  PERFORM alpha_input  CHANGING i_upload-partn_numb1.

  CLEAR l_kalks.
  SELECT SINGLE kalks
  INTO l_kalks
  FROM knvv
  WHERE  vkorg = i_upload-sales_org
      AND  vtweg = i_upload-distr_chan
      AND  spart = i_upload-division
      AND  kunnr = i_upload-partn_numb1 .
  CONDENSE l_kalks.

* items_in
  p_g_order_items_in-itm_number = l_rowno.
  PERFORM alpha_input  CHANGING p_g_order_items_in-itm_number.
  p_g_order_items_in-material = i_upload-material.

  PERFORM alpha_input  CHANGING p_g_order_items_in-material.

*  p_g_order_items_in-REASON_REJ = '00'.

  p_g_order_items_in-cust_mat35 = i_upload-cust_mat35.
  p_g_order_items_in-sales_unit = i_upload-sales_unit.
  p_g_order_items_in-currency = i_upload-currency.
  IF l_kzkfg IS NOT INITIAL.
    p_g_order_items_in-po_itm_no = l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_items_in-po_itm_no.
  ENDIF.
*  p_g_order_items_in-target_qty = i_upload-req_qty.
*  p_g_order_items_in-target_qu = i_upload-sales_unit.

  p_g_order_items_in-salqtynum =  i_upload-salqtynum.
  p_g_order_items_in-salqtyden =  i_upload-salqtyden.
  p_g_order_items_in-mat_entrd_external  = i_upload-short_text .


  APPEND p_g_order_items_in.


* intems_inx
  p_g_order_items_inx-itm_number = l_rowno.
  PERFORM alpha_input  CHANGING p_g_order_items_inx-itm_number.
  p_g_order_items_inx-updateflag = 'I'.
  p_g_order_items_inx-itm_number = 'X'.
  p_g_order_items_inx-material      = 'X'.
  p_g_order_items_inx-cust_mat35 = 'X'.
  p_g_order_items_inx-sales_unit    = 'X'.

*  p_g_order_items_inx-target_qty = 'X'.
*  p_g_order_items_inx-target_qu = 'X'.
  p_g_order_items_inx-salqtynum =  'X'.
  p_g_order_items_inx-salqtyden =  'X'.

*  p_g_order_items_inx-REASON_REJ = 'X'.


  IF l_kzkfg IS NOT INITIAL.
   p_g_order_items_in-config_id =  l_rowno.
   PERFORM alpha_input  CHANGING p_g_order_items_in-config_id.
   p_g_order_items_inx-config_id = 'X'.
   p_g_order_items_inx-po_itm_no = 'X'.
  ENDIF.
  APPEND p_g_order_items_inx.

*  conditions_in
  p_g_order_conditions_in-itm_number = l_rowno.
  PERFORM alpha_input  CHANGING p_g_order_conditions_in-itm_number.
  "BREAK-POINT.
  CASE l_kalks.
    WHEN 1.
      p_g_order_conditions_in-cond_type = 'PR01'.
    WHEN 2.
      p_g_order_conditions_in-cond_type = 'PR00'.
    WHEN 3.
      p_g_order_conditions_in-cond_type = 'PI01'.
    WHEN OTHERS .
      p_g_order_conditions_in-cond_type = 'PR00'.
  ENDCASE.
*  p_g_order_conditions_in-cond_type = 'PR00'.
  p_g_order_conditions_in-cond_value = i_upload-cd_p_unt2."#?#?.
  p_g_order_conditions_in-cond_p_unt =  i_upload-cond_p_unt.   "#?#?#?#?        NEW
  p_g_order_conditions_in-cond_unit    =  i_upload-cond_unit.
  p_g_order_conditions_in-currency = i_upload-currency.
  APPEND p_g_order_conditions_in.

* conditions_inx
  p_g_order_conditions_inx-itm_number = l_rowno.
  PERFORM alpha_input  CHANGING p_g_order_conditions_inx-itm_number.
  CASE l_kalks.
    WHEN 1.
      p_g_order_conditions_inx-cond_type = 'PR01'.
    WHEN 2.
      p_g_order_conditions_inx-cond_type = 'PR00'.
    WHEN 3.
      "   p_g_order_conditions_inx-cond_type = 'PI01'.
    WHEN OTHERS .
      p_g_order_conditions_inx-cond_type = 'PR00'.
  ENDCASE.
*  p_g_order_conditions_inx-cond_type = 'PR00'.
  p_g_order_conditions_inx-cond_value = 'X'.
  p_g_order_conditions_inx-updateflag = 'X'.
  p_g_order_conditions_inx-cond_unit = 'X'.
  p_g_order_conditions_inx-cond_p_unt = 'X'.
  p_g_order_conditions_inx-currency = 'X'.
  APPEND p_g_order_conditions_inx.

* schedules_in
  p_g_order_schedules_in-itm_number = l_rowno.
  PERFORM alpha_input  CHANGING p_g_order_schedules_in-itm_number.
*  p_g_order_schedules_in-sched_line  = '0001'.
  p_g_order_schedules_in-req_date = i_upload-req_date .
  p_g_order_schedules_in-req_qty =  i_upload-req_qty.

  APPEND p_g_order_schedules_in.



* schedules_inx
  p_g_order_schedules_inx-itm_number = l_rowno.
  PERFORM alpha_input  CHANGING p_g_order_schedules_inx-itm_number.
*  p_g_order_schedules_inx-sched_line  = '0001'.
  p_g_order_schedules_inx-req_date = 'X'.
  p_g_order_schedules_inx-req_qty = 'X'.
  p_g_order_schedules_inx-updateflag = 'X'.
  APPEND p_g_order_schedules_inx.




* cfgs
  IF l_kzkfg IS NOT INITIAL.
*   cfgs_ref
    p_g_order_cfgs_ref-posex = l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_ref-posex.
    p_g_order_cfgs_ref-config_id =  l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_ref-config_id.
    p_g_order_cfgs_ref-root_id = l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_ref-root_id.
    APPEND p_g_order_cfgs_ref.

*   cfgs_value
    p_g_order_cfgs_value-config_id =  l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-config_id.
    p_g_order_cfgs_value-inst_id = p_g_order_cfgs_value-config_id.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-inst_id.
    p_g_order_cfgs_value-charc = 'I_CUT_LENGTH'.
    IF sy-mandt = '800' or sy-mandt = '888'.
      break-point.
      p_g_order_cfgs_value-charc = 'I_CUT_LENG'.
    ENDIF.
    p_g_order_cfgs_value-value = i_upload-value1.
    APPEND p_g_order_cfgs_value.

    p_g_order_cfgs_value-config_id =   l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-config_id.
    p_g_order_cfgs_value-inst_id = p_g_order_cfgs_value-config_id.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-inst_id.
    p_g_order_cfgs_value-charc = 'I_PACKAGE'.
    IF sy-mandt = '800' OR sy-mandt = '888'.
      p_g_order_cfgs_value-charc = 'I_PACKING'.
    ENDIF.
    p_g_order_cfgs_value-value = i_upload-value2.
    APPEND p_g_order_cfgs_value.

    p_g_order_cfgs_value-config_id =   l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-config_id.
    p_g_order_cfgs_value-inst_id =  p_g_order_cfgs_value-config_id.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-inst_id.
    p_g_order_cfgs_value-charc = 'C_PACKAGE'.
    IF sy-mandt = '800' OR sy-mandt = '888'.
      p_g_order_cfgs_value-charc = 'C_PACK_PS'.
    ENDIF.
    p_g_order_cfgs_value-value = i_upload-value3(30).
    APPEND p_g_order_cfgs_value.

    p_g_order_cfgs_value-config_id =   l_rowno.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-config_id.
    p_g_order_cfgs_value-inst_id = p_g_order_cfgs_value-config_id.
    PERFORM alpha_input  CHANGING p_g_order_cfgs_value-inst_id.
    p_g_order_cfgs_value-charc = 'PRINT1'.
    IF sy-mandt = '800' OR sy-mandt = '888'.
      p_g_order_cfgs_value-charc = 'C_PRINT_PS'.
    ENDIF.
    p_g_order_cfgs_value-value = i_upload-value4.
    APPEND p_g_order_cfgs_value.


    break-point.
    IF sy-mandt = '800' ."800下多出的特性
        p_g_order_cfgs_value-config_id =   l_rowno.
        PERFORM alpha_input  CHANGING p_g_order_cfgs_value-config_id.
        p_g_order_cfgs_value-inst_id = p_g_order_cfgs_value-config_id.
        PERFORM alpha_input  CHANGING p_g_order_cfgs_value-inst_id.
        p_g_order_cfgs_value-charc = 'C_PRINT_SL'.
        p_g_order_cfgs_value-value = '02'.
        APPEND p_g_order_cfgs_value.
    ENDIF.

  ENDIF.

  l_rowno =  l_rowno + 10 .
ENDFORM.                    " frm_fillitems
*&---------------------------------------------------------------------*
*&      Form  frm_WriteText
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_writetext .
* Write SO ITEM Text
  DATA : ls_tdname LIKE thead-tdname.
  DATA header LIKE thead.
  DATA lines TYPE STANDARD TABLE OF tline .
  DATA w_line TYPE tline.
  LOOP AT g_order_items_in.
    CLEAR  ls_tdname.
    CLEAR header.
    CLEAR lines.CLEAR lines[].
    CLEAR w_line.
    CONCATENATE g_salesdocument
                g_order_items_in-itm_number
    INTO  ls_tdname.
    header-tdobject = 'VBBP'.
    header-tdname = ls_tdname.
    header-tdid = '0001'.
    header-tdspras  = '1'."sy-langu.
    w_line-tdformat = '*'.
    w_line-tdline = g_order_items_in-mat_entrd_external .
    CONDENSE w_line.
    APPEND w_line TO lines.

    CALL FUNCTION 'SAVE_TEXT'
      EXPORTING
        header          = header
        savemode_direct = 'X'
      TABLES
        lines           = lines
      EXCEPTIONS
        id              = 1
        language        = 2
        name            = 3
        object          = 4
        OTHERS          = 5.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ELSE.
      CALL FUNCTION 'COMMIT_TEXT'.
      IF sy-subrc <> 0.
        MESSAGE '保存文本出错!' TYPE 'W'.
        sy-subrc = 0.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " frm_WriteText






*&------------------------------------------------------------------------
*&  screen 1000 define
*&------------------------------------------------------------------------
tables: vbak.
PARAMETER: p_vkorg like vbak-vkorg OBLIGATORY,
           p_kunnr like vbak-kunnr OBLIGATORY,
           p_edatu    type   edatu OBLIGATORY,
           p_auart    type   vbak-auart  OBLIGATORY.


data: dynn(4) value '0251'.
SELECTION-SCREEN BEGIN OF SCREEN 0251 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK block_0 WITH FRAME TITLE text-001.
PARAMETER: p_MATKL like vbap-MATKL .
SELECT-OPTIONS   p_vbeln for vbak-vbeln.
PARAMETER:       p_arktx like vbap-arktx.
SELECTION-SCREEN END OF BLOCK block_0.
SELECTION-SCREEN END OF SCREEN 0251.





INITIALIZATION.

*&------------------------------------------------------------------------
*&
*& 此功能用于从文件导入并创建销售订单
*&
*&------------------------------------------------------------------------
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*  PERFORM frm_getpath CHANGING p_file.
*&------------------------------------------------------------------------


START-OF-SELECTION.


*&------------------------------------------------------------------------
*&
*& 此功能用于从文件导入并创建销售订单
*&
*&------------------------------------------------------------------------
*  PERFORM frm_upfile2talbe "TABLES i_upload
*                                   USING p_file
*                                             'DOC_NUMBER'.
*&------------------------------------------------------------------------
*PERFORM frm_upfile2talbe USING p_file 'DOC_NUMBER'.
select single name1 into p_kname from kna1 where kna1~kunnr = p_kunnr .

call screen '200'.

END-OF-SELECTION.



*&---------------------------------------------------------------------*
*&      Form  S200_ALV_INI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM S200_ALV_INI.

  data: gt_fieldcat  type lvc_t_fcat.
  data: gs_layout type lvc_s_layo.
  data: gs_variant type disvariant.

  if con_200_1 is initial.
    create object con_200_1
      EXPORTING
        container_name = 'CON_200_1'.
    create object grid_200_1
      EXPORTING
        i_parent = con_200_1.
  endif.

  "定义grid格式
  clear gs_layout.
  gs_layout-smalltitle  = ''.
  gs_layout-grid_title  = ''.
  gs_layout-detailtitl  = '细节信息'(003).
  gs_layout-zebra   =  'X'."定义GRID的样式如斑马条式
  gs_layout-sel_mode  = 'C'.
  gs_layout-cwidth_opt  = 'X'.
  gs_layout-no_toolbar  = ''.
  "gs_layout-BOX_FNAME = 'MARK'.

  "定义列
  DATA: ls_fieldcat like line of gt_fieldcat.
  CLEAR gt_fieldcat[].

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DOC_NUMBER'.
  ls_fieldcat-coltext = '凭证编号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PURCH_NO'.
  ls_fieldcat-coltext = '客户采购单号'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DOC_TYPE'.
  ls_fieldcat-coltext = '凭证类型'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALES_ORG'.
  ls_fieldcat-coltext = '销售组织'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DISTR_CHAN'.
  ls_fieldcat-coltext = '分销渠道'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DIVISION'.
  ls_fieldcat-coltext = '产品组'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PARTN_NUMB1'.
  ls_fieldcat-coltext = '售达方'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PARTN_NUMB2'.
  ls_fieldcat-coltext = '送达方'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PARTN_NUMB3'.
  ls_fieldcat-coltext = '业务员'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'ITM_NUMBER'.
  ls_fieldcat-coltext = '行项目号'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'MATERIAL'.
  ls_fieldcat-coltext = '物料号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'C_MATX'.
  ls_fieldcat-coltext = '中文描述'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'E_MATX'.
  ls_fieldcat-coltext = '英文描述'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'REQ_QTY'.
  ls_fieldcat-coltext = '需求数量'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALES_UNIT'.
  ls_fieldcat-coltext = '销售计量单位'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CD_UNT_ISO'.
  ls_fieldcat-coltext = '基本计量单位'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALQTYDEN'.
  ls_fieldcat-coltext = '转换分母'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALQTYNUM'.
  ls_fieldcat-coltext = '转换分子'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.



  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CD_P_UNT2'.
  ls_fieldcat-coltext = '单价'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CURRENCY'.
  ls_fieldcat-coltext = '订单币别'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'COND_P_UNT'.
  ls_fieldcat-coltext = '单价的单位数量'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'COND_UNIT'.
  ls_fieldcat-coltext = '单价的单位'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CUST_MAT35'.
  ls_fieldcat-coltext = '客户物料号'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'REQ_DATE'.
  ls_fieldcat-coltext = '交货时间'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE1'.
  ls_fieldcat-coltext = '切管长度'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE2'.
  ls_fieldcat-coltext = '包装方式'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE3'.
  ls_fieldcat-coltext = '包装说明'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE4'.
  ls_fieldcat-coltext = '印字方式'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SHORT_TEXT'.
  ls_fieldcat-coltext = '行项目文本'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'QUO_NUMBER'.
  ls_fieldcat-coltext = '报价单号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'QUO_ITEMNO'.
  ls_fieldcat-coltext = '报价行项号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CONCATENATE sy-repid '200' into gs_variant-report.
  "gs_variant-report = sy-repid. "指定保存变式的程序名.
  call method grid_200_1->set_table_for_first_display
    EXPORTING
      is_variant      = gs_variant
      is_layout       = gs_layout"采用自定义的格式
      I_SAVE          = 'A'
      I_DEFAULT       = 'X'
    CHANGING
      it_outtab       = i_upload[]
      it_fieldcatalog = gt_fieldcat[].


  SET HANDLER event_receiver->grid_200_1_user_command
              event_receiver->grid_200_1_toolbar
              event_receiver->grid_200_1_db_click FOR grid_200_1.
  CALL METHOD grid_200_1->set_toolbar_interactive.

ENDFORM.                    "S200_ALV_INI

*&---------------------------------------------------------------------*
*&      Module  STATUS_0200  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0200 OUTPUT.
  SET PF-STATUS 'G200'.
  SET TITLEBAR 'T200'.

  PERFORM S200_ALV_INI.

ENDMODULE.                 " STATUS_0200  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0200 INPUT.

 DATA:gi_index_rows TYPE lvc_t_row ,
      gs_index_rows TYPE lvc_s_row .
 data:wa_row like line of gi_index_rows.
 DATA:l_lines type i.

  case  FCODE_200.
    when 'BACK'.
      Clear FCODE_200.
      LEAVE to screen 0 .
    when 'EXIT'.
      Clear FCODE_200.
      LEAVE PROGRAM.
    when 'CANCEL'.
      Clear FCODE_200.
      leave to screen 0 .
    when 'ADDLINE'.
      Clear FCODE_200.
      call screen '250'.
      call method grid_200_1->refresh_table_display.
    when 'CHKOUT'.
      Clear FCODE_200.
      g_salesdocument = ''.
      perform frm_uptable2database .
      data msgtxt(100).
      if g_salesdocument <> ''.
        CONCATENATE '订单创建成功:'   g_salesdocument ',订单号是是否跳转到订单修改界面,' into msgtxt.
        CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
          EXPORTING
            defaultoption = 'N'
            diagnosetext1 = msgtxt
            textline1     = '确定继续?'
            titel         = '询问'
          IMPORTING
            answer        = l_answer.
        IF l_answer <> 'J'.
          leave to screen 0 .
          EXIT.
        ENDIF.
        SET PARAMETER ID: 'AUN' FIELD  g_salesdocument.
        CALL TRANSACTION 'VA02' AND SKIP FIRST SCREEN.
        leave to screen 0 .
      endif.
    when 'DELLINE'.
      Clear FCODE_200.
        CALL METHOD grid_200_1->get_selected_rows
          IMPORTING
            et_index_rows = gi_index_rows[].
        DESCRIBE TABLE gi_index_rows LINES l_lines.
        IF l_lines = 0.
          MESSAGE '请选中一个行项!' type 'E'.
          EXIT.
        ENDIF.

        CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
          EXPORTING
            defaultoption = 'N'
            diagnosetext1 = '系统将删除选中的行,'
            textline1     = '确定继续?'
            titel         = '询问'
          IMPORTING
            answer        = l_answer.

        IF l_answer <> 'J'.
          EXIT.
        ENDIF.


        clear wa_upload.


        "READ TABLE gi_index_rows into wa_row INDEX 1.
        sort gi_index_rows by index DESCENDING.
        loop at gi_index_rows into wa_row .
          READ TABLE i_upload into  wa_upload INDEX  wa_row-index  .
          DELETE TABLE i_upload from  wa_upload .
        ENDLOOP.

        CALL METHOD grid_200_1->refresh_table_display.
     WHEN 'GTOP'.
      Clear FCODE_200.
        CALL METHOD grid_200_1->get_selected_rows
          IMPORTING
            et_index_rows = gi_index_rows[].
        DESCRIBE TABLE gi_index_rows LINES l_lines.
        IF l_lines = 0.
          MESSAGE '请选中一个行项!' type 'E'.
          EXIT.
        ENDIF.

        clear wa_upload.
        sort gi_index_rows by index .
        data: sindex type i.
        sindex = 1.
        loop at gi_index_rows into wa_row .
          READ TABLE i_upload into  wa_upload INDEX  wa_row-index  .
          DELETE TABLE i_upload from  wa_upload .
          INSERT wa_upload into i_upload index sindex .
          sindex = sindex + 1.
        ENDLOOP.

        "CALL METHOD grid_200_1->refresh_table_display.
     WHEN 'GUP'.
      Clear FCODE_200.
        CALL METHOD grid_200_1->get_selected_rows
          IMPORTING
            et_index_rows = gi_index_rows[].
        DESCRIBE TABLE gi_index_rows LINES l_lines.
        IF l_lines = 0.
          MESSAGE '请选中一个行项!' type 'E'.
          EXIT.
        ENDIF.

        clear wa_upload.
        sort gi_index_rows by index .

        loop at gi_index_rows into wa_row .
          sindex = wa_row-index - 1.
          if sindex < 1 .
             exit.
          endif.
          READ TABLE i_upload into  wa_upload INDEX  wa_row-index  .
          DELETE TABLE i_upload from  wa_upload .
          INSERT wa_upload into i_upload index sindex .
        ENDLOOP.
        "CALL METHOD grid_200_1->refresh_table_display.
     WHEN 'GDOWN'.
      Clear FCODE_200.
        CALL METHOD grid_200_1->get_selected_rows
          IMPORTING
            et_index_rows = gi_index_rows[].
        DESCRIBE TABLE gi_index_rows LINES l_lines.
        IF l_lines = 0.
          MESSAGE '请选中一个行项!' type 'E'.
          EXIT.
        ENDIF.

        clear wa_upload.
        sort gi_index_rows by index DESCENDING .
        DESCRIBE TABLE i_upload LINES l_lines.
        loop at gi_index_rows into wa_row .
          sindex = wa_row-index + 1.
          if sindex > l_lines .
             exit.
          endif.
          READ TABLE i_upload into  wa_upload INDEX  wa_row-index  .
          DELETE TABLE i_upload from  wa_upload .
          INSERT wa_upload into i_upload index sindex .
        ENDLOOP.
        "CALL METHOD grid_200_1->refresh_table_display.

     WHEN 'GBOTM'.
      Clear FCODE_200.
        CALL METHOD grid_200_1->get_selected_rows
          IMPORTING
            et_index_rows = gi_index_rows[].
        DESCRIBE TABLE gi_index_rows LINES l_lines.
        IF l_lines = 0.
          MESSAGE '请选中一个行项!' type 'E'.
          EXIT.
        ENDIF.


        clear wa_upload.
        sort gi_index_rows by index DESCENDING .
        DESCRIBE TABLE i_upload LINES l_lines.
        sindex = l_lines .
        loop at gi_index_rows into wa_row .
          READ TABLE i_upload into  wa_upload INDEX  wa_row-index  .
          DELETE TABLE i_upload from  wa_upload .

          "if sindex > l_lines .
          "  append wa_upload to i_upload .
          "else.
            INSERT wa_upload into i_upload index sindex .
          "endif.
          sindex = sindex - 1 .

        ENDLOOP.
        "CALL METHOD grid_200_1->refresh_table_display.
  endcase.
ENDMODULE.                 " USER_COMMAND_0200  INPUT



*&---------------------------------------------------------------------*
*&      Form  S250_ALV_INI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM S250_ALV_INI.

  data: gt_fieldcat  type lvc_t_fcat.
  data: gs_layout type lvc_s_layo.
  data: gs_variant type disvariant.
  data:gt_toolbar_excluding   Type  UI_FUNCTIONS.

  if con_250_1 is initial.
    create object con_250_1
      EXPORTING
        container_name = 'CON_250_1'.
    create object grid_250_1
      EXPORTING
        i_parent = con_250_1.
  endif.




  "定义 gird toolbar
  CLEAR gt_toolbar_excluding.
  APPEND:
          cl_gui_alv_grid=>MC_FC_PRINT               to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_DRAG_DROP_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_NO_DELETE_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_NO_INSERT_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_TO_OFFICE to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_ABC    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CHAIN    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CRBATCH    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CRWEB    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_LINEITEMS    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_MASTER_DATA    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_MORE    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_REPORT    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_XINT    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_XXL    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CHECK    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_MB_EXPORT    to gt_toolbar_excluding,

          cl_gui_alv_grid=>MC_FC_GRAPH     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_HELP     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_HTML     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_INFO     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_PC_FILE   to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_VIEWS   to gt_toolbar_excluding,

          cl_gui_alv_grid=>MC_FC_LOC_APPEND_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_COPY     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_COPY_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_CUT     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_DELETE_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_INSERT_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_MOVE_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_PASTE     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_PASTE_NEW_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_REFRESH    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_UNDO     to gt_toolbar_excluding.


  "定义grid格式
  clear gs_layout.
  gs_layout-smalltitle  = ''.
  gs_layout-grid_title  = ''.
  gs_layout-detailtitl  = '细节信息'(003).
  gs_layout-zebra   =  'X'."定义GRID的样式如斑马条式
  gs_layout-sel_mode  = 'B'.
  gs_layout-cwidth_opt  = 'X'.
  gs_layout-no_toolbar  = ''.
  gs_layout-NO_ROWMARK = 'X'.
  gs_layout-EDIT_MODE = ''.
  "gs_layout-BOX_FNAME = 'MARK'.





  "定义列
  DATA: ls_fieldcat like line of gt_fieldcat.
  CLEAR gt_fieldcat[].

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SECL'.
  ls_fieldcat-coltext = '选择'.
  ls_fieldcat-outputlen = 2.
  ls_fieldcat-checkbox = 'X'.
  "ls_fieldcat-input = 'X'.
  ls_fieldcat-edit = 'X'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'EXITS'.
  ls_fieldcat-coltext = '已被添加'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DOC_NUMBER'.
  ls_fieldcat-coltext = '凭证编号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PURCH_NO'.
  ls_fieldcat-coltext = '客户采购单号'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DOC_TYPE'.
  ls_fieldcat-coltext = '凭证类型'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALES_ORG'.
  ls_fieldcat-coltext = '销售组织'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DISTR_CHAN'.
  ls_fieldcat-coltext = '分销渠道'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DIVISION'.
  ls_fieldcat-coltext = '产品组'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PARTN_NUMB1'.
  ls_fieldcat-coltext = '售达方'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PARTN_NUMB2'.
  ls_fieldcat-coltext = '送达方'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PARTN_NUMB3'.
  ls_fieldcat-coltext = '业务员'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'ITM_NUMBER'.
  ls_fieldcat-coltext = '行项目号'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'MATERIAL'.
  ls_fieldcat-coltext = '物料号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'E_MATX'.
  ls_fieldcat-coltext = '英文描述'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'C_MATX'.
  ls_fieldcat-coltext = '中文描述'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'REQ_QTY'.
  ls_fieldcat-coltext = '需求数量'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALES_UNIT'.
  ls_fieldcat-coltext = '销售计量单位'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CD_UNT_ISO'.
  ls_fieldcat-coltext = '基本计量单位'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALQTYDEN'.
  ls_fieldcat-coltext = '转换分母'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SALQTYNUM'.
  ls_fieldcat-coltext = '转换分子'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.



  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CD_P_UNT2'.
  ls_fieldcat-coltext = '单价'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CURRENCY'.
  ls_fieldcat-coltext = '订单币别'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'COND_P_UNT'.
  ls_fieldcat-coltext = '单价的单位数量'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'COND_UNIT'.
  ls_fieldcat-coltext = '单价的单位'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'CUST_MAT35'.
  ls_fieldcat-coltext = '客户物料号'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'REQ_DATE'.
  ls_fieldcat-coltext = '交货时间'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE1'.
  ls_fieldcat-coltext = '切管长度'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE2'.
  ls_fieldcat-coltext = '包装方式'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE3'.
  ls_fieldcat-coltext = '包装说明'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'VALUE4'.
  ls_fieldcat-coltext = '印字方式'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SHORT_TEXT'.
  ls_fieldcat-coltext = '行项目文本'.
  "ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'QUO_NUMBER'.
  ls_fieldcat-coltext = '报价单号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'QUO_ITEMNO'.
  ls_fieldcat-coltext = '报价行项号'.
  ls_fieldcat-CONVEXIT = 'ALPHA'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CONCATENATE sy-repid '250' into gs_variant-report.
  "gs_variant-report = sy-repid. "指定保存变式的程序名.
  call method grid_250_1->set_table_for_first_display
    EXPORTING
      is_variant           = gs_variant
      it_toolbar_excluding = gt_toolbar_excluding
      is_layout            = gs_layout"采用自定义的格式
      I_SAVE               = 'A'
      I_DEFAULT            = 'X'
    CHANGING
      it_outtab            = I_UPLOAD2[]
      it_fieldcatalog      = gt_fieldcat[].



  SET HANDLER event_receiver->grid_250_1_user_command
              event_receiver->grid_250_1_toolbar FOR grid_250_1.
  CALL METHOD grid_250_1->set_toolbar_interactive.

ENDFORM.                    "S250_ALV_INI

*&---------------------------------------------------------------------*
*&      Module  STATUS_0250  OUTP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0250 OUTPUT.
  SET PF-STATUS 'G250'.
  SET TITLEBAR 'T250'.

  PERFORM S250_ALV_INI.

ENDMODULE.                 " STATUS_0250  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0250  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0250 INPUT.
  case  FCODE_250.
    when 'BACK'.
      Clear FCODE_250.
      LEAVE to screen 0 .
    when 'EXIT'.
      Clear FCODE_250.
      LEAVE PROGRAM.
    when 'CANCEL' or 'RTN'.
      Clear FCODE_250.
      leave to screen 0 .
    when 'RUN'.
      Clear FCODE_250.

      PERFORM GetQuotationFromDb.
      CALL METHOD grid_250_1->refresh_table_display.
    when 'COF' .
      Clear FCODE_250.

      CALL METHOD grid_250_1->check_changed_data.

      CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
        EXPORTING
          defaultoption = 'N'
          diagnosetext1 = '是否将选中报价行项添加到当前待创建订单'
          textline1     = '确定继续?'
          titel         = '询问'
        IMPORTING
          answer        = l_answer.
      IF l_answer <> 'J'.
        EXIT.
      ENDIF.


      "to do copy upload2 to upload
      LOOP AT I_UPLOAD2 WHERE SECL = 'X' AND EXITS <> 'X' .
         i_upload = i_upload2.
         i_UPLOAD2-EXITS = 'X'.
         i_upload-req_date = p_edatu.
         i_upload-doc_type = p_auart.
         append i_upload .
         modify i_upload2 TRANSPORTING EXITS.
      ENDLOOP.

      leave to screen 0 .
  endcase.
ENDMODULE.                 " USER_COMMAND_0250  INPUT

FORM GetQuotationFromDb.

    data: p_ARKTX_t(255),p_MATKL_t(255).
    CONCATENATE '%' p_ARKTX '%' into p_ARKTx_t.
    CONCATENATE '%' p_MATKL '%' into p_MATKL_t.

    select

               "doc_number                    "凭证编号
               bstnk as purch_no              "客户采购单号
               auart as doc_type              "凭证类型
               vbak~vkorg as sales_org             "销售组织
               vbak~vtweg as distr_chan            "分销渠道
               vbak~spart as division              "产品组

               vbpa1~kunnr as partn_numb1     "售达方
               vbpa2~kunnr as partn_numb2     "送达方
               vbpa3~PERNR as partn_numb3     "人员,雇员

               "itm_number                    "行项目号
               vbap~matnr as material              "物料号
               vbap~KWMENG as req_qty               "需求数量
               vbap~vrkme as sales_unit            "销售计量单位
               vbap~MEINS as cd_unt_iso            "基本计量单位   NEW

               vbap~umvkn as salqtyden             "转换分母,denominator  : n个销售单位
               vbap~umvkz as salqtynum             "转换分子,numerator    : m个基本单位 = n个销售单位


               "cd_p_unt2 TYPE bapikbetr1,     "单价
               "currency TYPE waers,           "订单币别
               "cond_p_unt TYPE  kpein ,       "单价的单位数量        NEW
               "cond_unit TYPE  kmein ,        "单价的单位

               vbap~kdmat as cust_mat35             "客户物料号



               "req_date    TYPE  edatu ,      "交货时间

               "value1 TYPE cux_value,         "特性1-切管长度
               "value2 TYPE cux_value,         "特性2-包装方式
               "value3(100) ,"TYPE cux_value,  "特性3-客制包装说明
               "value4(100), "TYPE cux_value,  "特性4-印字方式内容
               "short_text TYPE arktx,         "行项目文本字段




               "以下字段用于查看,并不作为创建订单的数据
               "-----------------------------------------------
               makt1~MAKTX as  c_matx          "物料中文描述
               makt2~MAKTX as  e_matx          "物料英文描述
               vbap~vbeln as quo_number        "报价单号
               vbap~posnr as quo_itemno        "报价行项号
               vbap~cuobj                      "特性实例号
               vbak~knumv                      "定价关联序号

    into corresponding fields of table i_upload2
    from vbap
    inner join vbak on vbak~vbeln = vbap~vbeln
    inner join vbpa as vbpa1 on vbpa1~VBELN = vbap~VBELN and vbpa1~posnr = '000000' and vbpa1~PARVW = 'AG'
    inner join vbpa as vbpa2 on vbpa2~VBELN = vbap~VBELN and vbpa2~posnr = '000000' and vbpa2~PARVW = 'WE'
    inner join vbpa as vbpa3 on vbpa3~VBELN = vbap~VBELN and vbpa3~posnr = '000000' and vbpa3~PARVW = 'ZM'
    "left  join konv on konv~knumv = vbak~knumv and konv~kposn = vbap~posnr and ( kshcl = 'PR00' or kshcl = 'PR01' ) 聚集表不能关联,需要在 loop 中分别取出
    inner  join MAKT as MAKT1 on makt1~matnr = vbap~matnr and makt1~spras = '1'
    inner  join MAKT as MAKT2 on makt2~matnr = vbap~matnr and makt2~spras = 'E'
    where vbap~vbeln in p_vbeln
      and vbak~kunnr = p_kunnr
      and vbak~vkorg = p_vkorg
      and ( MAKT1~MAKTX like p_ARKTX_t or MAKT2~MAKTX like p_ARKTX_t )
      and vbap~MATKL like p_MATKL_t
      and vbak~bnddt >= sy-datum.


    loop at i_upload2.

        IF i_upload2-cuobj <> 0 . " ê??é??????á?

          DATA: i_configuration LIKE api_value OCCURS 0 WITH HEADER LINE.
          DATA: stratwtb(50) TYPE c.
          CALL FUNCTION 'VC_I_GET_CONFIGURATION'
            EXPORTING
              instance           = i_upload2-cuobj
              language           = sy-langu
              print_sales        = 'X'
            TABLES
              configuration_idoc = i_configuration
            EXCEPTIONS
              OTHERS             = 4.


          LOOP AT i_configuration .
            case i_configuration-atnam .
              when 'I_CUT_LENG'.
                 i_upload2-value1 =  i_configuration-atwrt.
                 REPLACE 'm' WITH '' INTO i_upload2-value1.

              when 'I_PACKING'.
                 i_upload2-value2 =  i_configuration-atwrt.

              when 'C_PACK_PS'.
                 i_upload2-value3 =  i_configuration-atwrt.

              when 'C_PRINT_PS'.
                 i_upload2-value4 =  i_configuration-atwrt.

              "when 'C_PRINT_SL'.
              "   i_upload2-value5 =  i_configuration-atwrt.

            endcase.
          ENDLOOP.

        ENDIF.
        select single
                  kbetr waers kpein kmein
        into  (i_upload2-cd_p_unt2 ,  i_upload2-currency , i_upload2-cond_p_unt , i_upload2-cond_unit)
        from  konv
        where konv~knumv = i_upload2-knumv
          and konv~kposn = i_upload2-quo_ItemNo
          and ( konv~kschl = 'PR00' or konv~kschl = 'PR01' ) . "聚集表不能关联,需要在 loop 中分别取出

        perform getSalesItmTxt using i_upload2-quo_number i_upload2-quo_ItemNo changing i_upload2-short_text .
        loop at i_upload where quo_number = i_upload2-quo_number and quo_itemno = i_upload2-quo_itemno.
           i_upload2-EXITS = 'X'.
           exit.
        endloop.
        MODIFY i_upload2 TRANSPORTING  value1 value2 value3 value4 short_text cd_p_unt2 currency cond_p_unt cond_unit EXITS .





    endloop.

ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  GetSalesItmTxt
*&---------------------------------------------------------------------*
*       取得销售订单行项目文本
*----------------------------------------------------------------------*
*      -->p_VBELN   text
*      -->p_POSNR   text
*      <--p_TEXT    Text
*----------------------------------------------------------------------*
FORM GetSalesItmTxt USING   p_VBELN   LIKE    VBAK-VBELN
                            p_POSNR   LIKE    VBAP-POSNR
                  CHANGING  p_TEXT."    TYPE    String.

  DATA: itab_sohead like thead ,
        itab_soline like tline occurs 0 with header line .
  DATA: p_Name Like THEAD-TDNAME,
        p1 LIKE p_VBELN,
        p2 LIKE p_POSNR .
  DATA:tmp TYPE String value ''.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_VBELN
    IMPORTING
      output = p1.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_POSNR
    IMPORTING
      output = p2.

  CONCATENATE p1 p2 into p_Name.

  " ID :0001   Name: 销售单+行项目号 0000110298000010     object: VBBP
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      ID                      = '0001'
      LANGUAGE                = '1'
      NAME                    = p_Name
      OBJECT                  = 'VBBP'
    IMPORTING
      HEADER                  = itab_sohead
    TABLES
      LINES                   = itab_soline
    EXCEPTIONS
      ID                      = 1
      LANGUAGE                = 2
      NAME                    = 3
      NOT_FOUND               = 4
      OBJECT                  = 5
      REFERENCE_CHECK         = 6
      WRONG_ACCESS_TO_ARCHIVE = 7
      OTHERS                  = 8.
  Loop at itab_soline.
    CONCATENATE ' ' tmp itab_soline-tdline INTO tmp.
  endloop .
  IF tmp <> ''.
    p_TEXT =  tmp.
    exit.
  ENDIF.


  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      ID                      = '0001'
      LANGUAGE                = 'E'
      NAME                    = p_Name
      OBJECT                  = 'VBBP'
    IMPORTING
      HEADER                  = itab_sohead
    TABLES
      LINES                   = itab_soline
    EXCEPTIONS
      ID                      = 1
      LANGUAGE                = 2
      NAME                    = 3
      NOT_FOUND               = 4
      OBJECT                  = 5
      REFERENCE_CHECK         = 6
      WRONG_ACCESS_TO_ARCHIVE = 7
      OTHERS                  = 8.
  Loop at itab_soline.
    CONCATENATE ' ' tmp itab_soline-tdline INTO tmp.
  endloop .

  p_TEXT =  tmp.



ENDFORM.                    "GetSalesItmTxt





*&---------------------------------------------------------------------*
*&      Form  GetSalesItmTxt
*&---------------------------------------------------------------------*
*       取得销售订单行项目文本
*----------------------------------------------------------------------*
*      -->p_VBELN   text
*      -->p_POSNR   text
*      <--p_TEXT    Text
*----------------------------------------------------------------------*
FORM GetSalesTxt USING   p_VBELN   LIKE    VBAK-VBELN
                  CHANGING  p_TEXT."    TYPE    String.

  DATA: itab_sohead like thead ,
        itab_soline like tline occurs 0 with header line .
  DATA: p_Name Like THEAD-TDNAME,
        p1 LIKE p_VBELN.
  DATA:tmp TYPE String value ''.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_VBELN
    IMPORTING
      output = p1.

  p_Name = p1.

  "CONCATENATE p1 p2 into p_Name.

  " ID :0001   Name: 销售单+行项目号 0000110298000010     object: VBBP
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      ID                      = '0001'
      LANGUAGE                = '1'
      NAME                    = p_Name
      OBJECT                  = 'VBBK'
    IMPORTING
      HEADER                  = itab_sohead
    TABLES
      LINES                   = itab_soline
    EXCEPTIONS
      ID                      = 1
      LANGUAGE                = 2
      NAME                    = 3
      NOT_FOUND               = 4
      OBJECT                  = 5
      REFERENCE_CHECK         = 6
      WRONG_ACCESS_TO_ARCHIVE = 7
      OTHERS                  = 8.
  Loop at itab_soline.
    CONCATENATE ' ' tmp itab_soline-tdline INTO tmp.
  endloop .
  IF tmp <> ''.
    p_TEXT =  tmp.
    exit.
  ENDIF.


  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      ID                      = '0001'
      LANGUAGE                = 'E'
      NAME                    = p_Name
      OBJECT                  = 'VBBK'
    IMPORTING
      HEADER                  = itab_sohead
    TABLES
      LINES                   = itab_soline
    EXCEPTIONS
      ID                      = 1
      LANGUAGE                = 2
      NAME                    = 3
      NOT_FOUND               = 4
      OBJECT                  = 5
      REFERENCE_CHECK         = 6
      WRONG_ACCESS_TO_ARCHIVE = 7
      OTHERS                  = 8.
  Loop at itab_soline.
    CONCATENATE ' ' tmp itab_soline-tdline INTO tmp.
  endloop .

  p_TEXT =  tmp.



ENDFORM.                    "GetSalesTxt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxgnolux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值