BAPI:创建销售订单(VA01)

业务:如果用户自己填写了销售价格,根据填写的价格维护销售订单定价条件,如果没填则根据配置的定价条件自动带出。
在这里插入图片描述

*&---------------------------------------------------------------------*
*&      Form  FRM_SALESDOCUMENT_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
 FORM FRM_SALESDOCUMENT_CREATE .
   DATA: LW_SALES_HEADER_IN      LIKE BAPISDHD1,
         LW_SALES_HEADER_INX     LIKE BAPISDHD1X,
         LW_LOGIC_SWITCH         TYPE BAPISDLS,
         LV_SALESDOCUMENT_EX     LIKE BAPIVBELN-VBELN,
         LT_SALES_ITEMS_IN       LIKE TABLE OF BAPISDITM  WITH HEADER LINE,
         LT_SALES_ITEMS_INX      LIKE TABLE OF BAPISDITMX WITH HEADER LINE,
         LT_SALES_SCHEDULES_IN   LIKE TABLE OF BAPISCHDL  WITH HEADER LINE,
         LT_SALES_SCHEDULES_INX  LIKE TABLE OF BAPISCHDLX WITH HEADER LINE,
         LT_SALES_CONDITIONS_IN  LIKE TABLE OF BAPICOND   WITH HEADER LINE,
         LT_SALES_CONDITIONS_INX LIKE TABLE OF BAPICONDX  WITH HEADER LINE,
         LT_SALES_TEXT           LIKE TABLE OF BAPISDTEXT WITH HEADER LINE,
         LT_SALES_PARTNERS_IN    LIKE TABLE OF BAPIPARNR  WITH HEADER LINE,
         LT_RETURN               LIKE TABLE OF BAPIRET2   WITH HEADER LINE.
   DATA: L_ANSWER TYPE C,
         LW_KWMENG TYPE KWMENG,
         LW_COND_VALUE TYPE BAPIKBETR1,
         LW_COND_VALUE1 TYPE BAPIKBETR1,
         LW_SCHED_LINE TYPE ETENR VALUE '0001',
         LW_ITM_NUM TYPE POSNR_VA .

   CLEAR: LT_SALES_ITEMS_IN,     LT_SALES_ITEMS_INX,
          LT_SALES_SCHEDULES_IN, LT_SALES_SCHEDULES_INX,
          LT_SALES_CONDITIONS_IN,LT_SALES_CONDITIONS_INX,
          LT_SALES_PARTNERS_IN,
          LT_RETURN.
   CLEAR :GT_ZTSD003[],
          GT_YTLIST1[].

   GT_YTLIST1[] = GT_YTLIST[].
   SORT GT_YTLIST1 BY VBELN.
   DELETE GT_YTLIST1 WHERE FLAG <> ABAP_ON.

   SELECT *
     INTO CORRESPONDING FIELDS OF TABLE GT_ZTSD003
     FROM ZTSD003
     FOR ALL ENTRIES IN GT_YTLIST1
     WHERE VBELN = GT_YTLIST1-VBELN.

   SORT GT_ZTSD003 BY MATNR.

**=> sales order header
   IF LW_SALES_HEADER_IN IS INITIAL.
     LW_SALES_HEADER_IN-DOC_TYPE    = GS_XSBC-AUART.    " 销售凭证类型
     LW_SALES_HEADER_IN-SALES_ORG   = GS_XSBC-VKORG.    " 销售机构
     LW_SALES_HEADER_IN-DISTR_CHAN  = GS_XSBC-VTWEG.    " 分销渠道
     LW_SALES_HEADER_IN-DIVISION    = GS_XSBC-SPART.    " 产品组

     LW_SALES_HEADER_INX-DOC_TYPE   = ABAP_TRUE.
     LW_SALES_HEADER_INX-SALES_ORG  = ABAP_TRUE.
     LW_SALES_HEADER_INX-DISTR_CHAN = ABAP_TRUE.
     LW_SALES_HEADER_INX-DIVISION   = ABAP_TRUE.

   ENDIF.

   IF LT_SALES_PARTNERS_IN[] IS INITIAL.
     CLEAR : LT_SALES_PARTNERS_IN.
     LT_SALES_PARTNERS_IN-PARTN_ROLE = 'AG'.         "
     LT_SALES_PARTNERS_IN-PARTN_NUMB = GS_XSBC-KUNAG. " 售达方
     APPEND LT_SALES_PARTNERS_IN.
     CLEAR LT_SALES_PARTNERS_IN.

     LT_SALES_PARTNERS_IN-PARTN_ROLE = 'WE'.         "
     LT_SALES_PARTNERS_IN-PARTN_NUMB = GS_XSBC-KUNWE." 送达方
     APPEND LT_SALES_PARTNERS_IN.
     CLEAR LT_SALES_PARTNERS_IN.
   ENDIF.

   LOOP AT GT_ZTSD003 INTO GS_ZTSD003.

     LW_KWMENG     = GS_ZTSD003-KWMENG + LW_KWMENG.
     LW_COND_VALUE = GS_ZTSD003-ZKBETR_XS.
     LW_COND_VALUE1 = GS_ZTSD003-ZKBETR_ZD.

