示例#1
0
        static void Main(string[] args)
        {
            Parser.Default.ParseArguments <Options>(args).WithParsed <Options>(o =>
            {
                try
                {
                    var version = RfcConnection.GetLibVersion();
                    Console.WriteLine($"currently loaded sapnwrfc library version : Major {version.MajorVersion}, Minor {version.MinorVersion}, patchLevel {version.PatchLevel}");

                    using (var conn = new RfcConnection(userName: o.UserName, password: o.Password, hostname: o.Hostname, client: o.Client))
                    {
                        ParameterMapping();
                        conn.Open();
                        using (var func = conn.CallRfcFunction("BAPI_COMPANYCODE_GETLIST"))
                        {
                            func.Invoke();
                            var returnValue = func.GetOutputParameters <BapiCompanyOutputParameters>();
                            Console.WriteLine(String.Format("|{0,-20}|{1,-10}", "Company Code", "Company Name"));
                            foreach (var row in returnValue.Details)
                            {
                                Console.WriteLine(String.Format("|{0,-20}|{1,-10}", row.CompanyCode, row.Name));
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }
            });
        }
示例#2
0
        public void Ping_NotConnected_ShouldReturnFalse()
        {
            var connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());

            var pingResult = connection.Ping();

            pingResult.Should().BeFalse();
        }
示例#3
0
        public void Disconnect_NotConnected_ShouldNotDisconnect()
        {
            var connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());

            connection.Disconnect();

            RfcErrorInfo errorInfo;

            _interopMock.Verify(x => x.CloseConnection(It.IsAny <IntPtr>(), out errorInfo), Times.Never);
        }
示例#4
0
        public void SetPool_ShouldSuccess()
        {
            var alias                 = "Test";
            var connection            = new RfcConnection(_interopMock.Object, RfcConfigurationOption);
            var rfcConnectionPoolMock = new Mock <IRfcConnectionPool>();

            rfcConnectionPoolMock.SetupProperty(p => p.ServerAlias, alias);

            connection.SetPool(rfcConnectionPoolMock.Object);

            connection.IsPooled.Should().BeTrue();
        }
示例#5
0
        static void Main(string[] args)
        {
            Parser.Default.ParseArguments <Options>(args)
            .WithParsed <Options>(o =>
            {
                try
                {
                    ParameterMapping();

                    var version = RfcConnection.GetLibVersion();
                    Console.WriteLine($"currently loaded sapnwrfc library version : Major {version.MajorVersion}, Minor {version.MinorVersion}, patchLevel {version.PatchLevel}");

                    using (var conn = new RfcConnection(builder => builder
                                                        .UseConnectionHost(o.Hostname)
                                                        .UseLogonUserName(o.UserName)
                                                        .UseLogonPassword(o.Password)
                                                        .UseLogonClient(o.Client)))
                    {
                        conn.Open();
                        using (var func = conn.CallRfcFunction("RFC_READ_TABLE"))
                        {
                            var inParams = new RfcParametersInput
                            {
                                QueryTable = "T001",
                                Delimiter  = ";",
                                No_Data    = "",
                                RowCount   = 0,
                                RowSkips   = 0
                            };

                            func.Invoke(inParams);

                            var result = func.GetOutputParameters <RfcParametersOutput>();

                            if (result.Data == null)
                            {
                                Console.WriteLine("No Data");
                            }

                            foreach (var r in result.Data)
                            {
                                Console.WriteLine(r.Wa);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw ex;
                }
            });
        }
示例#6
0
        static void Main(string[] args)
        {
            Parser.Default.ParseArguments <Options>(args)
            .WithParsed <Options>(o =>
            {
                try
                {
                    ParameterMapping();

                    var version = RfcConnection.GetLibVersion();
                    Console.WriteLine($"currently loaded sapnwrfc library version : Major {version.MajorVersion}, Minor {version.MinorVersion}, patchLevel {version.PatchLevel}");

                    using (var conn = new RfcConnection(builder => builder
                                                        .UseConnectionHost(o.Hostname)
                                                        .UseLogonUserName(o.UserName)
                                                        .UseLogonPassword(o.Password)
                                                        .UseLogonClient(o.Client)))
                    {
                        conn.Open();
                        using (var func = conn.CallRfcFunction("BAPI_GL_GETGLACCPERIODBALANCES"))
                        {
                            var inParams = new BapiParametersInput
                            {
                                CompanyCode  = o.Company,
                                CurrencyType = "10",        // document Currency
                                FiscalYear   = o.FiscalYear,
                                GlAccount    = o.GlAccount
                            };
                            func.Invoke(inParams);

                            var result = func.GetOutputParameters <BapiParametersOutput>();

                            Console.WriteLine(String.Format("|{0,-6}|{1,-6}|{2,-10}|{3,-10}", "Company", "Period", "Debit", "Credit"));
                            foreach (var row in result.Detail)
                            {
                                Console.WriteLine(String.Format("|{0,-6}|{1,-6}|{2,-10}|{3,-10}",
                                                                row.CompanyCode,
                                                                row.FiscalPeriod,
                                                                row.TotalCredit.ToString(),
                                                                row.TotalDebit.ToString()
                                                                ));;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw ex;
                }
            });
        }
示例#7
0
        public void Connect_ConnectionSucceeds_ShouldOpenConnection()
        {
            var parameters = new RfcConnectionOption {
                AppServerHost = "my-server.com"
            };
            var connection = new RfcConnection(_interopMock.Object, parameters);

            connection.Connect();

            RfcErrorInfo errorInfo;

            _interopMock.Verify(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), 1, out errorInfo), Times.Once);
        }
示例#8
0
        public void TestConnectionString()
        {
            var connection = new RfcConnection(connectionString: "Server=server_name; lang=en; user=testUser;pwd=secret");

            var rfcParms = connection.ConnectionParameters;

            Assert.Equal(4, rfcParms.Count);

            Assert.Contains(rfcParms, r => r.Key == "ASHOST" && r.Value == "server_name");
            Assert.Contains(rfcParms, r => r.Key == "lang" && r.Value == "en");
            Assert.Contains(rfcParms, r => r.Key == "user" && r.Value == "testUser");
            Assert.Contains(rfcParms, r => r.Key == "passwd" && r.Value == "secret");
        }
示例#9
0
        public void Connect_ConnectionSucceeds_ShouldOpenConnection()
        {
            var  alias         = RfcConfiguration.DefaultServer;
            var  configuration = RfcConfiguration.RfcServers.First(x => x.Alias == alias);
            uint counter       = GetRfcConnectionOptionPropertyCount(configuration.ConnectionOptions);
            var  connection    = new RfcConnection(_interopMock.Object, RfcConfigurationOption);

            connection.Connect();

            RfcErrorInfo errorInfo;

            _interopMock.Verify(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), counter, out errorInfo), Times.Once);
        }
示例#10
0
        public void Connect_ConnectionFailed_ShouldThrow()
        {
            var connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());
            var errorInfo  = new RfcErrorInfo {
                Code = RfcResultCodes.RFC_TIMEOUT
            };

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo));

            Action action = () => connection.Connect();

            action.Should().Throw <RfcException>().WithMessage("SAP RFC Error: RFC_TIMEOUT");
        }
