Dim strLabelText As String = "Hello this is a bunch of text to" &vbCr & "illustrate a point about text wrapping"
En un blog anterior, "Creación de un panel para mostrar tablas XFC", expliqué cómo crear un panel que mostrara el contenido de las tablas XFC de sus aplicaciones mediante un editor de tablas SQL. Esto se basó en la solicitud de un cliente. Tras ver el panel, el cliente quería exportar los datos de la tabla a un archivo CSV. Sí, es posible hacer clic derecho en un editor de tablas SQL y seleccionar "Exportar a CSV", lo que exportará los datos a un archivo CSV.
El problema con este enfoque es que, por razones de rendimiento, el Editor de Tablas SQL pagina los datos devueltos. Para conjuntos de datos grandes, puede haber muchas páginas de datos que solo se recuperan al navegar a ellas en el Editor de Tablas SQL. Al hacer clic derecho y exportar a CSV, solo se exportan los datos de la pestaña en la que se encuentra.
¿Qué ocurre si los usuarios desean exportar todo el contenido de la tabla que seleccionaron a un archivo CSV? Existe una solución, generalmente disponible en OneStream. Esto se puede lograr mediante un botón y un extensor de panel.
Paso 1. Agrega un botón a tu panel. En esta captura de pantalla, estoy agregando un botón a un panel que creé para un blog anterior.
Paso 2. Configure el botón para ejecutar un extensor de panel y pase el parámetro que contiene el nombre de la tabla seleccionada en el cuadro combinado, como un par de nombre y valor.
Paso 3. Cree un extensor de panel que consultará la base de datos de la aplicación para la tabla seleccionada, obtendrá todo el contenido de esa tabla, lo cargará en una tabla de datos y luego escribirá el contenido de esa tabla de datos en un archivo CSV en la base de datos de la aplicación, accesible a través del Explorador de archivos.
Los siguientes pasos se realizan todos dentro del Dashboard Extender que acaba de crear.
Paso 4. Cree una variable para almacenar el valor del nombre de la tabla seleccionada
'Obtener el nombre de la tabla seleccionada
Dim strTableName = args.NameValuePairs.XFGetValue("SelectedTable")
Paso 5. Necesitará una consulta SQL que utilice el nombre de la tabla seleccionada para devolver todo el contenido de la tabla seleccionada a una tabla de datos.
'Cree una consulta SQL que obtendrá todo el contenido de la tabla seleccionada
Dim sql As New System.Text.StringBuilder
sql.AppendLine($"
SELECT * FROM {strTableName}
")
'Return the SQL table and load the contents into a Data Table in memory
Dim dt As new DataTable()
Using dbConnApp As DbConnInfo = BRApi.Database.CreateApplicationDBConnInfo(si)
dt = BRApi.Database.ExecuteSql(dbConnApp, sql.ToString, False)
End Using
En este punto, tendrá una tabla de datos en memoria. El siguiente paso será escribir el contenido de esa tabla en un archivo CSV. El código que utilizo creará varios archivos CSV si hay más de un millón de registros en la tabla de datos. En este caso, esto se hizo porque los usuarios abrían el archivo CSV en Excel y necesitaba tener en cuenta las limitaciones de filas de Excel.
Paso 6. Defina el nombre del archivo CSV y la ruta del archivo. En este caso, uso el nombre de la tabla como nombre del archivo. Observe cómo defino la ruta del archivo con el nombre del usuario. La función si.UserName devuelve el nombre del usuario con un espacio entre el nombre y el apellido. Este espacio debe eliminarse, ya que la ruta del archivo de la base de datos de la aplicación no contiene ningún espacio.
'Crea las variables que definirán el nombre del archivo y la ruta de exportación
'Nota: La ruta del archivo de inicio incluye el nombre de usuario y elimina los espacios del nombre de usuario.
Dim strFileName As String = strTableName
Dim strFilePath As String = $"Documents/Users/{stringhelper.RemoveSystemCharacters(si.UserName,false,false)}"
Paso 7. Cree un objeto del Generador de Cadenas que contendrá el contenido de la Tabla de Datos. Este objeto se utilizará para crear el archivo CSV. A continuación, mediante la línea de anexión, agregue el registro de encabezado del archivo al Generador de Cadenas utilizando los Nombres de Columna de la Tabla de Datos. Esto es opcional, dependiendo de si desea o no el registro de encabezado en el archivo CSV.
'Objeto generador de cadenas que contendrá el contenido de la tabla de datos que se completó a partir de la consulta de tabla SQL
Dim fileAsString As New System.Text.StringBuilder
'Create the Header row for the export file based on the Column Names in the Data Table
fileAsString.AppendLine(String.Join(","dt.Columns.Cast(Of DataColumn).Select(Function(x) x.ColumnName)))
Paso 8. Ahora debe recorrer el contenido de la tabla de datos y agregarlo al generador de cadenas mediante el método de matriz de elementos de la tabla de datos. Agregue cada registro al generador de cadenas con una coma entre cada campo. La coma se debe a que estamos creando un archivo CSV, delimitado por comas.
'Recorrer todas las filas de la tabla de datos y agregarlas al objeto generador de cadenas
For Each dr As DataRow In dt.Rows
fileAsString.AppendLine(String.Join(",",dr.ItemArray()))
Paso 9. El último paso es escribir el contenido del Generador de Cadenas en la Base de Datos de la Aplicación, en la Carpeta de Usuarios. Tenga en cuenta que, en este ejemplo, la escritura se produce al alcanzar el final de la Tabla de Datos o al alcanzar un millón de registros (para gestionar el tamaño del archivo). La escritura utiliza brapi.filesystem.insertorupdateFile. Para usar esta función, el Generador de Cadenas debe convertirse a byte y luego pasarse a un objeto XFile.
'Verificar si se ha agregado un millón de registros al objeto generador de cadenas
'o si se ha alcanzado el final de la tabla de datos
'En cualquier caso, el objeto generador de cadenas se escribe en la carpeta de archivos de la aplicación mediante brapi.FileSystem.InserOrUpdateFile
'Si la tabla de datos contiene más de un millón de registros, el proceso crea archivos CSV separados para cada grupo de un millón
If (intY + 1) Mod 1000000 = 0 Or intY = dt.Rows.Count = 1 Then
Dim fileAsByte() As Byte = Sytem.Text.Encoding.Unicode.GetBytes(fileAsString.ToString)
Dim xfFileDataInfo As New XFFileInfor(fileSystemLocation.ApplicationDatabase,$"{strFileName}{intWriteCount}.csv",strFilePath)
Dim xFFileData As New XFFile(xfFileDataInfo,String.Empty,fileAsByte)
brapi.FileSystem.InsertOrUpdateFile(si,XfFileData)
intWriteCount = intWriteCount + 1
FileAsString.AppendLine(String.Join(",",dt.Columns.Cast(Of DataColumn).Select(Function(x) x.ColumnName)))
End If
intY = intY + 1
El código en su totalidad.
Public Function Export_XFC_Table_Data(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardExtenderArgs) as Object
Try
'Obtener el nombre de la tabla seleccionada
Dim strTableName = args.NameValuePairs.XFGetValue("SelectedTable")
'Cree una consulta SQL que obtendrá todo el contenido de la tabla seleccionada
Dim sql As New System.Text.StringBuilder
sql.AppendLine($"
SELECT * FROM {strTableName}
")
'Devuelve la tabla SQL y carga el contenido en una tabla de datos en la memoria
Dim dt As new DataTable()
Using dbConnApp As DbConnInfo = BRApi.Database.CreateApplicationDBConnInfo(si)
dt = BRApi.Database.ExecuteSql(dbConnApp, sql.ToString, False)
End Using
'Cree las variables que definirán el nombre del archivo de exportación y la ruta
'Nota: La ruta del archivo de inicio incluye el nombre de usuario y elimina los espacios del nombre de usuario.
Dim strFileName As String = strTableName
Dim strFilePath As String = $"Documents/Users/{stringhelper.RemoveSystemCharacters(si.UserName,false,false)}"
'Objeto generador de cadenas que contendrá el contenido de la tabla de datos que se completó a partir de la consulta de tabla SQL
Dim fileAsString As New System.Text.StringBuilder
'Cree la fila de encabezado para el archivo de exportación según los nombres de columna en la tabla de dato
fileAsString.AppendLine(String.Join(","dt.Columns.Cast(Of DataColumn).Select(Function(x) x.ColumnName)))
Dim intWriteCount As Integer = 1
Dim intY As Integer = 0
For Each dr As DataRow In dt.Rows
fileAsString.AppendLine(String.Join(",",dr.ItemArray()))
'Check to see if either a million records have been added to the String Builder Object
'Or the end of the Data Table has been reached
'In either case the String Builder Object is written to the Application File Folder using brapi.FileSystem.InserOrUpdateFile
'If the Data Table contains more than 1 million records the process creates a seperate CSV files for each group of a million
If (intY + 1) Mod 1000000 = 0 Or intY = dt.Rows.Count = 1 Then
Dim fileAsByte() As Byte = Sytem.Text.Encoding.Unicode.GetBytes(fileAsString.ToString)
Dim xfFileDataInfo As New XFFileInfor(fileSystemLocation.ApplicationDatabase,$"{strFileName}{intWriteCount}.csv",strFilePath)
Dim xFFileData As New XFFile(xfFileDataInfo,String.Empty,fileAsByte)
brapi.FileSystem.InsertOrUpdateFile(si,XfFileData)
intWriteCount = intWriteCount + 1
FileAsString.AppendLine(String.Join(",",dt.Columns.Cast(Of DataColumn).Select(Function(x) x.ColumnName)))
End If
intY = intY + 1
Next
Ahora, al hacer clic en el botón del panel, se ejecuta la extensión del panel y crea un archivo CSV en la carpeta de la base de datos de la aplicación, dentro de la carpeta Usuarios. Si el usuario selecciona el archivo y hace clic en el botón de descarga (en el Explorador de archivos), este se descargará en su escritorio local.
¿Quiere saber más sobre OneStream Software? Los consultores de MindStream Analytics están aquí para ayudarle a optimizar sus consolidaciones e informes.
Descubra el poder de OneStream Quickviews y mejore su proceso de planificación y análisis financiero (FP&A) con este interesante seminario web presentado por Erick Lewis de MindStream Analytics.
OneStream CPM
OneStream se alinea con las necesidades de su negocio y cambia más rápida y fácilmente que cualquier otro producto al ofrecer una plataforma y un modelo para todas las soluciones financieras de CPM. OneStream emplea guiado Flujos de trabajo, validaciones y mapeo flexible para brindar confianza en la calidad de los datos para todas las recopilaciones y análisis al tiempo que se reduce el riesgo a lo largo de todo el proceso financiero auditable.