'BAPI_REQUIREMENTS_CREATE' --创建月需求计划(MD61)

本文介绍了一个使用SAP BAPI批量创建需求的ABAP程序示例。该程序通过读取指定文本文件中的数据,利用SAP提供的WS_UPLOAD函数导入数据,并通过BAPI_REQUIREMENTS_CREATE函数创建需求记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

REPORT ZTY_MM_BAPI_REQUIREMENTS .
*bapi data
data: req_item like BAPISITEMR.
data: req_data like BAPISSHDIN occurs 0 with header line.
data: RETURN LIKE BAPIRETURN1 OCCURS 0 WITH HEADER LINE.
data: matertemp like BAPISITEMR-MATERIAL.
data: begin of wa_itab,
          index type i,  "序号
          matnr like BAPISITEMR-MATERIAL,     "物料编码
          REQ_QTY like BAPISSHDIN-REQ_QTY,    "计划数量
      end of wa_itab.
data: itab like wa_itab occurs 0 with header line.
data: matemp like BAPISITEMR-MATERIAL.  "物料编码
data: begin of log occurs 0,
         index type i,  "序号
         MESSAGE like return-message,  "消息文本
      end of log.

SELECTION-SCREEN: BEGIN OF BLOCK FRAME01
   WITH FRAME TITLE Text-001.
parameters: p_number like pbpt-pbdnr obligatory.
parameters: p_today like sy-datum obligatory.
parameters: TXTFILE like rlgrap-filename default
  'c:/material.txt' obligatory.
parameters: logfile like rlgrap-filename default
  'c:/log.txt' obligatory.
SELECTION-SCREEN: END OF BLOCK FRAME01.
SELECTION-SCREEN: BEGIN OF BLOCK FRAME02
   WITH FRAME TITLE TEXT-002.
SELECTION-SCREEN COMMENT /5(40) TEXT-003.
SELECTION-SCREEN: END OF BLOCK FRAME02.

START-OF-SELECTION.
  PERFORM FRM_GET_DATA.
  PERFORM FRM_CREATE_requ.
end-of-selection.
*-----------upload data----------
FORM FRM_GET_DATA.
CALL FUNCTION 'WS_UPLOAD'
 EXPORTING
*   CODEPAGE                      = ' '
   FILENAME                      = TXTFILE
   FILETYPE                      = 'DAT'
*   HEADLEN                       = ' '
*   LINE_EXIT                     = ' '
*   TRUNCLEN                      = ' '
*   USER_FORM                     = ' '
*   USER_PROG                     = ' '
*   DAT_D_FORMAT                  = ' '
* IMPORTING
*   FILELENGTH                    =
  TABLES
    DATA_TAB                      = ITAB
 EXCEPTIONS
   CONVERSION_ERROR              = 1
   FILE_OPEN_ERROR               = 2
   FILE_READ_ERROR               = 3
   INVALID_TYPE                  = 4
   NO_BATCH                      = 5
   UNKNOWN_ERROR                 = 6
   INVALID_TABLE_WIDTH           = 7
   GUI_REFUSE_FILETRANSFER       = 8
   CUSTOMER_ERROR                = 9
   OTHERS                        = 10
          .
IF SY-SUBRC <> 0.
write : '上载数据出错,请检查文本文件是否存在或格式错误!'.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
exit.
ENDIF.
ENDFORM.
*loop at itab.
*     itab-index = sy-index.
*     itab-plan = '8000'.
*     itab-requ = 'vse'.
*     itab-v = 'X'.
*     itab-req_number = p_number.
*     modify itab.
*endloop.
*-----------upload data end------
*----------create requirements---
FORM FRM_CREATE_requ.
    loop at itab.
        concatenate '00000000000' itab-matnr into matertemp.
        req_item-material = matertemp.
        req_item-plant = '8000'.
        req_item-REQU_TYPE = 'VSE'.
        req_item-VERSION = '00'.
        req_item-VERS_ACTIV = 'X'.
        req_item-req_number = p_number.

        req_data-DATE_TYPE = 3.
        req_data-req_date = p_today.
        req_data-REQ_QTY = itab-REQ_QTY.
        append req_data.
        CALL FUNCTION 'BAPI_REQUIREMENTS_CREATE'
          EXPORTING
            REQUIREMENTS_ITEM              = req_item