示例#11
0
        public void CreateFunctionMetaData_ShouldReturnIRfcFunctionMetaData()
        {
            var          connection = new RfcConnection(_interopMock.Object, RfcConfigurationOption);
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.GetFunctionDesc(It.IsAny <IntPtr>(), It.IsAny <string>(), out errorInfo))
            .Returns(FunctionDescriptionHandle);

            var functionName = "TEST";
            IRfcFunctionMetaData functionMetaData = connection.CreateFunctionMetaData(functionName);

            functionMetaData.Should().NotBeNull();
        }
示例#12
0
        public void Disconnect_Connected_ShouldDisconnect()
        {
            var          connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);

            connection.Connect();

            connection.Disconnect();

            _interopMock.Verify(x => x.CloseConnection(RfcConnectionHandle, out errorInfo), Times.Once);
        }
示例#13
0
        public void TestConnectionUri()
        {
            var connection = new RfcConnection(connectionUri: new Uri($"sap://user=testUser;pass=secret;l=EN;cl=001@A/test_server?rfcsdktrace=ON"));

            var rfcParms = connection.ConnectionParameters;

            Assert.Equal(6, rfcParms.Count);

            Assert.Contains(rfcParms, r => r.Key == "ASHOST" && r.Value == "test_server");
            Assert.Contains(rfcParms, r => r.Key == "lang" && r.Value == "EN");
            Assert.Contains(rfcParms, r => r.Key == "user" && r.Value == "testUser");
            Assert.Contains(rfcParms, r => r.Key == "passwd" && r.Value == "secret");
            Assert.Contains(rfcParms, r => r.Key == "client" && r.Value == "001");
            Assert.Contains(rfcParms, r => r.Key == "trace" && r.Value == "1");
        }
