.NET连接SAP系统专题:C#获取RFC中自定义的异常(四)

news/2024/7/4 9:05:22

    有的时候我们需要在RFC中抛出一些自定义的异常,比如输入一个不存在的品号,我们需要抛出一个异常,告知用户品号不存在。有一个笨笨的做法就是通过返回值来判断,但是这样不灵活,同时也会因为品号不存在而继续之行RFC。如果我们能自己抛出异常,程序自动停止执行RFC,那将是两全其美!

    现在设定一个功能:输入两个数,第一个数除以第二个数。2个异常:被除数不能为0和除数不能为100。

    首先,在SE37中建立一个RFC,就用上篇博文的RFC吧。

    在IMPORT页设置如下:     

   Export页面设置如下:   

   Changing和Table页面放空

   Exceptions页面设置如下:   

    然后就是源码咯:     

     代码中,RAISE专门用于抛出异常,程序自动停止执行,所有的返回值将被清空!RAISE 后面的内容就是在Exceptions中定义的内容了。

     然后程序记得激活!!如此SAP端设置就结束了。

     回到VS2010中,新建一个程序,界面如下:     

    于是,开始写程序:

    首先是引用两个dll(参考上篇),并在程序开头输入:

    using SAP.Middleware.Connector;

    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)

        {

            string type = string.Empty;

            RfcRepository repo = prd.Repository;

            IRfcFunction companyBapi = repo.CreateFunction("ZRFC_MARA_INFO");  //指定RFC名称

            try

            {

                companyBapi.SetValue("NUM1", textBox1.Text.Trim());  //输入参数复制

                companyBapi.SetValue("NUM2", textBox2.Text.Trim());  //输入参数复制

                companyBapi.Invoke(prd);  //开始调用执行

                textBox3.Text = companyBapi.GetValue("NUM3").ToString();  //获取返回结果

            }

            catch (RfcAbapException ex)  //此Exception专门用于获取用户自定义的异常信息!!!!

            {

                // companyBapi.Metadata.GetAbapException(ex.Key).Documentation   获取对应的异常的说明文字

                MessageBox.Show(companyBapi.Metadata.GetAbapException(ex.Key).Documentation, "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

            catch (RfcTypeConversionException ex)  //此Exception专门用于获取变量类型转换的异常!!!!

            {

                MessageBox.Show("您输入的不是数值", "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            }

            catch (RfcAbapRuntimeException ex)   //此Exception专门用于获取RFC执行过程中的运行时异常!!!!

            { 

                MessageBox.Show(companyBapi.Metadata.GetAbapException(ex.Key).Documentation, "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            }

            catch (RfcBaseException ex)  //此Exception是总Exception类,可以获取所有的异常,如果有多个Catch,则不可以放第一位!!!!

            {

                MessageBox.Show("其他所有错误", "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            }

            prd = null;

            repo = null;

        }

        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;

             }

        private void button1_Click(object sender, EventArgs e)

        {

            nco();

        }

如此,C#运行结果如下:

以上可以正确得出我们自己抛出的异常的信息出来。程序测试OK!!!


http://www.niftyadmin.cn/n/3390069.html

相关文章

Ksoap2调.Net Web Services 关于参数的一点的小问题

自己对于Ksoap2和Web Services都没有过深入的研究,只是最近遇到从Android客户端调用Web Services的需求。在使用过程中遇到了一些小问题,这里mark一下。 KSOAP2就不多说了,Google它主页吧第一个,intro、doc都有啊(惯例…

git for windows下载

由于git for windows官网在国外,下载特别慢。 这里分享一个国内的镜像,速度很快。 https://npm.taobao.org/mirrors/git-for-windows/ 拿去吧,不用血。

Python 1-17 元组

Python 1-17 元组 class tuple([iterable])tuple 是一个不可变的序列类型。 >>> s abc >>> l [1,2] >>> t 1,2 >>> d dict(a1,b2) >>> set {a,b}1、元组创建 >>> tup () # 创建空元组 >>> tup1 (1, …

学习委员工作总结

工作总结 辞别盛夏,伴着金秋的碎步,走进了郑州大学的校园。这是一个陌生的环境,这是一个新的起点,这又是一个奋斗历程的开始。回望近一年的学习生活,有收获,有喜悦在这一年的工作和学习中,我的处…

insight-6.8调试工具安装

错误信息: qiangLinuxSir:~$ sudo arm-elf-insight Tk_Init failed: Cant find a usable tk.tcl in the following directories: /usr/local/share/tk8.4 /usr/local/lib/tk8.4 /usr/lib/tk8.4 /usr/local/library /usr/library /usr/tk8.4.1/library /tk8.4…

技术成就梦想【我与51CTO的故事】

最初与51CTO结缘是在2009年的年初,我搜索一篇关于exchange 2003 OWA更改密码的文章,这一搜不当紧,搜了一个技术大牛出来,而这个技术大牛就是当时我们学校的陈宣宋老师,而我们的陈老师竟然是在51CTO上写博客&#xff0c…

Ubuntu下编译insight错误解决

错误: cc1: warnings being treated as errors .././gdb/cli/cli-cmds.c: In function ‘pwd_command’: .././gdb/cli/cli-cmds.c:323: error: ignoring return value of ‘getcwd’, declared with attribute warn_unused_result make[2]: *** [cli-cmds.o] 错误…

Python 1-18 字典

Python 1-18 字典 Python 的字典数据类型采用键值对 (key:value) 的形式,根据 key 的值计算 value 的地址,具有非常快的查取和插入速度。 例如,用 list 实现成绩单: # 给定一个名字,要查找对应的成绩,就…