)
095、BDC与调用事务(CALL TRANSACTION)今天早上刚到公司,就被一个老客户拉去救火。他们一个后台调度程序突然不干活了,日志里只留了一句“SY-SUBRC = 0,但凭证没生成”。我看了一下那段代码,用的是CALL TRANSACTION ‘FB01’,MODE ‘N’,UPDATE ‘L’。看到UPDATE 'L’我就懂了——本地更新,事务代码在执行中没抛异常,但最终提交的时候没跟数据库交互,数据只躺在当前应用服务器的更新会话里,一释放就没了。这种坑写代码的时候不炸,换一台服务器或者遇到数据库锁就炸,炸得你怀疑人生。先说说BDC到底是个什么东西。Batch Data Communication,批处理数据通信。老顾问喜欢管它叫“录屏”,因为最早用SHDB把操作过程录一遍,然后回放。本质就是模拟一个用户坐在终端前敲屏幕,填字段、点按钮、按回车。所以BDC程序要解决的核心问题只有一个——把用户的键盘鼠标动作翻译成一张标准的内表。这张内表行类型是BDC_DATA。里面关键的字段有:PROGRAM(程序名)、DYNPRO(屏幕号)、DYNBEGIN(是否新屏幕,标记X)、FNAM(字段名)、FVAL(字段值)。注意,每次屏幕切换时必须先放一行PROGRAM、DYNPRO、DYNBEGIN = 'X’作为屏幕起始行,后面跟着该屏幕的所有字段。字段名不是随意的,必须是屏幕上的实际字段名,比如物料主数据的字段经常是“MAKT-MAKTX”,或者“T001-BUKRS”。还有一个特殊字段叫BDC_OKCODE,代表功能键,回车算是“/00”,F3是“/35”什么的——别纠结这个具体值,录屏时看SHDB生成的代码里怎么写的,抄过来就行。