AX7 - Utilizar como diálogo un formulario

En este post explicaremos cómo utilizar un formulario como si fuera un diálogo en una clase RunBaseBatch.

Lo primero que haremos será agregar un formulario a nuestro proyecto que será el que utilizaremos como diálogo.



Le aplicaremos un patrón. Para este ejemplo he seleccionado el Dialog - Basic.




Como vemos, el patrón nos pide algunos objetos que debe tener el formulario.




Le agregaremos un ButtonGroup y dos Command Buttons: Ok y Cancel; con sus respectivos comandos.




Agregaremos un grupo.




Añadimos al nuevo grupo un control de tipo string al que nombraremos CustAccount y con la propiedad extended CustAccount.




Nos crearemos una clase que extienda de la RunBaseBatch como la siguiente:


class CustTableDialogForm extends RunBaseBatch
{
    CustAccount custAccount;

    #define.CurrentVersion(1)
    #define.Version1(1)
    #localmacro.CurrentList       
        custAccount
    #endmacro

    public Object dialog()
    {
        DialogRunbase  dialog = Dialog::newFormnameRunbase(formstr(CustTablePrintDialogForm), this);

        dialog.caption("Clientes");
        dialog = this.dialogInternal(dialog);

        return dialog;
    }

    static void main(Args   _args)
    {
        CustTableDialogForm     form = new CustTableDialogForm();

        if (form.prompt())
            form.run();
    }

    public void run()
    {
        info(custAccount);

    }


    public CustAccount parmCustAccount(CustAccount _custAccount = CustAccount)
    {
        custAccount = _custAccount;

        return custAccount;

    }

    public boolean canGoBatch()
    {
        return true;
    }

    public container pack()
    {
        return [#CurrentVersion,#CurrentList];
    }

    public boolean unpack(container packedClass)
    {
        Version version = RunBase::getVersion(packedClass);
    ;
        switch (version)
        {
            case #CurrentVersion:
                [version,#CurrentList] = packedClass;
                break;
            default:
                return false;
        }

        return true;
    }
}


Como veréis es la típica clase que extiende de la RunBaseBatch pero en el método dialog; vemos que no tenemos agregado ningún campo al diálogo pero sin embargo tenemos el siguiente código que es el encargado de llamar al formulario. 



DialogRunbase  dialog = Dialog::newFormnameRunbase(formstr(CustTablePrintDialogForm), this);



Si ejecutamos la clase nos pude devolver algún error; esto ocurre ya que para que el formulario pueda ser utilizado como un diálogo necesita de algunos objetos. en este caso, se queja de que le falta un tab. éste es necesario para poder crear los controles para el tabPage de ejecución por lotes.








Agregaremos el tab que nos está pidiendo y crearemos la siguiente estructura:




En el formulario nos faltará código porque aunque la clase funcione perfectamente y nos muestre nuestro formulario, deberemos pasarle los valores de los controles del formulario a la  clase.
En el método init del form recuperaremos la clase.


[Form]
public class CustTablePrintDialogForm extends FormRun
{
    CustTableDialogForm     custTableDialogForm;
 public void init()
    {
       
        if (!element.args().caller())
        {
            throw error("@SYS22539");
        }

        custTableDialogForm =  element.args().caller().runbase();

        super();
    }

}
   


y en el control custAccount sobrescribiremos el método modified para pasarle el valor a la clase.






[Control("String")]
    class CustAccount
    {
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public boolean modified()
        {
            boolean ret;
   
            ret = super();

            custTableDialogForm.parmCustAccount(CustAccount.valueStr());
   
            return ret;
        }

    }


Recordad que para poder llamar al control por código deberéis tener la propiedad Auto Declaration  a Yes.




Ahora si ejecutamos nuestra clase veremos que tiene la estructura de un diálogo, la cual contiene un campo, el tab para el proceso por lotes y los botones.




Si vemos el tab por lotes están todos los campos del proceso por lotes que han sido asignados por el sistema.





Seleccionamos un cliente del desplegable y vemos su funcionamiento.








Comentarios