楼主: BgL61UALJCd3
61 0

[有问有答] SAP 销售订单BAPI修改订单价格、数量等 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-7-6
最后登录
2018-7-6

楼主
BgL61UALJCd3 发表于 2025-11-21 17:09:28 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

本文重点讲解如何利用BAPI函数实现销售订单中价格与数量等关键信息的调整。

涉及的主要BAPI函数为:BAPI_SALESORDER_CHANGE

在修改销售订单的数量时,需通过BAPI向销售计划行传递更新后的数量数据,从而完成数量变更操作。

针对销售订单价格的调整,需根据定价类型的不同进行差异化处理:若定价类型为金额类信息,则必须在调用BAPI时明确指定对应的货币单位;而当定价类型为百分比形式(例如折扣率)时,则无需传输货币相关字段。此外,务必设置逻辑开关参数 logic_switch-cond_handl 的值为 X,以启用条件处理机制,确保系统识别到价格条件需要被修改。

FORM build_records_4_bapi USING  ps_sales_order TYPE gty_data.
  DATA: ls_view           TYPE order_view,
        lt_sales          TYPE TABLE OF sales_key,
        ls_sales          TYPE sales_key,
        lt_conditions_out TYPE TABLE OF bapisdcond,
        ls_conditions_out TYPE bapisdcond.

*  fill items

  CLEAR:wa_item.
  wa_item-itm_number = ps_sales_order-posnr.   "行项目
  IF ps_sales_order-kwmeng IS NOT INITIAL.
    wa_item-target_qty = ps_sales_order-kwmeng. "数量
  ENDIF.
  wa_item-reason_rej = ps_sales_order-abgru. "拒绝原因

  IF ps_sales_order-bstkd_e IS NOT INITIAL.
    wa_item-purch_no_s = ps_sales_order-bstkd_e. "客户PO号
  ENDIF.
  APPEND wa_item TO lt_item.

  CLEAR:wa_itemx.
  wa_itemx-updateflag   = 'U'.
  wa_itemx-itm_number = ps_sales_order-posnr.
  IF ps_sales_order-kwmeng IS NOT INITIAL..
    wa_itemx-target_qty   = 'X'.
  ENDIF.
  wa_itemx-reason_rej = 'X'.

  IF ps_sales_order-bstkd_e IS NOT INITIAL.
    wa_itemx-purch_no_s = 'X'.
  ENDIF.
  APPEND wa_itemx TO lt_itemx.


*   fill schedules
  IF ps_sales_order-etdat IS NOT INITIAL  OR ps_sales_order-kwmeng IS NOT INITIAL.

    READ TABLE lt_vbep INTO ls_vbep WITH KEY vbeln = ps_sales_order-vbeln
                                             posnr = ps_sales_order-posnr.
    IF sy-subrc = 0.
      CLEAR:wa_schdl.
      wa_schdl-itm_number      = ps_sales_order-posnr.   "行项目
      wa_schdl-sched_line      = ls_vbep-etenr.   "交货计划行号
      IF ps_sales_order-etdat IS NOT INITIAL.
        wa_schdl-req_date        = ps_sales_order-etdat.   "首个交货日期
      ENDIF.

      IF ps_sales_order-kwmeng IS NOT INITIAL.
        wa_schdl-req_qty = ps_sales_order-kwmeng.
      ENDIF.
      APPEND  wa_schdl TO lt_schdl.

      CLEAR wa_schdlx.
      wa_schdlx-itm_number      = ps_sales_order-posnr.
      wa_schdlx-sched_line      = ls_vbep-etenr. "交货计划行号
      wa_schdlx-updateflag      = 'U'.
      IF ps_sales_order-etdat IS NOT INITIAL.
        wa_schdlx-req_date      = 'X'.
      ENDIF.

      IF ps_sales_order-kwmeng IS NOT INITIAL.
        wa_schdlx-req_qty        = 'X'.
      ENDIF.
      APPEND wa_schdlx TO lt_schdlx.
    ENDIF.

  ENDIF.

