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();然后再做相应赋值即可。

通过RFC给SAP新建用户的更多相关文章

  1. C#通过RFC连接sap系统

    先理解一下 RFC(Romote Function Call)远程函数调用 调用前提: 1.要想通过C# 通过RFC调用SAP端,SAP端要存在RFC远程调用的函数才行(例如SAP端通过SE37创建) ...

  2. ubuntu下新建用户

    ubuntu下新建用户和RedHat系列的linux有点不一样 新建用户的命令是useradd,修改密码是passwd,如下: sudo useradd zhuhui sudo passwd 1234 ...

  3. Linux 新建用户、用户组,给用户分配权限(chown、useradd、groupadd、userdel、usermod、passwd、groupdel)

    Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...

  4. MySQL新建用户,授权,删除用户,修改密码

    首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的.注:本操作是在WIN命令提示符下,phpMyAdmin同样适用.    用户:phplamp  用户数据库: ...

  5. mysql 新建用户、授权、远程访问

    新建用户 insert into mysql.user(Host,User,Password) values("localhost","u",password( ...

  6. ubuntu在命令行新建用户后无法进入桌面的原因

    在命名行模式下 用useradd新建一个用户后 在图形界面输入密码无法登陆 这是因为未对新建的用户进行任何配置 用adduser命令新建用户即可进入桌面 下面说一下useradd 和 adduser的 ...

  7. mysql新建用户的方法

    新增 insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("local ...

  8. .NET通过RFC读取SAP数据

    本篇文章中我主要讲的是.NET如何通过RFC从SAP中读取数据.为了功能的可复用性,我将调用RFC的代码从业务层中分离出来单独建立在一个namespace中. 当然除了需要我们自己编写代码以外,还需要 ...

  9. rhel5 新建用户提示:the home directory already exists.

    rhel5 新建用户提示:the home directory already exists.(as4不存在这个问题) 环境如下: [oracle@rhel5 ~]$ df -hFilesystem  ...

随机推荐

  1. [MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载

    >目录< >——————————————————————< 1.建立工程  1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows So ...

  2. 找出数组中最长的连续数字序列(JavaScript实现)

    原始题目: 给定一个无序的整数序列, 找最长的连续数字序列. 例如: 给定[100, 4, 200, 1, 3, 2], 最长的连续数字序列是[1, 2, 3, 4]. 小菜给出的解法: functi ...

  3. django orm总结

    目录1.1.1 生成查询1.1.2 创建对象1.1.3 保存修改的对象1.1.4 保存 ForeignKey 和 ManyToManyField 字段1.1.5 检索对象1.1.6 检索所有的对象1. ...

  4. cookie入门与学习

    据我对cookie诞生背景的了解,cookie是由网景公司创建的,目的就是将用户的数据储存在客户端上.伴随的HTML5的出现,现在又有另外一个解决数据离线储存的方案,就是HTML5中的Web stor ...

  5. Atitit.javascript 实现类的方式原理大总结

    Atitit.javascript 实现类的方式原理大总结 1. 实现类的式::构造方法方式:原型方式:构造方法+原型的混合方式 1 2. 原型方式(function mode)经典式..实现属性推荐 ...

  6. atitit...触发器机制 ltrigger mechanism sumup .的总结O8f

    atitit...触发器机制  ltrigger  mechanism sumup .的总结O8f 1. 触发器的类型 1 2. 实现原理 1 3. After触发器 Vs Instead Of触发器 ...

  7. FIR.im Weekly - 技术是练出来的

    本期 Weekly 主要精选了上周一些不错的 GitHub 资源.开发工具和技术实践教程类文章分享给大家. JSPatch – 动态更新 iOS APP JSPatch 是 @Bang 最近业余做的小 ...

  8. Nginx在安装过程经常出现的问题

    在Linux操作系统下搭建Nginx服务器,很多时候会出现不同的错误,在此我们在搭建过程中出现的错误进行一些总结: 主要问题有: 1.防火墙问题 2.缺少gc++ 3.缺少pcre.zlib库 解决办 ...

  9. linux环境内存分配原理 mallocinfo

    Linux的虚拟内存管理有几个关键概念: Linux 虚拟地址空间如何分布?malloc和free是如何分配和释放内存?如何查看堆内内存的碎片情况?既然堆内内存brk和sbrk不能直接释放,为什么不全 ...

  10. Activity后台运行一段时间回来crash问题的分析与解决

    最近做项目的时候碰到一个棘手的问题,花了不少时间才找到原因并解决.特此记录这个被我踩过的坑,希望其他朋友遇到此问题不要调到这坑里去了. 问题描述: 1.背景:我的app中某个界面的Activity是继 ...