使用BAPI_CONTRACT_CREATE创建采购合同框架协议

来源:互联网 发布:sqlserver 2005 dev 编辑:程序博客网 时间:2024/05/03 22:10
*&---------------------------------------------------------------------*
*& Report  ZMMF201 采购合同框架协议批导程序
*& T-code  ZZME31K
*&---------------------------------------------------------------------*
*& Created by Xavery Hsueh on 2013-01-29 新开发程序
*&
*&---------------------------------------------------------------------*
REPORT  zmmf201 NO STANDARD PAGE HEADING.

************************************************************************
**  声明数据库表 Declaration of database                              **
************************************************************************
TABLES:ekko,
       ekpo,
       kna1.    "
************************************************************************
**  定义结构类型 Define the structure's type                          **
************************************************************************
*     采购合同行项目及属性
TYPES:BEGIN OF typ_ekpo,
        ebelp  TYPE ebelp,     "采购合同项目号
        pstyp  TYPE pstyp,     "项目类别
        knttp  TYPE knttp,     "科目分配类别
        matnr  TYPE matnr,     "物料号
        matkl  TYPE matkl,     "物料组
        txz01  TYPE txz01,     "短文本
        ktmng  TYPE ktmng,     "目标数量
        meins  TYPE meins,     "单位
        netpr  TYPE kbetr,     "净价
        peinh  TYPE epein,     "价格单位
        bwtar  TYPE bwtar_d,   "评估类型
        mwskz  TYPE mwskz,     "税码
        werks  TYPE werks_d,      "工厂
        webre  TYPE webre,     "基于GR的IV.
        kostl  TYPE kostl,
        bednr  TYPE bednr,     "需求跟踪号
        kdatb  TYPE ekko-kdatb, "条件记录有效起始日期
        kdate  TYPE ekko-kdate, "条件记录有效截止日期
        atr01  TYPE char30,
      END OF typ_ekpo.
DATA: wa_ekpo TYPE typ_ekpo.

*     采购合同抬头数据
TYPES:BEGIN OF typ_ekko,
        ebeln  TYPE ebeln,        "采购合同顺序号
        lifnr  TYPE lifnr,        "供应商账号
        evart  TYPE bsart,        "协议类型
        ekorg  TYPE ekko-ekorg,   "采购组织
        ekgrp  TYPE ekko-ekgrp,   "采购组
        bukrs  TYPE bukrs,        "公司代码
        kdatb  TYPE ekko-kdatb,   "有效起始日期
        kdate  TYPE ekko-kdate,   "有效截止日期
        verkf  TYPE everk,        "销售员:外部合同号
        waers  TYPE waers,        "货币
      END OF typ_ekko.
DATA: wa_ekko TYPE typ_ekko.

*     采购合同数据
DATA:BEGIN OF gt_po OCCURS 0,
        ekko TYPE typ_ekko,          "抬头数据
        ekpo TYPE TABLE OF typ_ekpo, "行项目数据
      END OF gt_po.
*     结果内表数据
TYPES:BEGIN OF typ_result,
        ekko  TYPE typ_ekko,        "采购合同抬头数据
        ekpo  TYPE typ_ekpo,        "采购合同行项目数据
        box   TYPE c,               "选择标记
        icon  TYPE icon_d,          "红绿灯指示
        chrst TYPE char100,         "检查结果
      END OF typ_result.
************************************************************************
**  定义变量与内表 Define the variants and Internal tables            **
************************************************************************
DATA:gt_result  TYPE TABLE OF typ_result  WITH HEADER LINE,
     gt_cell  TYPE TABLE OF alsmex_tabline WITH HEADER LINE,
     gt_t149d TYPE TABLE OF t149d WITH HEADER LINE.

DATA:BEGIN OF gt_contract OCCURS 0,
       ebeln TYPE ebeln,
       contr TYPE ebeln,
       icon  TYPE icon_d,
       chrst TYPE tdline,
     END OF gt_contract.

DATA:gt_text(4096) TYPE c OCCURS 0.
DATA:g_file  TYPE string.
DATA:g_indic TYPE c,           "数据错误标致
     g_index TYPE i,           "采购合同行项目的个数
     g_ebelp TYPE ebelp,       "行项目号计算
     g_flag  TYPE c.           "判断标识

FIELD-SYMBOLS: TYPE typ_result.
*@------------------ ALV 相关的变量 -----------------------------------*
TYPE-POOLS:slis.
DATA: g_grid TYPE REF TO  cl_gui_alv_grid,
      g_repid             LIKE sy-repid,
      g_structure_name    TYPE tabname,
      g_command           TYPE  slis_formname,
      g_title             TYPE lvc_title,
      g_setting           TYPE lvc_s_glay,
      wa_print            TYPE slis_print_alv,
      gt_list_top_of_page TYPE slis_t_listheader,
      gt_events           TYPE slis_t_event WITH HEADER LINE,
      gt_sort             TYPE slis_t_sortinfo_alv,
      wa_sort             TYPE slis_sortinfo_alv,
      wa_layout           TYPE slis_layout_alv,
      gt_fieldcat         TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      wa_fieldcat         LIKE LINE OF gt_fieldcat,
      g_field             TYPE char30,
      g_save              TYPE c,
      g_con_mark          TYPE slis_fieldcat_alv-fieldname VALUE 'MARK',
      g_length            TYPE i,
      g_pos               TYPE i.