*   fill condition
  IF ps_sales_order-kschl IS NOT INITIAL.
    CLEAR: logic_switch.
    logic_switch-cond_handl = 'X'.

    CLEAR: lt_sales, ls_sales, lt_conditions_out, ls_conditions_out.
    ls_view-sdcond = 'X'.
    ls_sales-vbeln = ps_sales_order-vbeln.
    APPEND ls_sales TO lt_sales.
    CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
      EXPORTING
        i_bapi_view          = ls_view
      TABLES
        sales_documents      = lt_sales
        order_conditions_out = lt_conditions_out.

    READ TABLE lt_conditions_out INTO ls_conditions_out
                               WITH KEY sd_doc     = ps_sales_order-vbeln
                                        itm_number = ps_sales_order-posnr
                                        cond_type  = ps_sales_order-kschl.
    IF sy-subrc = 0."修改价格
      CLEAR:wa_cond.
      wa_cond-itm_number = ps_sales_order-posnr.  "行项目
*      wa_cond-cond_st_no = ls_conditions_out-cond_st_no.
*      wa_cond-cond_count = ls_conditions_out-cond_count.
      wa_cond-cond_value = ps_sales_order-netpr.  "价格
      wa_cond-cond_type  = ps_sales_order-kschl.  "条件类型
      wa_cond-cond_p_unt = ps_sales_order-kpein.  "条件单位
      wa_cond-currency   = ps_sales_order-konwa.  "货币
      APPEND wa_cond TO lt_cond.

      CLEAR:wa_condx.
      wa_condx-updateflag      = 'U'.
      wa_condx-itm_number      = ps_sales_order-posnr.
      wa_condx-cond_st_no      = ls_conditions_out-cond_st_no.
      wa_condx-cond_count      = ls_conditions_out-cond_count.
      wa_condx-cond_type       = 'X'.
      wa_condx-cond_value      = 'X'.
      wa_condx-currency        = 'X'.
      wa_condx-cond_p_unt      = 'X'.
      APPEND wa_condx TO lt_condx.
    ELSE."新增定价条件行
      CLEAR:wa_cond.
      wa_cond-itm_number = ps_sales_order-posnr.  "行项目
      wa_cond-cond_value = ps_sales_order-netpr.  "价格
      wa_cond-cond_type  = ps_sales_order-kschl.  "条件类型
      wa_cond-cond_p_unt = ps_sales_order-kpein.  "条件单位
      wa_cond-currency   = ps_sales_order-konwa.  "货币
      APPEND wa_cond TO lt_cond.

      CLEAR:wa_condx.
      wa_condx-updateflag      = 'I'.
      wa_condx-itm_number      = ps_sales_order-posnr.
      wa_condx-cond_type       = 'X'.
      wa_condx-cond_value      = 'X'.
      wa_condx-currency        = 'X'.
      wa_condx-cond_p_unt      = 'X'.
      APPEND wa_condx TO lt_condx.
    ENDIF.

  ENDIF.

ENDFORM.

FORM build_header_4_bapi  USING  ps_sales_order TYPE gty_data.
* 抬头数据
  CLEAR wa_header.
*  IF ps_sales_order-bstkd IS NOT INITIAL.
*    wa_header-purch_no_c = ps_sales_order-bstkd.  "客户参考号
*  ENDIF.

  CLEAR:wa_headerx.
*  IF ps_sales_order-bstkd IS NOT INITIAL.
*    wa_headerx-purch_no_c = 'X'.
*  ENDIF.
  wa_headerx-updateflag = 'U'.

ENDFORM.

FORM upload_sales_order_with_bapi  USING  ps_sales_order TYPE gty_data .
  CLEAR: gv_salesdocument,
         gs_result,
         lt_return,
         ls_return.

  gv_salesdocument = ps_sales_order-vbeln.
  CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
    EXPORTING
      salesdocument    = gv_salesdocument
      order_header_in  = wa_header
      order_header_inx = wa_headerx
*     SIMULATION       =
*     BEHAVE_WHEN_ERROR           = ' '
*     INT_NUMBER_ASSIGNMENT       = ' '
     logic_switch     = logic_switch
*     NO_STATUS_BUF_INIT          = ' '
    TABLES
      return           = lt_return
      order_item_in    = lt_item
      order_item_inx   = lt_itemx
