• 通过RFC给SAP新建用户


    1、首先引用dll,然后在程序开头:using SAP.Middleware.Connector;

    2、接下去就是设置登陆参数了,以前相关博文都有说明:

    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;

    }

    3、设置一个方法,引用这个登陆参数的类:

    public void nco()

    {

    IDestinationConfiguration ID = new MyBackendConfig();

    RfcDestinationManager.RegisterDestinationConfiguration(ID);

    RfcDestination prd = RfcDestinationManager.GetDestination(”PRD_000″);

    RfcDestinationManager.UnregisterDestinationConfiguration(ID);

    nco(prd);

    }

    4、然后就是开始了调用代码,以下代码全部放出,然后一行一行说明:

    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#中编写相应的代码来调用它了。

    1、首先引用dll,然后在程序开头:using SAP.Middleware.Connector;

    2、接下去就是设置登陆参数了,以前相关博文都有说明:

    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;

    }

    3、设置一个方法,引用这个登陆参数的类:

    public void nco()

    {

    IDestinationConfiguration ID = new MyBackendConfig();

    RfcDestinationManager.RegisterDestinationConfiguration(ID);

    RfcDestination prd = RfcDestinationManager.GetDestination(”PRD_000″);

    RfcDestinationManager.UnregisterDestinationConfiguration(ID);

    nco(prd);

    }

    4、然后就是开始了调用代码,以下代码全部放出,然后一行一行说明:

    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;

    }

    5、调用结果如下:

    如此则此用户已经赋予相应的权限了,运行所有T-CODE,没问题!

    对了,如果要赋予多个角色的话,那么就是多做ROFTable.Insert();然后再做相应赋值即可。

  • 相关阅读:
    Android网站
    vim里面搜索字符串
    ssd遇到的bug
    ssd训练自己的数据集
    slover层解读
    caffe LOG LOG_IF
    cuda输出
    css中合理的使用nth-child实现布局
    Linux VM环境配置
    怎样对Android设备进行网络抓包
  • 原文地址:https://www.cnblogs.com/jamin/p/3374151.html
Copyright © 2020-2023  润新知