SysAttribute extension Framework 2012

La extensión de framework sysAttribute es una nueva manera de inicializar un conjunto de clases heredadas.
Como no, la mejor forma de explicarlo es con un ejemplo.

Empezaremos viendo como trabajabamos en la 2009 para seguir con el mismo ejemplo para la 2012.

Para este ejemplo he creado una clase principal y dos extendidas, dependiendo desde el menuItem desde el que se llame se nos abrirá el formulario de clientes o de proveedores.


Versión 2009

Clase OpenForm2009

//XBB :: http://axlearn2012.blogspot.com.es/ :: 20150320
class OpenForm2009 
{
   MenuItemName menuItemName;
}


Nos creamos este método que será sobrescrito en las extendidas.

public void open()
{
}




Y por supuesto un método construct que nos inicializará las clases extendidas.

static openForm2009 construct(menuItemName menuitemName)
{
   openForm2009 openForm2009;

   switch (menuitemName)
   {
       case menuitemDisplayStr(CustTable):
            openForm2009 = new OpenForm2009_CustTable();
            break;
       case menuitemDisplayStr(VendTable):
            openForm2009 = new OpenForm2009_VendTable();
            break;
       default:
            throw error("No implementado");
   }

   return openForm2009;
}




Clase OpenForm2009_CustTable

//XBB :: http://axlearn2012.blogspot.com.es/ ::20150320
class OpenForm2009_CustTable extends openForm2009
{
}


public void open()
{
   new MenuFunction(menuitemDisplayStr(CustTable), MenuItemType::Display).run();

}



Clase OpenForm2009_VendTable

//XBB :: http://axlearn2012.blogspot.com.es/ :: 20150320
class OpenForm2009_VendTable extends openForm2009
{
}

public void open()
{
    new MenuFunction(menuitemDisplayStr(VendTable), MenuItemType::Display).run();

}



Aquí un pequeño job para realizar las pruebas. 


static void openForm2009(Args _args)
{
   openForm2009 openForm2009;
   menuitemName menuitemName = menuitemDisplayStr(VendTable);
   ;

   openForm2009 = openForm2009::construct(menuitemName);
   openForm2009.open();
}



Ahora replicaremos el ejemplo anterior pero para la versión 2012.

Versión 2012

Para empezar la clase Padre la extenderemos de la SysAttribute.

//XBB :: http://axlearn2012.blogspot.com.es/ :: 20150320
class OpenForm2012 extends SysAttribute
{
    MenuItemName menuItemName;
}


Anularemos el método new y le pasaremos el objeto que diferenciara a que clase extendida se debe llamar.

public void new(MenuItemName _menuItemName)
{
   super();

   menuItemName = _menuItemName;
}

public void open()
{
}


menuitemName parmMenuitemName(menuItemName _menuitemName = menuItemName)
{
    menuItemName = _menuitemName;
    

    return menuItemName;
}


En el método construct llamaremos al método getClassFromSysAttribute de la clase SysExtenesionAppClassFactory, el cual dependiendo del objeto pasado inicializará una clase extendida.

static OpenForm2012 construct(MenuItemName _menuItemName)
{
 return SysExtensionAppClassFactory::getClassFromSysAttribute(classStr(OpenForm2012), new OpenForm2012(_menuItemName));
}

Clase OpenForm2012_CustTable

Importante: Indicarle en el classDeclaration el Attributo.

Con esto me refiero al [OpenForm2012(menuItemdisplaystr(CustTable))] el cual le indicara que attributo debe recibir la clase principal para llamar a esta clase.

//XBB :: http://axlearn2012.blogspot.com.es/ :: 20150320

[OpenForm2012(menuItemdisplaystr(CustTable))]
class OpenForm2012_CustTable extends openForm2012
{
}

public void open()
{
    new MenuFunction(menuitemDisplayStr(CustTable),   MenuItemType::Display).run();

}


Clase OpenForm2012_VendTable

//XBB :: http://axlearn2012.blogspot.com.es/ :: 20150320
[OpenForm2012(menuItemdisplaystr(VendTable))]
class OpenForm2012_VendTable extends openForm2012

{
}


public void open()
{
     new MenuFunction(menuitemDisplayStr(VendTable), MenuItemType::Display).run();
}




y por supuesto el job

static void openForm2012(Args _args)
{
   openForm2012 openForm2012;
   menuitemName menuitemName = menuitemDisplayStr(CustTable);
   ;

   openForm2012 = openForm2012::construct(menuitemName);
   openForm2012.open();
}


Adjunto un proyecto con estos objetos para el que no quiera trabajar.




Decargar el xpo del proyecto.

Aquí tenéis un poco más de información y un ejemplo en el que se puede ver que se puede pasar más de un atributo.

https://msdn.microsoft.com/EN-US/library/gg844185.aspx

Nota: Es posible que al modificar la clase principal tengáis problemas en las extendidas, si no os reconocen las clases extendidas borrad los datos de uso, fichero *auc, haced un CIL y si todo falla, reiniciar el AOS.. 


Comentarios