碰到一个需求,需要对销售订单的定价类型进行批量更新,对这种临时批量处理,考虑到数据源一般放在 Excel 中,使用 VBA 来调用 BAPI 实现不失为一种快捷的方式。

了解 BAPI 如何使用

更改销售订单的 BAPI 是 BAPI_SALESORDER_CHANGE,这个 BAPI 因为参数比较多,我们首先要找到针对更改定价类型这种场景,相应的参数如何设置。基本方法就是 SE37 进行测试,以及查看函数的文档。
经过查找和测试,了解到需要更新定价类型需要填写如下的参数:

ORDER_HEADER_INX 的 UPDATEFLAG 参数要填写 U:

LOGIC_SWITCH 参数的 PRICING 是核心,这里填写要更新的定价类型。可以在 VA02 界面行项目的条件选项卡中查看。

当然要告诉 BAPI, 需要修改的行项目,需要填写 ORDER_ITEM_IN 和 ORDER_ITEM_INX 两个参数:

查看测试结果:

有了这些准备,可以编写程序了。

编写函数调用 BAPI_SALESORDER_CHANGE

因为本篇是讲解 RFC 的案例,所以并不详细说明 VBA 调用 BAPI 的要点和语法。之前我写过系列文章,小伙伴们可以自行查找。我将函数的调用封装在函数中,返回值为 BAPI 的 RETURN 参数:

Public Function ChangeSalesOrder(OrderNo As String, ItemNo As Integer, NewPricing As String) As StringDim functions As New SAPFunctionsOCX.SAPFunctionsDim func As SAPFunctionsOCX.FunctionDim commitFunc As SAPFunctionsOCX.FunctionDim orderItemIn As SAPTableFactoryCtrl.TableDim orderItemInX As SAPTableFactoryCtrl.TableDim returnTable As SAPTableFactoryCtrl.TableDim retVal As String '函数返回只retVal = ""' sapConnection is globalIf sapConnection Is Nothing ThenMsgBox "请登录SAP系统!", vbOKOnly + vbInformationExit FunctionEnd IfIf sapConnection.IsConnected <> tloRfcConnected ThenMsgBox "请登录SAP系统!", vbOKOnly + vbInformationExit FunctionEnd IfSet functions.Connection = sapConnectionSet func = functions.Add("BAPI_SALESORDER_CHANGE")' BAPI参数-Importingfunc.Exports("SALESDOCUMENT").Value = OrderNo              ' 销售订单号func.Exports("ORDER_HEADER_INX").Value("UPDATEFLAG") = "U" ' U表示修改' BAPI参数-Pricing(在LOGIC_SWITCH参数中)func.Exports("LOGIC_SWITCH").Value("PRICING") = NewPricingfunc.Exports("LOGIC_SWITCH").Value("COND_HANDL") = "X"'BAPI参数-ORDER_ITEM_IN / ORDER_ITEM_INSet orderItemIn = func.Tables("ORDER_ITEM_IN")Set orderItemInX = func.Tables("ORDER_ITEM_INX")orderItemIn.AppendRoworderItemIn.Value(1, "ITM_NUMBER") = ItemNoorderItemInX.AppendRoworderItemInX.Value(1, "ITM_NUMBER") = ItemNoorderItemInX.Value(1, "UPDATEFLAG") = "U"'BAPI参数-返回值Set returnTable = func.Tables("RETURN")'执行函数If func.Call = False ThenretVal = DumpReturn(returnTable)Exit FunctionElseretVal = DumpReturn(returnTable)Dim returnOfCommit As SAPTableFactoryCtrl.TableSet commitFunc = functions.Add("BAPI_TRANSACTION_COMMIT")commitFunc.Exports("WAIT").Value = "X"Set returnOfCommit = commitFunc.Tables("RETURN")If commitFunc.Call = False ThenMsgBox func.ExceptionExit FunctionEnd IfEnd IfChangeSalesOrder = retVal
End Function

注意该 BAPI 需要在调用之后,根据是否成功,再调用另外一个 BAPI : BAPI_TRANSACTION_COMMIT 来实现真正的提交。

处理函数的返回值

函数的返回值 return 是一个表类型的参数,我们可以有两种方式来处理,第一种方式是将每一行的消息都返回:

Private Function DumpReturn(ret As SAPTableFactoryCtrl.Table) As StringDim i As IntegerDim retVal As StringretVal = ""Dim returnOfLine As StringIf Not ret Is Nothing ThenIf ret.rowcount > 0 ThenFor i = 1 To ret.rowcountreturnOfLine = "消息" & Str(i) & ": " & ret.Value(i, 1) & "," & ret.Value(i, 4) & ";"retVal = retVal & returnOfLineNext iEnd IfEnd IfDumpReturn = retVal
End Function

简便起见,我们也可以只获取 return 表参数的最后一行:

Private Function DumpReturn(ret As SAPTableFactoryCtrl.Table) As StringDim retVal As String    retVal = ""If Not ret Is Nothing ThenIf ret.rowcount > 0 ThenretVal = "消息类型 " & ret.Value(ret.rowcount, 1) & "," & ret.Value(ret.rowcount, 4)End IfEnd IfDumpReturn = retVal
End Function

