.NET连接SAP系统专题:C#调用BAPI给账户赋予权限(八)

    接上篇博文。

    上篇博文讲到C#调用BAPI BAPI_USER_CREATE 来生成SAP账户,但是新建的账户一点权限也没有,现在我们就再次利用BAPI给账户授予权限。

    首先,我们在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();然后再做相应赋值即可。




-----------------------------------------------------------------------------------------------------------------------------
SAP顾问进行时...!
注:文本系原创,如要转载请务必保持原文一致并注明作者(梦心)及出处(博客地址:http://www.cnblogs.com/mengxin523/),谢谢!
posted @ 2011-08-28 01:09 梦心 阅读(461) 评论(6) 编辑 收藏

 回复 引用 查看   
#1楼 2011-08-31 16:53 潇 洒      
写的很好,一个不懂sap的人也能看懂。
下次是不是要写C#调用ale接口和webservice呢?
期待中
这样你就把sap接口讲完整了

 回复 引用 查看   
#2楼 2011-09-16 15:10 yuyangip      
写的很好,一个不懂sap的人也能看懂。
支持下

 回复 引用 查看   
#3楼 2011-10-21 09:37 itboy      
LZ,
我用这种方法调用SAP的bapi,第一次提示是错误的key是正确的,但第二次提示就是乱七八糟的东西,不知道有没有遇见过这种情况?谢谢
第一次提示:
---------------------------
Message from webpage
---------------------------
Get data error:NO_RECORD_FOUND
---------------------------
OK
---------------------------

第二次提示:
---------------------------
Message from webpage
---------------------------
Get data error:Function module "⼀吀䐀䬀⼀䐀开刀䘀䌀开䴀伀开䠀吀开䰀䄀䈀䔀䰀开倀刀䤀一吀" not found.
---------------------------
OK
---------------------------

 回复 引用 查看   
#4楼[楼主] 2011-10-21 15:47 梦心      
@itboy
你代码的写法也是跟我一样的吗?好像乱码了

 回复 引用 查看   
#5楼 2011-10-24 13:53 itboy      
@梦心
恩,是一样的,错误是RfcAbapRuntimeException,错误的key是CALL_FUNCTION_NOT_FOUND,很奇怪,出现这个错误时,重新执行一下就会正常了,不知道哪里的问题

 回复 引用 查看   
#6楼[楼主] 2011-10-24 14:48 梦心      
@itboy
CALL_FUNCTION_NOT_FOUND 很明显它是提示你找不到你调用的RFC,所以你就要看看是哪里问题了~

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2155906 hqLbGvu+eho=