SAP BO. SAP Business One. Otro tema relacionado al SDK de SAP.
Posted On viernes, 14 de enero de 2011 at en 17:16 by Edgar Avena Vázquez 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.
//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.
Excelente maestro, un muy buen ejemplo se agradece.
Roberto Contuliano R.
A lo de maestro no sé, pero bajo ningún modo es un buen ejemplo. Tiene la cara solamente.