*           REQUIREMENT_PARAM              =
          IMPORTING
           MATERIAL                       = matemp
*           PLANT                          =
*           REQUIREMENTSTYPE               =
*           VERSION                        =
*           REQMTSPLANNUMBER               =
          TABLES
            REQUIREMENTS_SCHEDULE_IN       = REQ_data
*           REQUIREMENTS_CHAR_IN           =
            RETURN                         = RETURN.
 IF NOT matemp IS INITIAL.
        WRITE:/(10) matemp COLOR 4,
               (50) '创建成功'.
 else.
       log-index = itab-index.
       log-message = return-MESSAGE.
       append log.
 ENDIF.
clear matemp.
REFRESH req_data.
clear matertemp.
clear req_item.
endloop.
CALL FUNCTION 'WS_DOWNLOAD'
 EXPORTING
   FILENAME                      = LOGFILE
   FILETYPE                      = 'DAT'
  TABLES
    DATA_TAB                     = LOG
 EXCEPTIONS
   INVALID_FILESIZE              = 1
   INVALID_TABLE_WIDTH           = 2
   INVALID_TYPE                  = 3
   NO_BATCH                      = 4
   UNKNOWN_ERROR                 = 5
   GUI_REFUSE_FILETRANSFER       = 6
   CUSTOMER_ERROR                = 7
   OTHERS                        = 8
          .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

write : '批输入结束!请检查LOG文件!'.
endform.
*----------create end------------

 代码来源:http://blog.youkuaiyun.com/hansbj/archive/2004/10/26/152428.aspx

Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1600621


