Como usar SysLookupMultiSelectCtrl en una clase de tipo SrsReportDataContractUIBuilder

Hilo iniciado por Andrés López Escárcega el 16 de abril de 2015

Viendo 7 entradas - de la 1 a la 7 (de un total de 7)
  • Autor
    Entradas
  • #10637
    RangoAndrés López EscárcegaAndrés López Escárcega
    Participante
    PARTICIPANTE
    1.199 Rincoins

    Compañeros estoy atorado con un problema.

    Lo siguiente es que a la clase VendTransListContract le agregué un campo más el método se llama:

    – parmGroupBy( ) (El nombre de este campo es Cadena)

    Para que ese campo se vea reflejado en el reporte de transacciones de proveedor de AX 2012.

    Más aparte, quiero que el campo Cadena se despliegue como un control de tipo SysLookupMultiSelectCtrl que me permita seleccionar y a la vez guardar varias opciones a la vez.

    Esto lo logré creando la siguiente clase de tipo SrsReportDataContractUIBuilder con sus respectivos métodos:

    class VendTransListUIBuilder extends SrsReportDataContractUIBuilder
    {
        DialogField                         groupByField;

        container                           returnIds1;

        SysLookupMultiSelectCtrl            msCtrl1;
    }

    public void build()
    {
        VendTransListContract   vendTransListContract;

        super();

        vendTransListContract = this.dataContractObject();

        groupByField          = this.bindInfo().getDialogField(vendTransListContract, methodStr(VendTransListContract, parmGroupBy));

        groupByField.lookupButton(FormLookupButton::Always);
    }

    public void lookupChain()
    {
        Query       query               = new Query(querystr(ChainGroupLookup));
        TableId     multiSelectTableNum = tableNum(smmBusRelChainGroup);
        container   selectedFields      = [multiSelectTableNum, fieldName2id(multiSelectTableNum, fieldStr(smmBusRelChainGroup, ChainId))];

        msCtrl1 = SysLookupMultiSelectCtrl::constructWithQuery(this.dialog().dialogForm().formRun(), groupByField.control(), query, false, selectedFields);
    }

    public void postRun()
    {
        this.lookupChain();
    }

    – No se me olvidó colocarle también el método getFromDialog a mi clase Builder

    public void getFromDialog()
    {
        #Characters

        VendTransListContract   vendTransListContract = this.dataContractObject();
        ;

        super();

        // Return Ids from the 1st mutli-select control
        if (msCtrl1)
            returnIds1 = msCtrl1.get();

        vendTransListContract.parmGroupBy(con2StrUnlimited(msCtrl1.getSelectedFieldValues(), #SEMICOLON));
    }

    Activo el debugger y empiezo a correr el reporte:

    1. En la pantalla de diálogo seleccionó los valores:  VAL1 y VAL2 en mi campo Cadena y le doy en Aceptar.

    2. En el debugger rastrea que en el método getFromDialog de mi clase Builder sí se están recibiendo todos los valores que seleccionó desde mi campo cadena al llamar el siguiente objeto en el código de mi método: msCtrl1.getSelectedFieldValues()

    Esta parte si se se llevando a cabo de forma correcta.

    Una vez que el debugger llega al código del método de la clase siguiente:

    VendTransListDP.processReport( ) ahí es donde veo que me surge un problema.

    Adentro de ese mismo método mando a llamar a mi campo cadena con la siguiente instrucción:

    variable = contract.parmGroupBy( );

    Pero resulta que en vez que reciba los valores: VAL1;VAL2

    Está recibiendo un solo valor: VAL1 (usualmente es el valor de la primera opción que elijo desde mi campo Cadena)

    El propósito del campo Cadena que le agregué al diálogo es que me permita generar el reporte de transacciones de proveedor también filtrando por los valores seleccionados desde Cadena.

    He intentado todos los ejemplos que he encontrado investigando en google, pero hasta ahora nada me resulta.

    ¿Alguien sabe si algo le hace falta más a mi código?

    #10638
    RangoXBBXBB
    Participante
    PARTICIPANTE
    1.049 Rincoins

    ¿Que devuelve parmGroupBy?

    #10639
    RangoAndrés López EscárcegaAndrés López Escárcega
    Participante
    PARTICIPANTE
    1.199 Rincoins

    parmGroupBy devuelve un string de tipo extended smmChainId

    Cuando lo mando a llamar desde el método getFromDialog de mi clase VendTransListUIBuilder:

    Recibe los valores VAL1,VAL2 (mismos que seleccione desde mi campo cadena de tipo SysLookupMultiSelectCtrl en el diálogo) juntos dentro de una cadena string y separados por coma.

    Sin embargo, cuando mando a llamar el mismo parmGroupBy( ) en el método processReport de la clase VendTransListDP entonces sólo devuelve VAL1.

    #10640
    RangoXBBXBB
    Participante
    PARTICIPANTE
    1.049 Rincoins

    Que tamaño de longitud(caracteres) tiene smmChainId y luego tu campo variable que recibe el parmgroupId

    variable = contract.parmgroupid

    #10641
    RangoAndrés López EscárcegaAndrés López Escárcega
    Participante
    PARTICIPANTE
    1.199 Rincoins

    Muchas gracias por tu atención, Pr0fesional así como a los demás miembros del foro.

    Volví analizar mi código y encontré cual era el problema.

    Es la siguiente línea de código en mi método VendTransListUIBuilder.getFromDialog( ):

        vendTransListContract.parmGroupBy(con2StrUnlimited(msCtrl1.getSelectedFieldValues(), #SEMICOLON));

    Cuando mando a llamar parmGroupBy( ) para que reciba los valores elegidos desde el campo Cadena ( msCtrl1.getSelectedFieldValues() ) le puse:

    con2StrUnlimited(msCtrl1.getSelectedFieldValues(), #SEMICOLON) – Le digo que los valores almacenados en un contenedor me los convierta en una cadena string y separados por ; .

    Por lo que, está recibiendo: VAL1;VAL2

    Está equivocado ya que cuando vuelvo a llamar parmGroupBy( ), desde el método processReport de la clase del data provider, me devolverá únicamente el primer valor.

    La corrección que hice fue:

    con2StrUnlimited(msCtrl1.getSelectedFieldValues(), #COMMA) – así el valor que recibe parmGroupBy( ) es: VAL1,VAL2

    Cuando lo vuelvo a llamar desde el data provider ahora sí me devuelve todos los valores que seleccioné desde Cadena y, por lo tanto, hace que funcione bien el filtro en mi reporte.

    A tu última pregunta Pr0fesional:

    smmChainId tiene un tamaño de 20 caracteres, al igual que mi campo variable.

    #10642
    RangoXBBXBB
    Participante
    PARTICIPANTE
    1.049 Rincoins

    Ok, si ya lo tienes.

    Me temí que estubieras usando una variable demasiado corta y se te estubiera cortando.

    #10643
    Rangoamoxtoamoxto
    Participante
    PARTICIPANTE
    1.049 Rincoins

    Hola Andres, se ve bien, lo que no entiendo es como relacionas el campo de la clase “contract” al lookup?. Lo hago de la siguiente manera y vale adicionar que desde esta clase “SrsReportDataContractUIBuilder” puedes manejar eventos como lo haces con los diálogos en Dinamics Ax de la siguiente manera:

    class FinishedProducLookUpContractBuilder extends SrsReportDataContractUIBuilder
    {

    DialogField dialogFlower;
    DialogField dialogPacking;
    //
    DialogField dialogStandarRose; 
    DialogField dialogAsiaticLilly;
    DialogField dialogNoveltyGreen;/
    //
    }

    public void postRun()

    {

    DialogField fld1D;

    DialogField fld2D;

    ;

    fld1D = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(ContractClass, parmType));
    fld1D .registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(NOVFinishedProducLookUpContractBuilder, classTypeLookUp), this);//classTypeLookUp método de esta clase – Evento búsqueda o lookup

    fld2D = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(ContractClass, parmFlower));
    fld2D .registerOverrideMethod(methodStr(FormCheckBoxControl, modified), methodStr(ClassContractBuilder, Fld5_1_modified), this); //Fld5_1_modified método de esta clase – Evento modificar o modified

    super();

    }

    public boolean Fld5_1_modified(FormCheckBoxControl _ctrl)

    {
    //FormCheckBoxControl rdpContract = this.dialog().formRun().controlCallingMethod();

    boolean isFieldModified;
    boolean isFieldValue;
    ;

    _ctrl = this.dialog().formRun().controlCallingMethod();

    isFieldModified = _ctrl.modified();
    isFieldValue = _ctrl.value();

    if(isFieldValue)
    {
    this.setCheck(true);
    } else
    {
    this.setCheck(false);
    }

    return isFieldModified;

    }

    public void classTypeLookUp(FormStringControl _ctrl)
    {
    Query DropDownquery;
    SysTableLookup sysTableLookup;
    QueryBuildDataSource qbds;
    QueryBuildRange qbr,qbr1;
    QueryBuildDataSource qbdsEcoResCategory;
    QueryBuildRange qbrEcoResCategory,qbr2;
    ;

    sysTableLookup = SysTableLookup::newParameters(tableNum(EcoResCategory), _ctrl);

    DropDownquery = new Query();

    qbds = DropDownquery.addDataSource(tableNum(EcoResCategory));

    qbdsEcoResCategory = qbds.addDataSource(tablenum(NOVEcoResCategory));
    qbdsEcoResCategory.joinMode(JoinMode::InnerJoin);
    qbdsEcoResCategory.relations(true);

    qbrEcoResCategory = qbdsEcoResCategory.addRange(fieldNum(NOVEcoResCategory,MarkLook));
    qbrEcoResCategory.value(queryValue(NoYes::Yes));

    sysTableLookup.addSelectionField(fieldNum(EcoResCategory, Name));
    //sysTableLookup.addLookupField(fieldNum(EcoResCategory, ReciD));
    sysTableLookup.addLookupField(fieldNum(EcoResCategory, Name));
    sysTableLookup.addLookupField(fieldNum(EcoResCategory, Code));
    sysTableLookup.parmQuery(DropDownquery);
    sysTableLookup.performFormLookup();
    }

    Saludos,

    amoxto

Viendo 7 entradas - de la 1 a la 7 (de un total de 7)
  • Debes estar registrado para responder a este debate.
Carrito de compra