Buscar en este blog

lunes, 29 de septiembre de 2014

Listas y containers desde Ax 2012 para .Net mediante business connector (BC)

Aquí les dejo un ejemplo de código que trabaja con el business connector de Ax. En este caso quiero comunicar Ax 2012 R2 con una aplicación externa desarrollada en C# de .Net.
Lo que hago primero es consultar todos los valores de dimensiones en Ax enviando como parámetro el nombre de la dimensión financiera que estoy buscando y guardo esos valores en una lista, el problema surge cuando vas a leer en .Net, yo me encontré con la pregunta de qué usar, si listas o containers de ax, y en caso de usar uno u otro, cómo leerlo en .Net, así que abajo dejo el código para leer tanto containers como listas provenientes de Ax 2012 R2.

Método en Ax

static List getDimensionValuesFromAttribute(Name nameDimensionAttribute)
{
    DimensionAttribute          attribute;
    Common                      common;
    //container                   conValues;
    //int i = 1;
    List                        values = new List(Types::String);
    DimensionFinancialTag       finanacialTag;
    Query                       query;
    QueryRun                    queryRun;
    QueryBuildDataSource        qbDS;
    ;

    attribute = DimensionAttribute::findByName(nameDimensionAttribute);

    query = new Query();
    qbDS = query.addDataSource(attribute.BackingEntityType);
    qbDS.addSelectionField(attribute.ValueAttribute);
    qbDS.addSelectionField(attribute.NameAttribute);

    if(attribute.Type == DimensionAttributeType::CustomList)
    qbDS.addRange( fieldNum (DimensionFinancialTag, FinancialTagCategory)).value(SysQuery::value(attribute.financialTagCategory()));

    queryRun = new QueryRun(query);
    while(queryRun.next())
    {
        common = queryRun.get(attribute.BackingEntityType);
        //Si quisiera usar container
        //conIns(conValues, i, common.(attribute.ValueAttribute));
        //info(strFmt("valor en contenedor: %1, %2", i, conPeek(conValues, i)));
        //i += 1;

        //Usando Listas
        values.addEnd(common.(attribute.ValueAttribute));
    }

    return values;
}


El método en C# quedaría de la siguiente forma:

public List <InfoComboEntidad > ConsultaValoresDimension(string nombreDimensionAx)
        {
            InfoComboEntidad infoCombo = new InfoComboEntidad ();
            List< InfoComboEntidad> listaInfoCombo = new List <InfoComboEntidad >();
            Axapta ax = new Axapta();
            AxaptaObject axObjeto;
            AxaptaObject axObjetoParseado;
            //AxaptaContainer contenedor;

            try
            {
                // autenticación con ax
                ax.Logon( null, null, null, null);

                // Funciona si AX regresa un container
                //contenedor = (AxaptaContainer)ax.CallStaticClassMethod("GRWTools", "getDimensionValuesFromAttribute", "CostCenter");
                //for (int i = 1; i <= contenedor.Count; i++)
                //{
                //    string dato = contenedor.get_Item(1).ToString();
                //}

                // Funciona si AX regresa un List
                axObjeto = ax.CreateAxaptaObject( "Object");
                axObjeto = ( AxaptaObject)ax.CallStaticClassMethod("GRWTools" , "getDimensionValuesFromAttribute" , "CostCenter" );
                axObjetoParseado = ( AxaptaObject)axObjeto.Call("getEnumerator" );

                while ( Convert.ToBoolean(axObjetoParseado.Call( "moveNext")))
                {
                    infoCombo = new InfoComboEntidad();
                    infoCombo.Clave = axObjetoParseado.Call( "current").ToString();
                    infoCombo.Descripcion = axObjetoParseado.Call("current" ).ToString();
                    listaInfoCombo.Add(infoCombo);
                }               

                ax.Logoff();

                return listaInfoCombo;
            }
            catch ( Exception ex)
            {
                ax.Logoff();
                throw new Exception(ex.Message);
            }
        }



Por último, te invito a que te unas a la página de facebook recién creada para estar al día con las actualizaciones del blog y que podamos tener más comunicación. La meta? es hacer la comunidad de habla hispana mas grande sobre Dynamics Ax en cuestiones de desarrollo.


No hay comentarios.:

Publicar un comentario