SAP接口开发-根据生产订单编号获取物料信息

本文介绍如何使用C#语言调用SAP的BAPI_PRODORD_GET_DETAIL函数,以根据生产订单编号获取详细的物料信息。通过具体的代码示例,展示了创建函数、设置参数、调用函数及处理返回结果的全过程。

根据生产订单编号获取物料信息需要调用 BAPI_PRODORD_GET_DETAIL函数,调用接口用C#语言实现的源码如下所示:

        //2018年10月19号新增

        /// <summary>
        /// 根据生产订单获取物料信息
        /// </summary>
        /// <param name="prd"></param>
        /// <param name="OrderNum">生产订单号</param>
        /// <param name="errMsg">返回错误信息</param>
        /// <returns></returns>
        public static int GetMatDetailByOrder(RfcDestination prd, string OrderNums, out List<MaterialDetail> lstM, out string errMsg)
        {
            errMsg = "";
            lstM = new List<MaterialDetail>();
            MaterialDetail md1;
            try
            {
                //RfcRepository SapRfcRepository = prd.Repository;
                //IRfcFunction function = SapRfcRepository.CreateFunction("BAPI_PRODORD_GET_DETAIL");
                //function.SetValue("NUMBER", OrderNums[0]);//生产订单号
                //function.SetValue("ORDER_OBJECTS", "X");//默认
                //RfcSessionManager.BeginContext(prd);
                //function.Invoke(prd);
                //RfcSessionManager.EndContext(prd);
                //IRfcTable iTable = function.GetTable("COMPONENT");
                RfcRepository SapRfcRepository = prd.Repository;

                IRfcFunction function = SapRfcRepository.CreateFunction("BAPI_PRODORD_GET_DETAIL");
                IRfcStructure stru = function.GetStructure("ORDER_OBJECTS");
                IRfcTable pTable = null;
                IRfcTable mTable = null;

                stru.SetValue("COMPONENTS", "1");
                mTable = function.GetTable("COMPONENT");

                function.SetValue("ORDER_OBJECTS", "X");

                OrderNums = OrderNums.PadLeft(12, '0');
                function.SetValue("NUMBER", OrderNums);//ORDER_NUMBER
                function.Invoke(prd);

                IRfcStructure Return = function.GetStructure("RETURN");
                if (mTable.RowCount > 0)
                {
                    for (int j = 0; j < mTable.RowCount; j++)
                    {
                        #region
                        //iTable.CurrentIndex = j;
                        //DataRow dr = dt.NewRow();
                        //dr["Item_Num"] = iTable.GetString("ITEM_NUMBER").ToString();
                        //dr["Mterial_Description"] = iTable.GetString("MATERIAL_DESCRIPTION").ToString();
                        //dr["Commited_Quantity"] = iTable.GetString("COMMITED_QUANTITY").ToString();
                        //dr["Shortage"] = iTable.GetString("SHORTAGE").ToString();
                        //dr["Material_Externsion"] = iTable.GetString("MATERIAL_EXTERNSION").ToString();
                        //dr["Req_Segment"] = iTable.GetString("REQ_SEGMENT").ToString();
                        //dr["Stock_Segment"] = iTable.GetString("STOCK_SEGMENT").ToString();
                        //dt.Rows.Add(dr);
                        #endregion
                        md1 = new MaterialDetail();
                        mTable.CurrentIndex = j;
                        md1.ORDERID = mTable.GetValue("ORDER_NUMBER").ToString(); //订单号
                        md1.MATERIAL = mTable.GetValue("MATERIAL").ToString();//物料编号
                        md1.MATERIAL = md1.MATERIAL.TrimStart('0');
                        md1.ENTRY_QNT = mTable.GetValue("ENTRY_QUANTITY").ToString();
                        md1.ENTRY_QNT = Math.Round(decimal.Parse(md1.ENTRY_QNT)).ToString();
                        md1.PLANT = mTable.GetValue("PROD_PLANT").ToString();//工厂
                        md1.MATL_DESC = mTable.GetValue("MATERIAL_DESCRIPTION").ToString();//
                        md1.WITHDRAWN_QUANTITY = mTable.GetValue("WITHDRAWN_QUANTITY").ToString();//
                        md1.WITHDRAWN_QUANTITY = Math.Round(decimal.Parse(md1.WITHDRAWN_QUANTITY)).ToString();
                        md1.RESERV_NO = mTable.GetValue("RESERVATION_NUMBER").ToString();//
                        md1.RES_ITEM = mTable.GetValue("RESERVATION_ITEM").ToString();//
                        md1.ORDER_ITNO = mTable.GetValue("ITEM_NUMBER").ToString();
                        md1.ORDERID = mTable.GetValue("ORDER_NUMBER").ToString();
                        md1.ENTRY_UOM = mTable.GetValue("ENTRY_UOM").ToString();
                        md1.MOVE_TYPE = mTable.GetValue("MOVEMENT_TYPE").ToString();
                        //if (md1.MOVE_TYPE == "261")
                        lstM.Add(md1);
                    }
                }
                return 0;
            }
            catch (System.Exception ex)
            {
                errMsg = ex.Message;
                return -1;
            }
        }

 