**=> sales order item
     LT_SALES_ITEMS_IN-MATERIAL   = GS_ZTSD003-MATNR.        " 物料
     LT_SALES_ITEMS_IN-PLANT      = GS_ZTSD003-WERKS.        " 工厂
     LT_SALES_ITEMS_IN-STORE_LOC  = GS_ZTSD003-LGORT.        " 库存地点
     LT_SALES_ITEMS_INX-MATERIAL    = ABAP_TRUE.
     LT_SALES_ITEMS_INX-PLANT       = ABAP_TRUE.
     LT_SALES_ITEMS_INX-STORE_LOC   = ABAP_TRUE.
     AT END OF MATNR.
       LW_ITM_NUM = LW_ITM_NUM + 10.
**=> sales order item
       LT_SALES_ITEMS_IN-ITM_NUMBER = LW_ITM_NUM.
       LT_SALES_ITEMS_INX-ITM_NUMBER  = LW_ITM_NUM.
*
       APPEND: LT_SALES_ITEMS_IN, LT_SALES_ITEMS_INX.
       CLEAR:  LT_SALES_ITEMS_IN, LT_SALES_ITEMS_INX.

       " 计划行号
       LT_SALES_SCHEDULES_IN-ITM_NUMBER = LW_ITM_NUM.
       LT_SALES_SCHEDULES_IN-SCHED_LINE = LW_SCHED_LINE.       " L_TABIX.
       LT_SALES_SCHEDULES_IN-REQ_DATE   = SY-DATUM.     " 计划行日期
       LT_SALES_SCHEDULES_IN-REQ_QTY    = LW_KWMENG.    " 以销售单位计的 订单数量

       LT_SALES_SCHEDULES_INX-ITM_NUMBER = LW_ITM_NUM.
       LT_SALES_SCHEDULES_INX-SCHED_LINE = LW_SCHED_LINE.
       LT_SALES_SCHEDULES_INX-REQ_DATE   = ABAP_TRUE.
       LT_SALES_SCHEDULES_INX-REQ_QTY    = ABAP_TRUE.

       APPEND: LT_SALES_SCHEDULES_IN, LT_SALES_SCHEDULES_INX.
       CLEAR:  LT_SALES_SCHEDULES_IN, LT_SALES_SCHEDULES_INX,LW_KWMENG.

*----- 条件
       IF LW_COND_VALUE NE 0 AND LW_COND_VALUE1 NE 0.
