Buscar en este blog

jueves, 2 de octubre de 2014

Crear lookup en clase dialog en Ax 2012

Muchas veces necesitamos crear una clase dialog con un lookup para que el usuario seleccione un valor desde un combo para que después internamente nosotros podamos hacer "algo" con ese valor.

Una clase dialog vería así:

Ahora el código:

public class GRWPurchAgreementAddItem  extends RunBase
{
    //Declarando lo que se va a ocupar en la clase
    PurchAgreementHeader    purchAgreementHeader;
    TmpPurchLine            tmpPurchLine;
    ItemId                  itemId;
    DialogField             dlgItemId;
}

public ClassDescription caption()
{
    //Titulo que aparece el usuario (se ve en la imagen)
    return "Agregar artículo al acuerdo" ;
}

//Esta la importante
protected Object dialog()
{
    DialogRunbase       dialog = super ();

    FormStringControl   control;
    ;
    dialog = super ();

    //Aquí agregamos el campo a nuestra clase dialog, hasta todo igual que una
    //clase dialog cualquiera
    dlgItemId = dialog.addFieldValue( extendedTypeStr (ItemId), itemId);
   
    //Esta es la parte importante, aquí sobreescribimos el lookup del control que acabamos 
    //de crear y lo llenamos con el resultado de nuestro query (metodo en la misma clase: itemIdLookup)
    //que es la consulta que nos va a traer los datos que queremos presentar
    control = dlgItemId.control();
    control.registerOverrideMethod( methodStr (FormStringControl, lookup), methodStr (GRWPurchAgreementAddItem, itemIdLookup), this);

    return dialog;
}

public boolean getFromDialog()
{
    ;
    //Rescatamos el valor que el usuario seleccione en el combo
    itemId   = dlgItemId.value();

    return super();
}

public void itemIdLookup(FormStringControl _control)
{
    //Consultamos los valores que queremos presentar en el combo
    SysTableLookup          sysTableLookup;
    QueryBuildDataSource    queryBuildDataSource;
    QueryBuildRange         rangeitemId;
    Query                   query = new Query();

    queryBuildDataSource = query.addDataSource( tablenum(AgreementLine));

    sysTableLookup = SysTableLookup::newParameters( tablenum(AgreementLine), _control);
    sysTableLookup.addLookupfield( fieldnum(AgreementLine, ItemId),  true);
    //Aqui solo estoy aplicando un filtro al query que yo necesito por regla de negocio
    rangeitemId = query.dataSourceNo( 1).addRange(fieldNum (AgreementLine, Agreement));
    rangeitemId.value( int642str(purchAgreementHeader.RecId));

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}

public container pack()
{
    return connull();
}

public PurchAgreementHeader parmPurchAgreementHeader(PurchAgreementHeader _purchAgreementHeader = purchAgreementHeader)
{
    purchAgreementHeader = _purchAgreementHeader;
    return purchAgreementHeader;
}

public TmpPurchLine parmTmpPurchLine(TmpPurchLine _tmpPurchLine = tmpPurchLine)
{
    tmpPurchLine = _tmpPurchLine;
    return tmpPurchLine;
}

public void run()
{
    ;
    try
    {
        ttsbegin;
        //Aquí va lo que se vaya a hacer con el valor que selecciono el usuario en el combo
        tmpPurchLine.ItemId = itemId;
        tmpPurchLine.insert();

        ttscommit;
    }
    catch (Exception::Deadlock)
    {
        retry;
    }
    catch (Exception::UpdateConflict)
    {
        if (appl.ttsLevel() == 0)
        {
            if (xSession::currentRetryCount() >= 3)
            {
                throw Exception::UpdateConflictNotRecovered;
            }
            else
            {
                retry;
            }
        }
        else
        {
            throw Exception::UpdateConflict;
        }
    }
}

public boolean runsImpersonated()
{
    return true;
}

public boolean unpack(container packedClass)
{
    return true;
}


En mi caso yo necesitaba mandar llamar la clase a partir de un form


public void grwAddItem()
{
    GRWPurchAgreementAddItem gRWPurchAgreementAddItem;
    ;
    //Enviar a la clase, la temporal de las líneas
    //Enviar el purchAgreementHeader
    gRWPurchAgreementAddItem = new GRWPurchAgreementAddItem();
    gRWPurchAgreementAddItem.parmPurchAgreementHeader(purchAgreementHeader);
    gRWPurchAgreementAddItem.parmTmpPurchLine(TmpPurchLine);

    if (gRWPurchAgreementAddItem.prompt())
    {
        gRWPurchAgreementAddItem.run();
        TmpPurchLine_ds.executeQuery();
    }
}


Lookup para dimensiones financieras de organización
Rellenar o incluir caracteres en cadenas con strFix



Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio de algo.


No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 

1 comentario:

  1. Buenos días, quisiera hacerle una consulta muy puntual, en el reporte que desarrolle tengo un combo que selecciona el periodo(Semanal o Mensual), de acuerdo a lo seleccionado esto actualiza el rango de fechas(Fecha Inicio y Fecha Final). hasta ahí funciona a la perfección.

    periodoProgramacionField = this.bindInfo().getDialogField(this.dataContractObject(), methodstr(CMHProgramaOrdenTrabajoContract, parmPlanningPeriodoRecId));

    //Asigno el evento modificar periodo.

    periodoProgramacionField.registerOverrideMethod(methodStr(FormInt64Control, modified), methodStr(CMHProgramaOrdenTrabajoUIBuilder, periodoModified), this);

    // Metodo para modificar el rango de periodos.

    public void periodoModified(FormInt64Control _control)
    {

    EAMPlanningPeriod _EAMPlanningPeriod;
    str periodoDescricion;
    FromDate fech;
    _control.modified();

    periodoProgramacionField = this.bindInfo().getDialogField(this.dataContractObject(), methodstr(CMHProgramaOrdenTrabajoContract, parmPlanningPeriodoRecId));
    periodoRecId = periodoProgramacionField.value();

    periodoRecId = _control.value();


    //Obtenemos la descripción del periodo.
    while select firstOnly1 Description from _EAMPlanningPeriod
    where _EAMPlanningPeriod.RecId == periodoRecId
    {
    periodoDescricion = _EAMPlanningPeriod.Description;
    }


    planningEngine = new EAMPlanningEngine_PlanningBoardDetails(grupoProgramacionField.value(),periodoProgramacionField.value());

    fechaInicioField.value(planningEngine.boardStartDate());
    fechaFinalField.value(planningEngine.boardEndDate());
    periodoProgramacionField.value(periodoRecId);

    }

    una vez seleccionado el periodo paso a ejecutar el reporte esto hace que el Periodo se borre lo que esta seleccionado, esto a que se debe?? seguramente me falta actualizar el parámetro del Datacontract.

    si te das cuenta lo estoy actualizando los 3 parámetros con los nuevos valores.
    fechaInicioField.value(planningEngine.boardStartDate());
    fechaFinalField.value(planningEngine.boardEndDate());
    periodoProgramacionField.value(periodoRecId);
    solo de ellos permanece con su valor estos 2 parámetros.
    fechaInicioField.value(planningEngine.boardStartDate());
    fechaFinalField.value(planningEngine.boardEndDate());
    mientras el parámetro periodoProgramacionField se borra al ejecutar el reporte.
    Espero que me puedan apoyar con este problema,

    Saludos.

    ResponderBorrar