1.6. Agregar una query al diálogo

Hoy mostraremos como agregar una query a nuestro diálogo, también veremos como agrupar los campos del diálogo en grupos.

Lo primero será declararnos una variable de tipo queryRun.
He creado dos versiones de listas para que veáis como funciona. Si modificamos una lista al intentar desempaquetarla si tiene más variables de las empaquetadas nos mostrará un mensaje de error el programa. Así que tenemos dos opciones: crearnos una lista nueva o borrar los datos de uso.

class TestRunBaseBatch extends RunBaseBatch
{
    QueryRun            qr;

    //Campos que agregaremos al diálogo
    DialogField         dlgCustAccount;
    DialogField         dlgFromDate;
    DialogField         dlgToDate;

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

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

En el método Dialog hemos agregado grupos. Más tarde veremos como queda esto.

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

    dialog.addGroup("Cliente");
    dlgCustAccount  = dialog.addFieldValue(IdentifierStr(CustAccount), custAccount, 'Cliente', 'Texto ayuda!!!!!!!');

    dlgGroup = dialog.addGroup("Fechas");
    dlgGroup.frameType(FormFrameType::Raised3D);
    dlgFromDate     = dialog.addFieldValue(IdentifierStr(FromDate),    fromDate);
    dlgToDate       = dialog.addFieldValue(IdentifierStr(ToDate),      toDate);

    return dialog;
}

En el método pack le indicamos que nos empaquete la query, así en la próxima ejecución los datos seleccionados en la query nos parecerán de nuevo.

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

Y en el unpack como explicaba al principio del post, verificamos que versión esta desempaquetando para saber que variables agregar.
Si nos fijamos en la versión dos, si no hay query la creamos.

public boolean unpack(container packedClass)
{
    Integer     version = RunBase::getVersion(packedClass);

    container   packedQuery;

    switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = packedClass;
            break;
        case #CurrentVersion2:
            [version,#CurrentList,packedQuery] = packedClass; //Añadimos el container para recuperar la query empaquetada en el pack

            if (SysQuery::isPackedOk(packedQuery))
            {
                qr = new QueryRun(packedQuery);
            }
            else
            {
                qr = this.queryRun();
            }
            break;
        default:
            return false;
    }
    return true;
}

En el método queryBuild creamos la query.

protected QueryRun queryBuild()
{
    qr = new QueryRun(querystr(CustInvoice));

    return qr;
}

En el método query run devolvemos la query.

public QueryRun queryRun()
{
    if (!qr)
    {
        this.queryBuild();
    }

    return qr;
}

Este método sirve para indicarle que  muestre los valores de la query (vamos el típico botón de query).

//Obligamos a que nos muestre el botón para la query
public boolean showQueryValues()
{
    return true;
}

Así es como nos quedará nuestro diálogo:


 
Han sido unos cuantos post donde hemos ido paso a paso añadiendo funcionalidad a la clase, espero que los conceptos hayan quedado claros. El siguiente paso será hacer lo mismo que hemos visto en estos post pero con el nuevo framework.
 
Para descargar el fichero xpo sólo tenéis que presionar en el siguiente enlace:

Descargar fichero xpo

Comentarios