SAP BO. SAP Business One. Otro tema relacionado al SDK de SAP.

     Hace ya un tiempo vimos un pequeño ejemplo de SDK de SAP Business One en el cual usábamos el UI API para tomar un campo en especifico de la pantalla y lo publicábamos en un Messagebox, algo relativamente sencillo. Ahora en este ejemplo que es muy muy parecido haremos algo parecido. 

     Solo que esta vez estaremos al pendiente de los eventos que ocurran dentro de SAP Business One. El código sera muy parecido al anterior pero con unas pequeñas diferencias ya que en este agregaremos un evento el cual sera el núcleo principal de nuestro ejemplo. 


     Y para comenzar vamos a crear nuestro proyecto y agregamos las mismas referencias del ejemplo pasado. Una vez hecho, esto nos detenemos ahí por que me he brincado un paso importante para que esto funcione ¬¬, y lo que se me paso es que ocupamos a crear una tabla definida por el usuario dentro de nuestra sociedad. La tabla que esta en este ejemplo de llama "@USER_DATA" y los campos son los siguientes: 

  • U_User. Que usuario entro a SAP. 
  • U_Login. A que hora sucedió el evento. 
  • U_Direction. Entro o salio. 
     Bien ahora si en lo que estábamos en nuestro proyecto, en el Main pondremos este código. 


//Lanzamos la ejecucion de nuestro procedimiento
            SetApplication();

            Console.ReadLine();

  Bien ahora ya recuerdan ese "SetAplication", es el método que hará la unión de nuestro programa con SAP Business One y casi al final del método agregara el nuevo evento que vamos a estar evaluando. 

public static void SetApplication()

{
    // *******************************************************************
    // Usamo el objeto SboGuiApi para establecer nuestra conexión
    // Con una aplicación abierta de SAP Business One application, la cual
    // nos dara nuestro objeto inicializado
    // *******************************************************************

    SAPbouiCOM.SboGuiApi SboGuiApi = null;
    string sConnectionString = null;

    SboGuiApi = new SAPbouiCOM.SboGuiApi();

    // inicializamos sConnectionString con una cadena que especifica que se usen los parametros actuales

    sConnectionString = "0030002C0030002C00530041005000420044005F00440061007400650076002C0050004C006F006D0056004900490056";//System.Convert.ToString(Environment.GetCommandLineArgs().GetValue(1));

    // intentanr conectarse a la aplicacion abierta de SAP Business One

    try
    {
        // Si no existe una aplicacion abierta mandara un error
        SboGuiApi.Connect(sConnectionString);
    }
    catch
    { //  Si la conexion falla
        System.Windows.Forms.MessageBox.Show("No SAP Business One Application was found");
        System.Environment.Exit(0);
    }
    // inicializamos nuestro objeto
    SBO_Application = SboGuiApi.GetApplication(-1);
    // inicializamos nuestro evento
    SBO_Application.AppEvent += new SAPbouiCOM._IApplicationEvents_AppEventEventHandler(SBO_Application_AppEvent);
}


     Como ven en la ultima linea de este método vemos que estamos cargando un evento llamado "SBO_Application_Event" el cual estará atento a 3 eventos que SAP Business One nos permite monitorear que son: cuando se cierra SAP, cuando se cambia el idioma y cunando se cambia de compañía. Y ahora veamos el código de este método.

//procedimiento que genera nuestro nuevo evento en sap

static void SBO_Application_AppEvent(SAPbouiCOM.BoAppEventTypes EventType)
{
    switch (EventType)
    {
        case SAPbouiCOM.BoAppEventTypes.aet_ShutDown:
            System.Windows.Forms.Application.Exit();
            break;
        case SAPbouiCOM.BoAppEventTypes.aet_CompanyChanged:
            SetLogged();
            break;
        case SAPbouiCOM.BoAppEventTypes.aet_LanguageChanged:
            break;
    }
}


     En la sección de codigo anterior vemos claramente los 3 eventos y el que a nosotros nos importa es el que se da en el cambio de compañía pero ¿por que?, porque este evento da al entrar a SAP, al salir o al cambiar a otra compañía. Ahora bien en este evento mandamos a llamar a otro método el cual hará la función de sacar la información de quien se esta conectando y tendremos que usar un contador por que recuerden que a las tablas definidas por el usuario se les agrega un campo llamado DocEntry el cual es un simple contador. Y por ultimo agregamos a nuestra tabla los elementos que sacamos. 

static void SetLogged()

{
    try
    {
        //creamos un recordset de SAP
        SAPbobsCOM.Recordset RS;
        //creamos e instanciamos a nuestra conexión actual un objeto tipo compañia para poder trabajar
        //con el recorset de SAP Business One
        SAPbobsCOM.Company oCompany = (SAPbobsCOM.Company)SBO_Application.Company.GetDICompany();
        RS = (SAPbobsCOM.Recordset)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);
        
        //tomamos los datos que ocupamos
        string oName = SBO_Application.Company.UserName;
        string oDate = DateTime.Now.ToString();

        //calculamos el consecutivo
        RS.DoQuery("select MAX(DocEntry) from [@User_Data] ");
        int oCurrentNum = (int)RS.Fields.Item(0).Value;
        int NewLine = oCurrentNum;
        if (oCurrentNum < 1)
        {
            NewLine = 1;
        }
        else
        {
            NewLine += 1;
        }

        // guardamos los valores en nuestra tabla
        string Insert = "INSERT INTO [@USER_DATA] (DocEntry, U_User, U_Login, U_Direction) VALUES ";
            Insert += "('" + NewLine.ToString() + "','" + oName + "','" + oDate + "','Logged In')";
        RS.DoQuery(Insert) ;
    }
    catch (Exception Ex)
    {
        System.Windows.Forms.MessageBox.Show(Ex.Message);
    }

}

     
     Si todo sale bien en nuestra tabla estaremos guardando quien entra a SAP Business One. Hay que tomar en cuenta las siguientes cosas: 
  • Debe de haber una aplicación SAP Business One antes de ejecutar este código de lo contrario no funciona. 
  • Si cambian entre compañías les marcara un error debido a que las compañías que no tengan nuestra tabla no habrá donde guardar nuestra información. 

     Por ultimo quiero comentarles que empezare de nuevo a bloggear mas seguido y con nuevas cosas como por ejemplo dedicaremos uno o dos post a la facturación electrónica que viene integrada a SAP Business One. Saludos y gracias. 

Posted in |

2 comentarios:

  1. Roberto Contuliano Says:

    Excelente maestro, un muy buen ejemplo se agradece.
    Roberto Contuliano R.

  2. Anónimo Says:

    A lo de maestro no sé, pero bajo ningún modo es un buen ejemplo. Tiene la cara solamente.

Related Posts with Thumbnails