*     PARTNERS         =
*     PARTNERCHANGES   =
*     PARTNERADDRESSES =
*     ORDER_CFGS_REF   =
*     ORDER_CFGS_INST  =
*     ORDER_CFGS_PART_OF          =
*     ORDER_CFGS_VALUE =
*     ORDER_CFGS_BLOB  =
*     ORDER_CFGS_VK    =
*     ORDER_CFGS_REFINST          =
      schedule_lines   = lt_schdl
      schedule_linesx  = lt_schdlx
*     ORDER_TEXT       =
*     ORDER_KEYS       =
      conditions_in    = lt_cond
      conditions_inx   = lt_condx
*     EXTENSIONIN      =
*     EXTENSIONEX      =
    .

* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
  LOOP AT lt_return INTO ls_return WHERE type = 'E'
                                         OR type = 'A'.
    EXIT.
  ENDLOOP.

  IF sy-subrc = 0.
    "失败处理
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .

    CLEAR: gs_result-message,gs_result.
    LOOP AT lt_return INTO ls_return WHERE type EQ 'E' OR type EQ 'A'.
      gs_result-vbeln = ps_sales_order-vbeln.
      gs_result-bstkd_e = ps_sales_order-bstkd_e.
      gs_result-message = ls_return-message && ';' && '创建失败!'.
      APPEND gs_result TO gt_result.
    ENDLOOP.

  ELSE.
    "成功处理
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

    CLEAR gs_result.
    gs_result-vbeln = ps_sales_order-vbeln.
    gs_result-bstkd_e = ps_sales_order-bstkd_e.
    CONCATENATE '销售订单' gs_result-vbeln '修改成功' INTO gs_result-message.
    APPEND gs_result TO gt_result.

  ENDIF.

ENDFORM.

以下为完整的代码示例:

*&---------------------------------------------------------------------*
*& Report  ZSDF009
*&
*&---------------------------------------------------------------------*
*&
*&销售订单批量修改
*&---------------------------------------------------------------------*

REPORT zsdf009.
TABLES: sscrfields.
TYPES: BEGIN OF gty_data,
         vbeln   TYPE vbak-vbeln, "销售订单
         posnr   TYPE vbap-posnr, "销售订单行项目
         etdat   TYPE vbak-erdat, "首个交货日期
         kwmeng  TYPE vbap-kwmeng, " 订单数量
         kschl   TYPE komv-kschl, " 条件类型
         netpr   TYPE vbap-netpr, "条件价格
         kpein   TYPE konp-kpein, "条件价格单位
         konwa   TYPE konp-konwa, "货币
         abgru   TYPE vbap-abgru, "拒绝原因
         bstkd_e TYPE vbkd-bstkd_e, "客户PO号
       END OF gty_data.

TYPES:BEGIN OF ty_result,
        vbeln   TYPE vbak-vbeln,
        message TYPE bapiret2-message,
        bstkd_e TYPE vbkd-bstkd_e, "客户采购订单编号
      END OF ty_result.

DATA: gt_data TYPE TABLE OF gty_data,
      gs_data TYPE gty_data.

DATA: lt_item   TYPE STANDARD TABLE OF bapisditm,
      lt_itemx  TYPE STANDARD TABLE OF bapisditmx,
      lt_schdl  TYPE STANDARD TABLE OF bapischdl,
      lt_schdlx TYPE STANDARD TABLE OF bapischdlx,
      lt_cond   TYPE STANDARD TABLE OF bapicond,
      lt_condx  TYPE STANDARD TABLE OF bapicondx,
      lt_return TYPE STANDARD TABLE OF bapiret2,
      ls_return LIKE LINE OF lt_return.

DATA: lt_vbep TYPE TABLE OF vbep,
      ls_vbep TYPE vbep.

DATA: wa_header  TYPE bapisdh1,  "表头
      wa_headerx TYPE bapisdh1x, "表头标志
      wa_item    TYPE bapisditm,  "行项目
      wa_itemx   TYPE bapisditmx,
      wa_cond    TYPE bapicond,   "价格条件
      wa_condx   TYPE bapicondx,
      wa_schdl   TYPE bapischdl,  "交付计划
      wa_schdlx  TYPE bapischdlx,
      wa_return  TYPE bapiret2.

