En el anterior articulo vimos como listar hechos con sus propiedades y prepararlo para importarlo en excel. En esta ocasión vamos hacer algo similar, pero con atributos. El fichero de texto que generara Command Manager contendrá las siguientes características de los atributos; Nombre, ID, Representación, Tabla Lookup, Ubicación, Expresión y sus tablas de origen.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_10_resultado_fichero_lista_atributos-e1599141104933.png)
Con este excel podremos tener un mayor control de los objetos existentes y puede ser útil por ejemplo, para una auditoria. Vamos a ver paso por paso como podéis reutilizar este procedimiento.
Pasos a seguir
Descargar el fichero de ejemplo
Podéis descargarlos el procedimiento para listar los atributos y sus propiedades de una carpeta concreta haciendo clic aquí, o bien podéis descargaros el procedimiento para obtener el listado de los atributos y sus propiedades de todo un proyecto haciendo clic aquí.
Explicación del código
Si se abre el procedimiento desde MicroStrategy Command Manager (Menú Archivo > Abrir Procedimiento) podéis encontrar las líneas de código con el detalle de lo que realiza cada paso. En caso de no conocer el lenguaje de programación, no te preocupes y saltate este paso ya que el procedimiento esta listo para usar.
//Creado por MiguelTroyano.com // Cabecera del fichero printOut("Nombre&ID&Representacion&TablaLookup&Ruta&Expresion&TablaOrigen"); // Obtenemos todos los atributos de un proyecto ResultSet rsAtributos = executeCapture("LIST ALL ATTRIBUTES FOR PROJECT '" + sNombreProyecto + "';"); ResultSet rsPropiedades = null; // Nos posicionamos en el primer atributo encontrado rsAtributos.moveFirst(); // Mientras que existan atributos entramos en el bucle while (!rsAtributos.isEof()){ // Se declaran las varibables para guardar el nombre y la ruta del atributo String sNombreAtributo = rsAtributos.getFieldValueString(DisplayPropertyEnum.NAME); String sRutaAtributo = rsAtributos.getFieldValueString(DisplayPropertyEnum.PATH); // Obtenemos todas las propiedades de los atributos rsPropiedades = executeCapture("LIST PROPERTIES FOR ATTRIBUTE '" + sNombreAtributo + "' IN FOLDER '" + sRutaAtributo + "' FOR PROJECT '" + sNombreProyecto + "';"); // Nos posicionamos en la primera propiedad del atributo correspondiente rsPropiedades.moveFirst(); // Se decara una variable para almacenar el ID del atributo String sIdentificadorAtributo = rsPropiedades.getFieldValueString(DisplayPropertyEnum.ID); // Accedemos al Result Set ATTRIBUTE_FORM ResultSet rsAttributeForms = (ResultSet)rsPropiedades.getFieldValue(DisplayPropertyEnum.ATTRIBUTE_FORM); rsAttributeForms.moveFirst(); // Mientras que existan resultados entramos en el bucle while(!rsAttributeForms.isEof()){ // Accedemos al Result Set ATTRIBUTE_EXPRESSION_LIST ResultSet rsExpresion = (ResultSet) rsAttributeForms.getFieldValue(DisplayPropertyEnum.ATTRIBUTE_EXPRESSION_LIST); // Si el resultado del Result Set no esta vacio continuamos if(rsExpresion != null){ // Almacenamos las variables en una sola String sResultado_parte1 = sNombreAtributo + "&"+ sIdentificadorAtributo + "&" + rsAttributeForms.getFieldValueString(DisplayPropertyEnum.ATTRIBUTE_FORM_NAME) + "&" + rsAttributeForms.getFieldValueString(DisplayPropertyEnum.ATTRIBUTE_LOOKUP_TABLE) + "&" + sRutaAtributo ; // Nos posicionamos en el primer elemento rsExpresion.moveFirst(); // Mientras que encontremos elementos entramos en el bucle while(!rsExpresion.isEof()){ // Concatenamos el resultado 1 con la expresión y lo almacenamos en resultado 2 String sResultado_parte2 = (sResultado_parte1 + "&" + rsExpresion.getFieldValueString(0)); // Accedemos al Result Set ATTRIBUTE_MAPPING_TABLE_LIST para obtener las tablas origen ResultSet rsExpresion2 = (ResultSet) rsExpresion.getFieldValue(DisplayPropertyEnum.ATTRIBUTE_MAPPING_TABLE_LIST); // Si el conjunto de datos es diferente de nulo entramos en el bucle if(rsExpresion2 != null){ // Nos posicionamos en el primer resultado rsExpresion2.moveFirst(); // Mientras que sigan existiendo resultados entramos en el bucle while(!rsExpresion2.isEof()){ // Concatenamos el resultado de la variable Resultado_parte2 con las tablas de origen del atributo printOut(sResultado_parte2 + "&" + rsExpresion2.getFieldValueString(0)); // Nos posicionamos en la siguiente tabla origen por si tiene más de una rsExpresion2.moveNext(); } // Nos posicionamos en la siguiente expresion por si tiene más de una rsExpresion.moveNext(); } } } // Nos posicionamos en el siguiente elemento por si tiene más de uno rsAttributeForms.moveNext(); } // Nos posicionamos en el siguiente atributo por si tiene más de uno rsAtributos.moveNext(); }
Si se observa el código, esta preparado para que los diferentes valores se separen con el delimitador & a pesar de que el mas común sea el punto y coma. Esto es así porque este carácter puede entrar en conflicto con la expresión de un atributo y detectar que son columnas diferentes al importatrlo en Excel.
Otro detalle a tener en cuenta es que si un atributo tiene más de una tabla de origen mapeada, aparecerá en el fichero en tantas filas como tablas de origen tenga.
Preparar la ejecución
Para ejecutar el procedimiento lo podríamos realizar desde el propio Command Manager, pero en esta ocasión lo vamos a ejecutar por la línea de comandos para guardar directamente el resultado en un fichero de texto.
Crea un script y un fichero por lotes para realizar la ejecución. Si no sabes cómo realizarlo lee el siguiente articulo donde detalla cada paso.
Preparar el fichero de resultados
Una vez que ha finalizado la ejecución del procedimiento nos habrá devuelto un fichero de texto que necesitamos modificarlo para que Excel lo lea correctamente. Abre el fichero de resultados y elimina las 6 primeras líneas.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_4_listar_atributos_eliminar_primeras_filas.png)
Haz lo mismo con las 6 últimas líneas.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_5_listar_atributos_eliminar_ultimas_filas.png)
Busca y remplaza la palabra CEST por CEST&. Este paso es muy importante para que al abrirlo en Excel detecte la fecha entera como una columna independiente y la podamos borrar sino nos interesa.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_6_listar_atributos_sustituir.png)
Importar el fichero de texto en Excel
Abre Excel y desde el menú Datos selecciona Obtener datos externos y continuación la opción Desde un archivo de texto
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_7_importar_txt.png)
En el asistente que se abre indicarle que el fichero de texto esta delimitado y que la primera fila contiene el encabezado.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_7_asistente_delimitador.png)
Después de pulsar en el botón Siguiente de la ventana anterior, marca la casilla Otro e indicarle que tu delimitador de columnas es el símbolo & y pulsa en Siguiente.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_8_asistente_delimitador_2.png)
En la siguiente imagen puedes ver una vista previa de las columnas que va a importar. Puedes observar que gracias a que hemos sustituido en pasos anteriores la palabra CEST por CEST& nos ha reconocido la columna entera de fecha. Sino la necesitas indicarle que no la importe.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_9_asistente_saltar_columna.png)
Por último, solicitara que indiquemos dónde deseamos insertar los datos.
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_11_importar_en_celda.png)
Resultado
![](https://www.migueltroyano.com/wp-content/uploads/2020/09/command_manager_10_resultado_fichero_lista_atributos-e1599141104933.png)