Business Central 2020 Wave 1: Intefaces y Enums - Business Central

Breaking

domingo, 8 de marzo de 2020

Business Central 2020 Wave 1: Intefaces y Enums

Nivel: developer

Como usar Interfaces y Enums


Con la llegada de la nueva versiĆ³n de Business Central (2020 Wave 1) tenemos un nuevo elemento de programaciĆ³n que nos indica que nuestro Navision se encamina cada vez mĆ”s a la programaciĆ³n orientada a objetos.  Son las interfaces.  

Pese a que todavĆ­a no hay mucha documentaciĆ³n oficial, he preparado un ejemplo prĆ”ctico que nos permitirĆ” ver su uso: crear y usar una codeunit, permitiendo la implementaciĆ³n posterior (o en nuevas apps) del contenido de cada uno de sus procedimientos.  Es decir, la abstracciĆ³n.


InstalaciĆ³n de Business Central 2020 Wave 1 (BC 16).

Si quieres probar la nueva versiĆ³n, puedes crearte un Sandbox con la Preview de BC16:




Con esta opciĆ³n, ya podrĆ­amos probarlo funcionalmente pero para programar algo, necesitaremos descargarnos el fichero VSIX del DVD de la nueva versiĆ³n Preview de Business Central 2020 Wave 1, ya que el VSCode todavĆ­a no tiene la actualizaciĆ³n de la extensiĆ³n de AL Language:




Definir una interface.

Una vez instalado el entorno, podemos empezar a desarrollar nuestra aplicaciĆ³n.  En mi caso, consistirĆ” en una importaciĆ³n de ficheros de texto, que me permitirĆ” inicialmente, crear Clientes o Productos.  Es cierto que podrĆ­amos usar las sentencias IF o CASE y funcionarĆ­a igual, pero como veremos, hacer una extensiĆ³n de mi aplicaciĆ³n serĆ” mĆ”s sencillo usando las Interfaces.

Para definirla usaremos la siguiente estructura:





Por un lado el nombre de la interface (en mi caso ImportFiles).  En su interior, cada uno de los procedimientos que queramos usar, pero sin definir su contenido.

De esta forma, se puede separar la programaciĆ³n por desarrolladores.  Uno realizarĆ­a el contenido de cada procedimiento sin importarle como se use.  El otro, llamarĆ­a al procedimiento sin importarle su implementaciĆ³n.

Implementar los procedimientos.

Para implementar los procedimientos, creamos codeunits como habitualmente, con el nombre que queramos y aƱadiendo la terminaciĆ³n Implements y el nombre de la interface que implementa (en mi caso ImportFiles).  En su interior, creamos cada uno de los procedimientos definidos en la interface (en mi caso ImportFile)


Lo que hace el procedimiento es leer un fichero de texto mediante la instrucciĆ³n UploadIntoStream y rellenar una tabla especial llamada "CSV Buffer", que como su nombre indica, nos permite leer ficheros CSV (para los que aƱoran los dataport). Una vez leido el fichero, crea o modificar clientes.

La estructura del fichero es la siguiente:


Haremos una nueva implementaciĆ³n de nuestra interface, para poder importar en este caso, productos.  Como vemos es otra codeunit, pero con el mismo nombre de procedimiento ImportFile


Ahora vamos a ver como llamar a las diferentes opciones de implementaciĆ³n.

Usando Enum en lugar de Option

Una de las novedades que tuvimos con la llegada del AL frente al C/AL fue el tipo de datos Enum, que son como los Option, pero con la posibilidad de poder ser ampliados (extendidos).




Ahora, junto con las interfaces, hacen una pareja muy interesante.  Al definir el Enum, podemos decirle que estĆ” relacionado con una interface, aƱadiendo "implements NOMBRE_INTERFACE":





En el ejemplo, el Enum permite seleccionar entre los valores Customers o Items, para determinar que tipo de fichero vamos a importar, pero ademĆ”s le hemos indicado que estĆ” relacionada con la interface "ImportFiles", y en cada valor del Enum, nos permitirĆ­a seleccionar con la propiedad "Implementation" cual de las diferentes implementaciones debe usar: codeunit ImportCustomers o importItem.


Llamando a las interfaces

Ya solamente nos quedarĆ­a llamar a las diferentes implementaciones de las interface creada.  Para ello diseƱamos una pĆ”gina, donde crearemos una variable de tipo Enum y subtipo "TypeOfFile" que previamente habĆ­amos definido (lĆ­nea 41) a la que llamaremos TypeList.




Vincularemos dicha variable a un campo en nuestra pƔgina (Lƭnea 14).

Crearemos una Action para realizar la importaciĆ³n del fichero (LĆ­nea 26).  Pero, ¿quĆ© fichero? el que determine el Enum, o mĆ”s bien, la implementaciĆ³n indicada en su definiciĆ³n.  Para ello:

  • Dentro de la Action definimos una variable id de tipo Interface y subtipo ImportFiles (lĆ­nea 32)
  • Asignamos a dicha variable, el valor del Enum TypeList (LĆ­nea 34)
  • Llamamos al procedimiento id.ImportFile de la implementaciĆ³n de la interface seleccionada, mostrando true o false en funciĆ³n del resultado de la importaciĆ³n (LĆ­nea 35)

Probamos la extensiĆ³n

Efectivamente, al seleccionar cada opciĆ³n en el Enum y pulsar la acciĆ³n "Import File", nos abre la implementaciĆ³n correspondiente (importCustomers o importItem):


ImplementaciĆ³n de la interface ImportCustomers
ImplementaciĆ³n de la interface ImportItem


Si quieres probar el cĆ³digo, estĆ” disponible en https://github.com/RCORELLA/Interfaces

Conclusiones

Como he comentado antes, esto mismo se podrĆ­a haber realizado tambiĆ©n con un IF o con un CASE, pero ¿Y si alguien quisiera extender mi extensiĆ³n importando un fichero de Recursos?  SerĆ­a mucho mĆ”s fĆ”cil y menos intrusivo realizarlo con Interfaces y Enums.

Lo probaremos en la prĆ³xima entrada.

Agradecimientos.

Tal y como he comentado, todavĆ­a no hay mucha documentaciĆ³n oficial sobre interfaces, por lo que tengo que agradecer a Tobias Fenster y Stefano Demiliani por las aportaciones en sus blogs.







No hay comentarios: