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.
Hola, desde dónde se obtienen las librerias que usa?
sapnco.dll y sapnco_utils.dll.
Puedes bajarlo desde aquí https://www.nuget.org/packages/SAPNCo.x64/ o aquí tambien hay un blogger que dejó las librerías http://irevolucion.com/sap/.net/sapnetconnector/.
Debes tener en cuenta que a veces cuesta configurar las librerías para que funcionen correctamente, asi que es un pequeño trabajo de prueba-error.
Saludos.
Hola, tienes el código en algún repositorio?
Lamentablemente no. Ten en cuenta que esto es código del 2019.
En su momento lo utilicé y fue personalizado para este cliente.
Pero ya te digo que no hay mucha ciencia.
Además, tu Abaper debe indicarte los parámetros particulares de cada instalación.
Si necesitas ayuda en algo más puntual, lo puedo buscar entre mis archivos guardados.
Saludos.