I have found many example on the Internet but many are old (VS 2003, SAP. Net Connector 2.0 where the current is 3.0).
I wonder how to use SAP. NET Connector.
What files should I install?
References which add to the project?
How to add the provider to create a connection in Server Explorer?
SAP connectors allow the integration of different applications and technologies with SAP systems via open standards. The connectors are means for technical interoperability of SAP components (written in ABAP or ABAP Objects) and other components (e. g. written in Java, C++, Visual Basic, . NET, etc.).
Requirements:
Identify the correct version for your platform. You might have something along the following:
.. for a Windows 7 64-bit installation, we'll use sapnco30dotnet40P_12-20007348.zip
.
Expand the archive, and start the .msi
installation file.
.. follow the installation procedure, leaving all default options (next.. next.. next.. finish).
Open Visual Studio and create a new project (or open your own).
In the Solution Explorer
panel, usually to your right, right-click on References
and choose Add Reference
:
.. then, select the Browse
tab, navigate to the SAP Connector installation folder, and select both sapnco.dll
and sapnco_utils.dll
:
Now that you've correctly referenced the SAP .NET Connector in your Visual Studio project, you can write code for it.
Start by creating a destination configuration class (replace the connection parameters with the ones you're given by your client):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using SAP.Middleware.Connector; // your sap connector namespace WindowsFormsSapApplication1 { public class ECCDestinationConfig : IDestinationConfiguration { public bool ChangeEventsSupported() { return false; } public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; public RfcConfigParameters GetParameters(string destinationName) { RfcConfigParameters parms = new RfcConfigParameters(); if (destinationName.Equals("mySAPdestination")) { parms.Add(RfcConfigParameters.AppServerHost, "sapnode.mycompany.net"); parms.Add(RfcConfigParameters.SystemNumber, "21"); parms.Add(RfcConfigParameters.SystemID, "CF1"); parms.Add(RfcConfigParameters.User, "mySAPuser"); parms.Add(RfcConfigParameters.Password, "mySAPpassword"); parms.Add(RfcConfigParameters.Client, "100"); parms.Add(RfcConfigParameters.Language, "EN"); parms.Add(RfcConfigParameters.PoolSize, "5"); } return parms; } } }
.. then, connect to SAP and call a function. Suppose that you want to retrieve the list of companies, using the BAPI_COMPANYCODE_GETLIST
SAP function:
public void GetCompanies() { ECCDestinationConfig cfg = new ECCDestinationConfig(); RfcDestinationManager.RegisterDestinationConfiguration(cfg); RfcDestination dest = RfcDestinationManager.GetDestination("mySAPdestination"); RfcRepository repo = dest.Repository; IRfcFunction testfn = repo.CreateFunction("BAPI_COMPANYCODE_GETLIST"); testfn.Invoke(dest); var companyCodeList = testfn.GetTable("COMPANYCODE_LIST"); // companyCodeList now contains a table with companies and codes }
In the above example, the GetTable
function returns a SAP table which you may like, or not. There's a handy extension that transforms that table in a familiar .NET DataTable
, as follows:
public static class IRfcTableExtentions { /// <summary> /// Converts SAP table to .NET DataTable table /// </summary> /// <param name="sapTable">The SAP table to convert.</param> /// <returns></returns> public static DataTable ToDataTable(this IRfcTable sapTable, string name) { DataTable adoTable = new DataTable(name); //... Create ADO.Net table. for (int liElement = 0; liElement < sapTable.ElementCount; liElement++) { RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement); adoTable.Columns.Add(metadata.Name, GetDataType(metadata.DataType)); } //Transfer rows from SAP Table ADO.Net table. foreach (IRfcStructure row in sapTable) { DataRow ldr = adoTable.NewRow(); for (int liElement = 0; liElement < sapTable.ElementCount; liElement++) { RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement); switch (metadata.DataType) { case RfcDataType.DATE: ldr[metadata.Name] = row.GetString(metadata.Name).Substring(0, 4) + row.GetString(metadata.Name).Substring(5, 2) + row.GetString(metadata.Name).Substring(8, 2); break; case RfcDataType.BCD: ldr[metadata.Name] = row.GetDecimal(metadata.Name); break; case RfcDataType.CHAR: ldr[metadata.Name] = row.GetString(metadata.Name); break; case RfcDataType.STRING: ldr[metadata.Name] = row.GetString(metadata.Name); break; case RfcDataType.INT2: ldr[metadata.Name] = row.GetInt(metadata.Name); break; case RfcDataType.INT4: ldr[metadata.Name] = row.GetInt(metadata.Name); break; case RfcDataType.FLOAT: ldr[metadata.Name] = row.GetDouble(metadata.Name); break; default: ldr[metadata.Name] = row.GetString(metadata.Name); break; } } adoTable.Rows.Add(ldr); } return adoTable; } private static Type GetDataType(RfcDataType rfcDataType) { switch (rfcDataType) { case RfcDataType.DATE: return typeof(string); case RfcDataType.CHAR: return typeof(string); case RfcDataType.STRING: return typeof(string); case RfcDataType.BCD: return typeof(decimal); case RfcDataType.INT2: return typeof(int); case RfcDataType.INT4: return typeof(int); case RfcDataType.FLOAT: return typeof(double); default: return typeof(string); } } }
Reference: http://antswift.wordpress.com/2011/12/22/irfctable-to-net-datatable-extention-method/
After adding the above extension, you can now transform the result into a DataTable
:
// get the regular SAP structured table.. var companyCodeList = testfn.GetTable("COMPANYCODE_LIST"); // turn it into a DataTable.. var companyDataTable = companyCodeList.ToDataTable(); // use it SomeForm.DataGridView.DataSource=companyDataTable;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With