Exportar varias tablas a un mismo txt




Quiero exportar varias tablas de Access a un mismo txt por medio de VBA pero no se como, las siguientes son las limitaciones, empiezo al final a manejar código VBA y no sé como se hacen algunas cosas, todas las tablas tienen un ancho fijo distinto y campos variables por lo que no he podido pasarlas a una misma tabla y después exportar, la tabla 1 va al principio, la tabla 2 en medio y la tabla 3 al final, la tabla 2 puede tener de 2 registros o líneas hasta 8 millones por lo que hacer varios txt y luego unirlos con ms-2 consume mucho tiempo.
Puedes usar este código, que se lo puedes asignar a un botón, por ejemplo:


```
Dim miTXT As String
Dim miFila As String
Dim rst As DAO.Recordset
Dim i As Integer
'Ruta al fichero (si no existe lo crea, si existe lo sobreescribe)
miTXT = Application.CurrentProject.Path & "\Datos.txt"
'Abres el recordset
Open miTXT For Output As #1
'Primera tabla
Set rst = CurrentDb.OpenRecordset("Tabla1")
If rst.RecordCount <> o Then 'Si tiene registros
Do Until rst.EOF
'recorres todos los campos y los delimitas con TAB
For i = 0 To rst.Fields.Count - 1
miFila = miFila & rst(i) & vbTab
Next
'Pasas el registro al archivo y reseteas miFila
Print #1, miFila
miFila = ""
rst.MoveNext
Loop
End If
'Inserto una linea en blanco para separar
Print #1, ""
'Segunda tabla
Set rst = CurrentDb.OpenRecordset("Tabla3")
If rst.RecordCount <> o Then 'Si tiene registros
Do Until rst.EOF
'recorres todos los campos y los delimitas con TAB
For i = 0 To rst.Fields.Count - 1
miFila = miFila & rst(i) & vbTab
Next
'Pasas el registro al archivo y reseteas miFila
Print #1, miFila
miFila = ""
rst.MoveNext
Loop
End If
'Inserto una linea en blanco para separar
Print #1, ""
'Tercera tabla
Set rst = CurrentDb.OpenRecordset("TDatos")
If rst.RecordCount <> o Then 'Si tiene registros
Do Until rst.EOF
'recorres todos los campos y los delimitas con TAB
For i = 0 To rst.Fields.Count - 1
miFila = miFila & rst(i) & vbTab
Next
'Pasas el registro al archivo y reseteas miFila
Print #1, miFila
miFila = ""
rst.MoveNext
Loop
End If
'Cierras el archivo y el recordset
rst.Close
Set rst = Nothing
Close #1
```
Se podría "optimizar" para pasarle las tablas como parámetro y sustituir las lineas que se repiten para cada tabla por un ciclo que lo haga para cada tabla, pero a "efectos didácticos", así lo ves menos enrevesado.

Un saludo.
y apoyando mas la aportacion de made in china... te dejo este enlace:  
  
<http://www.elguille.info>  
  
me imagino que vas a modificar base de datos verdad?  
  
en realidad no es tan dificil... te lo comento muy general  
  
- creas las tablas con access y las pones en la pc que hara la de servidor.  
- realizas tu aplicacion normal, como si fueras a trabajar local(en una sola maquina). solo ten el cuidado de manejar alias, es decir... direcciona la base de datos con alias.  
- luego instala la aplicacion en todas las pc que te van a utilizar el sistema  
- mapea la tabla que esta el servidor  
- conecta en todas las pc la unidad de red(direccionada a la unidad mapeada)  
- crea el alias en las maquinas que van a usar el sistema  
  
listo..  
  
precauciones que debes de tomar:  
- integridad referencial(si es necesaria)   
- otorgar permisos de escritura a la tabla  
- tomar en cuenta el bloque de registros y el bloqueo de tablas.  
  
si lo que quieres es comunicar 2 pc por el puerto de red(cliente-servidor) entonces lee todo lo que puedas sobre el winsock.  
  
saludos.... ![wink](/ckeditor/plugins/smiley/images/icon_wink.gif) sigue valorando las respuestas Básicamente hay varias cosas que puedes hacer. 

