Cómo conectarse a SAP Hana desde C#.Net

Esta vez voy a explicar un código que uso para conectarme a SAP Hana.
Antes de nada, recordar que deben utilizar las librerías sapnco.dll y sapnco_utils.dll.
Bueno… vamos directo al loro:

Primero, definimos las clases entidad que se utilizarán:

/// <summary>
/// Clases que definen los objetos para SAP
/// </summary>
public class SapRfcModel : SapRfc{
	public List<SapRFCTablasModel> TablasI { get; set; }
	public List<SapRFCParametrosModel> Parametros { get; set; }
	public List<string> Salidas { get; set; }
	public SapRfcModel()
	{
		Parametros = new List<SapRFCParametrosModel>();
		Salidas = new List<string>();
	}
}
public class SapRfc{
	public int RfcId { get; set; }
	public string Nombre { get; set; }
	public string Funcion { get; set; }
	public string Tablas { get; set; }
}
public class SapRFCTablas{
	public int TablaId { get; set; }
	public int RfcId { get; set; }
	public string Nombre { get; set; }
}
public class SapRFCParametros{
	public int ParId { get; set; }
	public int RfcId { get; set; }
	public string Nombre { get; set; }
}
public class SapRFCTablasModel : SapRFCTablas{
	public List<SapRFCParametrosModel> Parametros { get; set; }
	public SapRFCTablasModel()
	{
		Parametros = new List<SapRFCParametrosModel>();
	}
}
public class SapRFCParametrosModel : SapRFCParametros{
	public object Valor { get; set; }
	public List<SapRFCParametrosModel> Parametros { get; set; }
	public SapRFCParametrosModel()
	{
		Parametros = new List<SapRFCParametrosModel>();
	}
}

Ahora, definimos las clases y métodos que se encargarán de la carga de datos y la conversión de los datos.

/// Clase para almacenar todos los datos de la clase de SAP
public class Sap{
	/// Método para Invocar la Funcion RFC con los parámetros recibidos.
	public object RFCSingleParameterMethod(SapRfcModel rfc, Func<IRfcTable, object> method)	{
		RfcConfigParameters conSettings = ConexionSAP.RFC_GetConnection();
		RfcDestination conSAP = RfcDestinationManager.GetDestination(conSettings);
		RfcRepository repo = conSAP.Repository;
		IRfcFunction sd = repo.CreateFunction(rfc.Funcion);
		foreach (SapRFCParametrosModel param in rfc.Parametros)
		{
			sd.SetValue(param.Nombre, param.Valor);
		}
		if (rfc.TablasI.Count > 0)
		{
			foreach (SapRFCTablasModel tbl in rfc.TablasI)
			{
				IRfcTable tblPrm = sd.GetTable(tbl.Nombre);
				foreach (SapRFCParametrosModel tpar in tbl.Parametros)
				{
					tblPrm.Append();
					foreach (SapRFCParametrosModel parm in tpar.Parametros)
					{
						try
						{
							tblPrm.SetValue(parm.Nombre, parm.Valor);
						}
						catch (Exception ex)
						{
							throw;
						}

					}
				}
			}
		}
		sd.Invoke(conSAP);
		IRfcTable rfcTable = sd.GetTable(rfc.Tablas);
		return method(rfcTable);
	}
}
/// Este método captura toda la información que devuelve SAP
public List<EntidadRetorno> Listar(IRfcTable rfcTable){
	List<EntidadRetorno> items = new List<EntidadRetorno>();
	int ncont = 1;
	foreach (IRfcStructure row in rfcTable)
	{
		EntidadRetorno item = new EntidadRetorno();
		item.Id = ncont;
		item.Propiedad1 = row.GetString("RETORNO_SAP1");
		item.Propiedad2 = row.GetString("RETORNO_SAP2");
		item.Propiedad3 = row.GetString("RETORNO_SAP3");
		...
		items.Add(item);
		ncont++;
	}
	return items;
}

Finalmente, este código es el que lanza la petición

public List<EntidadRetorno> InvocarPeticionSAP(){
	var retornaSAP = new SapRfcModel(){
		RfcId = 1,
		Funcion = "Nombre_Funcion",
		Tablas = "Tablas",
		TablasI = new List<SapRFCTablasModel>() { new SapRFCTablasModel() {
			RfcId = 1,
			Nombre = "Nombre 1",
			Parametros = new List<SapRFCParametrosModel>(){ },
			TablaId = 1
		} },
		Parametros = new List<SapRFCParametrosModel>() { new SapRFCParametrosModel() {
			RfcId=1,
			Nombre = "Nombre 2",
			Parametros = new List<SapRFCParametrosModel>(){ },
			ParId = 1,
			Valor = 2
		} }
	};
	var resultadoSAP = new EntidadRetorno().RFCSingleParameterMethod(retornaSAP, new EntidadRetorno().Listar);
	return resultadoSAP;
}

Espero se entienda y puedan realizar sus integraciones.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *