2.11.La clase UIBuilder.

Hoy explicaremos la clase UIBuilder, la cual se utiliza para modificar el diálogo, ya sea para agregar campos nuevos,  modificar las propiedades/métodos de los campos. o modificar el aspecto de éste.

Lo primero que haremos será crearnos una clase que extienda de la SrsReportDataContractUIBuilder.

En el Class Declaration agregaremos variables para los campos que queramos modificar del diálogo, éstas podrán ser de campos que existen en la clase contract o no.

Class CustInvoiceJourReportUIBuilder extends SrsReportDataContractUIBuilder
{
            CustinvoicejourReportContract   contract;
       
            DialogField     fromDateField;
            DialogField     toDateField;       
            DialogField     InvoiceIdField;
}

Anularemos el método build para recuperar nuestra clase contract y los parámetros que deseamos modificar.
He modificado la propiedad mandatory del control InvoiceIdField para que sea obligatorio y así podáis ver que se pueden modificar las propiedades de los controles del diálogo.

public void build()
{
           super();
       
            contract = this.dataContractObject() as CustinvoicejourReportContract;
       
            fromDateField = this.bindInfo().getDialogField(contract, methodStr(CustinvoicejourReportContract, parmFromDate));
            toDateField   = this.bindInfo().getDialogField(contract, methodStr(CustinvoicejourReportContract, parmToDate));
            InvoiceIdField   = this.bindInfo().getDialogField(contract, methodStr(CustinvoicejourReportContract, parmInvoiceId));
            InvoiceIdField.fieldControl().mandatory(true);
 }

A continuación crearemos unos métodos que utilizaremos para sobrescribir los métodos de los controles.

El primer ejemplo será una validación con el campo FromDate. Ésta se ejecutará en el momento que se modifique el campo.

Para hacer una validación lo ideal es hacerlo en la clase contract, no aquí.

 public boolean fromDateValidate(FormDateTimeControl _control)
 {
            boolean ret = true;
       
            if(toDateField.value() && fromDateField.value() > toDateField.value())
            {
                ret = checkFailed('La fecha desde no puede ser mayor a la fecha hasta.');
            }
       
            return ret;
 }
     

En el siguiente ejemplo, escribiremos un método lookup que utilizaremos para mostrar las facturas de cliente en nuestro campo InvoiceIdField.
  
 public boolean InvoiceIdLookup(FormStringControl _control)
 {
            Query                                query = new query(queryStr(CustInvoiceJour));
            SysTableLookup               sysTableLookup;
            QueryBuildDataSource     qbds;
       
            sysTableLookup = SysTableLookup::newParameters(tableNum(CustInvoiceJour), _control);
       
            sysTableLookup.addLookupfield(fieldNum(CustInvoiceJour, InvoiceId));
       
            sysTableLookup.parmQuery(query);
            sysTableLookup.performFormLookup();
       
            return true;
}

El último ejemplo lo he creado para que veais más posibilidades.
Aquí observareis que se puede modificar más de un método para un control.
Esconderemos los campos de fechas cuando modifiquemos el campo factura, siempre y cuando éste tenga valor.
    
public boolean InvoiceIdModified(FormStringControl _control)
{
            boolean ret = true;
       
            if (_control.modified())
            {
                if(InvoiceIdField.value())
                {
                    FromDateField.visible(false);
                    ToDateField.visible(false);
                }
                else
                {
                    FromDateField.visible(true);
                    ToDateField.visible(true);
               }
            }
       
            return ret;
}
    
  
Una vez escritos los métodos deberemos indicarle a la clase que los controles serán sobrescritos.
Como podéis ver se le indica al control que método se va a sobreescirbir y le indicamos el método que debe ejecutarse.
Podemos utilizar los típicos métodos de los controles tales como el modified, validate, lookup..

public void postRun()
{
            super();
       
            dialog.dialogForm().formRun().controlMethodOverload(false);
            fromDateField.registerOverrideMethod(methodStr(FormDateTimeControl, validate), methodStr(CustInvoiceJourReportUIBuilder, fromDateValidate), this);
            InvoiceIdField.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(CustInvoiceJourReportUIBuilder, InvoiceIdLookup), this);
            InvoiceIdField.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(CustInvoiceJourReportUIBuilder, InvoiceIdModified), this);
}

Si creamos una clase UIBuilder le deberemos pasar los valores de los campos a la clase contract utilizando el método getFromDialog

public void getFromDialog()
  {
            super();
       
            contract.parmInvoiceId(InvoiceIdField.value());
  }
  

Con esto tenemos nuestra clase UIBuilder creada, ahora deberemos indicarle a nuestra clase contract que tiene una clase UIBuilder para controlar el diálogo.
Esto lo haremos indicándole en el classdeclaration la clase UIbuilder.

 [
        DataContractAttribute,
        SysOperationContractProcessingAttribute(classStr(CustInvoiceJourReportUIBuilder), SysOperationDataContractProcessingMode::CreateUIBuilderForRootContractOnly)
  ]
  class CustinvoicejourReportContract implements SysOperationValidatable
 {
            FromDate        fromDate;
            ToDate          toDate;
            InvoiceId       invoiceId;
 }

Como veis no tiene ninguna dificultad la clase UIBuilder tan sólo es practicar un poco.



 

        

Comentarios