* usando `SqlBulkCopy.WriteToServer` que no funciona muy bien junto con EF, sin embargo, existen varios intentos para crear extensiones
* utilizando un procedimiento almacenado que tomará un registro grande y lo dividirá de acuerdo con alguna lógica
* utilizando parámetros de procedimiento almacenado escritos en la tabla y realice una llamada al procedimiento almacenado (y varias `insert ... select` dentro del procedimiento almacenado)

 En general, prefiero la tercera opción. 

 Marque esta pregunta [Entity Framework Stored Procedure Tabla Valor Parámetro](https://stackoverflow.com/questions/8157345/entity-framework-stored-procedure-table-value-parameter) -importar contacto:

aviso y aviso y andie me lee.....e avisado siemrpe que el importar contactos de un msn a otro noe s seguro....la razon:
no importas todos es decir,pierdes muchos por el camino y a otros no les llega las invitaciones o solicitudes de agregar.siempre e dicho y dire,que aunq cueste mucho mas trabajo agregarlos uno a uno es mas seguro y los tendras a todos..y otra manera que siemrpe e dicho es..a traves de email ya que cada eamil puedes mandarseloa 50 contactos a la vez,mandas el email con tu direccion nueva y que ellos te agureguen.. :) pues solo la plantilla ojdt. revisa bien la plantilla csv o txt que parece que tiene o detecta más columnas de las que estás pasando…

configura la plantilla de nuevo partiendo de cero o elimina todas las columnas y filas que te sobren… Recibí una respuesta de Brice Lambson que trabaja en el equipo central de EF: 


>  Vas en la dirección correcta: abre las conexiones menos. Recuerde, las conexiones SQLite son esencialmente secuencias de archivos, por lo que mantenerlas abiertas por más tiempo no es realmente un problema. 
> 
>  **Si solo hay una instancia de DbContext por conexión, DbContext aún puede ser propietario de la conexión, incluso si se crea externamente. Simplemente disponga la conexión dentro de DbContext.Dispose ().** 
> 
>  Si eso no es suficiente, puede intentar crear un grupo de conexiones. La gestión de la vida puede ser difícil. Lo importante es que una conexión no se usa fuera del hilo en el que se creó. 
> 
>  El uso de Cache = Shared (es decir, [Shared-Cache Mode](https://www.sqlite.org/sharedcache.html) ) también puede ayudar al rendimiento. 
> 
> Para volver a agregar una tabla a su modelo, primero deberá eliminar la tabla de su modelo. (se puede ver una lista de tablas en el árbol [model.Store] (vea el panel ' **Explorador de modelos** '; puede abrirla desde el menú del botón derecho del mouse). Cuando ejecute 'Actualizar modelo desde la base de datos ...' la tabla aparecerá en la pestaña 'Agregar' en el primer paso del 'Asistente de actualización'. 

 Pasos para completar: 

1. Cierra tu modelo en Visual Studio.
2. Abra su archivo .edmx en un editor de texto.
3. Busque y elimine los elementos de la entidad XML (vea las notas a continuación).
4. Abre tu modelo en Visual Studio.
5. Haga clic en Actualizar modelo de la base de datos.

 Para eliminar todas las referencias a una tabla en su Modelo: 

* En el elemento 'EntityContainer', elimine todos los elementos secundarios 'EntitySet' que tienen el atributo 'Nombre' establecido en el valor [TableNameToReAdd].
* En el elemento 'EntityContainer', elimine todos los elementos secundarios 'AssociationSet' donde exista un elemento 'End' que tengan su atributo 'EntitySet' establecido en el valor [TableNameToReAdd].
* En el elemento 'EntityContainer', elimine todos los elementos secundarios 'EntityType' donde tengan el atributo 'Nombre' establecido en el valor [TableNameToReAdd].
* En el elemento 'EntityContainer', elimine todos los elementos secundarios de 'Asociación' donde exista un elemento 'Fin' que tenga su atributo 'Función' establecido en el valor [TableNameToReAdd]. Aquí está la solución. Puede utilizar el siguiente código: 


```
context.Table.Where(x => x.Field1 > 0).Update(y => new Table { Field2 = y.Field2 + 1 });

```
  Espero que ayude. hola. tienes tres consultas abiertas con el mismo tema. debes cerrar por lo menos dos. saludos el for all entries es una sentencia que se utiliza para obtener la data de una tabla (en este caso vbfa) usando como parametros de entrada todos los registros de una tabla en particular (en este caso t\_vbak), en otras palabras en la sentencia se buscan todas las facturas generadas (se obtienen de la… no puedo estar de acuerdo con joeqwerty más, para ser honesto. no mencionar el tipo de control que tiene, pero todos los de la perc 5 y 6 tarjetas pueden realizar en directo de la matriz de expansión, aunque me gustaría ser fuertemente tentados a totalmente de copia de seguridad de su volumen. de esta manera su nuevo disco/s pasarán a formar parte de la r5 de la matriz y por lo tanto será capaz de sobrevivir a un fallo de disco único. si usted sólo tiene que añadir otro punto, a continuación, en el caso de la pérdida de un disco con buenas probabilidades de perder todo el almacén de datos vmfs (el riesgo de la disminución de si estás en esx/i v4), además de la expansión de la matriz a 6 unidades te da 300 gb más de espacio que el dos 3 matrices de unidad.