<think>首先,用户的问题是:“我想使用BAPI_SAG_CREATE创建普通采购 请问BAPI_SAG_CREATE 创建普通采购 示例或方法”。这涉及到SAP ABAP中的BAPI_SAG_CREATE函数,用于创建框架协议-计划协议。 从系统级指令中,我需要: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用,但用户提供的引用是关于BAPI函数的清单和教程,不是直接相关。用户提到引用[1]和[^2],但内容是关于其他BAPI函数的。引用[1]包括BAPI_SAG_CREATE,它是框架协议-计划协议创建。用户指定了“创建普通采购”,但BAPI_SAG_CREATE是用于计划协议(Scheduling Agreement),不是普通采购订单。普通采购订单通常使用BAPI_PO_CREATE1。 用户说:“使用BAPI_SAG_CREATE创建普通采购”,但BAPI_SAG_CREATE是用于框架协议-计划协议,不是普通采购。普通采购订单是Purchase Order,使用BAPI_PO_CREATE1。用户可能误解了函数名。 检查引用[1]:它列出了BAPI_SAG_CREATE作为框架协议-计划协议创建。所以,用户可能想创建计划协议,但说成了“普通采购”。或者用户错误地认为BAPI_SAG_CREATE用于普通采购。 在SAP中: - 普通采购订单:使用BAPI_PO_CREATE1。 - 计划协议:使用BAPI_SAG_CREATE。 用户指定了“创建普通采购”,所以或许我应该纠正用户:BAPI_SAG_CREATE不是用于普通采购的;普通采购应该用BAPI_PO_CREATE1。 但用户的问题是:“使用BAPI_SAG_CREATE创建普通采购”,所以我需要先澄清这一点。 我的回答应该: 1. 澄清函数用途:BAPI_SAG_CREATE用于创建框架协议-计划协议,而不是普通采购订单。 2. 提供正确的方法:如果用户想创建普通采购订单,建议使用BAPI_PO_CREATE1。 3. 如果用户坚持使用BAPI_SAG_CREATE,提供示例,但强调它不是用于普通采购。 4. 结构清晰:逐步解释。 5. 使用中文。 6. 生成相关问题。 7. 添加引用标识:用户提供了引用[1]和[^2],但[^2]是优快云博客链接,内容关于ABAP顾问能力模型,不直接相关。引用[1]有BAPI_SAG_CREATE,所以我应该引用它。 用户消息中:引用[1]包含“BAPI_SAG_CREATE框架协议-计划协议创建”,所以我可以引用它。 回答结构: - 先解释函数用途。 - 纠正误解。 - 提供示例代码或方法。 - 生成相关问题。 由于BAPI_SAG_CREATE是用于计划协议,我需要提供一个创建计划协议的示例。 普通采购订单的BAPI是BAPI_PO_CREATE1,所以我应该提到它。 步骤: 1. 确认用户需求:用户想创建普通采购,但使用了错误的BAPI。 2. 解释BAPI_SAG_CREATE:用于计划协议。 3. 提供BAPI_SAG_CREATE的示例。 4. 建议正确的BAPI用于普通采购。 5. 使用中文。 6. 添加引用。 7. 生成相关问题。 示例代码:我需要提供一个ABAP代码示例。用户在上一个问题中提到了快速排序的Python示例,但这里是ABAP。 在ABAP中,调用BAPI通常涉及填充输入结构,调用函数模块,处理返回。 BAPI_SAG_CREATE的典型用法: - 填充头部数据(如供应商、采购组织等)。 - 填充项目数据。 - 调用BAPI。 - 检查错误并提交事务。 类似地,对于BAPI_PO_CREATE1。 引用标识:在回答末尾或相关部分添加[^1]或[^2],但用户提供的引用[1]是关于函数清单的,[^2]是教程链接。 在回答中,我可以写:根据引用[1],BAPI_SAG_CREATE用于框架协议-计划协议创建[^1]。 生成相关问题:在最后添加“相关问题”部分。 现在,构建回答: - 开头:澄清函数用途。 - 主体:提供方法或示例。 - 结尾:生成相关问题。 代码格式:在示例中使用代码块,就像快速排序示例一样。 最终回答:</think>### 使用 BAPI_SAG_CREATE 创建框架协议-计划协议的示例与方法 您的查询中提到“使用 BAPI_SAG_CREATE 创建普通采购”,但需要澄清:BAPI_SAG_CREATE 是 SAP ABAP 中专门用于创建**框架协议-计划协议(Scheduling Agreement)** 的函数模块,而不是普通采购订单。普通采购订单通常使用 `BAPI_PO_CREATE1` 来实现[^1]。计划协议是一种长期采购协议,用于按计划交付货物(如定期供货),而普通采购订单是一次性采购行为。 如果您确实需要创建计划协议(框架协议的一种),我将提供完整的使用方法和示例代码。以下是基于 SAP ABAP 的标准实践,逐步说明如何调用 BAPI_SAG_CREATE。 #### 步骤 1: 理解 BAPI_SAG_CREATE 的基本结构 BAPI_SAG_CREATE 需要以下关键输入参数: - `HEADERDATA`: 协议头部数据(如供应商、采购组织、协议类型等)。 - `ITEMDATA`: 协议项目数据(如物料、数量、交付计划等)。 - `RETURN`: 返回消息(用于错误处理)。 协议创建后,需显式提交事务以保存数据。 计划协议类型通常为 `LP`(标准计划协议),而普通采购订单使用文档类型 `NB`[^1]。 #### 步骤 2: 示例代码 以下是一个完整的 ABAP 代码示例,展示如何调用 BAPI_SAG_CREATE 创建计划协议。代码包括头部数据设置、项目数据填充、错误处理和事务提交。 ```abap REPORT Z_CREATE_SCHEDULING_AGREEMENT. DATA: lt_header TYPE BAPIMERCHAGRM, " 头部数据 lt_item TYPE TABLE OF BAPIMERCHAGRMITM, " 项目数据表 ls_item LIKE LINE OF lt_item, " 单个项目数据 lt_return TYPE TABLE OF BAPIRET2, " 返回消息表 ls_return LIKE LINE OF lt_return, lv_docnum TYPE EBELN. " 生成的协议编号 " 1. 设置头部数据 lt_header-doc_type = 'LP'. " 协议类型:计划协议 lt_header-vendor = '0000001234'. " 供应商编号 lt_header-pur_org = '1000'. " 采购组织 lt_header-comp_code = '1000'. " 公司代码 lt_header-agrmt_date = sy-datum. " 协议日期(当前日期) " 2. 设置项目数据 ls_item-material = 'MAT-001'. " 物料号 ls_item-plant = '1000'. " 工厂 ls_item-target_qty = 100. " 目标数量 ls_item-target_qu = 'EA'. " 单位 ls_item-delivery_date = sy-datum + 30. " 计划交付日期(30天后) APPEND ls_item TO lt_item. " 3. 调用 BAPI 创建计划协议 CALL FUNCTION 'BAPI_SAG_CREATE' EXPORTING headerdatain = lt_header TABLES itemdatain = lt_item return = lt_return. " 4. 检查错误并提交事务 READ TABLE lt_return INTO ls_return WITH KEY type = 'E'. IF sy-subrc = 0. " 存在错误 WRITE: / '错误:', ls_return-message. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 回滚事务 ELSE. " 成功创建 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' " 提交事务 EXPORTING wait = 'X'. WRITE: / '计划协议创建成功,编号:', lv_docnum. ENDIF. ``` #### 代码说明 - **头部数据 (`HEADERDATALIN`)**: 设置协议的基本信息,例如 `doc_type = 'LP'` 表示计划协议,`vendor` 是供应商编号。 - **项目数据 (`ITEMDATAIN`)**: 定义物料、数量和交付计划。支持多项目,需使用内部表。 - **错误处理 (`RETURN`)**: 检查返回消息表(`BAPIRET2`),如果存在错误(`type = 'E'`),则回滚事务;否则提交事务。 - **事务提交**: 必须调用 `BAPI_TRANSACTION_COMMIT` 来保存数据,否则协议不会持久化[^1]。 - **普通采购的替代方案**: 如果您需要创建普通采购订单(一次性采购),请使用 `BAPI_PO_CREATE1`,设置文档类型为 `NB`,并填充采购订单相关参数。示例代码结构与上述类似,但函数和参数不同。 #### 注意事项 - **权限要求**: 确保 ABAP 用户有权限调用 BAPI 和写入采购模块数据。 - **数据验证**: 输入参数(如供应商、物料)必须在 SAP 系统中存在,否则 BAPI 会返回错误。 - **测试建议**: 在开发系统测试后再部署到生产环境。使用 `BAPI_TRANSACTION_ROLLBACK` 可避免测试数据残留。 - 根据引用[1],BAPI_SAG_CREATE 主要用于框架协议场景,不适合普通采购[^1]。如果您需要普通采购订单的完整示例,请提供更多细节。 ### 相关问题 1. BAPI_SAG_CREATE 和 BAPI_PO_CREATE1 在参数上有哪些主要区别? 2. 如何处理 BAPI_SAG_CREATE 返回的错误消息? 3. 在 SAP ABAP 中,如何修改或删除已创建计划协议? 4. 普通采购订单的创建流程与计划协议有什么不同? [^1]: 引用[1]:1.2.2BAPI清单 ME_INFORECORD_MAINTAIN采购信息记录修改BAPI_CONTRACT_CREATE框架协议-合同创建BAPI_CONTRACT_CHANGE框架协议-合同修改BAPI_SAG_CREATE框架协议-计划协议创建BAPI_PR_CREATE采购申请创建BAPI_PO_CREATE1采购订单创建BAPI_GOODSMVT_CREATE采购订单收货创建BAPI_INCOMINGINVOICE_PARK采购发票预制BAPI_INCOMINGINVOICE_POST采购发票过账BAPI_ACC_DOCUMENT_POST采购付款过帐RFC_CVI_EI_INBOUND_MAIN供应商主数据(员工)创建 二代码模板 1.3供应商主数据(员工)创建。 [^2]: 引用[2]:SAP_ABAP_BAPI函数清单案例教程。SAP ABAP 顾问能力模型(同心圆方法论)_sap abap 顾问能力模型(同心圆方法论)-优快云博客文章浏览阅读1.8k次,点赞5次,收藏35次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!_sap abap 顾问能力模型(同心圆方法论)https://blog.youkuaiyun.com/java_zhong1990/article/details/132469977。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值