Proyecto Tipo de Cambio para SAPB1

Code with Edd - Proyectos

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

Api Banco de México

Scroll hacia arriba