Interfaces
Ejemplo de interfaz en procedimientos
Sección titulada «Ejemplo de interfaz en procedimientos»interface IAddressProvider{ procedure GetAddress(): Text;}codeunit 65100 CompanyAddressProvider implements IAddressProvider{ procedure GetAddress(): Text; begin exit('Company address \ Denmark 2800') end;}codeunit 65101 PrivateAddressProvider implements IAddressProvider{ procedure GetAddress(): Text; begin exit('My Home address \ Denmark 2800') end;}page 65100 MyAddress{ PageType = Card; ApplicationArea = All; UsageCategory = Administration;
layout { area(Content) { group(GroupName) { } } }
actions { area(Processing) { action(WhatsTheAddress) { ApplicationArea = All; Caption = 'What's the Address?'; ToolTip = 'Select the address.'; Image = Addresses;
trigger OnAction() var iAddressProvider: Interface IAddressProvider; begin AddressproviderFactory(iAddressProvider); Message(iAddressProvider.GetAddress()); end; }
action(SendToHome) { ApplicationArea = All; Image = Home; Caption = 'Send to Home.'; ToolTip = 'Set the interface implementation to Home.'; trigger OnAction() begin sendTo := sendTo::Private end; }
action(SendToWork) { Image = WorkCenter; Caption = 'Send to Work.'; ToolTip = 'Set the interface implementation to Work.'; ApplicationArea = All;
trigger OnAction() begin sendTo := sendTo::Company end; } } }
local procedure AddressproviderFactory(var iAddressProvider: Interface IAddressProvider) var CompanyAddressProvider: Codeunit CompanyAddressProvider; PrivateAddressProvider: Codeunit PrivateAddressProvider; begin
if sendTo = sendTo::Company then iAddressProvider := CompanyAddressProvider;
if sendTo = sendTo::Private then iAddressProvider := PrivateAddressProvider;
end;
var sendTo: enum SendTo;}Ejemplo de interfaz en enumeraciones
Sección titulada «Ejemplo de interfaz en enumeraciones»enum 65100 SendTo{ Extensible = true;
value(0; Company) { }
value(1; Private) { }}Soporte obsoleto
Sección titulada «Soporte obsoleto»Las interfaces pueden quedarse obsoletas, como otros tipos de objetos AL, usando las propiedades ObsoleteState, ObsoleteReason y ObsoleteTag, así como el atributo Obsolete. Este enfoque puede ayudar con el proceso de gestión de cambios de interfaz.
Manejar valores de extensión de enumeración eliminados
Sección titulada «Manejar valores de extensión de enumeración eliminados»Puede usar enumeraciones para seleccionar una implementación de interfaz. Sin embargo, debido a la naturaleza conectable, una extensión de enumeración y su implementación de interfaz correspondiente podrían haberse desinstalado del inquilino, manteniéndose la configuración de la enumeración, lo que ahora apuntará a un valor desconocido. En lugar de que tener un código de la aplicación que agregue la lógica de validación para manejar este escenario, la plataforma debería detectar cuándo se proporciona un valor de enumeración no válido y permitir una forma extensible de manejar ese problema. Este escenario está relacionado con la reserva para el valor predeterminado que se usa cuando no se proporciona ningún valor de enumeración, aunque no es lo mismo.
La propiedad UnknownValueImplementation especifica los implementadores que se usan para los valores ordinales que no están incluidos en la lista definida de valores de enumeración.
UnknownValueImplementation = Interface = InterfaceImplementation;pageextension 50130 CustListExt extends "Customer List"{
trigger OnOpenPage() var ifoo: Interface IFoo; e: enum SomeEnum; begin e := SomeEnum::Yes; ifoo := e; ifoo.Foo(); // => YesFooImpl specified in Implementation on Yes value
e := SomeEnum::No; ifoo := e; ifoo.Foo(); // => DefaultFooImpl specified in DefaultImplementation
e := 2; // No enum value matches this. ifoo := e; ifoo.Foo(); // => UnknownFooImpl specified in UnknownImplementation end;}
interface IFoo{ procedure Foo();}
codeunit 50145 ErrorFooImpl implements IFoo{ procedure Foo() begin Message('Bad FOO') end;}
codeunit 50146 DefaultFooImpl implements IFoo{ procedure Foo() begin Message('Default FOO') end;}
codeunit 50147 YesFooImpl implements IFoo{ procedure Foo() begin Message('Yes FOO') end;}
enum 50135 SomeEnum implements IFoo{ Extensible = true; UnknownValueImplementation = IFoo = ErrorFooImpl; DefaultImplementation = IFoo = DefaultFooImpl;
value(0; Yes) { Implementation = IFoo = YesFooImpl; } value(1; No) { // Nothing specified. Using defaults }}La propiedad UnknownValueImplementation se aplica a las enumeraciones. Al desinstalar las extensiones de enumeración, los valores persistentes se pueden volver desconocidos. UnknownValueImplementation proporciona un control de errores genérico en tales casos. Las enumeraciones a menudo se pueden usar para seleccionar una implementación de interfaz. Sin embargo, debido a la naturaleza de un modelo de desarrollo extensible, es posible que se desinstalen una extensión de enumeración y su implementación de interfaz correspondiente de un inquilino, mientras que el valor de la enumeración específica sigue disponible, aunque ahora apuntará a un valor desconocido. El uso de la propiedad UnknownValueImplementation al definir una enumeración evita la aparición de un mensaje de error técnico en la UI y permite un manejo de errores más fácil de usar.
Relacionada con UnknownValueImplementation está la propiedad DefaultImplementation, que se usa para revertir a un valor predeterminado cuando no se proporciona ningún valor de enumeración.