CODEX

5 consejos básicos de desarrollo sobre el SDK de SAP Business One

Esenciales para todo aquel que esté empezando

Probablemente estos consejos ya los tengáis en cuenta o no os hagan falta, pero en mi caso me hubiera gustado tenerlos asimilados al empezar a desarrollar.

1 Usar las herramientas disponibles en la DI API para modificar el contenido y/o el esquema de la base de datos.

Esto más que un consejo, se trata de una “ley”, puesto que como todos sabemos es una condición indispensable para que nuestros clientes no pierdan el soporte de SAP. Usando la DI API, tanto sus objetos de negocio como el objeto Recordset, debemos ser capaces de actualizar y leer la información de las tablas estándar y de nuestras propias tablas (UDTs) o nuestros campos (UDFs).

2 Dejar un log “claro” de los errores que se suceden en nuestro addon.

A la hora de corregir los errores que surgen a un usuario de nuestro addon, es de mucha ayuda el contar con una tabla UDT (por ejemplo) a la que podamos acceder para comprobar el estado de la pila de llamadas del addon en el momento de la excepción.

3 Usar siempre bloques try catch finally.

Debemos tratar de “blindar” nuestro código mediante el uso de bloques “try catch finally”, con el objetivo de que no se produzcan excepciones no controladas que provoquen la interrupción y desconexión de nuestro addon sin dar información al usuario.

Esta captura de excepciones es especialmente sensible a la hora de introducir datos, ya sea a través de la interfaz de usuario o a través de interfaces con otros sistemas.

4 Liberar los objetos COM cuando hayamos terminados de usarlos.

Supongamos que necesitamos usar un Recordset para ejecutar una determinada consuta. En el momento en que hayamos ejecutado dicha consulta y extraído la información necesaria, debemos liberar nuestro Recordset, haya o no ocurrido una excepción:

Recordset rs = null;
try{
  rs = kernel.Company.GetBusinessObject(BoObjectTypes.BoRecordset) as   Recordset;
  rs.DoQuery("SELECT ...");
if (rs.RecordCount > 0)
//Procesar la información del recordset
} catch (Exception ex) {
//Procesar la excepción y dejar log del error
} finally {
  if (rs != null) //Liberamos el Recordset haya habido o no excepción
  System.Runtime.Interop.Marshall.ReleaseComObject(rs);
}

5 Congelar y DESCONGELAR los formularios propios durante los momentos de refresco de la información.

Hay que tener en cuenta que si se produce una excepción durante el proceso también debemos descongelar nuestro formulario. Algo así podría valer:

Form oForm = null;
try
{
oForm = kernel.Application.Forms.ActiveForm;
oForm.Freeze(true);
//Trabajar con oForm para (por ejemplo)
//cargar información desde la base de datos
}
catch (Exception ex)
{
//Procesar la excepción y dejar log del error
}
finally
{
if (oForm != null) //Descongelamos el formulario haya habido o no excepción
oForm.Freeze(false);
}