none
Ponerle orden o número (1,2,3...) a cada registro de una consulta. RRS feed

  • Pregunta

  • Hola buenos días, tengo el siguiente problema:

    Estoy trabajando con access, y tienen más de 640 000 registros, mi objetivo era o es, exportar a excel 10 tablas de 65 000 registros, pero mi tabla en access no tiene orden (así se me hubiese hecho más fácil filtrar mis exportaciones), por fa si alguien sabe como le agrego esos números de orden, (la tabla original no la tiene ya que es una importación de un txt y es el nuevo resultado lo que quiero exportar), si saben un método o una idea mejor se los agradecería bastante y me sacarían de un apuro.

    Saludos

    Moisés

    domingo, 4 de enero de 2015 14:41

Todas las respuestas

  • Hola,

    Hay dos formas de hacer lo siguiente:

    1. Por código C# lees los registros y le agregas un correlativo antes de exportarlo a excel.

    2. Usando SSIS para a través de un scriot task le agregues un correlativo a cada fila antes de exportar a excel.

    Saludos

    Luis Aldazabal

    domingo, 4 de enero de 2015 15:06
  • moisesmd,

    No entiendo el objetivo de particionar los 640000 registros en 10 tablas en Excel, si es por un tema de capacidad de almacenamiento y trabajas con Excel 2007 o superior el limite de filas es de 1048576 filas, así que no deberías tener problemas; en el caso de Excel 2003 la limitante es de 65536 filas.

    Luego de la aclaración, como bien mencionas, el tener una columna autonumerica en tu tabla ayudaría a hacer el filtro y exportar sólo lo seleccionado, pero, ¿porqué no creas es columna adicional? ¿Cuál es la limitante?

    Elije la vista diseño de la tabla, agrega al final un campo llamado id y dale el tipo de dato autonumeración, ello generará automáticamente los números correlativos para todas las filas que ya tengas en tu tabla. Finalmente has tu filtro según la columna id y si no quieres que exporte la columna id, sólo selecciona las columnas que deseas exportar (haciendo clic en las cabeceras de las columnas).

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.


    Willams Morales P.
    Arequipa - Perú

    • Propuesto como respuesta Enrique AA domingo, 4 de enero de 2015 21:23
    domingo, 4 de enero de 2015 16:57
  • Modificas la tabla en Access le añades un campo autonumérico y listo.

    Por cierto, este es un foro de SQL Server, no de Access ni de Excel



    Jesús López


    EntityLite a lightweight, database first, micro orm


    domingo, 4 de enero de 2015 19:52
  • Hola no estoy creando una tabla, trato de exportar data que yo no he diseñado, sino que ya existe, por eso es mi duda igual gracias por el alcance.
    domingo, 4 de enero de 2015 20:18
  • moises,

    Ni Jesús ni yo estamos sugiriendo que crees una tabla, lo que mencionamos es que hagas una modificación a la tabla que ya existe agregándole una columna de tipo [autonumeración]. Al agregar la columna todos los registros que ya tienes cargados se le asignará un número correlativo por fila, que es lo que tu necesitas, o por lo menos eso entiendo.

    Posterior a la exportación, si deseas borras esa columna que agregaste de manera temporal.

    ¿por qué no lo intentas y nos comentas los resultados?


    domingo, 4 de enero de 2015 20:27
  • Como bien menciona williams, el metodo de agregar una columna auto numerica en access me parece el metodo más facil y rapido, no tomes a mal los ocmentarios de que este es el foro incorrecto, aunque varias de las personas por aqui son multi disciplina y pueden ayudarte, es posible que obtengas mejores y más rapidas respuestas si vas al foro adecuado.
    domingo, 4 de enero de 2015 21:28
  • Hola gracias por la respuesta, lo que pasa es que si le pongo esa numeración a la tabla se pierden los registros en las consultas, y son 3 consultas con información modificada de la primera tabla, en las que quisiera esa auto numeración, he buscado y en las consultas (en vista diseño) no es posible asignar autonumeracion ya que solo salen los campos de la tabla consultada. Cada consulta tiene un resultado distinto para fines de información he alli el problema.

    Gracias, si estoy consultando otros foros de gestores de información.

    Saludos

    Moisés.


    Moisés Mayo

    domingo, 4 de enero de 2015 22:24
  • Moises,

    >> 

    lo que pasa es que si le pongo esa numeración a la tabla se pierden los registros en las consultas,

    <<

    ¿Cómo es que pasa eso? Que yo sepa, añadir una columna a una tabla de Access no afecta a las consultas. Es más, acabo de hacer la prueba ahora mismo, confirmando que añadir columnas a tablas no afecta a las consultas.

    Por otra parte. ¿Cómo piensas hacer la exportación? ¿Desde el propio Access usando las herramientas de access? o ¿estás dispuesto por ejemplo a hacer una pequeña aplicación de consola en C#?.

    Lo digo porque aquí somos bastantes los que seríamos capaces de hacer esa aplicación de consola. Podemos ejecutar una consulta sobre la base de datos de Access, obtener un datareader e ir introduciendo de 65000 en 65000 registros en distintas hojas de Excel o en distintos libros de Excel.

    Por cierto. ¿Qué es lo que pretendes? ¿Tener una hoja por cada 65000 registros? o ¿Tener un libro por cada 65000 registros?

    Y por último. ¿De qué version de Excel y de Access estamos hablando?

    Porque como dice Willams el límite de 64K filas hace tiempo que está superado en Excel. Y también que si vamos a hacer una app en c# necesitamos saber si lo podemos hacer con el Jet 4.0 o tenermos que hacerlo con el motor de Access. También tendríamos que saber si la base de datos es un mdb o una accdb



    Jesús López


    EntityLite a lightweight, database first, micro orm



    lunes, 5 de enero de 2015 7:01
  • Mira aquí tienes un código en C# de una app de consola que exporta una tabla con 750.000 registros a libros de Excel con 65.000 registros cada uno.

    La app hace uso de la librería ClosedXml:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.OleDb;
    using ClosedXML.Excel;
    using System.IO;
    
    namespace ExportAccessToExcel
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Jesús\Documents\NIF_SINIESTROS.accdb"))
                using (var cmd = new OleDbCommand("SELECT * FROM NIF_SINIESTROS_TABLE", cn))
                {
                    
                    cn.Open();
                    var recordIndex = 0;
                    var wkNumber = 0;
                    XLWorkbook wk = null;
                    using (var reader = cmd.ExecuteReader())
                    {
                        IXLWorksheet sheet = null;
                        while (reader.Read())
                        {
                            if (recordIndex % 65000 == 0)
                            {
                                SaveWorkbook(wkNumber, wk);
                                wk = new XLWorkbook();
                                wkNumber++;
                               
                                sheet = wk.AddWorksheet("Sheet" + wkNumber.ToString("000"));
                                recordIndex = 0;
                                AddHeader(sheet, reader);
                            }
                            AddRow(sheet, reader, recordIndex++);
                        }
                        SaveWorkbook(wkNumber, wk);
                    }
                }
            }
    
            private static void SaveWorkbook(int wkNumber, XLWorkbook wk)
            {
                if (wk != null)
                {
                    string fileName = "MyBook" + wkNumber.ToString("000") + ".xlsx";
                    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
                    wk.SaveAs(filePath);
                }
            }
    
            static void AddHeader(IXLWorksheet sheet, OleDbDataReader reader)
            {
                for(int fieldIndex = 0; fieldIndex < reader.FieldCount; fieldIndex++)
                {
                    sheet.Cell(1, fieldIndex + 1).Value = reader.GetName(fieldIndex);
                }
            }
            static void AddRow(IXLWorksheet sheet, OleDbDataReader reader, int recordIndex)
            {
                int row = recordIndex + 2;
                for (int fieldIndex = 0; fieldIndex < reader.FieldCount; fieldIndex++)
                {
                    sheet.Cell(row, fieldIndex + 1).Value = reader.GetValue(fieldIndex);
                }
            }
        }
    }
    



    Jesús López


    EntityLite a lightweight, database first, micro orm

    lunes, 5 de enero de 2015 7:58
  •        Que tal amigo puedes colocar un orden como quieres (1,2,3) desde tu Select .

    Ejemplo:

     SELECT ROW_NUMBER()  OVER (ORDER BY t.id) AS Row FROM tabla t

    Row   
    -------------------------------------------
    1     
    2     
    3     
    4     
    5     
    OBS: Favor vota si te es útil la información.
    Saludos 
    BEMO- Paraguay 
    https://tcsystems.wordpress.com/

    lunes, 5 de enero de 2015 11:41
  • Gracias por tu colaboración bader0907,  pero resulta que Moises usa una base de datos de Access y en Access desafortunadamente no existe la función analítica ROW_NUMBER() como sí existe en SQL Server.


    Jesús López


    EntityLite a lightweight, database first, micro orm

    lunes, 5 de enero de 2015 23:40
  •     Perdon Jesus .. no me percate de la base de datos...

    BEMO-Paraguay

    martes, 6 de enero de 2015 11:12