1. 先决条件:
在本机上安装SAP GUI, 最好选择同时选择with RFC SDK。确保WINDOW/SYSTEM32下出现必要的dll。
2. Javascript代码实例(在ECC6下测试有效):
注:如果直接存成本地HTML文件会无法运行哦,直接放BSP里面吧。
<script language="JavaScript">
retcd = 0;
exceptions = 0;
// *** SAPLogon() creates an object that has the methods to
// execute a call to an SAP function module
function SAPlogon() {
alert("ok");
fns = new ActiveXObject("SAP.Functions");
trans = fns.Transactions;
conn = fns.connection; /* get a new connection object */
conn.ApplicationServer = your server;
conn.SystemNumber = "00";
conn.System = "DEV"; /* Set the system ID (see: SY-SYSID) */
conn.user = username; /* set userid (blank for dialog) */
conn.password = password; /* set password (blank for dialog) */
conn.Client = "200"; /* set password (blank for dialog) */
conn.Language = "ZH"; /* set language (blank for default) */
conn.tracelevel = 6; /* set password (blank for dialog) */
conn.RFCWithDialog = 1; /* true: opens visible session window */
exceptions = 0;
conn.logon(0, 0); /* *** this call creates the object *** */
SAPcallTransaction();
SAPlogoff();
};
function SAPlogoff() {
conn.logoff(0, 0);
exceptions = 0;
};
// *** execute the SAP function MODULE "RFC_CALL_TRANSACTION_USING"
// as a method execution of object type SAP.functions
function SAPcallTransaction()
{
exceptions = 0;
callta = fns.add("RFC_CALL_TRANSACTION_USING");
callta.exports("TCODE") = "SE38";
callta.exports("MODE") = "E";
retcd = callta.call;
conn.logoff();
alert(retcd);
SAPcallTransaction = retcd;
};
</script>
<body>
<!—Create an HTML button with a JavaScript call attached –>
<input TYPE="button" VALUE="Call ABAP Editor" OnClick = "SAPlogon();" >
</body>
3. 单点登录
在第2步完成后,测试的时候出弹出SAP GUI登录的对话框。
要实现想portal那样的singlesignon功能,必须要提供ECC的SSO ticket。每个instance是不一样的。
增加以下参数,并可以去掉conn.password
conn.ticket = "MIIC/DCCArsCByARBBMBNkcwCQYHKoZIzjgEAzBkMQswCQYDVQQGEwJERTEcMBoG" +
"A1UEChMTU0FQIFRydXN0IENvbW11bml0eTETMBEGA1UECxMKU0FQIFdlYiBBUzEU" +
"MBIGA1UECxMLSTAwMjA2MzcxOTIxDDAKBgNVBAMTA0VHUTAeFw0xMTA0MTMwMTM2" +
"NDdaFw0zODAxMDEwMDAwMDFaMGQxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNTQVAg" +
"VHJ1c3QgQ29tbXVuaXR5MRMwEQYDVQQLEwpTQVAgV2ViIEFTMRQwEgYDVQQLEwtJ" +
"MDAyMDYzNzE5MjEMMAoGA1UEAxMDRUdRMIIBtzCCASwGByqGSM44BAEwggEfAoGB" +
"AP/UzX5lnXRk6QbS7CEboUI0WKQcS9sAK2J88kCkNYOBfCI34pV1VttrG+dcEIQ1" +
"nnbC6MKF3feWDQ7ayRWBSWwZNgez+bE/2R789TInAxEAGVJCZkhPmFvsvnxj6XsZ" +
"OJXJeiKMtxOmEHAo5jcKHJfiKCUiKyxW1VcfQjJldliJAhUA3y6wdWacew2pbOuh" +
"GVBkS5IKCTkCgYEAqOa2FowF8FZd74L09/Y6DEMAysJSKp0SFjXALOjVAGJ9Nd0M" +
"wwbC2RLaRXgLlMkLutfVxOT/w0u8IWZoBpXEscppq/zlRdt3ogHfcJ6rduUVOzTX" +
"DRhKIWWfZpR9K0RbANgAClRXqTzCGvdE40Sk06aq3TcJzmy0BNab8sMqiC4DgYQA" +
"AoGAAIYIVVFPz0NONR6FVuEptmMm8a/JngQCVMFbmUxTG2eXuAW7jXfXCfS7sZXU" +
"XC8NeVzWAzWGaK7IbQObtQkAwdscEoU9QUcFwk/PMpbYCyGNSM9hq5o9+i46kyNG" +
"14rdo+Wxi/Un2h/IHS5BQR4uTaS06/TDkmF2ZzYzZ8NiIMwwCQYHKoZIzjgEAwMw" +
"ADAtAhUAz00pAVQOPp90yn9fr5ZIygOUdKcCFDeDnZZGdRJXzpbKflJLxBCSmrDx";
当然,需要保证javascript运行时能够得到当前用户的SAP用户名。
测试,是不是很爽啊!
4. 参数的传递
其实上述的方法,是用来使用SAP的RFC的, 只不过RFC_CALL_TRANSACTION_USING这个RFC本身具有调用TCODE的功能。
callta.exports("TCODE") = "SE38";
callta.exports("MODE") = "E";
是RFC的传入参数,传出参数应该为 callta.imports,表参数是callta.tables。
未完待续。。。