*----- 复制不变定价因素且重定税款
         LW_LOGIC_SWITCH-PRICING = 'G'.

         LT_SALES_CONDITIONS_IN-ITM_NUMBER  = LW_ITM_NUM.
         LT_SALES_CONDITIONS_IN-COND_TYPE   = 'ZPR1'.           " 条件类型 定价条件
         LT_SALES_CONDITIONS_IN-COND_VALUE  = LW_COND_VALUE.    " 价格     定价比率
         LT_SALES_CONDITIONS_IN-CURRENCY    = 'CNY'.            " 货币码

         LT_SALES_CONDITIONS_INX-ITM_NUMBER = LW_ITM_NUM.
         LT_SALES_CONDITIONS_INX-COND_TYPE  = 'ZPR1'.
         LT_SALES_CONDITIONS_INX-CURRENCY   = ABAP_TRUE.
         LT_SALES_CONDITIONS_INX-COND_VALUE = ABAP_TRUE.


         APPEND: LT_SALES_CONDITIONS_IN,LT_SALES_CONDITIONS_INX.
         CLEAR:  LT_SALES_CONDITIONS_IN,LT_SALES_CONDITIONS_INX,LW_COND_VALUE.

         LT_SALES_CONDITIONS_IN-ITM_NUMBER  = LW_ITM_NUM.
         LT_SALES_CONDITIONS_IN-COND_TYPE   = 'ZPR2'.           " 条件类型 定价条件
         LT_SALES_CONDITIONS_IN-COND_VALUE  = LW_COND_VALUE1.    " 价格     定价比率
         LT_SALES_CONDITIONS_IN-CURRENCY    = 'CNY'.            " 货币码

         LT_SALES_CONDITIONS_INX-ITM_NUMBER = LW_ITM_NUM.
         LT_SALES_CONDITIONS_INX-COND_TYPE  = 'ZPR2'.
         LT_SALES_CONDITIONS_INX-CURRENCY   = ABAP_TRUE.
         LT_SALES_CONDITIONS_INX-COND_VALUE = ABAP_TRUE.


         APPEND: LT_SALES_CONDITIONS_IN,LT_SALES_CONDITIONS_INX.
         CLEAR:  LT_SALES_CONDITIONS_IN,LT_SALES_CONDITIONS_INX,LW_COND_VALUE.

       ENDIF.

     ENDAT.

   ENDLOOP.

   CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
     EXPORTING
       SALES_HEADER_IN      = LW_SALES_HEADER_IN
       SALES_HEADER_INX     = LW_SALES_HEADER_INX
       CONVERT_PARVW_AUART  = ABAP_ON
       LOGIC_SWITCH         = LW_LOGIC_SWITCH
     IMPORTING
       SALESDOCUMENT_EX     = LV_SALESDOCUMENT_EX
     TABLES
       RETURN               = LT_RETURN
       SALES_ITEMS_IN       = LT_SALES_ITEMS_IN
       SALES_ITEMS_INX      = LT_SALES_ITEMS_INX
       SALES_SCHEDULES_IN   = LT_SALES_SCHEDULES_IN
       SALES_SCHEDULES_INX  = LT_SALES_SCHEDULES_INX
       SALES_CONDITIONS_IN  = LT_SALES_CONDITIONS_IN
       SALES_CONDITIONS_INX = LT_SALES_CONDITIONS_INX
       SALES_PARTNERS       = LT_SALES_PARTNERS_IN.

   IF SY-SUBRC EQ 0 AND LV_SALESDOCUMENT_EX IS NOT INITIAL.

     GT_YTLIST-ZVBELN_S = LV_SALESDOCUMENT_EX.
     MODIFY GT_YTLIST TRANSPORTING ZVBELN_S WHERE FLAG = ABAP_ON .
     LOOP AT GT_YTLIST WHERE FLAG = ABAP_ON.
       UPDATE ZTSD004 SET ZVBELN_S = LV_SALESDOCUMENT_EX
       WHERE VBELN = GT_YTLIST-VBELN.
     ENDLOOP.
     MESSAGE S020(ZMSG) WITH LV_SALESDOCUMENT_EX.
     COMMIT WORK.
   ELSE.

     LOOP AT LT_RETURN WHERE TYPE = 'E'.
       MESSAGE LT_RETURN-MESSAGE TYPE 'S' DISPLAY LIKE 'E'.
       EXIT.
     ENDLOOP.

     ROLLBACK WORK.
   ENDIF.
 ENDFORM.  