FIELD-SYMBOLS:.
*@---------------------------------------------------------------------*
*@    创建采购合同 BAPI_CONTRACT_CREATE 用到的变量
*@---------------------------------------------------------------------*
CONSTANTS:con_create TYPE char10 VALUE 'CREATE',
          con_change TYPE char10 VALUE 'CHANGE',
          con_yes    TYPE c      VALUE 'X'.

DATA:g_action TYPE char10,        "执行动作说明
     wa_header    TYPE bapimeoutheader,
     wa_headerx   TYPE bapimeoutheaderx,
     gt_h_cond_v  TYPE TABLE OF bapimeoutheadvalidity WITH HEADER LINE,
     gt_h_cond_vx TYPE TABLE OF bapimeoutheadvalidityx WITH HEADER LINE,
     gt_item      TYPE bapimeout_t_item WITH HEADER LINE,
     gt_itemx     TYPE bapimeout_t_itemx WITH HEADER LINE,
     gt_account   TYPE TABLE OF bapimeoutaccount WITH HEADER LINE,
     gt_accountx  TYPE TABLE OF bapimeoutaccountx WITH HEADER LINE,
     gt_item_cond_v TYPE TABLE OF bapimeoutvalidity WITH HEADER LINE,
     gt_item_cond_vx TYPE TABLE OF bapimeoutvalidityx WITH HEADER LINE,
     gt_item_cond   TYPE TABLE OF bapimeoutcondition WITH HEADER LINE,
     gt_item_condx  TYPE TABLE OF bapimeoutconditionx WITH HEADER LINE,
     gt_return TYPE bapiret2_t WITH HEADER LINE,

g_subrc TYPE sy-subrc.

DATA:g_ebeln TYPE bapimeoutheader-number,                   "#EC NEEDED
     gt_extensionin LIKE bapiparex OCCURS 0 WITH HEADER LINE,
     gt_extensionout TYPE bapiparex_t.



************************************************************************
**  宏定义 Define the macro                                           **
************************************************************************
DEFINE mcr_range.
  clear &1.
  &1-sign = 'I'.
  &1-option = &2.
  &1-low = &3.
  &1-high = &4.
  append &1.
END-OF-DEFINITION.

* 给FILEDCAT ALV内表赋值
DEFINE mcr_field.
  clear wa_fieldcat.
  clear g_field.
  g_pos = g_pos + 1 .
  wa_fieldcat-col_pos       =  g_pos.
  wa_fieldcat-fieldname = &1.
  wa_fieldcat-tabname = 'GT_RESULT'.
* wa_fieldcat-no_out = 'X'.      "field no display, choose from layout
  wa_fieldcat-key = &2.         "SUBTOTAL KEY
  wa_fieldcat-seltext_l = &3.
* 计算输出字段的长度
  concatenate 'GT_RESULT-' &1 into g_field.
  assign (g_field) to .
  describe field output-length  g_length.
  wa_fieldcat-outputlen = g_length.
  append wa_fieldcat to gt_fieldcat.
END-OF-DEFINITION.
************************************************************************
**  选择屏幕 Customize the selection-screen                           **
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE text-001.
PARAMETERS: p_filenm TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************
**  执行程序事件 Executing the program's events                       **
************************************************************************
INITIALIZATION.
  PERFORM sub_init_cond.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_filenm.
  PERFORM sub_get_directory.

START-OF-SELECTION.
  PERFORM sub_upload_data.      "上载数据
  PERFORM sub_process_data.     "转换数据类型与格式
  PERFORM sub_check_header.     "销售订单抬头数据检查
  PERFORM sub_check_item.       "销售订单行项目数据检查

END-OF-SELECTION.
  PERFORM sub_create_fieldcat.
  PERFORM sub_init_layout.
  PERFORM sub_display_as_alv.

*@---------------------------------------------------------------------*
*@      Form  SUB_INIT_COND
*@---------------------------------------------------------------------*
*       初始化选择条件
*----------------------------------------------------------------------*
FORM sub_init_cond .
  p_filenm = '20130116-06-ME31K模版2.4.xlsx'.
