Hay muchas formas de enviar el resultado de una consulta a una planilla Excel, aquí veremos una de esas formas.
NOTA: el código fuente está basado en Visual FoxPro pero puede ser fácilmente adaptado a otros lenguajes de programación.
La ventaja de este método es que nos resultará muy fácil enviar la consulta que queremos, al libro Excel que queremos, a la hoja Excel que queremos, en el rango que queremos mostraremos la consulta, y esa consulta puede estar basada en cualquier tabla o en cualquier vista de nuestra Base de Datos del Firebird.
Primero, creamos la función que se encargará de realizar la tarea.
Listado 1.
FUNCTION ENVIAR_EXCEL_CON_DSN LParameters tcDSN, tcUsuario, tcPassword, tcConsulta, tcRango Local lcMensajeError, lcConsulta, loExcel, loLibro, loHoja, loTabla, lcConexion, lcBaseDatos lcMensajeError = "" tcRango = iif(VarType(tcRango) <> "C", "A1", tcRango) && Si no se definió donde colocar la tabla, se la coloca en la celda A1 *-- Tratamos de crear un objeto Excel if Empty(lcMensajeError) loExcel = CreateObject("Excel.Application") lcMensajeError = iif(VarType(loExcel) <> "O", "No se pudo crear el objeto EXCEL, verifica si está instaldo EXCEL", lcMensajeError) endif *-- Si todo OK, tratamos de crear un libro Excel if Empty(lcMensajeError) loLibro = loExcel.Workbooks.Add lcMensajeError = iif(VarType(loLibro) <> "O", "No se pudo crear el libro de EXCEL", lcMensajeError) endif *-- Si todo OK, tratamos de crear una hoja en el libro Excel if Empty(lcMensajeError) loHoja = loLibro.Worksheets(1) lcMensajeError = iif(VarType(loHoja) <> "O", "No se pudo crear la hoja en el libro EXCEL", lcMensajeError) endif *-- Si todo OK, creamos el string de conexión a la Base de Datos del Firebird, usando el DSN de esa Base de Datos if Empty(lcMensajeError) lcConexion = "ODBC;DSN=" + tcDSN + ";USER=" + tcUsuario + ";PASSWORD=" + tcPassword endif *-- Si todo OK, tratamos de conectarnos a la Base de Datos del Firebird if Empty(lcMensajeError) loTabla = loHoja.QueryTables.Add(lcConexion, loHoja.Range(tcRango), tcConsulta) lcMensajeError = iif(VarType(loTabla) <> "O", "No se pudo crear la tabla de consulta en la planilla Excel", lcMensajeError) endif *-- Si todo OK, insertamos la tabla en la planilal Excel if Empty(lcMensajeError) #DEFINE xlInsertEntireRows 2 loTabla.RefreshStyle = xlInsertEntireRows loTabla.Refresh endif *-- Si todoOK, mostramos la planilla Excel if Empty(lcMensajeError) loExcel.Visible = .T. endif *-- Liberamos de la memoria los objetos que habíamos creado loTabla = .NULL. loHoja = .NULL. loLibro = .NULL. loExcel = .NULL. Return(lcMensajeError) * *
Y después llamamos a esa función, con los parámetros que deseemos usar.
Listado 2.
Local lcDSN, lcUsuario, lcPassword, lcConsulta, lcMensajeError, lcRango lcDSN = "AUTOMUNDO-FIREBIRD" lcUsuario = "SYSDBA" lcPassword = "masterkey" lcConsulta = "SELECT " ; + " ASC_ANOEJE, " ; + " ASC_CODSUC, " ; + " ASC_FECHAX, " ; + " ASC_NUMERO " ; + "FROM " ; + " V_CONTA_ABM_ASIENTOS " ; + "WHERE " ; + " ASC_NUMERO >= 100 AND " ; + " ASC_NUMERO <= 120" lcRango = "B5" lcMensajeError = ENVIAR_EXCEL_CON_DSN(lcDSN, lcUsuario, lcPassword, lcConsulta, lcRango) *-- Si ocurrió algún error, mostramos un mensaje al usuario if !Empty(lcMensajeError) #DEFINE MSG_ICONO_ERROR 16 #DEFINE MSG_BOTON_ACEPTAR 0 =MessageBox(lcMensajeError, MSG_ICONO_ERROR + MSG_BOTON_ACEPTAR, "Hay un problema...") endif Return * *
Y así obtendremos una planilla similar a la siguiente:
Captura 1. Si haces clic en la imagen la verás más grande
Por lo tanto, nos resultará muy sencillo crear una planilla Excel con los datos que el usuario pueda necesitar. Inclusive podríamos tener en nuestra aplicación una opción que le muestre todas las vistas disponibles y que le permita crear consultas personalizadas, a su gusto y paladar. Ya depende de la creatividad de cada uno hacer algo así.
Artículos relacionados:
Usando EXCEL para leer bases de datos de Firebird
Planillas EXCEL dinámicas con Firebird (1)
Planillas EXCEL dinámicas con Firebird (2)
Comentarios recientes