一、首先引用dll,而後在程序開頭:using SAP.Middleware.Connector;3d
二、接下去就是設置登錄參數了,之前相關博文都有說明:blog
public class MyBackendConfig : IDestinationConfiguration圖片
{字符串
public RfcConfigParameters GetParameters(String destinationName)get
{it
if (」PRD_000″.Equals(destinationName))io
{event
RfcConfigParameters parms = new RfcConfigParameters();ast
parms.Add(RfcConfigParameters.AppServerHost, 「192.168.1.3″);function
parms.Add(RfcConfigParameters.SystemNumber, 「00″);
parms.Add RfcConfigParameters.User, 「MENGXIN」);
parms.Add(RfcConfigParameters.Password, 「5239898″);
parms.Add(RfcConfigParameters.Client, 「888″);
parms.Add(RfcConfigParameters.Language, 「ZH」);
parms.Add(RfcConfigParameters.PoolSize, 「5″);
parms.Add(RfcConfigParameters.MaxPoolSize, 「10″);
parms.Add(RfcConfigParameters.IdleTimeout, 「60″);
return parms;
}
else return null;
}
public bool ChangeEventsSupported()
{
return false;
}
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
}
三、設置一個方法,引用這個登錄參數的類:
public void nco()
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(」PRD_000″);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
nco(prd);
}
四、而後就是開始了調用代碼,如下代碼所有放出,而後一行一行說明:
public void nco(RfcDestination prd)
{
//選擇要調用的BAPI的名稱
RfcFunctionMetadata BAPI_COMPANYCODE_GETDETAIL_MD = prd.Repository.GetFunctionMetadata(」BAPI_USER_CREATE」);
//新建調用該BAPI的一個「實例」
IRfcFunction function = null;
function = BAPI_COMPANYCODE_GETDETAIL_MD.CreateFunction();
//由於用戶名稱是一個字段,因此直接賦予字符串便可
function.SetValue(」USERNAME」, USERID.Text.Trim());
//接下去是密碼。由於密碼是一個結構,該結構只有一個欄位,因此這裏先獲取這個密碼結構
IRfcStructure PWD = function.GetStructure(」PASSWORD」);
//設置這個結構中的這個欄位的內容
PWD.SetValue(」BAPIPWD」, password.Text.Trim());
//再把這個結構傳進去給做爲密碼參數
function.SetValue(」PASSWORD」, PWD);
//這個是登錄信息,類型也是一個結構,因此這裏獲取出這個登陸信息的結構出來
IRfcStructure logo = function.GetStructure(」LOGONDATA」);
//如下兩個是設置這個登錄結構的一些欄位的值
logo.SetValue(」GLTGV」, 「20110821″);
logo.SetValue(」GLTGB」, 「99991231″);
//將登錄信息的結構傳進去給LOGONDATA
function.SetValue(」LOGONDATA」, logo); //設置參數
//這個是地址信息,取結構,而後賦值,再將它傳進去
IRfcStructure address = function.GetStructure(」ADDRESS」);
address.SetValue(」FIRSTNAME」, firstname.Text.Trim());
address.SetValue(」LASTNAME」, lastname.Text.Trim());
address.SetValue(」DEPARTMENT」, 「資訊室」);
function.SetValue(」ADDRESS」, address); //設置參數
//如下這個DEFAULTS是帳戶的默認信息,不是必需要的。咱們這裏利用它設置登入帳戶的語言爲ZH
IRfcStructure DEFAULTS = function.GetStructure(」DEFAULTS」);
DEFAULTS.SetValue(」LANGU」, 「1″); //語言代碼,對應簡體中文
function.SetValue(」DEFAULTS」, DEFAULTS);
//如下這個是RETURN,是回傳結果的結構。記住,這裏跟上面不同,上面是Structure,這裏則是Table!!
IRfcTable returnStructure = function.GetTable(」RETURN」);
function.Invoke(prd);//提交調用BAPI
//彈出對話框顯示調用結果
MessageBox.Show(returnStructure.GetString(」MESSAGE」).ToString());
prd = null;
}
輸入T-CODE:BAPI,而後在第二個頁簽下找到該BAPI:
上圖中的紅色框框裏就是咱們要調用的BAPI的名稱。雙擊它,進入到該BAPI的一些說明裏:
看到了,在屬性頁裏它勾選了Remote… 說明它是能夠遠程操控的!
上圖裏,注意到紅色框框都是不可選的,也就是後面的複選框沒有選中,它告訴咱們,在調用BAPI的時候這些參數是必需要有值傳進來的!
這個就是返回的參數。固然,這個Return也是必需要傳出來的值。
細心的人從上面幾個圖片能夠看出,「參考打印」欄位裏都是BAPI開頭的結構,或者是結構裏面的一個字段。雙擊這些結構進去就能夠看到相關的欄位組成。
如今回到Import頁籤裏,雙擊USERNAME的「參考打印」——BAPIBNAME-BAPIBNAME。「-」前部分是結構,後面是這個結構裏的一個欄位。進入到裏面:
這個BAPINAME結構只有一個欄位,並且是CHAR型,12碼,SO,在傳 用戶名 進來的時候就是寫入字符串便可。
咱們看看PASSWORD,對應的結構是:BAPIPWD 雙擊之,以下圖:
發現這裏面只有一個欄位,CHAR型,40碼,傳密碼之用。
再看看ADDRESS欄位對應的結構BAPIADDR3,雙擊之:
這個結構欄位就比較多了。雖然這裏沒有規定那些是必需要有值的,但確實有些是須要賦值,有些則能夠放空。
咱們在SU01裏面新建用戶的時候系統會提示要求輸入姓和名,那麼這裏的FIRSTNAME和LASTNAME是必須的了。
BAPI裏傳入的參數LOGONDATA是放登錄數據的,具體的結構再也不贅述。而返回的信息RETURN裏有一個MESSAGE是放調用結果的信息,咱們在NCO3裏調用要用到它來返回結果信息。
首先,咱們在BAPI畫面裏查找出相關的BAPI出來,利用角色去給用戶添加權限:
雙擊此BAPI,進入到BAPI預覽畫面:
Table屬性頁:
第一個ACTIVITYGROUPS是指咱們要傳進去的表格內容,再也不是一個欄位和結構內容了。第二個的RETURN則是返回調用結果。
雙擊BAPIAGR的結構,進入結構詳情畫面:
以上AGR_NAME是角色名,應該是必需要的。
那麼,接下去就是在C#中編寫相應的代碼來調用它了。
一、首先引用dll,而後在程序開頭:using SAP.Middleware.Connector;
二、接下去就是設置登錄參數了,之前相關博文都有說明:
public class MyBackendConfig : IDestinationConfiguration
{
public RfcConfigParameters GetParameters(String destinationName)
{
if (」PRD_000″.Equals(destinationName))
{
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.AppServerHost, 「192.168.1.3″);
parms.Add(RfcConfigParameters.SystemNumber, 「00″);
parms.Add RfcConfigParameters.User, 「MENGXIN」);
parms.Add(RfcConfigParameters.Password, 「5239898″);
parms.Add(RfcConfigParameters.Client, 「888″);
parms.Add(RfcConfigParameters.Language, 「ZH」);
parms.Add(RfcConfigParameters.PoolSize, 「5″);
parms.Add(RfcConfigParameters.MaxPoolSize, 「10″);
parms.Add(RfcConfigParameters.IdleTimeout, 「60″);
return parms;
}
else return null;
}
public bool ChangeEventsSupported()
{
return false;
}
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
}
三、設置一個方法,引用這個登錄參數的類:
public void nco()
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(」PRD_000″);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
nco(prd);
}
四、而後就是開始了調用代碼,如下代碼所有放出,而後一行一行說明:
public void nco(RfcDestination prd)
{
//調用BAPI
RfcFunctionMetadata BAPI_COMPANYCODE_GETDETAIL_MD = prd.Repository.GetFunctionMetadata(」BAPI_USER_ACTGROUPS_ASSIGN」);
IRfcFunction function = null;
function = BAPI_COMPANYCODE_GETDETAIL_MD.CreateFunction();
//傳入咱們要賦予權限的用戶名
function.SetValue(」USERNAME」, USERID.Text.Trim());
//接下去就是傳入角色名。因爲ACTIVITYGROUPS 是在Table屬性頁,因此咱們是用Table 而不是Import和Export屬性頁裏面用的Structure
IRfcTable ROFTable = function.GetTable(」ACTIVITYGROUPS」);
//上面語句產生的ROFTable 實際上是一張空表,裏面除了有那幾個欄位以外是沒有任何記錄的,因此在對錶格賦值以前須要先進性新增一行
ROFTable .Insert();
//接下去就是對錶格當前行的相關欄位賦值。以下的角色名「MIS」是預選在SAP中創建好的
ROFTable .CurrentRow.SetValue(」AGR_NAME」, 「MIS」);
ROFTable .CurrentRow.SetValue(」FROM_DAT」, 「20110825″);
ROFTable .CurrentRow.SetValue(」TO_DAT」, 「99991231″);
//傳入該賦值後的表格
function.SetValue(」ACTIVITYGROUPS」, ROFTable);
//引用回傳結果
IRfcTable RETURNStructure = function.GetTable(」RETURN」);
//提交調用
function.Invoke(prd);
//顯示調用結果
MessageBox.Show(RETURNStructure.GetString(」MESSAGE」).ToString());
prd = null;
}
五、調用結果以下:
如此則此用戶已經賦予相應的權限了,運行全部T-CODE,沒問題!
對了,若是要賦予多個角色的話,那麼就是多作ROFTable.Insert();而後再作相應賦值便可。