ENDFORM.                    " SUB_INIT_COND
*&---------------------------------------------------------------------*
*&      Form  SUB_GET_DIRECTORY
*&---------------------------------------------------------------------*
*       给选择条件字段添加文件目录搜索帮助
*----------------------------------------------------------------------*
FORM sub_get_directory.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = p_filenm
      mask             = ',*.xls.'
      mode             = 'O'
      title            = 'File Name'
    IMPORTING
      filename         = p_filenm
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  g_file = p_filenm.
ENDFORM.                    " SUB_GET_DIRECTORY
*&---------------------------------------------------------------------*
*&      Form  SUB_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       将数据上载到内表中
*----------------------------------------------------------------------*
FORM sub_upload_data .
* 上载电子表格数据
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_filenm
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 139
      i_end_row               = 9999
    TABLES
      intern                  = gt_cell
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
ENDFORM.                    " SUB_UPLOAD_DATA
*&---------------------------------------------------------------------*
*&      Form  sub_process_data
*&---------------------------------------------------------------------*
*       将EXCEL上载上来的数据转换到指定类型的内表中
*----------------------------------------------------------------------*
FORM sub_process_data .
  CLEAR:gt_result,
        wa_ekko,
        wa_ekpo,
        g_index,
        g_ebelp.

  g_flag = 'X'.
  g_index = 1.
* 将上载的数据添加到结果内表中
  LOOP AT gt_cell.
    PERFORM sub_process_header.   "处理采购合同抬头数据
    PERFORM sub_process_item.     "处理采购行项目数据
*   当某行的指定字段值为‘#’号,表示这是销售订单之间的分隔标识,本行
*   不是有效数据。
    AT END OF row.
      IF g_flag = '#'.     "销售订单结束行,不是有效的行项目数据
        g_index = g_index + 1.  "计算销售订单顺序号
        g_flag = 'X'.
        CLEAR wa_ekko.
        CLEAR g_ebelp.
      ELSE.
        CLEAR g_flag.
        CLEAR gt_result.
        g_ebelp = g_ebelp + 10.  "计算销售订单行项目号
        gt_result-ekko = wa_ekko.
        gt_result-ekpo = wa_ekpo.
        gt_result-ekko-ebeln = g_index.
        gt_result-ekpo-ebelp = g_ebelp.
        APPEND gt_result.
        CLEAR wa_ekpo.
      ENDIF.
    ENDAT.
  ENDLOOP.
ENDFORM.                    " sub_process_data
*&---------------------------------------------------------------------*
*&      Form  SUB_PROCESS_HEADER
*&---------------------------------------------------------------------*
*       处理上载文件中的采购合同抬头数据
*----------------------------------------------------------------------*
FORM sub_process_header .
  CHECK g_flag = 'X'.
  CASE gt_cell-col.
    WHEN '0001'.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = gt_cell-value
        IMPORTING
          output = wa_ekko-lifnr.     "供应商账号
    WHEN '0002'.
      wa_ekko-evart = gt_cell-value.  "协议类型
    WHEN '0003'.
      wa_ekko-ekorg = gt_cell-value.  "采购组织
    WHEN '0004'.
      wa_ekko-ekgrp = gt_cell-value.  "采购组
    WHEN '0006'.
      wa_ekko-bukrs = gt_cell-value.  "公司代码
    WHEN '0007'.
      CALL FUNCTION 'CONVERSION_EXIT_DATEX_INPUT'
        EXPORTING
          input  = gt_cell-value
        IMPORTING
          output = wa_ekko-kdatb.      "有效起始日期
    WHEN '0008'.
      CALL FUNCTION 'CONVERSION_EXIT_DATEX_INPUT'
        EXPORTING
          input  = gt_cell-value
        IMPORTING
          output = wa_ekko-kdate.      "有效截止日期
    WHEN '0024'.
      wa_ekko-verkf = gt_cell-value.   "销售员:外部合同号
    WHEN OTHERS.
  ENDCASE.
  wa_ekko-waers = 'RMB'.
ENDFORM.                    " SUB_PROCESS_HEADER
*&---------------------------------------------------------------------*
*&      Form  SUB_PROCESS_ITEM
*&---------------------------------------------------------------------*
*       处理上载文件中的销售订单行项目数据
*----------------------------------------------------------------------*
FORM sub_process_item .
  CASE gt_cell-col.
    WHEN '0001'.
      IF gt_cell-value = '#'.   "分隔标记
        g_flag = '#'.
      ENDIF.
    WHEN '0020'.
      wa_ekpo-pstyp = gt_cell-value.       "项目类别
    WHEN '0021'.
      wa_ekpo-knttp = gt_cell-value.       "科目分配类别
    WHEN '0009'.
      wa_ekpo-matnr = gt_cell-value+0(18). "物料号
    WHEN '0005'.
      wa_ekpo-werks = gt_cell-value.       "工厂
    WHEN '0022'.                           "物料描述
      wa_ekpo-txz01 = gt_cell-value.
    WHEN '0023'.
      wa_ekpo-matkl = gt_cell-value.
    WHEN '0010'.
      wa_ekpo-ktmng = gt_cell-value.       "数量
    WHEN '0011'.
      wa_ekpo-meins = gt_cell-value.       "计量单位
    WHEN '0012'.
      wa_ekpo-netpr = gt_cell-value.       "净价
    WHEN '0013'.
      wa_ekpo-peinh = gt_cell-value.       "价格单位
    WHEN '0014'.
      CALL FUNCTION 'CONVERSION_EXIT_DATEX_INPUT'
        EXPORTING
          input  = gt_cell-value
        IMPORTING
          output = wa_ekpo-kdatb.         "有效截止日期
    WHEN '0015'.
      CALL FUNCTION 'CONVERSION_EXIT_DATEX_INPUT'
        EXPORTING
          input  = gt_cell-value
        IMPORTING
          output = wa_ekpo-kdate.          "有效截止日期
    WHEN '0016'.
      wa_ekpo-bwtar = gt_cell-value.       "评估类型
    WHEN '0017'.
      wa_ekpo-mwskz = gt_cell-value.       "税码
    WHEN '0018'.
      wa_ekpo-webre = gt_cell-value.       "基于GR的IV.
    WHEN '0025'.
      wa_ekpo-kostl  = gt_cell-value.
    WHEN '0019'.
      wa_ekpo-bednr  = gt_cell-value.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.                    " SUB_PROCESS_ITEM
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_HEADER
*&---------------------------------------------------------------------*
*       检查结果内表的订单抬头数据并更新检查状态
*----------------------------------------------------------------------*
FORM sub_check_header .

