miércoles, 30 de enero de 2019

D365FO | Creación de nuevo módulo (Secuencias numéricas).

La creación de nuevos módulos con su respectiva parametrización (secuencias numéricas), nos permite exponer al usuario una visión adaptable del sistema. Con un ejemplo, mostraremos la forma de crearlos y hacerlos parametrizables como cualquier otro módulo, propio de D365FO.

- En Visual Studio cree un nuevo proyecto en un nuevo modelo, el mismo que podrá ser utilizado como un nuevo paquete de extensión.
 
- De clic derecho sobre el BaseEnum NumberSeqModule y elija Crear extension.
- Recordando que todos los nombres de los elementos deben ser únicos, cambie el nombre de la nueva extensión de NumberSeqModule.Extension a NumberSeqModule.[PREFIJO]Extension. Para nuestro caso es NumberSeqModule.HAExtension
- De clic derecho sobre NumberSeqModule:HAExtension y elija Nuevo Elemento. Dele un nombre y una etiqueta en sus propiedades. En nuestro caso Name: HAVehicle, Label: Vehículo.
- Crear un nuevo EDT String, dele un nombre y una etiqueta. En nuestro caso Name: HAVehicleId, Label: Código de vehículo, String Size: 20. 
 
- Crear una tabla de parámetros para el nuevo módulo: HAVehicleParameters. La tabla debe tener un campo Key (EDT : ParametersKey) y un método find.
 static HAVehicleParameters find(boolean _forupdate = false)  
   {  
     HAVehicleParameters parameter;  
     if (_forupdate)  
     {  
       parameter.selectForUpdate(_forupdate);  
     }  
     select firstonly parameter  
       index Key  
       where parameter.Key == 0;  
     if (!parameter && !parameter.isTmp())  
     {  
       Company::createParameter(parameter);  
       PriceDiscSalesPolicyParameters::initParameters();  
     }  
     return parameter;  
   } 
- Los métodos delete y update deben sobreescribirse. - Crear en la tabla de parámetros los métodos NumberSeqModule y numRefHAVehicleId.
 static NumberSeqModule numberSeqModule()  
   {  
     return NumberSeqModule::HAVehicle;  
   }
 public server static NumberSequenceReference numRefHAVehicleId()  
   {  
     NumberSeqScope scope = NumberSeqScopeFactory::createDataAreaScope(curExt());  
     return NumberSeqReference::findReference(extendedTypeNum(HAVehicleId),scope);  
   }
- Adicionalmente, crear el indice con el campo Key y;
- Crear la relación de tipo Foreign Key con las siguientes propiedades:

- Crear una nueva clase para los números de secuencias. En nuestro caso es HANumberSeqModuleVehicle. Esta clase debe extender de la clase NumberSeqApplicationModule.

- Los métodos initializeReference y loadModule deben sobreescribirse. En el método loadModule agregue el código para la referencia a la secuencia numérica.
 protected void loadModule()  
   {  
     NumberSeqDatatype datatype = NumberSeqDatatype::construct();  
     datatype.parmDatatypeId(extendedTypeNum(HAVehicleId));  
     datatype.parmConfigurationKeyId(configurationKeyNum(ledgerBasic));  
     datatype.parmReferenceHelp(literalStr("Código único de vehículo"));  
     datatype.parmWizardIsContinuous(false);  
     datatype.parmWizardIsManual(NoYes::No);  
     datatype.parmWizardFetchAheadQty(10);  
     datatype.parmWizardIsChangeDownAllowed(NoYes::No);  
     datatype.parmWizardIsChangeUpAllowed(NoYes::No);  
     datatype.parmWizardHighest(999999999);  
     datatype.parmSortField(1);  
     datatype.addParameterType(NumberSeqParameterType::DataArea, true, false);  
     this.create(datatype);  
     //super();  
   }
- El método buildModulesMapSubsciber es un método controlador de eventos. Abra el diseño de la clase NumberSeqGlobal. De clic derecho sobre el delegado buildModulesMapDelegate y elija "Copiar método controlador de eventos".
- Pegue el metodo en la clase HANumberSeqModuleVehicle y luego sobreescribirlo.
 [SubscribesTo(classstr(NumberSeqGlobal),delegatestr(NumberSeqGlobal,buildModulesMapDelegate))]  
   public static void buildModulesMapSubsciber(Map numberSeqModuleNamesMap)  
   {  
     NumberSeqGlobal::addModuleToMap(classnum(HANumberSeqModuleVehicle), numberSeqModuleNamesMap);  
   }  
- Adicionalmente, crear el método numberSeqModule.
 public NumberSeqModule numberSeqModule()  
   {  
     return NumberSeqModule::HAVehicle;  
   }  