DATA: gs_result          TYPE ty_result.
DATA: gt_result          TYPE TABLE OF ty_result.
DATA: gs_layout   TYPE lvc_s_layo,
      gt_fieldcat TYPE TABLE OF lvc_s_fcat,
      gs_fieldcat TYPE lvc_s_fcat.

DATA: BEGIN OF gt_excel_result OCCURS 0,
        text TYPE string,
      END OF gt_excel_result.

DATA: gv_salesdocument  LIKE bapivbeln-vbeln.

DATA: logic_switch TYPE bapisdls.

DATA: g_grid TYPE REF TO cl_gui_alv_grid.  "刷新alv

DATA:  functxt TYPE smp_dyntxt."模板下载按钮

*----------------------------------------------------------------------*
*   常量变量
*----------------------------------------------------------------------*
CONSTANTS:
  cns_pf_status    TYPE slis_formname VALUE 'FRM_PF_STATUS',       "ALV自定义按钮
  cns_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.    "ALV自定义按钮响应事件

SELECTION-SCREEN BEGIN OF BLOCK col1 WITH FRAME TITLE text-001.
SELECTION-SCREEN:FUNCTION KEY 1.
PARAMETERS:p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK col1.

*&---------------------------------------------------------------------*
* GLOBAL MACROS
*&---------------------------------------------------------------------*
DEFINE fill_field.               "宏定义
  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname     = &1. "ALV 控制: 内部表字段的字段名称
  gs_fieldcat-scrtext_l     = &2. "长字段标签
  gs_fieldcat-cfieldname    = &3. "ALV 控制: 参考的当前单位的字段名称
  gs_fieldcat-outputlen     = &4. "ALV 控制: 列的字符宽度
  gs_fieldcat-edit          = &5. "ALV 控制: 准备输入(可编辑字段)
  gs_fieldcat-emphasize     = &6. "ALV 控制: 带有颜色的高亮列
  gs_fieldcat-decimals_o    = &7. "ALV 控制: 输出小数位的编号
  gs_fieldcat-ref_table     = &8. "参考表
  gs_fieldcat-ref_field     = &9. "参考字段
*  GS_FIELDCAT-CHECKBOX    = &9.
  gs_fieldcat-colddictxt    = 'L'.
  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    CLEAR functxt.
    functxt-icon_id   = icon_export.
    functxt-icon_text = '下载'.
    functxt-quickinfo = '模版下载!'.
    sscrfields-functxt_01 = functxt.
    MODIFY SCREEN.
  ENDLOOP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      file_name = p_file. "返回文件名

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = 'FC01' .
    PERFORM frm_download_template.
  ENDIF.

START-OF-SELECTION.
  PERFORM frm_upload_data.

END-OF-SELECTION.
* ALV处理
*  PERFORM frm_display_data.
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_display_data .
  PERFORM frm_layout.
  PERFORM frm_fill_field.
  PERFORM frm_alv_display.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_download_template .
  "-----检查系统是否存在模板
  DATA: lv_objname TYPE wwwdata-objid VALUE 'ZSALES_ORDER'.
  DATA: ls_objdata TYPE wwwdatatab.
  "-----弹出选择存放的路径.
  DATA: lv_window_title      TYPE string VALUE '文件下载',
        lv_default_extension TYPE string VALUE 'xlsx',
        lv_default_file_name TYPE string VALUE '销售订单批量修改导入模版',
        lv_file_filter       TYPE string VALUE 'Excel文件(*.xlsx)|*.xlsx|',

        lv_filename          TYPE string,
        lv_path              TYPE string,
        lv_fullpath          TYPE string,
        lv_user_action       TYPE i.

  DATA: lv_key         TYPE wwwdatatab,
        lv_destination TYPE rlgrap-filename,
        lv_rc          TYPE i,
        lv_temp        TYPE c.

  "****----------------------------------------------
  CLEAR:ls_objdata.