ENDFORM.                    " SUB_CHECK_HEADER
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_ITEM
*&---------------------------------------------------------------------*
*       检查结果内表的订单行项目数据并更新检查状态
*----------------------------------------------------------------------*
FORM sub_check_item .
  SELECT * FROM t149d INTO TABLE gt_t149d.

  SORT gt_t149d BY bwtar.
  LOOP AT gt_result ASSIGNING .
*   根据物料号来取物料组
    IF -ekpo-matnr IS INITIAL.
    ELSE.
      SELECT SINGLE
            matkl
            maktx
            meins
          INTO (-ekpo-matkl,
                -ekpo-txz01,
                -ekpo-meins)
          FROM mara INNER JOIN makt ON mara~matnr = makt~matnr
          WHERE mara~matnr = -ekpo-matnr AND
                spras = 1.
    ENDIF.
*   检查评估类型
    CLEAR gt_t149d.
    READ TABLE gt_t149d WITH KEY bwtar = -ekpo-bwtar
                                 BINARY SEARCH.
    IF sy-subrc = 0.

    ELSE.
      IF -ekpo-bwtar IS NOT INITIAL.
        -chrst = '输入的评估类型不存在!'.
      ENDIF.
    ENDIF.
*   数据正确赋绿灯,数据不正确赋红灯
    IF -chrst IS INITIAL.
      -icon = '@08@'.         "绿灯
    ELSE.
      -icon = '@0A@'.         "红灯
    ENDIF.
  ENDLOOP.
ENDFORM.                    " SUB_CHECK_ITEM
*&---------------------------------------------------------------------*
*&      Form  SUB_CREATE_FIELDCAT
*&---------------------------------------------------------------------*
*       给输出的结果内表指定字段
*----------------------------------------------------------------------*
FORM sub_create_fieldcat .
  CLEAR gt_fieldcat[].
  mcr_field  'ICON'          'X'    '指识标识'.
  mcr_field  'EKKO-EBELN'    'X'    '采购合同序号'.
  mcr_field  'EKPO-EBELP'    'X'    '项目号'.
  mcr_field  'EKKO-LIFNR'    ''     '供应商账号'.
  mcr_field  'EKKO-EVART'    ''     '协议类型'.
  mcr_field  'EKKO-EKORG'    ''     '采购组织'.
  mcr_field  'EKKO-EKGRP'    ''     '采购组'.
  mcr_field  'EKPO-WERKS'    ''     '工厂'.
  mcr_field  'EKKO-BUKRS'    ''     '公司代码'.
  mcr_field  'EKKO-KDATB'    ''     '有效起始日期' .
  mcr_field  'EKKO-KDATE'    ''     '有效截止日期' .
  mcr_field  'EKKO-VERKF'    ''     '外部合同号'.
  mcr_field  'EKPO-PSTYP'    ''     '项目类别'.
  mcr_field  'EKPO-KNTTP'    ''     '科目分配类别'.
  mcr_field  'EKPO-MATNR'    ''     '物料编号'.
  mcr_field  'EKPO-TXZ01'    ''     '物料描述'.
  mcr_field  'EKPO-MATKL'    ''     '物料组'.
  mcr_field  'EKPO-KTMNG'    ''     '目标数量'.
  mcr_field  'EKPO-MEINS'    ''     '计量单位'.
  mcr_field  'EKPO-KDATB'    ''     '条件记录有效起始日期'.
  mcr_field  'EKPO-KDATE'    ''     '条件记录有效截止日期'.
  mcr_field  'EKPO-NETPR'    ''     '净价'.
  mcr_field  'EKPO-PEINH'    ''     '价格单位'.
  mcr_field  'EKPO-BWTAR'    ''     '评估类型'.
  mcr_field  'EKPO-MWSKZ'    ''     '税码'.
  mcr_field  'EKPO-WEBRE'    ''     '基于GR的IV'.
  mcr_field  'EKPO-KOSTL'    ''     '成本中心'.
  mcr_field  'EKPO-BEDNR'    ''     '需求跟踪号'.
  mcr_field  'CHRST'         ''     '检查结果'.
