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

Hoy simplemente crearemos un par de campos de fechas para que interactúen con nuestro lookup de clientes.
Modificaremos el classDeclaration para dejarlo como se ve a continuación:

class TestRunBaseBatch extends RunBaseBatch
{
    //Campos que agregaremos al dialogo
    DialogField         dlgCustAccount;
    DialogField         dlgFromDate;
    DialogField         dlgToDate;

    //Variables a las que asignaremos el valor del campo del dialogo
    CustAccount         custAccount;
    FromDate             fromDate;
    ToDate                 toDate;

    #define.CurrentVersion(1) //Versión de la lista
    #LOCALMACRO.CurrentList
        CustAccount,
        FromDate,
        ToDate
    #ENDMACRO
}

En el diálogo meteremos los dos campos de fechas.

protected Object dialog()
{
    DialogRunbase   dialog = super();

    dlgCustAccount  = dialog.addFieldValue(IdentifierStr(CustAccount), custAccount, 'Cliente', 'Texto ayuda!!!!!!!');
    dlgFromDate     = dialog.addFieldValue(IdentifierStr(FromDate),    fromDate);
    dlgToDate         = dialog.addFieldValue(IdentifierStr(ToDate),      toDate);

    return dialog;
}

Modificaremos el método getFromDialog para recuperar el valor de los campos de fecha.

public boolean getFromDialog()
{
    custAccount = dlgCustAccount.value();
    fromDate    = dlgFromDate.value();
    toDate      = dlgToDate.value();

    return super();
}

Nos crearemos los métodos parm para los dos nuevos campos.

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

    return fromDate;
}

public ToDate parmToDate(ToDate _toDate = ToDate)
{
    ToDate = _toDate;

    return ToDate;
}

A continuación crearemos un método validate para los campos de fechas. Si os fijáis, utilizamos los campos del diálogo para recuperar el valor ya que el diálogo no se ha cerrado; el valor no ha sido traspasado a las variables FromDate y ToDate.

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;
}

En el método DialogPostRun le indicaremos que métodos serán sobrescritos para los campos de fecha

public void dialogPostRun(DialogRunbase _dialog)
{
    FormControl control;

    super(_dialog);

    //Sobreescribimos el método lookup del control CustAccount
    dlgCustAccount.registerOverrideMethod(methodstr(FormStringControl, lookup), methodstr(TestRunBaseBatch, custAccountLookup), this);
    //Sobreescrivimos el método validate de los controles de fecha
    dlgFromDate.registerOverrideMethod(methodstr(FormDateControl, validate),  methodstr(TestRunBaseBatch, dateValidate),      this);
    dlgToDate.registerOverrideMethod(methodstr(FormDateControl, validate),    methodstr(TestRunBaseBatch, dateValidate),      this);
}

Agregaremos el siguiente rango en la query:

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 este es el valor a devolver si no se le indica,
    //devuelve el primer campo de los agregados. En este 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();
}

Con todo lo que realizamos nuestro diálogo tendrá este aspecto:


Y veremos como se modifica la query en tiempo de ejecución mostrando solo los clientes que tengan facturas para el período de fechas introducidas.


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

Descargar fichero xpo

Comentarios