实现从 Excel 中读取数据,然后进行批量更新

Public Sub RunScript()Dim i As LongDim returnVal As StringFor i = 4 To Sheet3.UsedRange.rows.CountIf Sheet3.Range("A" & i).Value = "EOF" Then Exit SubDim leftCell As RangeSet leftCell = Sheet3.Range("A" & i)returnVal = ChangeSalesOrder(leftCell.Value, leftCell.Offset(0, 1).Value, leftCell.Offset(0, 2).Value)leftCell.Offset(0, 3).Value = returnValNext

在界面中进行测试:

源码

sap_interface_prog_rfc_vba: RFC programing using VBA (gitee.com)

参考

更新销售订单执行新定价——BAPI_SALESORDER_CHANGE

SAP接口编程案例 - VBA批量更新销售订单定价类型相关推荐

  1. SAP SD初阶之VL10A为销售订单创建外向交货单

    SAP SD初阶之VL10A为销售订单创建外向交货单 SAP SD模块中销售订单的外向交货单创建,有很多种方法.其中之一就是使用VL10A这个事务代码. 不过基于个人喜好和操作习惯的原因,VL10A这 ...

  2. 畅捷通T+与畅捷通T+对接集成批量新增销售订单连通存货批量创建(批量新增销售订单)

    畅捷通T+与畅捷通T+对接集成批量新增销售订单连通存货批量创建(批量新增销售订单) 对接系统畅捷通T+ "T+"是一款灵动.智慧.时尚的互联网管理软件,主要针对中小型工贸和商贸企业 ...

  3. [SAP ABAP开发技术总结]SD销售订单定价过程

    16.3.2.     定价过程 16.3.2.1.           条件技术七要素 16.3.2.2.           条件表V/03.V/04.V/05 16.3.2.3.         ...

  4. 批量生成销售订单、退货订单

    生成一般销售订单和退货订单所要使用的BAPI不同, 一般销售订单: BAPI_SALESORDER_CREATEFROMDAT2 退货订单: BAPI_CUSTOMERRETURN_CREATE 二者 ...

  5. SAP S/4HANA销售订单的类型建模细节

    Created by Wang, Jerry, last modified on Apr 09, 2017 销售订单行项目表名:VBAK, 订单类型字段:AUART 存放订单类型条目的表:TVAKT ...

  6. 金蝶K3--产品入库--更新销售订单/预测单编号

    create trigger icstockbill_custon icstockbill for update if exists(select 1 from inserted) begindecl ...

  7. SAP接口编程 之 JCo3.0系列:Table参数

    Table参数作为export parameter BAPI_COMPANYCODE_GETDETAIL是一个适合演示的函数,没有import paramter参数,调用后COMPANYCODE_GE ...

  8. EBS ORACLE使用API批量取消销售订单

    需要切换组织,还有用户的id.下面红色字体代表要修改的地方. /*BEGIN MO_GLOBAL.INIT('M'); MO_GLOBAL.set_policy_context ('S',199); ...

  9. 销售订单定价-客户取值

    其实VK12里面配置的定价信息里面取得事运达方的主数据设置. 客户税分类 1 定义 指出定价时系统是否考虑到涉及消费者的税收(例如,国家销售税). 使用 系统从存储在 运达方 客户主记录中的税收记录复 ...

最新文章

  1. Java中的三目运算符
  2. linux下Intellij Idea 14的安装
  3. 百余名欧洲议会议员发函 呼吁英国留在欧盟
  4. 服务器资源管理器视图的添加显示的步骤
  5. ASP.NET Core 2.2 : 扒一扒新的Endpoint路由方案
  6. 图片--Android加载图片导致内存溢出(Out of Memory异常)
  7. android 最全的shape属性
  8. java集合类习题_Java集合练习
  9. guice android,android – 如何使用Guice的@Singleton?
  10. 选择 ASP.NET Core Web UI--主线
  11. 图像文字识别:Python批量识别图片中的文字并自动改名
  12. 2022保研经验帖——吉大、华师、浙大、中大、南航/理、东南、南开等
  13. Android 10.0 强制app横屏显示
  14. 基于NT98530的多目VR摄像机方案,多sensor同步,多sensor防抖,PTP校时,实景SLAM数字孪生的最佳搭档。
  15. 改纸盒大小_关于纸箱尺寸的一些知识
  16. 隐私泄露防不胜防,真的没有办法了吗?
  17. Android调用系统原生分享组件
  18. 英语 作文模板二 图表作文
  19. 计算机组成原理与系统结构习题集
  20. NeurIPS 2022 | Stable Diffusion采样速度翻倍!清华提出扩散模型高效求解器

热门文章

  1. 如何用python制作正方形模拟器 python项目小发明 【安安教具】-【数学】-【正方形】模拟器
  2. python练习题 11-20
  3. 【Android安全】安卓刷机过程及原理
  4. JPEG图像压缩原理与DCT离散余弦变换
  5. USB学习笔记(5)STM32 USB库移植步骤
  6. long long int 和 int
  7. js生成excel表格并下载
  8. 如何评价现在的人工智能技术
  9. 把漫画浏览器的离线下载的功能给实现了一下
  10. 常用图像数据集:标注、检索