1.11 Sobrescribir los métodos de los campos del diálogo interactuando entre ellos

Como hicimos con la RunBaseBatch vamos a agregar dos campos de tipo fecha para que interactúen con el lookup de clientes.

Lo primero que haremos será modificar nuestra clase contract para agregarle nuestros campos de fechas.

[DataContractAttribute,
  SysOperationContractProcessingAttribute(classStr(TestSysOperationUIBuilder))]

class TestSysOperationDataContract implements SysOperationInitializable, SysPackable
{
      CustAccount custAccount;

      FromDate fromDate;
      ToDate toDate;


 
     #define.CurrentVersion(1)
      #LocalMacro.ParmList
          custAccount,

          fromDate,
          toDate
      #EndMacro


Añadiremos los métodos parm para los dos campos.

[DataMemberAttribute,
 SysOperationDisplayOrderAttribute('2')]

public FromDate parmFromDate(FromDate _fromDate = fromDate)
{
   fromDate = _fromDate;
 
  return fromDate;
}

[DataMemberAttribute,
 SysOperationDisplayOrderAttribute('3')]
public ToDate parmToDate(ToDate _toDate = toDate)
{
   toDate = _toDate;
 
  return toDate;
}

Haremos lo mismo en la UIBuilder.

class TestSysOperationUIBuilder extends SysOperationAutomaticUIBuilder
{
      DialogField dlgCustAccount;
      DialogField dlgFromDate;
      DialogField dlgToDate;

      CustAccount custAccount;

      FromDate fromDate;
      ToDate toDate;

Modificaremos el lookup para que filtre por los campos de fecha(Texto en amarillo)

public void custAccountLookup(FormStringControl _control)
{
 
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tablenum(CustTable), _control);

  Query q = new Query();
  QueryBuildDataSource custTableQbds;
  QueryBuildDataSource invoiceTableQbds;
 
 

   //El true es para indicarle que éste es el valor a devolver, si no se le indica
  //devuelve el primer campo de los agregados. En éste caso también sería el AccountNum

   sysTableLookup.addLookupfield(fieldnum(CustTable, AccountNum),true);
   sysTableLookup.addLookupMethod(tableMethodStr(CustTable, Name)); //Con addLookupMethod podemos añadir un método

   custTableQbds = q.addDataSource(tablenum(CustTable)); 
   invoiceTableQbds = custTableQbds.addDataSource(tableNum(CustInvoiceTable));
   invoiceTableQbds.relations(false);

   invoiceTableQbds.joinMode(JoinMode::ExistsJoin);
 
  invoiceTableQbds.addLink(fieldNum(CustTable, AccountNum), fieldNum(CustInvoiceTable, OrderAccount));
   invoiceTableQbds.addRange(fieldNum(CustInvoiceTable, InvoiceDate)).value(queryRange(dlgFromDate.value(), dlgToDate.value())); //Usamos los campos dialog porque las variable fromDate y toDate no tienen valor todavía, ya que se recupera en el getFromDialog

   sysTableLookup.parmQuery(q);
   sysTableLookup.performFormLookup();



Nos crearemos un método que valide los campos de fecha.

public Boolean dateValidate(FormStringControl _control)
{
 
   boolean ret = true;

    if (dlgFromDate.value() && dlgToDate.value() && dlgFromDate.value() > dlgToDate.value())

   {
 
     ret = checkFailed(strFmt("La fecha desde no puede ser superior a la fecha hasta"));
    }
    return ret;}


public void postBuild()
{
 
    super();

     // get references to dialog controls after creation

   dlgCustAccount = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(TestSysOperationDataContract, parmCustAccount));
   dlgFromDate = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(TestSysOperationDataContract, parmFromDate));
   dlgToDate = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(TestSysOperationDataContract, parmToDate));
}

  
public void postRun()
{
 
    super();

     //Sobrescribimos el método lookup del control CustAccount
     dlgCustAccount.registerOverrideMethod(methodstr(FormStringControl, lookup), methodstr(TestSysOperationUIBuilder, custAccountLookup), this);

     //Sobrescribimos el método validate de los controles de fecha
     //Cuidado al agregar nuevos campos con lo empaquetado , refrescar caches
     dlgFromDate.registerOverrideMethod(methodstr(FormDateControl, validate), methodstr(TestSysOperationUIBuilder, dateValidate), this);

     dlgToDate.registerOverrideMethod(methodstr(FormDateControl, validate), methodstr(TestSysOperationUIBuilder, dateValidate), this);
}

*Es posible que os muestre un error al realizar la ejecución.
Recordad hacer un CIL y si habéis ejecutado la clase anteriormente, borrar los datos de uso o añadir una nueva versión a la contract.

Nuestro diálogo tendrá este aspecto:


 
Y si asignamos una rango de fechas podremos ver que el lookup está modificado.
 
 
 
 
Este post es el equivalente al siguiente para la RunBaseBatch:

1.5. Sobrescribir los métodos de los campos del diálogo interactuando entre ellos


Para descargar el fichero xpo sólo tenéis que presionar en el siguiente enlace:

Descargar fichero xpo
 
 
 


Comentarios