*从SAP服务器中下载Excel模板
  SELECT SINGLE relid
  objid
  FROM wwwdata                                     "存对象模板的表
  INTO CORRESPONDING FIELDS OF ls_objdata
  WHERE srtf2 = 0
  AND relid = 'MI'                                  "有三种类型 HT MI IT
  AND objid = lv_objname. "MONTLYSTOCK

  IF sy-subrc <> 0.
    MESSAGE 'Excel 模板不存在,请用TCODE:SMW0进行加载' TYPE 'E'.
    RETURN.
  ENDIF.
  IF  ls_objdata-objid = space .
    MESSAGE 'Excel 模板不存在,请用TCODE:SMW0进行加载' TYPE 'E'.
    RETURN.
  ENDIF.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title              = lv_window_title
      default_extension         = lv_default_extension
      default_file_name         = lv_default_file_name
      file_filter               = lv_file_filter
    CHANGING
      filename                  = lv_filename
      path                      = lv_path
      fullpath                  = lv_fullpath
      user_action               = lv_user_action
    EXCEPTIONS
      cntl_error                = 1
      error_no_gui              = 2
      not_supported_by_gui      = 3
      invalid_default_file_name = 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.
    IF lv_user_action = ( cl_gui_frontend_services=>action_ok ).
* 下载模板

      SELECT SINGLE * INTO CORRESPONDING FIELDS OF lv_key FROM wwwdata WHERE  objid = 'ZSDF009' .

      lv_destination = lv_fullpath.

      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          key         = lv_key
          destination = lv_destination
        IMPORTING
          rc          = lv_rc
        CHANGING
          temp        = lv_temp.
      IF lv_rc <> 0.
        MESSAGE '下载Excel模板出错' TYPE 'E'.
        STOP.
      ENDIF.
    ELSE.
      MESSAGE '已取消选择上载文件!' TYPE 'S'.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_upload_data .
  CONSTANTS first_col TYPE i VALUE 1.
  CONSTANTS first_row TYPE i VALUE 2.
  DATA: l_row  TYPE i,
        l_text TYPE string.
  DATA: excel    TYPE ole2_object.
  DATA: lt_file TYPE STANDARD TABLE OF zalsmex_tabline.
  DATA: ls_file TYPE zalsmex_tabline.
  FIELD-SYMBOLS:<field> TYPE gty_data.
  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = first_col
      i_begin_row             = first_row
      i_end_col               = '10'
      i_end_row               = '60000'
    TABLES
      intern                  = lt_file
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE '上传数据失败!' TYPE 'E'.
  ELSE.
*  translate data
    LOOP AT lt_file INTO ls_file.
      l_row = ls_file-row + 1.
      CASE ls_file-col.
        WHEN '0001'. "销售订单
          gs_data-vbeln  = ls_file-value.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = gs_data-vbeln
            IMPORTING
              output = gs_data-vbeln.
        WHEN '0002'. " 销售订单行项目
          gs_data-posnr = ls_file-value.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = gs_data-posnr
            IMPORTING
              output = gs_data-posnr.
        WHEN '0003'. " 首个交货日期
          gs_data-etdat = ls_file-value.
        WHEN '0004'. " 订单数量
          gs_data-kwmeng = ls_file-value.
        WHEN '0005'. " 条件类型
          gs_data-kschl = ls_file-value.
        WHEN '0006'. " 条件价格
          gs_data-netpr = ls_file-value.
        WHEN '0007'. " 条件价格单位
          gs_data-kpein =   ls_file-value.
        WHEN '0008'. " 货币
          gs_data-konwa =   ls_file-value.
        WHEN '0009'. " 拒绝原因
          gs_data-abgru =   ls_file-value.
        WHEN '0010'. " 客户PO号
          gs_data-bstkd_e = ls_file-value.
        WHEN OTHERS.
      ENDCASE.
* 数据检查
      AT END OF row.
*       检查销售订单
        IF gs_data-vbeln = ''.
          l_text = l_row.
          CONCATENATE '第' l_text '行“销售订单”不能为空。' INTO l_text.
          gt_excel_result-text = l_text.
          APPEND gt_excel_result.
        ENDIF.
*        检查销售订单行项目
        IF gs_data-posnr = ''.
          l_text = l_row.
          CONCATENATE '第' l_text '行“销售订单行项目”不能为空。' INTO l_text.
          gt_excel_result-text = l_text.
          APPEND gt_excel_result.
        ENDIF.

        APPEND gs_data TO gt_data.
        CLEAR gs_data.
      ENDAT.
    ENDLOOP.

    IF gt_excel_result[] IS NOT INITIAL.
      LOOP AT gt_excel_result.
        WRITE:/ gt_excel_result-text.
      ENDLOOP.
    ELSE.
      SORT gt_data BY vbeln posnr.

      IF gt_data IS NOT INITIAL.
        SELECT * INTO TABLE lt_vbep
          FROM vbep
          FOR ALL ENTRIES IN gt_data
          WHERE vbeln = gt_data-vbeln
            AND posnr = gt_data-posnr.
      ENDIF.