SAP系统中,销售订单与MRP(物料需求计划)的集成是企业资源规划中的关键环节。虽然标准的销售订单报表(如VA03查看销售订单详细信息)不直接显示MRP运行数据,但可以通过以下方式间接查看或关联MRP运行信息: ### 查看MRP运行信息的方法 1. **通过事务代码MD04(库存/需求清单)** 用户可以在MD04中输入物料编号和工厂,查看该物料的需求来源,包括销售订单计划订单生产订单等。如果销售订单触发了MRP运行,则会在MD04中显示相关的计划订单或采购建议。 此外,MD04可以显示MRP元素标识(DELKZ),用于区分不同类型的MRP元素,例如独立需求、计划订单、采购申请等[^1]。 2. **使用函数 `MD_MRP_LIST_API`** 该函数可获取MRP清单信息,结合销售订单号,可查询该订单是否触发了MRP运行以及生成的相关计划订单或采购申请。此方法适用于需要编程方式访问MRP数据的场景,例如开发自定义报表或集成第三方系统。 3. **使用事务代码CO03(生产订单信息)** 如果销售订单触发了生产订单的创建,可以通过CO03输入生产订单号查看其详细信息,包括MRP运行时的参数和时间戳。 4. **使用BAPI `BAPI_PLANNEDORDER_GET_DETAIL` 或 `BAPI_PRODORD_GET_DETAIL`** 这些BAPI可用于获取计划订单生产订单的详细信息,包括与MRP运行相关的信息,例如需求来源、计划时间、MRP控制参数等。这些接口通常用于二次开发或集成外部系统时使用。 5. **通过SD模块与MM/PP模块的集成** 在销售订单创建后,若启用了自动MRP运行,系统可能会自动生成计划订单或采购申请。此时,可在MM模块(如ME51N查看采购申请)或PP模块(如MD04或CO03)中查看MRP运行结果。 6. **自定义开发报表** 若标准功能无法满足需求,可通过ABAP开发创建自定义报表,将销售订单与MRP运行数据进行关联展示。例如,读取销售订单表(VBAK/VBAP)、MRP计划订单表(AUFK/AUFP)、MRP运行日志(MDPH、MDPS)等,并通过SE16N或自定义事务代码展示数据。 开发过程中可调用标准函数如 `MD_STOCK_REQUIREMENTS_LIST_API` 和 `MD_PEGGING_NODIALOG` 来获取实时库存和需求关系数据[^1]。 ### 示例代码:调用BAPI获取计划订单详情 ```abap DATA: lt_plan_order TYPE TABLE OF bapiplpo, ls_return TYPE bapiret2. CALL FUNCTION 'BAPI_PLANNEDORDER_GET_DETAIL' EXPORTING plannedorder = '1000001' " 示例计划订单号 IMPORTING plannedorderdata = lt_plan_order EXCEPTIONS plannedorder_not_found = 1 OTHERS = 2. IF sy-subrc <> 0. CALL FUNCTION 'BAPI_MSGSTO_GETDETAIL' IMPORTING return = ls_return. ENDIF. ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Favor_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值