ENDFORM.                    " SUB_CREATE_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  SUB_INIT_LAYOUT
*&---------------------------------------------------------------------*
*       设置常用的输出布局参数
*----------------------------------------------------------------------*
FORM sub_init_layout .
  wa_layout-zebra             = 'X'.
  wa_layout-window_titlebar   = '采购合同框架协议批导入程序'.
  wa_layout-colwidth_optimize = 'X'.
  wa_layout-box_fieldname     = 'BOX'.
  wa_layout-header_text       = '选择'.
ENDFORM.                    " SUB_INIT_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  SUB_DISPLAY_AS_ALV
*&---------------------------------------------------------------------*
*       调用 ALV 的FUNCTION来输出结果
*----------------------------------------------------------------------*
FORM sub_display_as_alv .
  g_repid = sy-repid.
  g_setting-coll_top_p = 'X'.       "最小化 CALLBACK-TOP-OF-PAGE.
* ABAP List Viewer
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = g_repid
      i_structure_name         = 'TYP_RESULT'
      i_grid_title             = g_title
      i_grid_settings          = g_setting
      i_callback_user_command  = 'SUB_USER_COMMAND'
      i_callback_pf_status_set = 'SUB_SET_PF_STATUS'
      i_save                   = g_save
      is_layout                = wa_layout
      it_fieldcat              = gt_fieldcat[]
    TABLES
      t_outtab                 = gt_result
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.                    " SUB_DISPLAY_AS_ALV
*@--------------------------------------------------------------------*
*@      Form  sub_user_command
*@--------------------------------------------------------------------*
*      -->R_UCOMM     事务功能码
*      -->RS_SELFIELD ALV相关的数据
*---------------------------------------------------------------------*
FORM sub_user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.
  DATA l_ebeln TYPE ebeln.
  CASE r_ucomm.
    WHEN '&IC1'.                 "双击事件的功能码
      CASE rs_selfield-fieldname.
        WHEN 'EKKO-EBELN'.
          l_ebeln = rs_selfield-value.
          CALL FUNCTION 'ME_DISPLAY_PURCHASE_DOCUMENT'
            EXPORTING
              i_ebeln              = l_ebeln
            EXCEPTIONS
              not_found            = 1
              no_authority         = 2
              invalid_call         = 3
              preview_not_possible = 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.
          ENDIF.

        WHEN OTHERS.
      ENDCASE.
    WHEN 'CREATE'.               "创建销售订单
      PERFORM sub_ucomm_create.
  ENDCASE.
* 刷新ALV报表
  rs_selfield-refresh = 'X'.
ENDFORM.                    "sub_user_command
*@---------------------------------------------------------------------*
*@       FORM SUB_SET_PF_STATUS                                        *
*@---------------------------------------------------------------------*
*  设置ALV菜单
*  通过SE41,拷贝程序SAPLSLVC_FULLSCREEN的状态STANDARD_FULLSCREEN过来
*@---------------------------------------------------------------------*
FORM sub_set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.                    "sub_set_pf_status
*&---------------------------------------------------------------------*
*&      Form  SUB_UCOMM_CREATE
*&---------------------------------------------------------------------*
*       创建销售订单
*----------------------------------------------------------------------*
FORM sub_ucomm_create .
  PERFORM sub_check_data.  "检查数据是否正确
  g_action = con_create.
  LOOP AT gt_result ASSIGNING WHERE icon = '@08@'.
    CLEAR:wa_ekko,
          wa_ekpo.
*   将抬头数据信息赋值到BAPI函数的内表
    wa_ekko = -ekko.
    AT NEW ekko-ebeln.
      REFRESH:gt_item,
              gt_itemx,
              gt_account,
              gt_accountx,
              gt_item_cond_v,
              gt_item_cond_vx,
              gt_item_cond,
              gt_item_condx.
      PERFORM sub_contract_header.      "处理销售订单抬头数据
    ENDAT.
*   处理行项目的信息
    wa_ekpo = -ekpo.
    PERFORM sub_contract_item.        "处理一般行项目信息
    PERFORM sub_contract_account.     "处理会计科目信息
    PERFORM sub_contract_item_cond_v. "处理行项目的条件记录有效日期
    PERFORM sub_contract_item_cond.   "处理行项目的条件记录
*   调用BAPI函数来创建销售订单
    AT END OF ekko-ebeln.
      PERFORM sub_contract_create.        "调用FUNCTION创建销售订单
      PERFORM sub_contract_commit.        "提交
      PERFORM sub_refresh_result.         "更新结果内表
    ENDAT.
  ENDLOOP.
* 更新结果内表
  SORT gt_contract BY ebeln.
  LOOP AT gt_result ASSIGNING .
    CLEAR gt_contract.
    READ TABLE gt_contract WITH KEY ebeln = -ekko-ebeln
                                    BINARY SEARCH.
    IF sy-subrc = 0.
      -icon  = gt_contract-icon.
      -ekko-ebeln = gt_contract-contr.
      -chrst = gt_contract-chrst.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " SUB_UCOMM_CREATE
