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.
- 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.
- Pegue el metodo en la clase HANumberSeqModuleVehicle y luego sobreescribirlo.
- 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:
- 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.
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". [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:
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.- Compile e implemente el proyecto.
- Explore el nuevo módulo que se presenta en la sección Módulos de D365FO.
No hay comentarios:
Publicar un comentario