public SapResult <DataTable> GetTable(string tableName, int rowSkips = 0, int rowCount = 0) { var result = new SapResult <DataTable>(); try { using (var conn = new SapConnection(_destinationName)) { // NOTE: https://www.sapdatasheet.org/abap/func/rfc_read_table.html var rfcFunction = conn.Repository.CreateFunction("RFC_READ_TABLE"); rfcFunction.SetValue("QUERY_TABLE", tableName); rfcFunction.SetValue("DELIMITER", DATA_SEPARATOR); rfcFunction.SetValue("ROWSKIPS", rowSkips); rfcFunction.SetValue("ROWCOUNT", rowCount); rfcFunction.Invoke(conn.Destination); var fields = rfcFunction.GetTable("FIELDS"); var datas = rfcFunction.GetTable("DATA"); var table = ToTable(tableName, fields, datas); result.Export = table; } } catch (Exception ex) { result.AddError(ex); } return(result); }
public static dynamic ExecuteBAPI(InputBAPI Input) { DataSet resultDataSet; Dictionary <String, String> connectionParams = new Dictionary <string, string>(); String[] connectionStringArray = Input.ConnectionString.Split(';'); foreach (String configEntry in connectionStringArray) { connectionParams.Add(configEntry.TrimEnd().TrimStart().Split('=')[0], configEntry.TrimEnd().TrimStart().Split('=')[1]); } using (var connection = new SapConnection(connectionParams)) { connection.Open(); var command = new SapCommand(Input.BAPIName, connection); foreach (Parameter param in Input.Parameters) { command.Parameters.Add(param.Name, param.Value); } resultDataSet = command.ExecuteDataSet(); } return(JToken.FromObject(resultDataSet)); }
public SapResult <List <FunctionModel> > GetFunctions(string functionName) { var result = new SapResult <List <FunctionModel> >(); try { using (var conn = new SapConnection(_destinationName)) { // NOTE: https://www.sapdatasheet.org/abap/func/rfc_function_search.html var rfcFunction = conn.Repository.CreateFunction("RFC_FUNCTION_SEARCH"); rfcFunction.SetValue("FUNCNAME", functionName); rfcFunction.SetValue("LANGUAGE", "KO"); rfcFunction.Invoke(conn.Destination); var functions = rfcFunction.GetTable("FUNCTIONS"); foreach (var function in functions) { result.Export.Add(new FunctionModel { Name = function.GetString("FUNCNAME"), Group = function.GetString("GROUPNAME"), Application = function.GetString("APPL"), RemoteHost = function.GetString("HOST"), ShortText = function.GetString("STEXT") }); } } } catch (Exception ex) { result.AddError(ex); } return(result); }
public void Ping_NotConnected_ShouldReturnFalse() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); // Act var pingResult = connection.Ping(); // Assert pingResult.Should().BeFalse(); }
public SapResult <List <ParameterModel> > GetFunctionParameters(string functionName) { var result = new SapResult <List <ParameterModel> >(); try { using (var conn = new SapConnection(_destinationName)) { var parameters = new List <ParameterModel>(); var meta = conn.Repository.GetFunctionMetadata(functionName); for (int i = 0; i < meta.ParameterCount; i++) { StructureModel structureModel = null; if (meta[i].DataType == RfcDataType.STRUCTURE) { string structureName = meta[i].ValueMetadataAsStructureMetadata.Name; structureModel = LoadStructureMetadata(conn.Repository, structureName); } else if (meta[i].DataType == RfcDataType.TABLE) { string structureName = meta[i].ValueMetadataAsTableMetadata.LineType.Name; structureModel = LoadStructureMetadata(conn.Repository, structureName); } var parameter = new ParameterModel() { Name = meta[i].Name, DataType = meta[i].DataType.ToString(), Direction = meta[i].Direction.ToString(), DefaultValue = meta[i].DefaultValue, Optional = meta[i].Optional, Documentation = meta[i].Documentation, Structure = structureModel }; parameters.Add(parameter); } // 정렬순서 var sortOrder = new List <string>() { "IMPORT", "EXPORT", "CHANGING", "TABLES" }; result.Export = parameters.OrderBy(x => sortOrder.IndexOf(x.Direction)).ToList(); } } catch (Exception ex) { result.AddError(ex); } return(result); }
public static void Run() { string connStr = "connectionstring"; using var connection = new SapConnection(connStr); connection.Connect(); using var someFunction = connection.CreateFunction("MySapfunction"); var result = someFunction.Invoke <SomeFunctionResult>(new { VBELN = "partnumber", }); }
public void Disconnect_NotConnected_ShouldNotDisconnect() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); // Act connection.Disconnect(); // Assert RfcErrorInfo errorInfo; _interopMock.Verify(x => x.CloseConnection(It.IsAny <IntPtr>(), out errorInfo), Times.Never); }
public IEnumerable <InputData> SelectBySerial(string ProdNo, object state = null) { var data = SapConnection.GetData(ProdNo); if (data.Count() == 0) { yield break; } foreach (var obj in data.SapAdaptWithSameProperties <InputData>()) { yield return(obj); } }
private SapCommand GetCommand(SapConnection connection) { var command = new SapCommand(_query.BapiName, connection); var parametersDictionary = GetParameters(_query.Parameters); if (parametersDictionary.HasItems()) { foreach (var key in parametersDictionary.Keys) { command.Parameters.Add(key, parametersDictionary[key]); } } return(command); }
public void ReadListRfcTest() { using (SapConnection baglanti = this.GetConnection()) { var result = baglanti.ExecuteFunction("ZBDT_SD_GRUP_TESLIMAT_BILGI", new { I_VBELN_S = "8500016389", I_VBELN_E = "8500016389" }); List <ZTeslimat> teslimat = new List <ZTeslimat>(); teslimat = result.GetTable <ZTeslimat>("T_LISTE").ToList(); Assert.Equal(2, teslimat.Count()); } }
static void Main(string[] args) { SapConnection con = new SapConnection(); RfcDestinationManager.RegisterDestinationConfiguration(con); RfcDestination dest = RfcDestinationManager.GetDestination("NSP"); RfcRepository repo = dest.Repository; IRfcFunction fReadTable = repo.CreateFunction("ZSOMA"); fReadTable.SetValue("I_NRO1", 1); fReadTable.SetValue("I_NRO2", 2); fReadTable.Invoke(dest); var result = fReadTable.GetValue("E_RESULT"); Console.WriteLine(result.ToString()); Console.ReadLine(); }
public void Disconnect_Connected_ShouldDisconnect() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); RfcErrorInfo errorInfo; _interopMock .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo)) .Returns(RfcConnectionHandle); connection.Connect(); // Act connection.Disconnect(); // Assert _interopMock.Verify(x => x.CloseConnection(RfcConnectionHandle, out errorInfo), Times.Once); }
public void GetAttributes_GettingTheAttributesFails_ShouldThrowException() { // Arrange RfcAttributes rfcAttributes = Fixture.Create <RfcAttributes>(); RfcErrorInfo errorInfo; _interopMock .Setup(x => x.GetConnectionAttributes(It.IsAny <IntPtr>(), out rfcAttributes, out errorInfo)) .Returns(RfcResultCode.RFC_CLOSED); var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); // Act Action action = () => connection.GetAttributes(); // Assert action.Should().Throw <SapException>() .WithMessage("SAP RFC Error: RFC_CLOSED"); }
public void Connect_ConnectionFailed_ShouldThrow() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); var errorInfo = new RfcErrorInfo { Code = RfcResultCode.RFC_TIMEOUT }; _interopMock .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo)); // Act Action action = () => connection.Connect(); // Assert action.Should().Throw <SapException>() .WithMessage("SAP RFC Error: RFC_TIMEOUT"); }
public void Connect_ConnectionSucceeds_ShouldOpenConnection() { // Arrange var parameters = new SapConnectionParameters { AppServerHost = "my-server.com" }; var connection = new SapConnection(_interopMock.Object, parameters); // Act connection.Connect(); // Assert RfcErrorInfo errorInfo; _interopMock.Verify( x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), 1, out errorInfo), Times.Once); }
static void Main(string[] args) { try { Console.WriteLine("/************************ rfc .net core support *************************"); Console.WriteLine(" Author(s): christ chang"); Console.WriteLine(" Description: rfc .net core support"); Console.WriteLine(" github: https://github.com/Nightstars/rfc_demo"); Console.WriteLine(" thanks: huysentruitw and his work "); Console.WriteLine("************************************************************************/"); //define connect string string connectionString = "AppServerHost=192.168.95.20; SystemNumber=00; User=ZBT_RFC; Password=Zbt_rfc123; Client=310; Language=ZH; PoolSize=5; Trace=8;"; //structure rfc connection using var connection = new SapConnection(connectionString); //open rfc connection connection.Connect(); //structure call function by rfc target fun using var someFunction = connection.CreateFunction("ZMDG_MDATA_INFO"); //call remote rfc functon with input parameter constructor and get fun result rfc_demo.FunctionResult result = someFunction.Invoke <FunctionResult>(new FunctionParameters { Ibukrs = "1010", Iztype = "2", Izdata = "20200801", Iztime = "00:00:00" }); //print result in console foreach (ZMDGS003 item in result.result) { Console.WriteLine(item.Mdata); Console.WriteLine(item.Meinst); Console.WriteLine(item.Groes); Console.WriteLine(item.Zspm); Console.WriteLine(item.Maktx); Console.WriteLine(item.Bukrs); Console.WriteLine(); } Console.ReadKey(); }catch (Exception e) { Console.WriteLine("Oh no: " + e.Message); Console.ReadKey(); } }
public ClassRfcReadTable SapReadTable(string query_table, string delimiter, string no_data, string fields, string filter) { SapLibrary.EnsureLibraryPresent(); ClassRfcReadTable data = null; // System.Console.WriteLine("Starting..."); var connectionString = ConfigurationManager.AppSettings["ConnectionString"]; using var conn = new SapConnection(connectionString); conn.Connect(); // Console.WriteLine("SAP Connction was opened..."); ClassRfcReadTableInput fc = new ClassRfcReadTableInput(); fc.QueryTable = query_table; fc.Delimiter = delimiter; fc.NoData = no_data; string[] af = fields.Split(','); fc.Fields = new RFC_DB_FLD[af.Length]; for (int i = 0; i < af.Length; i++) { fc.Fields[i] = new RFC_DB_FLD(); fc.Fields[i].FieldName = af[i]; } string[] ao = filter.Split(','); if (ao != null && ao.Length > 0) { fc.Options = new RFC_DB_OPT[ao.Length]; } for (int i = 0; i < ao.Length; i++) { fc.Options[i] = new RFC_DB_OPT(); if (!string.IsNullOrEmpty(ao[i])) { if (ao[i].Length > 72) { throw new Exception("Error by rfc_read_table:; an option string is longer as 72 -> " + ao[i]); } fc.Options[i].Text = ao[i]; } } using var func = conn.CreateFunction("RFC_READ_TABLE"); data = func.Invoke <ClassRfcReadTable>(fc); return(data); }
private void btnCreate_Click(object sender, System.EventArgs e) { string path = CreateFolder(tbPath.Text, tbFunctionName.Text); SapParameter parameter = new SapParameter() { AppServerHost = tbAppServerHost.Text, Client = tbClient.Text, IdleTimeout = tbIdleTimeout.Text, Language = cbLanguage.SelectedText, Name = tbName.Text, Password = tbPassword.Text, PeakConnectionsLimit = tbPeakConnectionsLimit.Text, PoolSize = tbPoolSize.Text, SystemNumber = tbSystemNumber.Text, User = tbUser.Text, FunctionName = tbFunctionName.Text }; IRfcFunction function = SapConnection.GetFunction(parameter); if (function != null) { List <SapClassModel> classBuilder = SapConnection.GetAllTablesClass(function); foreach (var sapClass in classBuilder) { using (var tw = File.AppendText(path + sapClass.ClassName + ".cs")) { tw.WriteLine(sapClass.Builder.ToString()); tw.Close(); } } MessageBox.Show(@"Complete", @"Alert", MessageBoxButtons.OK); } else { MessageBox.Show(@"Not found function name", @"Alert", MessageBoxButtons.OK); } }
private Tuple <IEnumerable <T1>, IEnumerable <T2>, IEnumerable <T3>, IEnumerable <T4>, IEnumerable <T5> > ListMultiple <T1, T2, T3, T4, T5>() { var quantity = this.GetTypeQuantity <T1, T2, T3, T4, T5>(); this.ValidateQuery <T1, T2, T3, T4, T5>(quantity); var items1 = Enumerable.Empty <T1>(); var items2 = Enumerable.Empty <T2>(); var items3 = Enumerable.Empty <T3>(); var items4 = Enumerable.Empty <T4>(); var items5 = Enumerable.Empty <T5>(); using (var connection = new SapConnection(GetConnectionConfig())) { connection.Open(); var command = this.GetCommand(connection); if (quantity >= 1) { items1 = this.ExecuteQuery <T1>(command); } if (quantity >= 2) { items2 = this.ExecuteQuery <T2>(command); } if (quantity >= 3) { items3 = this.ExecuteQuery <T3>(command); } if (quantity >= 4) { items4 = this.ExecuteQuery <T4>(command); } if (quantity >= 5) { items5 = this.ExecuteQuery <T5>(command); } } return(new Tuple <IEnumerable <T1>, IEnumerable <T2>, IEnumerable <T3>, IEnumerable <T4>, IEnumerable <T5> >(items1, items2, items3, items4, items5)); }
public void Ping_Connected_PingTimeout_ShouldReturnFalse() { // Arrange 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(RfcResultCode.RFC_TIMEOUT); var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); connection.Connect(); // Act var pingResult = connection.Ping(); // Assert pingResult.Should().BeFalse(); }
public void Dispose_DisconnectionFailed_ShouldNotThrow() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); 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(RfcResultCode.RFC_CANCELED); connection.Connect(); // Act Action action = () => connection.Dispose(); // Assert action.Should().NotThrow(); }
static void Main(string[] args) { using (var connection = new SapConnection("DEV")) { connection.Open(); var session = new SapSession(connection); //var transaction = connection.BeginTransaction(); var command = new SapCommand("BAPI_GET_PROJECT_DETAILS_TABLE", connection); command.Parameters.Add("PROJECT_TYPE","EP"); session.StartSession(); var resultDataSet = command.ExecuteDataSet(); session.EndSession(); var sapDataReader = command.ExecuteReader("RESULTS"); var i = 0; while(sapDataReader.Read()) { Console.WriteLine("{0} : {1}",i,sapDataReader.Item.GetString(0)); i++; } Console.WriteLine(sapDataReader.RowCount); //transaction.Commit(); //var rfcTables = command.ExecuteRfcTables(); } Console.WriteLine("Done !"); Console.ReadKey(); }
public void CreateFunction_ShouldCreateFunction() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); RfcErrorInfo errorInfo; _interopMock .Setup(x => x.OpenConnection(It.IsAny <RfcConnectionParameter[]>(), It.IsAny <uint>(), out errorInfo)) .Returns(RfcConnectionHandle); _interopMock .Setup(x => x.GetFunctionDesc(RfcConnectionHandle, "FunctionA", out errorInfo)) .Returns(FunctionDescriptionHandle); connection.Connect(); // Act ISapFunction function = connection.CreateFunction("FunctionA"); // Assert function.Should().NotBeNull(); _interopMock.Verify(x => x.CreateFunction(FunctionDescriptionHandle, out errorInfo), Times.Once); }
public void IsValid_ConnectionHandleInvalid_ShouldReturnFalse() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); 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(RfcResultCode.RFC_OK); connection.Connect(); // Arrange var isValid = connection.IsValid; // Assert isValid.Should().BeFalse(); }
static void Main(string[] args) { using (var connection = new SapConnection("DEV")) { connection.Open(); var session = new SapSession(connection); //var transaction = connection.BeginTransaction(); var command = new SapCommand("BAPI_GET_PROJECT_DETAILS_TABLE", connection); command.Parameters.Add("PROJECT_TYPE", "EP"); session.StartSession(); var resultDataSet = command.ExecuteDataSet(); session.EndSession(); var sapDataReader = command.ExecuteReader("RESULTS"); var i = 0; while (sapDataReader.Read()) { Console.WriteLine("{0} : {1}", i, sapDataReader.Item.GetString(0)); i++; } Console.WriteLine(sapDataReader.RowCount); //transaction.Commit(); //var rfcTables = command.ExecuteRfcTables(); } Console.WriteLine("Done !"); Console.ReadKey(); }
public void GetAttributes_GettingConnectionAttributesSucceeds_ShouldReturnConnectionAttributes() { // Arrange RfcAttributes rfcAttributes = Fixture.Create <RfcAttributes>(); rfcAttributes.Reserved = null; RfcErrorInfo errorInfo; _interopMock .Setup(x => x.GetConnectionAttributes(It.IsAny <IntPtr>(), out rfcAttributes, out errorInfo)) .Returns(RfcResultCode.RFC_OK); var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); // Act SapAttributes attributes = connection.GetAttributes(); // Assert attributes.Should().NotBeNull(); attributes.Should().BeEquivalentTo(rfcAttributes, config => config .ComparingByMembers <RfcAttributes>() .ComparingByMembers <SapAttributes>() .ExcludingMissingMembers()); }
public void IsConnected_ConnectedButLibraryReturnsError_ShouldReturnFalse() { // Arrange var connection = new SapConnection(_interopMock.Object, new SapConnectionParameters()); 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(RfcResultCode.RFC_CLOSED); connection.Connect(); // Act bool isConnected = connection.IsValid; // Assert isConnected.Should().BeFalse(); }
/// <summary> /// Execute SAP RFC-function. /// </summary> /// <param name="function">Name of the SAP function</param> /// <returns>JToken dictionary of export parameter or table values returned by SAP function.</returns> public static dynamic ExecuteFunction(ExecuteFunctionInput taskInput) { var connectionParams = ConnectionStringToDictionary(taskInput.ConnectionString.Value); var returnvalues = new JObject(); FunctionInput input; IRfcFunction sapFunction; if (taskInput.InputType == InputType.JSON) { try { input = new FunctionInput(taskInput.InputFunctions); } catch (Exception e) { throw new Exception("Failed to parse input JSON", e); } } else if (taskInput.InputType == InputType.PARAMETERS) { input = new FunctionInput(); var structures = new List <Structure>(); foreach (var s in taskInput.SimpleInput.Functions) { structures.Add(new Structure { Name = s.Name, Fields = s.Fields }); } input.Functions = structures.ToArray(); } else { throw new Exception("Invalid input type!"); } using (var connection = new SapConnection(connectionParams)) { connection.Open(); var repo = connection.Destination.Repository; using (var session = new SapSession(connection)) { session.StartSession(); foreach (var f in input.Functions) { try { sapFunction = repo.CreateFunction(f.Name); } catch (Exception e) { throw new Exception($"Failed to create function: {e.Message}", e); } try { f.PopulateRfcDataContainer(sapFunction); } catch (Exception e) { throw new Exception($"Failed to populate function input structure: {e.Message}", e); } try { sapFunction.Invoke(connection.Destination); } catch (Exception e) { throw new Exception($"Invoking function failed: {e.Message}", e); } var tables = GetTableNames(sapFunction); var exportParams = GetExportParameters(sapFunction); var tablesAsJObject = new JObject(); foreach (var table in tables) { var rfcTable = sapFunction.GetTable(table); tablesAsJObject.Add(table, JToken.FromObject(RfcTableToDataTable(rfcTable, table))); } foreach (var parameter in exportParams) { tablesAsJObject.Add(parameter.Key, parameter.Value); } returnvalues.Add(f.Name, tablesAsJObject); } session.EndSession(); } } return(returnvalues); }
private void button1_Click(object sender, EventArgs e) { SapConnection oSapConnection = new SapConnection(); txtAux.Text = oSapConnection.test(); }