<think>嗯,用户问的是关于用BAPI创建销售订单时处理价格的例子。首先,我需要回忆一下SAP中销售订单的定价结构。通常,销售订单的价格是通过条件技术来确定的,比如使用条件类型PR00或者其他的。 用户可能需要知道如何在调用BAPI的时候传递正确的价格信息。这时候应该考虑使用BAPI_SALESORDER_CREATE或者类似的函数模块。我记得在订单的ITEM数据中,有一个条件表需要填充,比如CONDITIONS_IN。 接下来,需要确定正确的条件类型。例如,PR00是标准价格,可能需要传递值到COND_NO字段,或者直接在COND_VALUE中填写金额。还要注意货币单位和单位设置,比如每个单位的价格还是总价。 另外,还要考虑定价过程的配置,不同的条件类型可能对应不同的步骤。用户可能没有提到这些配置,但在示例中可能需要简单说明前提条件,比如确保定价过程正确设置。 然后,数据结构方面,可能需要填充结构BAPICOND,包括条件类型(COND_TYPE)、价格(COND_VALUE)、货币(CURRENCY)等字段。同时,条件表是内表,需要循环填充到订单项中。 还要注意是否需要处理折扣或附加费,这时候可能会有多个条件类型。但用户的问题主要是创建价格的例子,所以可能先聚焦在基础价格上。 最后,可能需要提供一个代码示例,展示如何填充这些结构,并调用BAPI。同时提醒用户测试时检查返回参数,确保价格正确应用。可能还需要提到COMMIT WORK和BAPI_TRANSACTION_COMMIT来保存数据。 另外,用户可能遇到的常见问题,比如价格未正确带出,可能是条件记录主数据缺失,或者定价过程配置问题,这些也需要在注意事项中提到。</think>以下是一个基于SAP BAPI创建销售订单时处理价格的详细示例说明,采用结构化步骤分解: #### 1. 基础概念 在SAP销售订单中,价格通过**条件技术**实现,核心要素包括: - **条件类型**:如`PR00`(标准价格)、`K004`(折扣) - **定价过程**:由多个条件类型组成的计算逻辑 - **条件记录**:主数据中存储的具体价格值 #### 2. 关键BAPI及参数 使用标准函数模块: ``` BAPI_SALESORDER_CREATE ``` 涉及价格的关键输入参数: - `ORDER_HEADER_IN`:订单头数据(含销售组织、分销渠道等) - `ORDER_ITEMS_IN`:行项目数据(含物料、数量) - **`CONDITIONS_IN`**:价格条件表(核心价格传递接口) #### 3. 价格传递示例代码 ```abap DATA: lt_conditions TYPE TABLE OF BAPICOND, ls_condition LIKE LINE OF lt_conditions. * 填充价格条件(假设单价为95.50 CNY/PC) ls_condition-COND_TYPE = 'PR00'. " 条件类型 ls_condition-COND_VALUE = '95.50'. " 单价 ls_condition-CURRENCY = 'CNY'. " 货币 ls_condition-COND_UNIT = 'PC'. " 单位(按件计价) ls_condition-COND_P_UNT = '1'. " 定价单位数量 APPEND ls_condition TO lt_conditions. * 调用BAPI CALL FUNCTION 'BAPI_SALESORDER_CREATE' EXPORTING ORDER_HEADER_IN = ls_header TABLES ORDER_ITEMS_IN = lt_items CONDITIONS_IN = lt_conditions RETURN = lt_return. * 检查执行结果 LOOP AT lt_return INTO DATA(ls_return) WHERE TYPE CA 'AE'. ROLLBACK WORK. EXIT. ENDLOOP. IF sy-subrc <> 0. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. ENDIF. ``` #### 4. 关键注意事项 - **定价过程配置**:确保事务代码`V/08`中定价过程包含使用的条件类型 - **条件记录验证**:通过事务`VK13`检查价格主数据是否存在 - **单位一致性**:`COND_UNIT`需与物料主数据单位匹配 - **价值计算**:总价 = COND_VALUE × 数量 × COND_P_UNT #### 5. 常见问题排查 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 价格未带出 | 缺少条件记录 | 检查`VK13`主数据 | | 货币错误 | 订单货币与条件记录不匹配 | 统一货币配置 | | 单位转换错误 | 单位换算表未维护 | 维护事务代码`CUNI` | #### 6. 高级应用场景 - **组合定价**:同时传递多个条件类型(如`PR00`+`K004`折扣) - **公式定价**:通过条件基价+条件补充(如运费公式) - **客户专属价**:使用客户-物料组合条件类型(如`PR02`) 建议在测试系统先行验证,并通过`VA02`事务代码检查已创建订单的定价分析(点击行项目→条件→定价分析)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值