*&---------------------------------------------------------------------*
*&      Form  SUB_CHECK_DATA
*&---------------------------------------------------------------------*
*       检查导入的数据是否正确,如果不正确,则给出 Error Message,禁止
*       用户继续创建销售订单
*----------------------------------------------------------------------*
FORM sub_check_data .
  LOOP AT gt_result WHERE icon = '@0A@'.
    MESSAGE '数据错误,不能创建销售订单' TYPE 'E'.
  ENDLOOP.
ENDFORM.                    " SUB_CHECK_DATA
*&---------------------------------------------------------------------*
*&      Form  SUB_CONTRACT_HEADER
*&---------------------------------------------------------------------*
*       将采购合同抬头数据添加到BAPI函数的内表中
*----------------------------------------------------------------------*
FORM sub_contract_header .
  wa_header-number     = ''. "wa_ekko-ebeln. "合同号
  wa_header-vendor     = wa_ekko-lifnr. "供应商
  wa_header-doc_type   = wa_ekko-evart. "协议类型
  wa_header-comp_code  = wa_ekko-bukrs. "公司代码
  wa_header-doc_date   = sy-datum.      "协议日期
  wa_header-vper_start = wa_ekko-kdatb. "协议起始日期
  wa_header-vper_end   = wa_ekko-kdate. "协议截至日期
  wa_header-purch_org  = wa_ekko-ekorg. "采购组织
  wa_header-pur_group  = wa_ekko-ekgrp. "采购组
*  wa_header-acum_value = wa_ekko-ktwrt. "目标值
  wa_header-currency   = wa_ekko-waers. "货币
  wa_header-langu      = sy-langu.
  wa_header-mast_cond  = 'X'.

*  wa_headerx-number     = con_yes. "合同号
  wa_headerx-vendor     = con_yes. "供应商
  wa_headerx-doc_type   = con_yes. "协议类型
  wa_headerx-comp_code  = con_yes. "公司代码
  wa_headerx-doc_date   = con_yes. "协议日期
  wa_headerx-vper_start = con_yes. "协议起始日期
  wa_headerx-vper_end   = con_yes. "协议截至日期
  wa_headerx-purch_org  = con_yes. "采购组织
  wa_headerx-pur_group  = con_yes. "采购组
  wa_headerx-acum_value = con_yes. "目标值
  wa_headerx-currency   = con_yes. "货币
  wa_headerx-langu      = con_yes.
  wa_headerx-mast_cond  = con_yes.

  REFRESH: gt_h_cond_v, gt_h_cond_vx.
  gt_h_cond_v-serial_id   = '1'.
  gt_h_cond_v-valid_from  = wa_ekpo-kdatb.
  gt_h_cond_v-valid_to    = wa_ekpo-kdate.
  APPEND gt_h_cond_v.

  gt_h_cond_vx-serial_id   = '1'.
  gt_h_cond_vx-serial_idx  = con_yes.
  gt_h_cond_vx-valid_from  = con_yes.
  gt_h_cond_vx-valid_to    = con_yes.
  APPEND gt_h_cond_vx.
ENDFORM.                    " SUB_CONTRACT_HEADER
*&---------------------------------------------------------------------*
*&      Form  SUB_CONTRACT_ITEM
*&---------------------------------------------------------------------*
*       将采购合同行项目数据添加到BAPI函数的内表中
*----------------------------------------------------------------------*
FORM sub_contract_item .
  CLEAR: gt_item, gt_itemx.
  gt_item-item_no    = wa_ekpo-ebelp. "行号
  gt_item-short_text = wa_ekpo-txz01. "短文本
  gt_item-material   = wa_ekpo-matnr. "物料编号
  gt_item-matl_group = wa_ekpo-matkl. "物料组
  gt_item-plant      = wa_ekpo-werks. "工厂
  gt_item-target_qty = wa_ekpo-ktmng. "目标数量
  gt_item-val_type   = wa_ekpo-bwtar. "评估类型

  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
    EXPORTING
      input          = wa_ekpo-meins
      language       = sy-langu
    IMPORTING
      output         = wa_ekpo-meins
    EXCEPTIONS
      unit_not_found = 1
      OTHERS         = 2.

  gt_item-po_unit    = wa_ekpo-meins.
  gt_item-po_unit_iso = wa_ekpo-meins.
  gt_item-conv_num1   = '1'.
  gt_item-conv_den1   = '1'.
  gt_item-net_price   = wa_ekpo-netpr.    "净价
  gt_item-price_unit  = wa_ekpo-peinh.    "价格单位
  gt_item-orderpr_un  = wa_ekpo-meins.    "订单价格单位(采购)
  gt_item-orderpr_un_iso = wa_ekpo-meins. "订单价格单位(采购)
  gt_item-acctasscat  = wa_ekpo-knttp.    "科目分配类别
  gt_item-item_cat    = wa_ekpo-pstyp.    "项目类别
  gt_item-trackingno  = wa_ekpo-bednr.    "需求跟踪号
  gt_item-tax_code    = wa_ekpo-mwskz.    "税码