*        build records and calling bapi
      LOOP AT gt_data ASSIGNING <field>.
*        build records 赋值
        PERFORM build_records_4_bapi USING <field>.
*        one order with serval items
        AT END OF vbeln.
*        build header
          PERFORM build_header_4_bapi USING <field>.
*        call bapi to upload sales order
          PERFORM upload_sales_order_with_bapi  USING <field>.
          CLEAR: lt_item, lt_itemx, lt_schdl, lt_schdlx, lt_cond, lt_condx.

        ENDAT.
      ENDLOOP.
*         if no error exist , raise report
      PERFORM frm_display_data.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Form BUILD_RECORDS_4_BAPI
*&---------------------------------------------------------------------*
*& text  item
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_records_4_bapi USING  ps_sales_order TYPE gty_data.
  DATA: ls_view           TYPE order_view,
        lt_sales          TYPE TABLE OF sales_key,
        ls_sales          TYPE sales_key,
        lt_conditions_out TYPE TABLE OF bapisdcond,
        ls_conditions_out TYPE bapisdcond.

*  fill items

  CLEAR:wa_item.
  wa_item-itm_number = ps_sales_order-posnr.   "行项目
  IF ps_sales_order-kwmeng IS NOT INITIAL.
    wa_item-target_qty = ps_sales_order-kwmeng. "数量
  ENDIF.
  wa_item-reason_rej = ps_sales_order-abgru. "拒绝原因

  IF ps_sales_order-bstkd_e IS NOT INITIAL.
    wa_item-purch_no_s = ps_sales_order-bstkd_e. "客户PO号
  ENDIF.
  APPEND wa_item TO lt_item.

  CLEAR:wa_itemx.
  wa_itemx-updateflag   = 'U'.
  wa_itemx-itm_number = ps_sales_order-posnr.
  IF ps_sales_order-kwmeng IS NOT INITIAL..
    wa_itemx-target_qty   = 'X'.
  ENDIF.
  wa_itemx-reason_rej = 'X'.

  IF ps_sales_order-bstkd_e IS NOT INITIAL.
    wa_itemx-purch_no_s = 'X'.
  ENDIF.
  APPEND wa_itemx TO lt_itemx.


*   fill schedules
  IF ps_sales_order-etdat IS NOT INITIAL  OR ps_sales_order-kwmeng IS NOT INITIAL.

    READ TABLE lt_vbep INTO ls_vbep WITH KEY vbeln = ps_sales_order-vbeln
                                             posnr = ps_sales_order-posnr.
    IF sy-subrc = 0.
      CLEAR:wa_schdl.
      wa_schdl-itm_number      = ps_sales_order-posnr.   "行项目
      wa_schdl-sched_line      = ls_vbep-etenr.   "交货计划行号
      IF ps_sales_order-etdat IS NOT INITIAL.
        wa_schdl-req_date        = ps_sales_order-etdat.   "首个交货日期
      ENDIF.

      IF ps_sales_order-kwmeng IS NOT INITIAL.
        wa_schdl-req_qty = ps_sales_order-kwmeng.
      ENDIF.
      APPEND  wa_schdl TO lt_schdl.

      CLEAR wa_schdlx.
      wa_schdlx-itm_number      = ps_sales_order-posnr.
      wa_schdlx-sched_line      = ls_vbep-etenr. "交货计划行号
      wa_schdlx-updateflag      = 'U'.
      IF ps_sales_order-etdat IS NOT INITIAL.
        wa_schdlx-req_date      = 'X'.
      ENDIF.

      IF ps_sales_order-kwmeng IS NOT INITIAL.
        wa_schdlx-req_qty        = 'X'.
      ENDIF.
      APPEND wa_schdlx TO lt_schdlx.
    ENDIF.

  ENDIF.

