Nivel: developer
Como usar Interfaces y Enums
Para definirla usaremos la siguiente estructura:
Ahora vamos a ver como llamar a las diferentes opciones de implementaciĆ³n.
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":
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:
Si quieres probar el cĆ³digo, estĆ” disponible en https://github.com/RCORELLA/Interfaces
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
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.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 |
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.
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:
Publicar un comentario