*  gt_item-pricedate   = '4'.
  gt_item-price_date  = wa_ekpo-kdatb.
  APPEND gt_item.

  gt_itemx-item_no    = wa_ekpo-ebelp. "行号
  gt_itemx-item_nox   = con_yes.       "行号
  gt_item-material    = con_yes.       "物料号
  gt_itemx-short_text = con_yes.       "端文本
  gt_itemx-matl_group = con_yes.       "物料组
  gt_itemx-plant      = con_yes.       "工厂
  gt_itemx-target_qty = con_yes.       "目标数量
  gt_itemx-po_unit    = con_yes.
  gt_itemx-po_unit_iso = con_yes.
  gt_itemx-val_type   = con_yes.
  gt_itemx-conv_num1  = con_yes.
  gt_itemx-conv_den1  = con_yes.
  gt_itemx-net_price  = con_yes.       "净价
  gt_itemx-price_unit = con_yes.       "价格单位
  gt_itemx-orderpr_un = con_yes.
  gt_itemx-orderpr_un_iso = con_yes.
  gt_itemx-acctasscat = con_yes.      "科目分配类别
  gt_itemx-item_cat   = con_yes.      "项目类别
  gt_itemx-trackingno = con_yes.      "需求跟踪号
  gt_itemx-tax_code   = con_yes.
  gt_itemx-pricedate  = con_yes.      "
  gt_itemx-price_date = con_yes.
  APPEND gt_itemx.
ENDFORM.                    " SUB_CONTRACT_ITEM
*&---------------------------------------------------------------------*
*&      Form  SUB_CONTRACT_ACCOUNT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sub_contract_account .
  CHECK wa_ekpo-kostl IS NOT INITIAL.

  CLEAR:gt_account, gt_accountx.
  gt_account-item_no = wa_ekpo-ebelp.  "行号
  gt_account-serial_no = '01'.
  gt_account-co_area = 'SGJT'.
*  gt_account-profit_ctr = '0055000023'.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = wa_ekpo-kostl
    IMPORTING
      output = gt_account-costcenter.

  APPEND gt_account.

  gt_accountx-item_no    = wa_ekpo-ebelp.  "行号
  gt_accountx-serial_no  = '01'.
  gt_accountx-item_nox   = con_yes.
  gt_accountx-serial_nox = con_yes.
  gt_accountx-costcenter = con_yes.
  gt_accountx-co_area    = con_yes.
*  gt_account-profit_ctr   = con_yes.
  APPEND gt_accountx.
ENDFORM.                    " SUB_CONTRACT_ACCOUNT
*&---------------------------------------------------------------------*
*&      Form  SUB_CONTRACT_ITEM_COND_V
*&---------------------------------------------------------------------*
*       处理采购框架协议行项目上的条件记录的有效日期
*----------------------------------------------------------------------*
FORM sub_contract_item_cond_v .
  CHECK wa_ekpo-kdatb IS NOT INITIAL.

  CLEAR:gt_item_cond_v, gt_item_cond_vx.
  gt_item_cond_v-item_no    = wa_ekpo-ebelp.
  gt_item_cond_v-serial_id  = wa_ekpo-ebelp.
  gt_item_cond_v-valid_from = wa_ekpo-kdatb.
  gt_item_cond_v-valid_to   = wa_ekpo-kdate.
*  gt_item_cond_v-plant      = wa_ekpo-werks.
  APPEND gt_item_cond_v.

  gt_item_cond_vx-item_no    = wa_ekpo-ebelp.
  gt_item_cond_vx-serial_id  = wa_ekpo-ebelp.
  gt_item_cond_vx-serial_idx = con_yes.
  gt_item_cond_vx-item_nox   = con_yes.
  gt_item_cond_vx-valid_from = con_yes.
*  gt_item_cond_vx-plant      = con_yes.
  IF wa_ekpo-kdate IS INITIAL.
  ELSE.
    gt_item_cond_vx-valid_to   = con_yes.
  ENDIF.
  APPEND gt_item_cond_vx.