*   fill condition
  IF ps_sales_order-kschl IS NOT INITIAL.
    CLEAR: logic_switch.
    logic_switch-cond_handl = 'X'.

    CLEAR: lt_sales, ls_sales, lt_conditions_out, ls_conditions_out.
    ls_view-sdcond = 'X'.
    ls_sales-vbeln = ps_sales_order-vbeln.
    APPEND ls_sales TO lt_sales.
    CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
      EXPORTING
        i_bapi_view          = ls_view
      TABLES
        sales_documents      = lt_sales
        order_conditions_out = lt_conditions_out.

    READ TABLE lt_conditions_out INTO ls_conditions_out
                               WITH KEY sd_doc     = ps_sales_order-vbeln
                                        itm_number = ps_sales_order-posnr
                                        cond_type  = ps_sales_order-kschl.
    IF sy-subrc = 0."修改价格
      CLEAR:wa_cond.
      wa_cond-itm_number = ps_sales_order-posnr.  "行项目
*      wa_cond-cond_st_no = ls_conditions_out-cond_st_no.
*      wa_cond-cond_count = ls_conditions_out-cond_count.
      wa_cond-cond_value = ps_sales_order-netpr.  "价格
      wa_cond-cond_type  = ps_sales_order-kschl.  "条件类型
      wa_cond-cond_p_unt = ps_sales_order-kpein.  "条件单位
      wa_cond-currency   = ps_sales_order-konwa.  "货币
      APPEND wa_cond TO lt_cond.

      CLEAR:wa_condx.
      wa_condx-updateflag      = 'U'.
      wa_condx-itm_number      = ps_sales_order-posnr.
      wa_condx-cond_st_no      = ls_conditions_out-cond_st_no.
      wa_condx-cond_count      = ls_conditions_out-cond_count.
      wa_condx-cond_type       = 'X'.
      wa_condx-cond_value      = 'X'.
      wa_condx-currency        = 'X'.
      wa_condx-cond_p_unt      = 'X'.
      APPEND wa_condx TO lt_condx.
    ELSE."新增定价条件行
      CLEAR:wa_cond.
      wa_cond-itm_number = ps_sales_order-posnr.  "行项目
      wa_cond-cond_value = ps_sales_order-netpr.  "价格
      wa_cond-cond_type  = ps_sales_order-kschl.  "条件类型
      wa_cond-cond_p_unt = ps_sales_order-kpein.  "条件单位
      wa_cond-currency   = ps_sales_order-konwa.  "货币
      APPEND wa_cond TO lt_cond.

      CLEAR:wa_condx.
      wa_condx-updateflag      = 'I'.
      wa_condx-itm_number      = ps_sales_order-posnr.
      wa_condx-cond_type       = 'X'.
      wa_condx-cond_value      = 'X'.
      wa_condx-currency        = 'X'.
      wa_condx-cond_p_unt      = 'X'.
      APPEND wa_condx TO lt_condx.
    ENDIF.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_HEADER_4_BAPI
*&---------------------------------------------------------------------*
*& text  header
*&---------------------------------------------------------------------*
*      -->P_<FIELD>  text
*&---------------------------------------------------------------------*
FORM build_header_4_bapi  USING  ps_sales_order TYPE gty_data.
* 抬头数据
  CLEAR wa_header.
*  IF ps_sales_order-bstkd IS NOT INITIAL.
*    wa_header-purch_no_c = ps_sales_order-bstkd.  "客户参考号
*  ENDIF.

  CLEAR:wa_headerx.
*  IF ps_sales_order-bstkd IS NOT INITIAL.
*    wa_headerx-purch_no_c = 'X'.
*  ENDIF.
  wa_headerx-updateflag = 'U'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_SALES_ORDER_WITH_BAPI
*&---------------------------------------------------------------------*
*& text 创建销售订单
*&---------------------------------------------------------------------*
*      -->P_GS_SALES_ORDER  text
*&---------------------------------------------------------------------*
FORM upload_sales_order_with_bapi  USING  ps_sales_order TYPE gty_data .
  CLEAR: gv_salesdocument,
         gs_result,
         lt_return,
         ls_return.

  gv_salesdocument = ps_sales_order-vbeln.
  CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
    EXPORTING
      salesdocument    = gv_salesdocument
      order_header_in  = wa_header
      order_header_inx = wa_headerx