示例#14
0
        public void Dispose_ShouldDisconnectFunction()
        {
            RfcErrorInfo errorInfo;
            var          connection = new RfcConnection(_interopMock.Object, RfcConfigurationOption);

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            _interopMock.Setup(x => x.CloseConnection(It.IsAny <IntPtr>(), out errorInfo)).Returns(RfcResultCodes.RFC_OK);
            connection.Connect();

            connection.Dispose();

            _interopMock.Verify(x => x.CloseConnection(RfcConnectionHandle, out errorInfo), Times.Once);
        }
示例#15
0
        static void Main(string[] args)
        {
            Parser.Default.ParseArguments <Options>(args)
            .WithParsed <Options>(o =>
            {
                try
                {
                    ParameterMapping();

                    var version = RfcConnection.GetLibVersion();
                    Console.WriteLine($"currently loaded sapnwrfc library version : Major {version.MajorVersion}, Minor {version.MinorVersion}, patchLevel {version.PatchLevel}");

                    using (var conn = new RfcConnection(userName: o.UserName, password: o.Password, hostname: o.Hostname, client: o.Client))
                    {
                        conn.Open();
                        using (var func = conn.CallRfcFunction("BAPI_CUSTOMER_GETLIST"))
                        {
                            var inParams = new ListCustomersInputParameters
                            {
                                MaxRows = 10,
                                Range   = new IdRange[]
                                {
                                    new IdRange()
                                    {
                                        Sign = "I", Option = "BT", High = "ZZZZZZZZZZ"
                                    }
                                }
                            };

                            func.Invoke(inParams);
                            var returnValue = func.GetOutputParameters <ListCustomersOutputParameters>();

                            Console.WriteLine(String.Format("|{0,-20}|{1,-10}", "Customer Number", "Customer Name"));
                            foreach (var row in returnValue.Addresses)
                            {
                                Console.WriteLine(String.Format("|{0,-20}|{1,-10}", row.CustomerId, row.Name));
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw ex;
                }
            });
        }
示例#16
0
        static void Main(string[] args)
        {
            Parser.Default.ParseArguments <Options>(args)
            .WithParsed <Options>(o =>
            {
                try
                {
                    ParameterMapping();

                    var version = RfcConnection.GetLibVersion();
                    Console.WriteLine($"currently loaded sapnwrfc library version : Major {version.MajorVersion}, Minor {version.MinorVersion}, patchLevel {version.PatchLevel}");

                    using (var conn = new RfcConnection(builder => builder
                                                        .UseConnectionHost(o.Hostname)
                                                        .UseLogonUserName(o.UserName)
                                                        .UseLogonPassword(o.Password)
                                                        .UseLogonClient(o.Client)))
                    {
                        conn.Open();
                        using (var func = conn.CallRfcFunction("BAPI_CUSTOMER_GETDETAIL2"))
                        {
                            var inParams = new CustomerDataInput {
                                Customer = o.Customer
                            };
                            func.Invoke(inParams);

                            var result = func.GetOutputParameters <CustomerDataOutput>();

                            Console.WriteLine(String.Format("|{0,-20}|{1,-20}|{2,-20}|{3,-20}", "Customer Number", "Create Date", "Confirm Date", "Confirm Time"));

                            Console.WriteLine(String.Format("|{0,-20}|{1,-20}|{2,-20}|{3,-20}",
                                                            result.Detail.Customer,
                                                            result.Detail.CreateDate?.ToString("yyyy-MM-dd") ?? "Not Defined",
                                                            result.Detail?.ConfirmDate?.ToString("yyyy-MM-dd") ?? "Not Defined",
                                                            result.Detail?.ConfirmationTime?.ToString() ?? "Not Defined")
                                              );
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw ex;
                }
            });
        }
示例#17
0
        public void Dispose_DisconnectionFailed_ShouldNotThrow()
        {
            var          connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            _interopMock
            .Setup(x => x.CloseConnection(It.IsAny <IntPtr>(), out errorInfo))
            .Returns(RfcResultCodes.RFC_CANCELED);

            connection.Connect();

            Action action = () => connection.Dispose();

            action.Should().NotThrow();
        }
示例#18
0
        public void Ping_Connected_PingTimeout_ShouldReturnFalse()
        {
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            _interopMock
            .Setup(x => x.Ping(RfcConnectionHandle, out errorInfo))
            .Returns(RfcResultCodes.RFC_TIMEOUT);
            var connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());

            connection.Connect();

            var pingResult = connection.Ping();

            pingResult.Should().BeFalse();
        }
示例#19
0
        public void Ping_Connected_SuccessfulPing_ShouldReturnTrue()
        {
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            _interopMock
            .Setup(x => x.Ping(RfcConnectionHandle, out errorInfo))
            .Returns(RfcResultCodes.RFC_OK);
            var connection = new RfcConnection(_interopMock.Object, RfcConfigurationOption);

            connection.Connect();

            var pingResult = connection.Ping();

            pingResult.Should().BeTrue();
        }
示例#20
0
        public void CreateTransaction_ShouldReturnIRfcTransaction()
        {
            var          connection = new RfcConnection(_interopMock.Object, RfcConfigurationOption);
            RfcErrorInfo errorInfo;
            string       tid;

            _interopMock
            .Setup(x => x.GetTransactionId(It.IsAny <IntPtr>(), out tid, out errorInfo))
            .Returns(RfcResultCodes.RFC_OK);

            _interopMock
            .Setup(x => x.CreateTransaction(It.IsAny <IntPtr>(), It.IsAny <string>(), It.IsAny <string>(), out errorInfo))
            .Returns(TransactionHandle);

            IRfcTransaction transaction = connection.CreateTransaction();

            transaction.Should().NotBeNull();
        }
示例#21
0
        static void Main(string[] args)
        {
            Parser.Default.ParseArguments <Options>(args)
            .WithParsed(o =>
            {
                var version = RfcConnection.GetLibVersion();
                Console.WriteLine($"currently loaded sapnwrfc library version : Major {version.MajorVersion}, Minor {version.MinorVersion}, patchLevel {version.PatchLevel}");

                /**
                 * Use the connection builder fluent api.
                 */
                using (var conn = new RfcConnection(builder => builder
                                                    .UseConnectionHost(o.Hostname)
                                                    .UseLogonUserName(o.UserName)
                                                    .UseLogonPassword(o.Password)
                                                    .UseLogonClient(o.Client)))
                {
                    conn.Open();
                    conn.Ping();
                    // do something more interesting here...
                }


                /**
                 * Use the connection string api.
                 */
                using (var conn = new RfcConnection(connectionString: $"Server={o.Hostname}; Uid={o.UserName}; Passwd={o.Password}; Client={o.Client}"))
                {
                    conn.Open();
                    conn.Ping();
                    // do something more interesting here...
                }

                /**
                 * Use the connection uri api.
                 */
                using (var conn = new RfcConnection(connectionUri: new Uri($"sap://user={ Uri.EscapeDataString(o.UserName) };passwd={ Uri.EscapeDataString(o.Password) };client={o.Client}@A/{o.Hostname}")))
                {
                    conn.Open();
                    conn.Ping();
                    // do something more interesting here...
                }
            });
        }
示例#22
0
        public void IsValid_ConnectionHandleInvalid_ShouldReturnFalse()
        {
            var          connection   = new RfcConnection(_interopMock.Object, new RfcConnectionOption());
            int          isValidValue = 0;
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            _interopMock
            .Setup(x => x.IsConnectionHandleValid(RfcConnectionHandle, out isValidValue, out errorInfo))
            .Returns(RfcResultCodes.RFC_OK);

            connection.Connect();

            var isValid = connection.IsValid;

            isValid.Should().BeFalse();
        }
示例#23
0
        public void IsConnected_Connected_ShouldReturnTrue()
        {
            var          connection = new RfcConnection(_interopMock.Object, RfcConfigurationOption);
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            int isValid = 1;

            _interopMock
            .Setup(x => x.IsConnectionHandleValid(RfcConnectionHandle, out isValid, out errorInfo))
            .Returns(RfcResultCodes.RFC_OK);

            connection.Connect();

            bool isConnected = connection.IsValid;

            isConnected.Should().BeTrue();
        }
示例#24
0
        public void IsConnected_ConnectedButLibrarySaysWereDisconnected_ShouldReturnFalse()
        {
            var          connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            int isValid = 0;

            _interopMock
            .Setup(x => x.IsConnectionHandleValid(RfcConnectionHandle, out isValid, out errorInfo))
            .Returns(RfcResultCodes.RFC_OK);

            connection.Connect();

            bool isConnected = connection.IsValid;

            isConnected.Should().BeFalse();
        }
示例#25
0
        public void Disconnect_DisconnectionFailed_ShouldThrowException()
        {
            // Arrange
            var          connection = new RfcConnection(_interopMock.Object, new RfcConnectionOption());
            RfcErrorInfo errorInfo;

            _interopMock
            .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo))
            .Returns(RfcConnectionHandle);
            _interopMock
            .Setup(x => x.CloseConnection(It.IsAny <IntPtr>(), out errorInfo))
            .Returns(RfcResultCodes.RFC_CANCELED);

            connection.Connect();

            // Act
            Action action = () => connection.Disconnect();

            // Assert
            action.Should().Throw <RfcException>()
            .WithMessage("SAP RFC Error: RFC_CANCELED");
        }