ENDFORM.                    " SUB_CONTRACT_ITEM_COND_V
*&---------------------------------------------------------------------*
*&      Form  SUB_CONTRACT_ITEM_COND
*&---------------------------------------------------------------------*
*       处理采购框架协议行项目上的条件记录
*----------------------------------------------------------------------*
FORM sub_contract_item_cond .
  CHECK wa_ekpo-kdatb IS NOT INITIAL.

  CLEAR:gt_item_cond, gt_item_condx.
  gt_item_cond-item_no     = wa_ekpo-ebelp.
  gt_item_cond-serial_id   = wa_ekpo-ebelp.
  gt_item_cond-cond_count  = 1.
  gt_item_cond-cond_value  = wa_ekpo-netpr.
  gt_item_cond-currency    = wa_ekko-waers.
  gt_item_cond-cond_p_unt  = wa_ekpo-peinh.
  gt_item_cond-cond_unit   = wa_ekpo-meins.
  gt_item_cond-numerator   = 1.
  gt_item_cond-denominator = 1.
  gt_item_cond-cond_type   = 'PB00'.
  gt_item_cond-change_id   = 'I'.
  APPEND gt_item_cond.

  gt_item_condx-item_no     = wa_ekpo-ebelp.
  gt_item_condx-serial_id   = wa_ekpo-ebelp.
  gt_item_condx-cond_count  = 1.
  gt_item_condx-item_nox    = con_yes.
  gt_item_condx-serial_idx  = con_yes.
  gt_item_condx-cond_countx = con_yes.
  gt_item_condx-cond_value  = con_yes.
  gt_item_condx-currency    = con_yes.
  gt_item_condx-cond_p_unt  = con_yes.
  gt_item_condx-cond_unit   = con_yes.
  gt_item_condx-numerator   = con_yes.
  gt_item_condx-denominator = con_yes.
  gt_item_condx-cond_type   = con_yes.
  APPEND gt_item_condx.
ENDFORM.                    " SUB_CONTRACT_ITEM_COND
*&---------------------------------------------------------------------*
*&      Form  SUB_CONTRACT_CREATE
*&---------------------------------------------------------------------*
*       调用FUNCTION创建采购合同
*----------------------------------------------------------------------*
FORM sub_contract_create .
  DATA l_ebeln TYPE ebeln.
  IF g_action = con_create.   "无合同号,新建
    CALL FUNCTION 'BAPI_CONTRACT_CREATE'
       EXPORTING
         header                = wa_header
         headerx               = wa_headerx
*      testrun               = pa_test
       IMPORTING
         purchasingdocument    = g_ebeln
       TABLES
         return                = gt_return
         item                  = gt_item
         itemx                 = gt_itemx
         account               = gt_account
         accountx              = gt_accountx
         item_cond_validity    = gt_item_cond_v
         item_cond_validityx   = gt_item_cond_vx
         item_condition        = gt_item_cond
         item_conditionx       = gt_item_condx.
*         head_cond_validity    = gt_h_cond_v
*         head_cond_validityx   = gt_h_cond_vx
    .
  ELSE.    " 有合同号,修改
    g_ebeln = wa_header-number.
    CALL FUNCTION 'BAPI_CONTRACT_CHANGE'
      EXPORTING
        purchasingdocument    = l_ebeln
        header                = wa_header
        headerx               = wa_headerx
*      testrun               = pa_test
      IMPORTING
        exp_header            = wa_header
      TABLES
        return                = gt_return
        item                  = gt_item
        itemx                 = gt_itemx
        extensionin           = gt_extensionin.
  ENDIF.
  LOOP AT  gt_return WHERE type = 'E' OR type  = 'A'.
    IF -chrst IS INITIAL.
      -chrst = gt_return-message.
    ELSE.
      CONCATENATE -chrst ' ' gt_return-message
            INTO  -chrst.
    ENDIF.
    g_indic = 'X'.
  ENDLOOP.
  g_subrc = sy-subrc.
ENDFORM.                    " SUB_CONTRACT_CREATE
*&---------------------------------------------------------------------*
*&      Form  SUB_CONTRACT_COMMIT
*&---------------------------------------------------------------------*
*       如果所有的BAPI FUNCTION都没有返回 ERROR MESSAGE,则更新到系统
*----------------------------------------------------------------------*
FORM sub_contract_commit .
* 当返回信息的LOOP循环有错误的数据时,SUBRC会变成0 这时不能更新数据
  IF g_subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
* 当返回信息的LOOP循环没有错误的数据时,SUBRC会变成4,这时可以更新数据
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.
ENDFORM.                    " SUB_CONTRACT_COMMIT
*&---------------------------------------------------------------------*
*&      Form  SUB_REFRESH_RESULT
*&---------------------------------------------------------------------*
*       创建完成后根据结果给出MESSAGE并刷新结果内表
*----------------------------------------------------------------------*
FORM sub_refresh_result .
* 当返回信息的LOOP循环有错误的数据时,SUBRC会变成0 这时创建失败
  IF g_subrc = 0.
    -icon = '@2O@'.
  ELSE.
    -icon = '@2K@'.
*    -ekko-ebeln = g_ebeln.
  ENDIF.
* 最终状态
  IF g_indic = 'X'.
    MESSAGE '程序执行完成,存在错误的数据!' TYPE 'S'.
  ELSE.
    MESSAGE '采购合同已创建!' TYPE 'S'.
  ENDIF.

  CLEAR gt_contract.
  gt_contract-ebeln = -ekko-ebeln.
  gt_contract-contr = g_ebeln.
  gt_contract-icon  = -icon.
  gt_contract-chrst = -chrst.
  APPEND gt_contract.
ENDFORM.                    " SUB_REFRESH_RESULT
1 0
原创粉丝点击