*     SIMULATION       =
*     BEHAVE_WHEN_ERROR           = ' '
*     INT_NUMBER_ASSIGNMENT       = ' '
     logic_switch     = logic_switch
*     NO_STATUS_BUF_INIT          = ' '
    TABLES
      return           = lt_return
      order_item_in    = lt_item
      order_item_inx   = lt_itemx
*     PARTNERS         =
*     PARTNERCHANGES   =
*     PARTNERADDRESSES =
*     ORDER_CFGS_REF   =
*     ORDER_CFGS_INST  =
*     ORDER_CFGS_PART_OF          =
*     ORDER_CFGS_VALUE =
*     ORDER_CFGS_BLOB  =
*     ORDER_CFGS_VK    =
*     ORDER_CFGS_REFINST          =
      schedule_lines   = lt_schdl
      schedule_linesx  = lt_schdlx
*     ORDER_TEXT       =
*     ORDER_KEYS       =
      conditions_in    = lt_cond
      conditions_inx   = lt_condx
*     EXTENSIONIN      =
*     EXTENSIONEX      =
    .

* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
  LOOP AT lt_return INTO ls_return WHERE type = 'E'
                                         OR type = 'A'.
    EXIT.
  ENDLOOP.

  IF sy-subrc = 0.
    "失败处理
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .

    CLEAR: gs_result-message,gs_result.
    LOOP AT lt_return INTO ls_return WHERE type EQ 'E' OR type EQ 'A'.
      gs_result-vbeln = ps_sales_order-vbeln.
      gs_result-bstkd_e = ps_sales_order-bstkd_e.
      gs_result-message = ls_return-message && ';' && '创建失败!'.
      APPEND gs_result TO gt_result.
    ENDLOOP.

  ELSE.
    "成功处理
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

    CLEAR gs_result.
    gs_result-vbeln = ps_sales_order-vbeln.
    gs_result-bstkd_e = ps_sales_order-bstkd_e.
    CONCATENATE '销售订单' gs_result-vbeln '修改成功' INTO gs_result-message.
    APPEND gs_result TO gt_result.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  CLEAR: gs_layout."它用来定义ALV报表的整体属性
  gs_layout-zebra         = 'X' ."ZBbra
  gs_layout-cwidth_opt    = 'X'."优化列宽选项是否设置
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fill_field .
  REFRESH gt_fieldcat.
  fill_field: 'VBELN'  '订单号'   '' '' '' '' '' 'VBAK' 'VBELN',
              'MESSAGE'  '消息'   '' '' '' '' '' '' '',
              'BSTKD_E'  '参考订单号'   '' '' '' '' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alv_display .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid    "SY-REPID  当前程序名
      i_callback_user_command  = cns_user_command
      i_callback_pf_status_set = cns_pf_status
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat[]
      i_save                   = 'A'
*     it_events                = gt_events
    TABLES
      t_outtab                 = gt_result[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE 'ALV DISPLAY IS ERROR' TYPE 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_PF_STATUS
*&---------------------------------------------------------------------*
*       ALV的自定义按钮GUI
*----------------------------------------------------------------------*
FORM frm_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING rt_extab.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       ALV自定义按钮响应事件
*----------------------------------------------------------------------*
FORM frm_user_command USING ucomm    LIKE sy-ucomm
      rs_selfield TYPE slis_selfield.
  DATA: l_valid  TYPE char01.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'  "刷新ALV
    IMPORTING
      e_grid = g_grid.
  CALL METHOD g_grid->check_changed_data
    IMPORTING
      e_valid = l_valid.
  IF l_valid IS INITIAL.
    EXIT.
  ENDIF.
  CASE ucomm.
    WHEN '&IC1'.
      IF rs_selfield-fieldname = 'VBELN'. "双击单元格的列字段
        IF rs_selfield-value IS NOT INITIAL.
          SET PARAMETER ID 'AUN' FIELD rs_selfield-value.
          CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN .
        ENDIF.
      ENDIF.
    WHEN OTHERS.
  ENDCASE.
  rs_selfield-refresh    = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.
ENDFORM.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SAP API Transaction destination concatenate

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 21:37