1、 # 、 m 一 t | t 实用第一 智慧密集 。 一 一 Exce1VBA与sAp一 c接口调用实例 刘 静 摘 要:通过VBA程序实例,介绍了利用Excel的VBA宏程序,调用SAP系统的RFC远程函数 接口实现外部数据与SAP系统的交互。程序实现了在VBA中登录SAP系统,并完成对SAP主 数据的写入和读取,同时也简单给出对RFC、BDC、VBA的理解和经验。 关键词:SAP系统;远程函数调用;VBA宏程序;批量数据转换 系统 詈 2程序开发 系统的首选 自接触该系统之后,工作中一直存在一种困扰, 一一 即在维护SAP主数据时,重复性手工劳动过多,导致工作效 率低下,数据错误率高 以员
2、工上数据维护(BDC模板维护方 式)为例,其操作流程如下: (1)确认员_上数据模板,主要包括LFA1表字段名称。 (2)运行事务代码SttDB录制BDC数据导入模板。 (3)按要求逐项填叮了 工主数据并存为TXT文本文件。 (4)用SAPGUITOOLS校验数据 生成【1J导人BDC数据 文本。 (5)执行事务代码ZZ J:传该BDC文本。 (6)执行事务代码SM35,执行数据导人SESSION导入 数据 (7)在SAP系统的数据导入SESSION生成的LOG中手工 检查数据导人情况 按照这个流程手工维护主数据,重复性步骤多,数据校验 与数据导入检杏繁琐出错后纠错查找过稗相 麻烦。 于是在丁
3、作之余,经常思考能否通过程序自动实现主数据 的自动校验、导人和导入后的检查。数据校验相对容易,存 Excel中用VBA完全可以实现。但导入和导入后的检查则需要 和SAP系统进行数据交换,接口存哪里呢?通过小断交流学 习和检索相关资料,终于发现原来SAP系统早已提供了这样 的接,即RFC远程 数调用。 1 测试环境 (1)Windows XP下安装微软Office Excel,笔者使用版本 2007,2003也可以 (2)安装SAP GUI客户端,使用的版本为71,默认安装 即可 (3)服务器端要有测试系统(T系统),J【_j户权限设置时, 要拥有对事务代码SM35,SHDB,XK01的使用权限
4、。 电 与矗 21 模板确定 这里不详细介绍员j二主数据字段荻取和BDC录制过程, 一般有实际SAP系统工作经验的用户都会接触到这一基本技 术。只给出录制好的BDC模板文本在Excel中编辑好的结果, 如图l所示。主数据模板亦如图2所示模板中所列出的字段 都是变量,常量字段则在BDC中默认数值导人。注意BDC一员 工和FIELD一员工两个模板巾的字段名要一一对应,完全一致。 例如:如:BDC一员上中的LIFNR对应的是FIELD一员工第一 行的LIFNR,以此类推。 图1 员工BDC模板 暴墓妒 皴弱 K ; ; _ 一 紫 酱 “- - 一 。 一_ll l琏窭 i i= : 鲢二 ! 二L
5、鱼: 幽一 ;篆 墨 黼嚣 = 寿瓣圈 i 盘 一 图2员工主数据模板 Type BDcTYPE 要 自定义结构 0de: ” Prog ramName As s仃 g : 35” Dyn 0Ass廿。ng ;st ,T0 maBdcR0W ID As String o i ivvvProgramName:bdcTemplate_C ellsFi eldName As String 。一 Va。ue As s ng dX )bdcWor k(idX1 1DynPr。:bdcTempIate_cells( 3) d pe bdcWork(idx1)-IDi:bdcTempIateCeIIs(id
6、x1,4) D im:apConn As Objec bdcW0rk(_d dName bdcTemplateCeUs(idx1。5) dcT曲A bj bdcTemplateCells(idxl,。 Set,Sa pCo nn= ateObje (1IsAP。FUNC ON lLdx2 Ton+D Wjth sapC n。 ne i0n 一idxlO:LOsI LtI |IJVVo TIIolamAiJaXBci LCIdcRIiuv。vw client=”900。 。 Appli cation ISe =日10 *。*H tIfxnbNdacWOrme=k I L,J2 IIPrOF I
7、gramName ,Then 一 SystemNutuber=“” IIMlUA I, 品 in: Languag “ ”, 。 DyD nP “0000ll0r bd 。一 。I ICII Work(idx1)ID=“T”Then Pas swo d=“p。sswo ” t 一e:bdcWork(idx1)AIII“caiiI dName h co =txn。Na e End Sub 、 Sub Rfc Call() Else Dim bdcdcWork(300)As BDCTYPE tempBeg “ Dim Func A如bj 。 Name: ,T Dim eMsg As Object
8、” cwo rk(I_dX1l(l1)FjeldValue,忆 Thn Dim updM ode As Object : kshiI-eetFunicit1Ion11 Dim tra? As Object: Match(Mid(bdcWIIg lUk,g lU1一FieldV a lu e , fieldSetRows(1), h s eets(“F eld-p:)Select T I,1 fieldSetC el ls(idx2,fietdColum Set bdcTemplate=Worksheets(“Bdc一员工”) 。 Set set=w0rkSheets(“ d埙 Etelsme
9、pVaIue bdcw。 x1)_ dVaIue startRow=2 f_ I 一 。 maxBdcRow=bdcTemplate-Range(“A|=A300”)End(xl_ ,E调llU用II写入函数 DOwn)R,OnW + 口 ; c +口。 。 ,nn,、 r|“,1 、 C a ll Ap p e n d B D C, 一一Wrk(idx1)Pr。gramName。 n maxDataR0w_f elds et。Range(A1:A3oo End D。wn bdcWork (Id1)DynP LtJeLm,pUBUeJgVInJVU 。 Field- R W f) 。 Uf T
10、In Call SapLogon If SapConnConnectionLogon(0 True)=True Then Set rfcFunc=SapConnAdd(“RFC_CALL_TRANSAC TION”) Set BdcTab=rfcFunctables(“BDCTABLE”) Set reMsg=rfcFuncimports(“MESSG”) Set updMode=rfcFuncexports(“UPDM0D E,) Set tranCode=rfcFuncexports(”TRANCOD E,) Else MsgBox“Saplogon参数设置错误,未能登录Sap系 Next
11、 If rfcFuncCall=True Then fieldSetCells(idx2,maxFieldColumn+1)=reMsg VaIue(“MSGTX”) End If BdcTab FreeTable Next Set tranCode Nothing Set updMode=Nothing Set reMsg=Nothing Set BdcTab=Nothing 积 实用第一 智慧密集 Set ffcFunc=Nothing Set SapConn=Nothing End Sub Sub AppendBDC(pgm,dyn,beg,nam,va1) With BdcTab Ro
12、wsAdd Value(ROWCOUNT。“PROGRAM”)=Pgm Value(ROWCOUNT,“DYNPRO”)=dyn Value(R0WC0UN TJ“DYN8EGIN”)=beg Value(ROWCOUNT,“FNAM”)=nam Value(ROWCOUNT“FVAL”)=val IEnd With End Sub Sub IRfc Read() Sheets(“Lfal一读取”)Select Call SapLogon If Sa pConnConnectionLogon(0,True)=True Thenl CellsClear Set ffcFunc=SapConnAd
13、d(“RFC_READ 1-ABLE”) Set oOptions=ffcFunctables(“OPTIONS”) Set oLine=ffcFunc,tables(-|D rA”) Set oFields=ffcFunctables(“FIELDS”) ffcFuncexpos(“QUERY_TABLE”)=“LFA1” ffcFuncexpos(“DELlMI1TER”)=“,” oO ptionsAppendRow oOptions(1,“TE)(T”)=“LIFNRikeEQCY” oFieldsAppendRow oFields(1“FIELDNAME”)=LIFNR” oFiel
14、ds。AppendRow oFields(2“FIELDNAME”):“NAME2” oFieldsAppendRow oFields(3,“FIELDNAME”)=“SORTL” Else MsgBox“Saplogon参数设置错误,未能登录Sap系统” Exit Sub End If lf ffcFuncCalI=True Then RO W=oLineR0WC0UNT l=1 Do While i 【增加一行 【全部删除】 function cateup(catid,id)( cates=; divstr= : for(i=O;i +catescatesicatename+ : ) di
15、vstr= +divstr+ return divstr; ) $vat) echo”addrow($( goodstable,)I”$vaI( id J” $val f catid 】“ , 。$val name,】l III, $val price 】” , $val number 1“ , Sval sale 】 ) ) 7 (收稿日期:2011-0211) 也 也 止 也 也 靶 也 也 也S止 “ 址业址址 Sl上址S也业靶 止 也址址 边址址 靶喜 “舢 址 St (上接第26贝) 护,但实际应用RFC时,总是出班一 错误,尤其是数据量 大的时候。从原理 看,BDC方式应用RFC接
16、口是_以处理 大数据量应Hj的,“观的问题应该和对SAP的实际应用水平 有关,有钻研精神的不妨在了解文中提供的方法后自行研究。 32 BDC 存SAP系统坦,重复输入数据时,操作 本是相同的, 一般地, 先执行事务代码,进入相关屏幕后输入或选取值, 确认后再进入另一个屏幕,继续输入值或者修改某些字段里的 值。一条记录完成r,继续下一条,如此循环。 为解决上二述_F丁重复操作带来的问题,SAP系统通过BDC 这种录屏技术,把用,J的一次业务操作的所仃过群记录下来。 首先记录光标收到哪个字段,然后记录用户填入了什么值,最 后记录HJ户点击厂什么按钮这样就形戚 一个BDC“模极” 通过重复执行这个B
17、DC模板告诉SAP系统以怎样的方式来 重复执行这个录制过程。 对于一般的SAP系统朋户,在执行这个过程时,BDC模 板_几一次录制,多次使用,但数据校验、数据导入后的检查基 本都需要于1二太做,或者利用一 外部工具太做,这个过程需 要重复多次且需要记忆多个事务代码和丁作处理流程。如本文 前面所述丁作中效率不高且容易错 利HVBA调用RFC函数,将很多于工的重复性 作自动 化了 川 住他川时,直接点击设置好的宏按钮 呵完成过去 手丁状态下的多次重复劳动效率的提高无疑是巨大的 33 VBA 在实际j 作f_r经常 川到Excel来处理数据,实际应Jf】 48 畦 20鲡1毽1技09圬与蠖女i 中,
18、感觉VBA作为一种宏语言,由于提供J7面向对象的程序 设计方法,简单易用,开发便捷,是非常不错的一个实用工 具。尤其是VBA在利用各种接口获取外部数据的功能,不仪 提高了不同应削软件间的相互开发和调用能力而且使用户可 以直接使用Office套装软件的强大的协作功能,可以更容易地 将H常l厂作程序化、自动化,提高工作效率。 在例中VBA通过SAP系统提供的RFC接j 利用BDC 录屏技术将数据写入SAP系统同时也利川了RFC甬数读取 SAP系统巾的相关数据。推而广之这种方法也可以应用于 SAP系统的其他外部开发,例如咔I报BOM或财务数据的写入 采购报表或财务报表数据提取与展示等。有兴趣的话,不
19、妨多 研究学习。SAP也提供丁更多更高级的接广j技术,例如BAPI 和IDOC等 参考文献 【11 http:hlog163comsherlabymmily126blogstatic6514778820 O8ll515027552 【2】http:wenkubaiducomviewb4209465783e0912a2162aOfhtm1 【31 hLtp:xiechuanhuablog163comblogstatic9573385520089311 56161 95 I4】http:dlsea72blog163comblogstatic3859509120079301 141 26334 【5】http:wwwcnblogscomflysky927archive2009O1041368521 htm1 (收稿日期:2011-0310)