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

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
- Cambiado Miguel.Vazquez.MSDN lunes, 5 de enero de 2015 23:44 Misrouted
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
-
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
-
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
- Editado Jesús López domingo, 4 de enero de 2015 19:53 x
-
-
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?
- Editado Willams Morales domingo, 4 de enero de 2015 20:29
-
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.
-
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
-
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
- Editado Jesús López lunes, 5 de enero de 2015 7:12 x
-
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 -
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/ -
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 -