上一篇: abap-MRP自动产生采购申请-BADI增强-将销售单和行号复制为需求追踪号          下一篇: sap-系统应用报告

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

公司业务背景:
    一般是针对客户的应用领域,将相关的产品都会给一份报价,有效期一般都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:    gnolux-blog.appsot.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