Net 调用SAP RFC接口来读取数据实战纪实.docx
- 文档编号:29754090
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:30
- 大小:382.59KB
Net 调用SAP RFC接口来读取数据实战纪实.docx
《Net 调用SAP RFC接口来读取数据实战纪实.docx》由会员分享,可在线阅读,更多相关《Net 调用SAP RFC接口来读取数据实战纪实.docx(30页珍藏版)》请在冰豆网上搜索。
Net调用SAPRFC接口来读取数据实战纪实
.Net 调用SAP RFC接口来读取数据实战纪实
这几天研究.Net如何调用SAPRFC接口来读取数据,搞得我重装了三次系统,找资料找到吐血,看了德文、日文、英文、中文几乎所有可以参考的资料,师傅亲自出马,并请教了一堆高手还包括IBM的帅锅,还割舍了阳光明媚的周日来研究,终于功夫不负有心人,最终还是解决了,汗啊~~
下面把我调试的全过程都记录一下,以后有人遇到相同问题就可以参考了。
1.【关键前提】:
(1)你安装了VS2003(注意:
一定要VS2003,原因在下面)
(2)安装SAP.NetConnector2.0 (这东东目前只支持.netframework1.X,即IDE7.5版本,所以只能用VS2003)
(3)有Javaruntimeenvironment(后面导入SAP的Function时有用)
(4)安装SAPLogon
原理图如下:
2.【开始编程】
(1)首先是在SAP里面创建RFC
(2)VS里面编程
先以Winform程序为例吧
a.新建winform项目,因为装了SAP.NetConnector,所以可以添加对SAP.Connector.dll和SAP.Connector.Rfc.dll的引用。
在项目中新建类,你会发现多了一个SAPConnectorProxy的类,新建一个,就是下面图中的SAPProxy1.sapwsdl文件啦。
b.在Form1.cs中添加控件
(比较简陋,凑合看了)
c.在SAPTest的Button事件里面加入以下代码
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
SAP.Connector.SAPLogonDestinationmyDest;
SAP.Connector.SAPConnectionmyConn;
SAPProxy1myProx;
BRFCKNA1TablexMara;
System.Data.DataTabledMara;
try
{
myDest=newSAP.Connector.SAPLogonDestination();
myDest.DestinationName="这里输入SAP服务器上的系统名称";
myDest.Client=这里输入SAP服务器的客户端号;
myDest.Username="这里输入SAP服务器访问的用户名";
myDest.Password="这里输入SAP服务器访问的密码";
myConn=newSAP.Connector.SAPConnection(myDest);
myConn.Open();
xMara=newBRFCKNA1Table();//注意,这个BRFCKNA1Table可不是随便写的哈,看到下面就明白了
myProx=newSAPProxy1();
myProx.Connection=myConn;
myProx.Rfc_Customer_Get("",this.textBox1.Text,refxMara);
// 注意,这个Rfc_Customer_Get就是你要call的RFC的function名称
dMara=newSystem.Data.DataTable();
dMara=xMara.ToADODataTable();
dataGrid1.DataSource=dMara;
dataGrid1.Refresh();
myConn.Close();
}
catch(Exceptionex)
{
textBox1.Text=ex.ToString();
}
}
d.从SAP服务器上导入RFCFunction
不要小看这一步哦
【支线任务1】在C:
\WINDOWS找到saplogon.ini,打开后把SysName和SrvPort下面的内容清空,不清空的话他会引导你去找SAP服务器上的Messagingserver,总是告诉你无法打开或者无法找到sapmsg.ini的文件,非常麻烦。
[MSSysName]
Item1=
[MSSrvPort]
Item1=
(如果机器上没有Javaruntime environment 就会一直停留在Loading的画面=.= )
e.启动项目,在textbox里面输入检索关键字,就可以看到这样的画面,调用成功^0^
上面是以Winform为例,下面简单说一下WebApp和WebService,还是有点差别的哟
【WebApp】
Webapp的不同之处在于
(1)在default.aspx中加入button,datagrid以及textbox后,在后台程序中加入如下代码:
privatevoidButton1_Click(objectsender,System.EventArgse)
{
//Declareparametershere
SAPProxy1proxy=newSAPProxy1();
SAPRFCIF.BRFCKNA1TablebrfcknA1Table1=newBRFCKNA1Table();
try
{
proxy.Connection=SAP.Connector.SAPLoginProvider.GetSAPConnection(this);
//Callmethodshere
proxy.Rfc_Customer_Get("",this.TextBox1.Text,refbrfcknA1Table1);
//NowupdateDataBindings.OnWinFormsthiswillbeautomatic,on //WebFormscallthefollowingline
this.DataBind();
}
catch(Exceptionex)
{
//IfSAPLoginProvider.GetSAPConnection(this)cannotgetaconnection,//wemightgetanerror.
//Normallythiscanbeignoredasitwillautomaticallywillforcea//relogon.
}
}
(2)需要新建一个SAPLogin1.aspx,这个也是装了SAP.netConnector以后,在新增项目的时候可以看到的一个aspx模板,然后在SAPLogin1.aspx.cs中添加如下代码
stringsystemNumber="00";//这个也是要看SAP服务器设置的
privatevoidLogin_Click(objectsender,System.EventArgse)
{
//Binddataback
this.destination1.Username=this.user.Text;
this.destination1.Password=this.password.Text;
//设置sap服务器start
this.destination1.AppServerHost="这个自己填哈";
this.destination1.SystemNumber=short.Parse(systemNumber);
;
//设置sap服务器end
try
{
this.destination1.Client=short.Parse(this.client.Text);
}
catch(Exception)
{
this.destination1.Client=0;
}
if(this.language.Text.Length>0)
{
this.destination1.Language=this.language.Text;
}
try
{
SAP.Connector.SAPLoginProvider.OpenSAPConnection(this,destination1.ConnectionString,this.persist.Checked);
}
catch(System.Exceptionexception)
{
this.message.Text=exception.ToString();
}
}
【WebService】
(1)在Service1.asmx中添加SAP的Destination控件
右键,打开代码
(2)在Service1.asmx.cs中加入以下代码
privatevoidInitializeComponent()
{
//以下是定義Destination的內容
ponents=newSystem.ComponentModel.Container();
this.destination1=newSAP.Connector.Destination(ponents);
//
// destination1
//
this.destination1.AppServerHost="XXXXXXX";
this.destination1.Client=((short)(XXX));
this.destination1.Language="EN";
this.destination1.Password="XXXX";
this.destination1.SystemNumber=((short)(00));
this.destination1.Username="XXXX";
//----------------------------------------
}
[WebMethod]
publicDataSetExploding_BOM(stringLanguage)
{
try
{
SAPProxy1mProxy=newSAPProxy1(); //實例一個SAPProxy
mProxy.Connection=SAP.Connector.Connection.GetConnectionFromPool(this.destination1.ConnectionString); //鏈接
RFCHOSTSTablemStpoxtable=newRFCHOSTSTable(); //實例一個輸出資料的Table
DateTimemNow=DateTime.Now;
stringstr_now=mNow.ToString(); //把取到的當前日期轉為字串型
mProxy.Rfc_Get_Local_Destinations(Language,refmStpoxtable);
mProxy.Connection.Close();
mProxy.Connection=null;
DataSetmReturn=newDataSet();//實例一個DataSet﹐存放RFC回傳的Table
mReturn.Tables.Add(mStpoxtable.ToADODataTable());
returnmReturn;
}
catch(Exception ex)
{
returnDataError(ex);
}
}
publicDataSetDataError(Exceptionex)
{
DataSeterrDS=newDataSet("Errors");
DataTableerrTable=errDS.Tables.Add("Error");
errTable.Columns.Add("Message");
errTable.Rows.Add(newObject[]{ex.Message});
returnerrDS;
}
已投稿到:
排行榜圈子
阅读(1051)|评论(23)|收藏
(1)|打印|举报
前一篇:
DIY输入法皮肤
后一篇:
龙二去了天堂,都是我的错
评论 重要提示:
警惕虚假中奖信息,点击查看详情[发评论]
西游梦呓:
2008-06-2923:
08:
09
?
是你之前的学习资料?
还是你又自己搞这个?
没明白
博主回复:
2008-11-2113:
36:
12
是我最近在做的一个项目要做SAP接口,但是我们部门没人做过,我就自己上了,借这个机会学到很多东西哈哈
新浪网友:
2008-07-1108:
41:
50
好文,不错,有帮助
博主回复:
强者:
2008-07-1815:
36:
32
我在测试此代码时,在执行 myConn.Open();操作时报如下错误:
Missing R3NAME=... or ASHOST=... in connect_param in RfcOpenEx
请这是何问题,如何解决?
博主回复:
NaNa:
2008-07-1822:
04:
19
RFC接口调用SAP如果有异常会通过com.sap.mw.jco.JCO$Exception:
抛出异常
在开发中遇到的异常有如下
用户名密码可能是错误或者用户无权限,确认用户,必要时联系SAP负责人,检查用户
(103) RFC_ERROR_LOGON_FAILURE:
##.#####,####
(103) RFC_ERROR_LOGON_FAILURE:
Name or password is incorrect (repeat logon)
call信息没有填写完整,检查配置文件各个SAP配置信息是否完整
(101) RFC_ERROR_PROGRAM:
Missing R3NAME=... or ASHOST=... in connect_param in RfcOpenEx
ip地址失败:
com.sap.mw.jco.JCO$Exception:
(102) RFC_ERROR_COMMUNICATION:
Connect to SAP gateway failed
组权限访问 server文件没更新.
(102) RFC_ERROR_COMMUNICATION:
Connect to message server failed
C:
\WINNT\system32\drivers\etc
端口号错误报错信息:
(103) RFC_ERROR_LOGON_FAILURE:
## 502 ########
超时:
(103) RFC_ERROR_LOGON_FAILURE:
Timeout
执行函数,函数的问题
(104) RFC_ERROR_SYSTEM_FAILURE:
Error in module RSQL of the database interface.执行函数
(104) RFC_ERROR_SYSTEM_FAILURE:
An error occurred when receiving a complex parameter.
(106) JCO_ERROR_RESOURCE:
Trying to access row values in a table which does not have any rows yet
返回的表没有值.那个表连第一行都没有,取不到
(106) JCO_ERROR_RESOURCE:
Trying to access row values in a table which does not have any rows yet
语法错误
(104) RFC_ERROR_SYSTEM_FAILURE:
Syntax error in program SAPMV50A
找不到行
(106) JCO_ERROR_RESOURCE:
Trying to access row values in a table which does not ha:
ve any rows yet
输入参数不能插入SAP函数输入字段中.
(122) JCO_ERROR_CONVERSION:
Integer '4234243' has to many digits at field PO_ITEM
博主回复:
新浪网友:
2008-07-2614:
07:
58
string cs = "ASH T=SAP SYSNR=00 CLIENT=00 USER=DDIC PASSWD=19920706";
System.Data.DataTable sdt;
SAPProxy1 proxy = new SAPProxy1(cs);
BAPIADDR1 addr1=new BAPIADDR1();
addr1.Addr_No="0004";
addr1.Adr_Notes="dkfjkd";
addr1.Build_Long="1";
addr1.Building ="1";
addr1.C_O_Name="sdjfh";
addr1.Chckstatus="sdjkf";
addr1.E_Mail="sdfjkh";
addr1.City="ewrui";
addr1.City_No="0001";
addr1.Country="AD";
string ctry,bankKey;
BAPIRET2 i2=new BAPIRET2();
BAPI1011_ADDRESS addr=new BAPI1011_ADDRESS();
// addr.Addr_No="0004";
// addr.Bank_Branch="dskjfhk";
// addr.Region="";
addr.Bank_Name="dsjkfdk";
// addr.City="ewrui";
// addr.Street="programe";
proxy.Bapi_Bank_Create(addr,addr1 ,"AD","","00004","1", out ctry,out bankKey,out i2);
试了很久,还是未能将数据添加到SAP中,只能查看现有数据!
请博主帮我看看这个问题出在什么地方!
博主回复:
新浪网友:
2008-07-2814:
25:
57
非常好的文章,
但是我和你写的一样,却返回不了数据值
SAP.Connector.SAPLogonDestination myTest;
SAP.Connector.SAPConnection myConn;
SAPProxy1 myProx;
System.Data.DataTable dMara;
ZGET_AUFKTable xMara;
try
{
myTest = new SAP.Connector.SAPLogonDestination();
myTest.DestinationName = "DEV";
myTest.Client = 030 ;
myTest.Username = "XCN";
myTest.Password = "Sap0%";
//myTest.AppServerHost = "10.1.11.3";
myTest.Language = "ZF";
//myTest.SystemNumber = 0 ;
myConn = new SAP.Connector.SAPConnection(myTest);
xMara = new ZGET_AUFKTable();
myProx = new SAPProxy1();
myProx.Connection = myConn;
myConn.Open();
int i ;
string s;
//myProx.Zget_Aufk_Data(this.txtAufnrfm.Text,this.txtAufnrto.Text,this.txtGltrsfm.Text,this.txtGltrsto.Text,this.txtGstrsfm.Text,this.txtGstrsto.Text,this.txtWerks.Text,out i ,ref xMara);
myProx.Zget_Aufk_Data(this.txtAufnrfm.Text,this.txtAufnrto.Text,this.txtGltrsfm.Text,this.txtGltrsto.Text,this.txtGstrsfm.Text,this.txtG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Net 调用SAP RFC接口来读取数据实战纪实 调用 SAP RFC 接口 读取 数据 实战 纪实