Aplicación en C# .NET para automatizar el registro del tipo de cambio en SAPB1 utilizando los servicios del Banco de México (SIE API).
CREAR UN PROYECTO NUEVO:
Utilizaremos Microsoft Visual Studio Community 2019 y crearemos un proyecto Windows Forms App (.NET Framework) o Aplicación de Consola.
Se debe de agregar la referencia de la librería DI API de SAPB1 al proyecto.
CLASE PARA LA CONEXIÓN CON LA DI API DE SAPB1:
Esta clase se utilizara para realizar la conexión con la base de datos de SAPB1 y para registrar el tipo de cambio.
class ApplicationDBContext
{
// SAPBO =======
private SAPbobsCOM.Company oCompany = new SAPbobsCOM.Company();
int lErrCode = 0;
int lRetCode;
string sErrMsg;
private string _errorMessage;
public string errorMessage
{
get { return _errorMessage; }
set { _errorMessage = value; }
}
public ApplicationDBContext()
{
}
// conexión a la base de datos
public bool ConnectCompany()
{
try
{
bool resul = false;
ConnectSAPBO connect = this.GetLocalMachine();
if(connect != null)
{
if (oCompany.Connected == true) { oCompany.Disconnect(); }
oCompany.Server = "localhost";
oCompany.language = SAPbobsCOM.BoSuppLangs.ln_Spanish_La; //Lenguaje para la sesión.
oCompany.UseTrusted = false;
oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_MSSQL2017; // en el caso de SQL
oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_HANADB; // en el caso de HANA
oCompany.DbUserName = "mi usuario de la base de datos";
oCompany.DbPassword = "mi contraseña de base de datos";
oCompany.CompanyDB = "nombre de la base de datos";
oCompany.UserName = "mi usuario de SAPB1 que sea superusuario";
oCompany.Password = "mi contraseña del usuario de SAPB1";
lRetCode = oCompany.Connect();
if (lRetCode != 0)
{
oCompany.GetLastError(out lErrCode, out sErrMsg);
_errorMessage = lErrCode + ". " + sErrMsg;
}
else
{
resul = true;
}
}
return resul;
}
catch (Exception ex)
{
_errorMessage = ex.Message;
return false;
}
}
// desconectar la base de datos
public bool DisconnectCompany()
{
try
{
bool resul = false;
oCompany.Disconnect();
resul = true;
return resul;
}
catch (Exception ex)
{
_errorMessage = ex.Message;
return false;
}
}
// registrar el tipo de cambio USD en SAPB1
public bool SetCurrencyDolar(double valor)
{
try
{
bool resul = false;
SAPbobsCOM.SBObob oSBObob;
oSBObob = (SAPbobsCOM.SBObob)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoBridge);
oSBObob.SetCurrencyRate("USD", DateTime.Now.Date, valor, true);
resul = true;
return resul;
}
catch (Exception ex)
{
_errorMessage = ex.Message;
return false;
}
}
// registrar el tipo de cambio EUR en SAPB1
public bool SetCurrencyEuro(double valor)
{
try
{
bool resul = false;
SAPbobsCOM.SBObob oSBObob;
oSBObob = (SAPbobsCOM.SBObob)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoBridge);
oSBObob.SetCurrencyRate("EUR", DateTime.Now.Date, valor, true);
resul = true;
return resul;
}
catch (Exception ex)
{
_errorMessage = ex.Message;
return false;
}
}
}
CLASE PARA EL MODELO DE LA RESPUESTA DE LA API DEL SERVICIO DEL BANCO DE MÉXICO:
Esta clase se utilizara para mapear la respuesta que se recibe de la api del Banco de México a nuestro proyecto para utilizar los datos que se reciben.
[DataContract]
class Dolar
{
[DataMember]
public string idSerie { get; set; }
[DataMember]
public string titulo { get; set; }
[DataMember]
public Datos[] datos { get; set; }
}
[DataContract]
class Datos
{
[DataMember]
public string fecha { get; set; }
[DataMember]
public string dato { get; set; }
}
[DataContract]
class Series
{
[DataMember]
public Dolar[] series { get; set; }
}
[DataContract]
class Bmx
{
[DataMember]
public Series bmx { get; set; }
}
CLASE PARA REGISTRAR EL TIPO DE CAMBIO EN SAPB1:
Esta clase se utilizara para mandar llamar la clase de conexión con la DI API de SAPB1 y realizar el registro del tipo de cambio.
class SetTC: ApplicationDB
{
private string _error;
public string Error
{
get { return _error; }
set { _error = value; }
}
public SetTC()
{
_error = "";
}
public bool SetTCDolar(double valor)
{
try
{
bool resul = false;
if (this.ConnectCompany() == true)
{
if(this.SetCurrencyDolar(valor) == true)
{
resul = true;
}
else
{
Error = this.errorMessage;
}
this.DisconnectCompany();
}
else
{
Logger.Error(this.errorMessage);
Error = this.errorMessage;
}
return resul;
}
catch (Exception ex)
{
Error = ex.Message;
return false;
}
}
public bool SetTCEuro(double valor)
{
try
{
bool resul = false;
if (this.ConnectCompany() == true)
{
if (this.SetCurrencyEuro(valor) == true)
{
resul = true;
}
else
{
Error = this.errorMessage;
}
this.DisconnectCompany();
}
else
{
Error = this.errorMessage;
}
return resul;
}
catch (Exception ex)
{
Error = ex.Message;
return false;
}
}
}
CLASE PARA OBTENER LA LA RESPUESTA A LA PETICIÓN DE LA API DEL BANCO DE MÉXICO.
Esta clase se utiliza para consumir la api del Banco de México y recibir la respuesta del tipo de cambio que estamos solicitando al servicio.
class GetTC
{
private string _error;
public string Error
{
get { return _error; }
set { _error = value; }
}
public GetTC()
{
_error = "";
}
public Bmx getTCDolar()
{
try
{
string datetime1 = DateTime.Now.Date.ToString("yyyy-MM-dd");
string datetime2 = DateTime.Now.Date.ToString("yyyy-MM-dd");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43718/datos/oportuno";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Accept = "application/json";
request.Headers["Bmx-Token"] = "aqui va el token que debemos obtener del portal de la api del banco de mexico.";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
if (response.StatusCode != HttpStatusCode.OK)
{
throw new Exception(String.Format("Server error (HTTP {0}: {1}).", response.StatusCode, response.StatusDescription));
}
var content = string.Empty;
using (var stream = response.GetResponseStream())
{
using (var sr = new StreamReader(stream))
{
content = sr.ReadToEnd();
}
}
Bmx objBmx;
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
{
// Deserialization from JSON
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(Bmx));
objBmx = (Bmx)deserializer.ReadObject(ms);
}
return objBmx;
}
catch (Exception ex)
{
_error = ex.Message;
return null;
}
}
public Bmx getTCEuro()
{
try
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF46410/datos/oportuno";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Accept = "application/json";
request.Headers["Bmx-Token"] = "aqui va el token que debemos obtener del portal de la api del banco de mexico.";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
if (response.StatusCode != HttpStatusCode.OK)
{
throw new Exception(String.Format("Server error (HTTP {0}: {1}).", response.StatusCode, response.StatusDescription));
}
var content = string.Empty;
using (var stream = response.GetResponseStream())
{
using (var sr = new StreamReader(stream))
{
content = sr.ReadToEnd();
}
}
Bmx objBmx;
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content)))
{
// Deserialization from JSON
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(Bmx));
objBmx = (Bmx)deserializer.ReadObject(ms);
}
return objBmx;
}
catch (Exception ex)
{
_error = ex.Message;
return null;
}
}
}
CONSUMIR LA API Y REGISTRAR EL TIPO DE CAMBIO:
En el Load() de nuestro Form principal, o si usamos aplicación de Consola seria en nuestro Main(), mandaremos llamar las clases para recibir los datos de la api con el tipo de cambio solicitado y registrarlo en SAPB1.
try
{
GetTC dolar = new GetTC();
Bmx bmx = dolar.getTCDolar();
if (bmx != null)
{
double valor = 0;
SetTC setDolar = new SetTC();
if (double.TryParse(bmx.bmx.series[0].datos[0].dato, out valor))
{
if (setDolar.SetTCDolar(valor) == true)
{
Logger.Info("Tipo de cambio (dólar) actualizado correctamente. $" + valor);
}
else
{
Logger.Error("Exception: " + setDolar.Error);
}
}
else
{
Logger.Error("Exception: El valor del dolar no es un número valido.");
}
}
else
{
Logger.Error("Exception: " + dolar.Error);
}
GetTC euro = new GetTC();
bmx = euro.getTCEuro();
if (bmx != null)
{
double valor = 0;
SetTC setEuro = new SetTC();
if (double.TryParse(bmx.bmx.series[0].datos[0].dato, out valor))
{
if (setEuro.SetTCEuro(valor) == true)
{
Logger.Info("Tipo de cambio (Euro) actualizado correctamente. $" + valor);
}
else
{
Logger.Error("Exception: " + setEuro.Error);
}
}
else
{
Logger.Error("Exception: El valor del euro no es un número valido.");
}
}
else
{
Logger.Error("Exception: " + euro.Error);
}
this.Dispose();
this.Close();
}
catch (Exception ex)
{
this.Dispose();
this.Close();
}
Regresar a la página principal de proyectos.
Referencia:
SAP Business One SDK – Help Center
https://help.sap.com/viewer/product/SAP_BUSINESS_ONE/9.3/es-ES