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