设为首页 收藏本站
查看: 1328|回复: 0

[经验分享] 通过RFC给SAP新建用户

[复制链接]

尚未签到

发表于 2015-9-19 13:57:57 | 显示全部楼层 |阅读模式
  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:
DSC0000.jpg
  上图中的红色框框里就是我们要调用的BAPI的名称。双击它,进入到该BAPI的一些说明里:
DSC0001.jpg
  看到了,在属性页里它勾选了Remote… 说明它是可以远程操控的!
DSC0002.jpg
  上图里,注意到红色框框都是不可选的,也就是后面的复选框没有选中,它告诉我们,在调用BAPI的时候这些参数是必须要有值传进来的!
DSC0003.jpg
  这个就是返回的参数。当然,这个Return也是必须要传出来的值。
  细心的人从上面几个图片可以看出,“参考打印”栏位里都是BAPI开头的结构,或者是结构里面的一个字段。双击这些结构进去就可以看到相关的栏位组成。
  现在回到Import页签里,双击USERNAME的“参考打印”——BAPIBNAME-BAPIBNAME。“-”前部分是结构,后面是这个结构里的一个栏位。进入到里面:
DSC0004.jpg
  这个BAPINAME结构只有一个栏位,而且是CHAR型,12码,SO,在传 用户名 进来的时候就是写入字符串即可。
  我们看看PASSWORD,对应的结构是:BAPIPWD 双击之,如下图:
DSC0005.jpg
  发现这里面只有一个栏位,CHAR型,40码,传密码之用。
  再看看ADDRESS栏位对应的结构BAPIADDR3,双击之:
DSC0006.jpg
  这个结构栏位就比较多了。虽然这里没有规定那些是必须要有值的,但确实有些是需要赋值,有些则可以放空。
  我们在SU01里面新建用户的时候系统会提示要求输入姓和名,那么这里的FIRSTNAME和LASTNAME是必须的了。
  BAPI里传入的参数LOGONDATA是放登陆数据的,具体的结构不再赘述。而返回的信息RETURN里有一个MESSAGE是放调用结果的信息,我们在NCO3里调用要用到它来返回结果信息。
  
  首先,我们在BAPI画面里查找出相关的BAPI出来,利用角色去给用户添加权限:
DSC0007.jpg
  双击此BAPI,进入到BAPI预览画面:
DSC0008.jpg
  Table属性页:
DSC0009.jpg
  第一个ACTIVITYGROUPS是指我们要传进去的表格内容,不再是一个栏位和结构内容了。第二个的RETURN则是返回调用结果。
  双击BAPIAGR的结构,进入结构详情画面:
DSC00010.jpg
  以上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、调用结果如下:
DSC00011.jpg
DSC00012.jpg
DSC00013.jpg
  如此则此用户已经赋予相应的权限了,运行所有T-CODE,没问题!
  对了,如果要赋予多个角色的话,那么就是多做ROFTable.Insert();然后再做相应赋值即可。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-115890-1-1.html 上篇帖子: sap router maintenance 下篇帖子: 【转贴】SAP HANA内存数据库详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表