En artículos anteriores hemos visto:
- Cómo instalar Dynamics NAV “Tenerife” en una máquina local (con el nuevo entorno de desarrollo en Visual Studio Code).
- Para empezar a familiarizarnos con el nuevo lenguaje AL, repasamos la Sintaxis para la creación de tablas.
- Después continuamos con la Sintaxis para la creación de campos.
En este artículo vamos a repasar la Sintaxis del lenguaje AL para asignar propiedades a los campos.
Para ello voy a repasar campos del estándard de Navision, y voy a explicar cómo replicar en Visual Studio Code lo que haciamos en el entorno C/SIDE.
Propiedad CaptionML
//Campo 3 de la tabla 17 G/L Entry field(3;"G/L Account No.";Code[20]) { CaptionML = ENU='G/L Account No.',ESP='Nº cuenta'; }
- Para indicar la propiedad se debe escribir CaptionML =
- A continuación indicar el código del idioma, y el signo =.
Por ejemplo:
ENU=
ESP= - Escribir el caption entre comillas simples ‘ ‘
- Si necesitas incluir la comilla simple como parte del caption, tienes que usar dos comillas simples.
Por ejemplo, para escribir el Caption Don’t show indicariamos:CaptionML = ENU=’Don”t show’,ESP=’No mostrar’; - La propiedad puede incluir la traducción a múltiples idiomas. Hay que separar cada uno de ellos con una coma.
- Al final, escribir punto y coma ;
- Esta propiedad es obligatoria según los manuales de buena praxis a la hora de programar.
- Nota: Es posible que en un futuro próximo se cambie la forma de indicar los captions, centralizando las traducciones en un único archivo de traducciones, en lugar de indicarlo campo a campo. Ver más información aquí.
Propiedad OptionCaptionML
// Campo 5 de la tabla 17 G/L Entry field(5;"Document Type";Option) { OptionMembers = " ",Payment,Invoice,"Credit Memo","Finance Charge Memo",Reminder,Refund; OptionCaptionML = ENU=' ,Payment,Invoice,Credit Memo,Finance Charge Memo,Reminder,Refund', ESP=' ,Pago,Factura,Abono,Docs. interés,Recordatorio,Reembolso'; }
- Para indicar la propiedad se debe escribir OptionCaptionML =
- A continuación indicar el código del idioma, y el signo =.
- Escribir los captions de las opciones entre comillas simples ‘ ‘
- Si necesitas incluir la comilla simple como parte del caption, tienes que usar dos comillas simples.
- La propiedad puede incluir la traducción a múltiples idiomas. Hay que separar cada uno de ellos con una coma.
- Al final, escribir punto y coma ;
- Esta propiedad es obligatoria según los manuales de buena praxis a la hora de programar.
- Nota: Es posible que en un futuro próximo se cambie la forma de indicar los captions, centralizando las traducciones en un único archivo de traducciones, en lugar de indicarlo campo a campo. Ver más información aquí.
Propiedad TableRelation
A continuación vamos a ver unos cuantos ejemplo de campos del estándar que usan la propiedad TableRelation, en sus distintas variantes.
// Campo 3 de la tabla 17 G/L Entry field(3;"G/L Account No.";Code[20]) { TableRelation = "G/L Account"; }
- Se relaciona el campo con una tabla. Si no se indica nada más, la relación es con el campo que conforma la clave primaria de la tabla relacionada.
- Esta propiedad por si sola no valida que el valor exista en la tabla relacionada.
De eso se encarga la propiedad ValidateTableRelation, aunque por defecto su valor es True, por lo que no es necesario indicarla explícitamente. - La propiedad TestTableRelation, que acompañaba a TableRelation y ValidateTableRelation, no está disponible en el lenguaje AL.
// Campo 27 de la tabla 17 G/L Entry field(27;"User ID";Code[50]) { TableRelation = User."User Name"; ValidateTableRelation = false; }
- Se relaciona con el campo “User Name” de la tabla relacionada User.
- Como “User Name” no forma parte de la clave primaria de la tabla User, tenemos que poner la propiedad ValidateTableRelation a false.
// Campo 83 de la tabla 18 Customer field(83;"Location Code";Code[10]) { TableRelation = Location where ("Use As In-Transit"=const(false)); } // El código en el entorno C/SIDE, se escribe así: // TableRelation = Location WHERE (Use As In-Transit=CONST(No))
- Se relaciona con la tabla Location.
- De la tabla Location, únicamente podemos seleccionar aquellos almacenes que no se usen como tránsito.
El filtro es constante, por lo que usamos el CONST. - Notar las siguientes diferencias de AL con respecto a C/AL:
- Los campos booleanos en C/SIDE se indicaban como Yes/No.
En VSCode se indican como true/false. - Los campos que tienen espacios o caracteres especiales, ahora hay que indicarlos entre comillas dobles
- Los campos booleanos en C/SIDE se indicaban como Yes/No.
// Campo 288 de la tabla 18 Customer field(288;"Preferred Bank Account Code";Code[10]) { TableRelation = "Customer Bank Account".Code where ("Customer No."=field("No.")); } // El código en el entorno C/SIDE, se escribe así: // TableRelation = "Customer Bank Account".Code WHERE (Customer No.=FIELD(No.))
- Se relaciona con la tabla “Customer Bank Account”.
- Como la tabla relacionada tiene 2 campos que conforman la clave primaria, tenemos que indicar con qué campo lo relacionamos. En este caso con el campo Code.
- Notar las siguientes diferencias de AL con respecto a C/AL:
- Los campos que tienen espacios o caracteres especiales, ahora hay que indicarlos entre comillas dobles
// Campo 6 de la tabla 37 Sales Line field(6;"No.";Code[20]) { TableRelation = if (Type=CONST(" ")) "Standard Text" else if (Type=CONST("G/L Account"),"System-Created Entry"=CONST(false)) "G/L Account" where ("Direct Posting"=CONST(true),"Account Type"=CONST(Posting),Blocked=CONST(false)) else if (Type=CONST("G/L Account"),"System-Created Entry"=CONST(true)) "G/L Account" else if (Type=CONST(Resource)) Resource else if (Type=CONST("Fixed Asset")) "Fixed Asset" else if (Type=CONST("Charge (Item)")) "Item Charge" else if (Type=CONST(Item)) Item; } } // El código en el entorno C/SIDE, se escribe así: // TableRelation = IF (Type=CONST(" ")) "Standard Text" ELSE IF (Type=CONST(G/L Account),System-Created Entry=CONST(No)) "G/L Account" WHERE (Direct Posting=CONST(Yes),Account Type=CONST(Posting),Blocked=CONST(No)) ELSE IF (Type=CONST(G/L Account),System-Created Entry=CONST(Yes)) "G/L Account" ELSE IF (Type=CONST(Resource)) Resource ELSE IF (Type=CONST(Fixed Asset)) "Fixed Asset" ELSE IF (Type=CONST("Charge (Item)")) "Item Charge" ELSE IF (Type=CONST(Item)) Item
- En función del valor del campo Type, se relaciona con distintas tablas, algunas de ellas con filtros.
- Notar las siguientes diferencias de AL con respecto a C/AL:
- Los campos que tienen espacios o caracteres especiales, ahora hay que indicarlos entre comillas dobles
- Los campos booleanos en C/SIDE se indicaban como Yes/No.
En VSCode se indican como true/false.
- En Visual Studio Code es posible poner todo el código en una misma línea, o hacer saltos de linea para que sea más fácil de leer.
- En el entorno C/SIDE teníamos estas pantallas que nos ayudaban a crear la propiedad:
En VSCode el IntelliSense todavía no nos ayuda mucho… de forma que para crear TableRelation complejos recomiendo crearlo en C/SIDE, copiar el código y pegarlo en VSCode, haciendo los ajustes necesarios.
Propiedad Description
//Campo 2 de la tabla 5331 CRM Integration Record field(2;"CRM ID";guid) { Description='An ID of a record in Microsoft Dynamics CRM'; }
- Este campo es de uso interno para programadores. No es visible desde el entorno cliente.
- En el estándar de Dynamics NAV, en las tablas aparecidas en las últimas versiones, se utiliza para explicar para qué sirve el campo, o qué valores se pueden poner.
- Cuando desarrollamos personalizaciones para clientes, solemos usar este campo para marcarlo con una referencia a un código de desarrollo interno, habitualmente el mismo que ponemos en la Version List, y en el trigger de documentación.
Propiedad Editable
//Campo 1 de la tabla 254 VAT Entry field(1;"Entry No.";integer) { Editable = false; }
- La propiedad se usa para indicar si un campo es editable o no por el usuario.
- El valor por defecto de la propiedad Editable es true. Se debe indicar false en caso contrario.
Propiedad Enabled
// No hay ningún campo en el estándar de Dynamics NAV "Tenerife" Preview field(id;Name;integer) { Enabled = false; }
- Esta propiedad determina si se puede almacenar datos en el campo o no
- Se usa la propiedad false cuando un campo deja de ser válido y no está en uso, pero se quiere mantener el espacio en la base de datos.
- Más información sobre la propiedad en la documentación oficial.
Propiedad NotBlank
// Campo 1 de la tabla 3 Payment Terms field(1;Code;code[10]) { NotBlank = true; }
- Esta propiedad se usa para indicar que no se pueden dejar valores en blanco en el campo
- Se usa principalmente en campos de clave primaria
- No se recomienda usar en campos que no son clave primaria, según la documentación oficial.
Propiedad InitValue
// Campo 13 de la tabla 4 Currency field(13;"Amount Rounding Precision";Decimal) { InitValue = 0.01; }
- Esta propiedad se usa para indicar que no se pueden dejar valores en blanco en el campo
- Se usa principalmente en campos de clave primaria
- No se recomienda usar en campos que no son clave primaria, según la documentación oficial.
- Si el campo es de tipo code o text, el valor inicial se indica entre comillas simples
p.ej. InitValue = ‘abc’; - Si el campos es de tipo boolean, el valor inicial solo puede ser true o false.
False es el valor por defecto, si no se indica lo contrario.
p.ej. InitValue = true; - Si el campo es de tipo option, el valor inicial tiene que ser uno de los valores indicados en la propiedad OptionMembers (su sintaxis se explica aquí).
P.ej. InitValue = “First Option”;
Propiedad Numeric
// Campo 171 de la tabla 18 Customer field(171;"Payment Reference";Code[50]) { Numeric = true; }
- Esta propiedad se usa para indicar que en el campo solo se admiten valoren numéricos
- Se utiliza principalmente en campos de tipo text o code
- Se podría crear un campo Integer en su lugar, pero entonces a valores comprendidos entre el -2,147,483,647 y el 2,147,483,647
Propiedad ValuesAllowed
// No hay ningún campo en el estándar de Dynamics NAV "Tenerife" Preview field(id;Name;integer) { ValuesAllowed = '1;2;3'; }
- Esta propiedad se usa para indicar los valores permitidos en el campo
- Los valores permitidos tienen que indicarse como un texto (entre comillas simples), y los valores tienen que ir separados con punto y coma.
Propiedad CharAllowed
// No hay ningún campo en el estándar de Dynamics NAV "Tenerife" Preview field(id;Name;integer) { CharAllowed = 'AZ'; }
- Esta propiedad se usa para qué caracteres están permitidos.
- Por ejemplo, si solo se quieren permitir caracteres en mayúsculas entre la A y la Z, se indica de la siguiente forma:
- Ver la documentación oficial para más información.
Hasta aquí esta lista de propiedades. En el siguiente artículo seguiremos desgranando las propiedades que faltan para completar la lista.
Salut!
Laura Nicolàs

Soy Laura Nicolàs, una de las gemelas del Navision.
Llevo más de 14 años trabajando con Business Central (antes conocido como Dynamics NAV o Navision). Hago consultoría, análisis, desarrollo, implantación, migraciones, actualizaciones de versión (upgrade), instalación, soporte y formación.
La formación es una de mis pasiones, así que estoy siempre grabando cursos que tienes disponibles en ClipPlatform.com
+40 cursos y +450 lecciones. Hay cursos para usuarios, para consultores y para programadores.
Comentarios