- Crear un formulario para presentar la tabla de parametros. En nuestro caso HAVehicleParameters.
- Arrastre la tabla HAVehicleParameters al DataSource en la parte superior izquierda del panel del diseñador de formas.Cambie las siguientes propiedades:
- Arrastre la tabla NumberSequenceReference al DataSource en la parte superior izquierda panel del diseñador de formas.Cambie las siguientes propiedades:
- Para aplicar el patrón de formulario principal, haga clic derecho en el nodo Diseño y elija Aplicar patrón: Tabla de Contenidos.
- Cuando especificamos el patrón principal del diseño del formulario, nos guiamos en cuanto a los controles que debemos agregar y dónde. Esto ayuda a garantizar que el formulario que diseñamos sigue un diseño de interfaz de usuario con las mejores prácticas.
- Haga clic en el nodo Métodos y elija Sobreescribir el método init(). Antes de la llamada a super(), ingrese la siguiente línea de código:
 public void init()  
 {  
     super();  
     HAVehicleParameters::find();  
 }  
- Crear un nuevo método numberSeqPreInit() en el nodo Métodos, el cual debe contener el siguiente código:
 void numberSeqPreInit()  
 {  
     runExecuteDirect = false;  
     numberSequenceModules = [NumberSeqModule::HAVehicle];  
     numberSeqApplicationModule = new HANumberSeqModuleVehicle();  
     scope = NumberSeqScopeFactory::createDataAreaScope();  
     NumberSeqApplicationModule::createReferencesMulti(numberSequenceModules, scope);  
     tmpIdRef.setTmpData(NumberSequenceReference::configurationKeyTableMulti(numberSequenceModules));  
 }  
- En el nodo Métodos del DataSource NumberSequenceReference, sobreescribir el método removeFilter() e ingrese el siguiento código:
 public void removeFilter()  
 {  
       runExecuteDirect = false;  
       numbersequenceReference_ds.executeQuery();  
       //super();  
 }  
- Finalmente, sobreescribir el método executeQuery() e ingresar el siguiente código:
 public void executeQuery()  
 {  
       if (runExecuteDirect)  
       {  
         super();  
       }  
       else  
       {  
         runExecuteDirect = true;  
         this.queryRun(NumberSeqReference::buildQueryRunMulti(numberSequenceReference,  
                                    tmpIdRef,  
                                    numberSequenceTable,  
                                    numberSequenceModules,  
                                    scope));  
         numbersequenceReference_ds.research();  
       }  
       //super();  
 }  
- La presentación integrada del código en el formulario:
 [Form]  
 public class HAVehicleParameters extends FormRun  
 {  
   boolean runExecuteDirect;  
   container numberSequenceModules;  
   NumberSeqApplicationModule numberSeqApplicationModule;  
   NumberSeqScope scope;  
   TmpIdRef tmpIdRef;  
   /// <summary>  
   ///  
   /// </summary>  
   public void init()  
   {  
     this.numberSeqPreInit();  
     super();  
     HAVehicleParameters::find();  
     //this.numberSeqPostInit();  
   }  
   void numberSeqPostInit()  
   {  
     numberSequenceReference_ds.object(fieldNum(NumberSequenceReference, AllowSameAs)).visible(numberSeqApplicationModule.sameAsActive());  
     referenceSameAsLabel.visible(numberSeqApplicationModule.sameAsActive());  
   }  
   void numberSeqPreInit()  
   {  
     runExecuteDirect = false;  
     numberSequenceModules = [NumberSeqModule::HAVehicle];  
     numberSeqApplicationModule = new HANumberSeqModuleVehicle();  
     scope = NumberSeqScopeFactory::createDataAreaScope();  
     NumberSeqApplicationModule::createReferencesMulti(numberSequenceModules, scope);  
     tmpIdRef.setTmpData(NumberSequenceReference::configurationKeyTableMulti(numberSequenceModules));  
   }  
   [DataSource]  
   class NumberSequenceReference  
   {  
     public void removeFilter()  
     {  
       runExecuteDirect = false;  
       numbersequenceReference_ds.executeQuery();  
       //super();  
     }  
     public void executeQuery()  
     {  
       if (runExecuteDirect)  
       {  
         super();  
       }  
       else  
       {  
         runExecuteDirect = true;  
         this.queryRun(NumberSeqReference::buildQueryRunMulti(numberSequenceReference,  
                                    tmpIdRef,  
                                    numberSequenceTable,  
                                    numberSequenceModules,  
                                    scope));  
         numbersequenceReference_ds.research();  
       }  
       //super();  
     }  
   }  
 }  
- Crear un nuevo MenuItem tipo Display. Dele un nombre y una etiqueta, para nuestro caso HAVehicleParameters. En sus propiedades coloque el formulario de parámetros.
- Crear un nuevo Menú (HAVehicleTable), y dentro un Submenú (HASetUp) donde se coloque el MenuItem HAVehicleParameters.
- De clic derecho sobre el Menú MainMenu y elija crear extensión. Cambie el nombre de la nueva extensión a MainMenu.HAExtension. Coloque dentro el nuevo menú HAVehicleTable.
- Compile e implemente el proyecto.
- Explore el nuevo módulo que se presenta en la sección Módulos de D365FO.
- En la ruta Configurar / Parámetros de vehículo se encuentra la parametrización de Secuencias numéricas.

No hay comentarios:

Publicar un comentario