Anónimo
Agrupación de bases TXT
En Command Prompt uno varios archivos de TXT en uno solo.
Lo que necesito es poner este comando en un botón de Access o shortcut para que cuando copien los TXT los puedan unir con este acceso y se cree la liga a Access para varios reportes y gráficas
Lo que necesito es poner este comando en un botón de Access o shortcut para que cuando copien los TXT los puedan unir con este acceso y se cree la liga a Access para varios reportes y gráficas
1 Respuesta
Respuesta de dytcdo
1
1
Utiliza código con la función shell de VBA con copy file1+file2+file3 filetodo, personalizandola para tu caso
¿Este comando lo puedo utilizar para muchos archivos? Ejemplo copy *.txt Total.txt
Si, con shell lo que haces es pasar órdenes con VBA a la ventana de comandos, la que quieras.
En principio puedes usarlo para tantos como quieras, si pasas copy *.txt Total.txt, copiarás todos los archivos txt de un directorio en otro archivo llamado Total.txt. Con *.txt lo que no tendrás es control sobre el orden en que los copia, si quieres hacerlo de manera que la copia sea ordenada no te queda más remedio que copy file1.txt+file2.txt+... filetodo.txt
Puedes primero copiar todos los archivos en uno solo, y luego importarlos o vincularlos para trabajar con ellos dentro de Access.
Para hacer el vinculo a este Total.txt en un botón utiliza Docmd. TransferText con los parámetros adecuados para tu caso.
Lo que te aconsejo para el TransferText, si te parece más fácil, es que hagas una macro con el comando importar o vincular texto, con todos tu parámetros. Luego con el click derecho guardes la macro como módulo de visual basic. Modifiques los parámetros de este módulo a tu conveniencia y lo integres en el botón.
Yo me he encontrado con este en alguna ocasión, lo que he hecho ha sido lo siguiente:
Tener en la BD una tabla con el nombre de los archivos en un campo, en otro campo un valor numérico para el orden.
Construir la cadena de texto del comando copy leyendo esta tabla por orden, generalmente un RecordSet
Pasar esta cadena al comando Shell con cmd.exe para copiar todos los archivos txt en otro nuevo
Importar o vincular el archivo txt nuevo, con TransferTxt
La ventaja de tener los nombres de los archivos y el orden en una tabla, es que ante cualquier cambio es los nombres o el orden, sólo hay que cambiar los valores de la tabla y el código que hayas escrito te vale perfectamente, y además para cualquier nombre de archivo.txt, sin necesidad de modificar la programación que hayas hecho.
En principio puedes usarlo para tantos como quieras, si pasas copy *.txt Total.txt, copiarás todos los archivos txt de un directorio en otro archivo llamado Total.txt. Con *.txt lo que no tendrás es control sobre el orden en que los copia, si quieres hacerlo de manera que la copia sea ordenada no te queda más remedio que copy file1.txt+file2.txt+... filetodo.txt
Puedes primero copiar todos los archivos en uno solo, y luego importarlos o vincularlos para trabajar con ellos dentro de Access.
Para hacer el vinculo a este Total.txt en un botón utiliza Docmd. TransferText con los parámetros adecuados para tu caso.
Lo que te aconsejo para el TransferText, si te parece más fácil, es que hagas una macro con el comando importar o vincular texto, con todos tu parámetros. Luego con el click derecho guardes la macro como módulo de visual basic. Modifiques los parámetros de este módulo a tu conveniencia y lo integres en el botón.
Yo me he encontrado con este en alguna ocasión, lo que he hecho ha sido lo siguiente:
Tener en la BD una tabla con el nombre de los archivos en un campo, en otro campo un valor numérico para el orden.
Construir la cadena de texto del comando copy leyendo esta tabla por orden, generalmente un RecordSet
Pasar esta cadena al comando Shell con cmd.exe para copiar todos los archivos txt en otro nuevo
Importar o vincular el archivo txt nuevo, con TransferTxt
La ventaja de tener los nombres de los archivos y el orden en una tabla, es que ante cualquier cambio es los nombres o el orden, sólo hay que cambiar los valores de la tabla y el código que hayas escrito te vale perfectamente, y además para cualquier nombre de archivo.txt, sin necesidad de modificar la programación que hayas hecho.
Gracias por las respuesta es muy completa, el problema que tengo es que no manejo
VBMe ayudas con el comando compledo cosiderando que los archivos están en D: y se llaman ARCH1.txt ARCH2.txt ARCH3.txt
En access lo guardaría en Modules o como lo guardo
VBMe ayudas con el comando compledo cosiderando que los archivos están en D: y se llaman ARCH1.txt ARCH2.txt ARCH3.txt
En access lo guardaría en Modules o como lo guardo
Antes de todo, si me pasas una dirección de correo te paso todo lo que viene a continuación personalizado con los archivos de texto, bat y mdb del texto, que es un poco largo
Vamos por partes
1.- Crear el formulario con el botón
Si lo quieres poner en un botón has de crear un formulario
En este formulario creas un botón (un control)
Sobre este botón (control) se pueden realizar varios eventos (click, doble clic, mover el mouse, etc), y el botón hará que Access realice algo.
Al hacer un evento sobre un control generas una llamada a un procedimiento (no te asustes de esta frase, fue lo primero que leí yo de VB, y después de leerla varias veces no sabía lo que quería decir), dicho de manera más normal:
Control=botón (en este caso es un botón, pudiera ser un textbox, un checklist, ...)
evento= acción realizada sobre el control (click, doble click, ...)
Procedimiento= en este caso lo que quieres que Access haga, un pequeño programa
Al hacer un evento sobre un control generas una llamada a un procedimiento = al hacer click sobre el botón haces que se ejecute el "programita" (el código que luego te indicaré)
2.- Preparación previa para crear el "programita"
Vamos ha hacer que tenga dos partes
Parte 1
La primera que haga que se copien los archivos todos en otro nuevo, con la orden copy arch1.txt+arch2.txt+arch3.txt archtodo.txt.
Me has dicho que están en D: y son arch1.txt, arch2.txt, arch3.txt, el nombre del archivo con todos juntos será archtodo.txt. En este punto es importante utilizar nombres de archivos al viejo estilo 8+3 de DOS, Access falla a veces cuando el nombre del archivo tiene más de 8 caracteres.
La orden del prompt será:
Copy d:\arch1.txt+d:\arch2.txt+d:\arch3.txt d:\archtodo.txt
esta es la que hay que pasarle al shell
asegurate que al escribirlo en la ventada del prompt funciona adecuadamente
Antes habrá que borrar d:\archtodo.txt para que no pregunte si sobrescribe el archivo, igualmente con el shell
Lo más cómodo es que te hagas un archivo de proceso por lotes, un .bat, con estas dos líneas, y lo guardes en D:
del d:\archtodo.txt
copy d:\arch1.txt+d:\arch2.txt+d:\arch3.txt d:\archtodo.txt
para pasarselo al shell
Parte 2
La segunda que Access lo importe/vincule en una tabla, para esto es nesario saber si el archivo archtodo.txt tiene los valores separados por comas u otro carácter o delimitado (por posiciones en cada línea, por ejemplo, posiciones 1-15: nombre, 16-30: apellidos y 31-40: Número de teléfono)
a) Delimitado por caracteres
Si es separado por comas tendrá más o menos este aspecto
"Juan","Fernández", 913326845
"Luis","Pérez", 916549823
"María","González", 985848273
En este caso es habitual que los campos tipo texto vayan indicados con dobles comillas ("), pero no es necesario, esto se puede hacer fácilmente mediante un asistente. La coma (,) que separa los valores de cada campo puede ser otro carácter, ;, TAB, etc. He utilizado coma (,) por se un carácter bastante habitual (si usas Excel, el tipo de archivo csv, significa coma separated values, valores separados por comas) de manera que cada línea es un registro, y en cada línea cada valor separado por comas es el valor en un campo de ese registro.
b) Ancho fijo
Si es por posiciones, será más o menos con este aspecto
1234567890123456789012345678901234567890
Juan Fernández 913326845
Luis Pérez 916549823
María González 985848273
Para poder ver esto mejor, copia el texto y pégalo en cualquier editor de texto, y le das formato de fuente courier o courier new, esta fuente tiene la característica que todas las letras tienen el mismo ancho, con lo que verás que queda alineado en columnas. La primera línea de número la he puesto para que veas lo de las posiciones.
Saber de que tipo es tu archivo es necesario para saber como importarlo o vincularlo en una tabla, bastará que hagas varias pruebas, hasta que des justamente con la importación que deseas. Una vez que lo tengas claro, bastará que en el último paso del asistente de importación de archivos, justo antes de convertirlo en una tabla guardes la especificación de importación (donde quedan guardadas en el mdb la configuración para la importación de tu archivo txt), de esta manera una vez que lo hagas y lo guardes no tendrás que repetirlo.
Archivo>Obtener datos externos>Importar o Vincular. Si no vas a tener problemas de espacio en disco o la base es de menos de 1Gb, te aconsejo importar; si los archivos van a estar cambiando y no quieres estar importándolos con frecuencia Vincular. La mayor diferencia es que importando los metes en la base de datos y los puedes manipualr, es decir alimentas los datos de las tablas con los txt externos, si los vinculas no podrás nadas más que leerlos, no podrás cambiar el contenido de los txt directamente.
Una vez que se abre el asistente de importación, elige txt, y haz varias pruebas hasta que des con lo que necesitas, te aconsejo que dediques un tiempo a la ventana que sale en el botón "Avanzado" es mucho más potente y tienes en tu mano todos los parámetros de la importación/vinculación. Una vez que lo tengas guarda la especificación de importación, más adelante nos hará falta.
3.- Crear el "programita"
Hasta aquí ya está hecho casi todo,
Para escribir código en un botón, haces click con el botón derecho, y le das a generar evento, por defecto en un botón te seleccionará el evento click, verás que en la parte superior de la ventana te pone dos desplegables, en el de la inzquierda el nombre del botón y en el de la derecha pondrá click (el evento hacer click), la parte grande de abajo entre la línea Sub y la línea End Sub es donde has de escribir el procedimiento, el "programita"
Es esta ventana escribes el código, la primera parte ha de contener la línea
shell ("d:\copy_all.bat", vbHide)
VbHide, para que no se vea la ventana negra del prompt
La segunda parte es la de la importación, esta es la que te decía que es más fácil hacer con una macro, y luego convertirla a código, vama allá:
Primero haz la macro:
Macro>nueva
En acción busca TransferirTexto
En la parte de abajo de la ventana de macro te aparecen todas las opciones:
- Tipo de transferencia: delimitado o ancho fijo, según tu archivo
- Nombre de la especificación: esta es la especificación de importación que has guardado antes
- Nombre de la tabla: dale el nombre que quieras, por ejemplo TablaDatos
- Nombre del archivo: d:\archtodo.txt
- Contiene nombre de campos: según tu archivo, generalmente no
- Nombre de la tabla HTML: no te hace falta
- Página de códigos: déjalo en blanco a no ser que utilices varias codepages
guarda la macro, dale el nombre que quieras, por ejemplo MacroImport
Ahora una vez guardada, haces click con el botón derecho en el icono de la macro, y seleccionas guardar como, escoge guardarla como módulo en lugar de como macro. Esto lo que hace es que te convierte la macro en módulo de VBA.
Creará un módulo con una de las líneas algo así:
DoCmd. TransferText acImportDelim, "Especificación Delimitado", "TablaDatos", "d:\archtodo.txt", False, ""
Y borras la macro
Estas dos son las líneas de código que has de poner en el evento click del botón:
Shell("d:\copy_all.bat", vbHide)
DoCmd. TransferText acImportDelim, "Especificación Delimitado", "TablaDatos", "d:\archtodo.txt", False, ""
Vamos por partes
1.- Crear el formulario con el botón
Si lo quieres poner en un botón has de crear un formulario
En este formulario creas un botón (un control)
Sobre este botón (control) se pueden realizar varios eventos (click, doble clic, mover el mouse, etc), y el botón hará que Access realice algo.
Al hacer un evento sobre un control generas una llamada a un procedimiento (no te asustes de esta frase, fue lo primero que leí yo de VB, y después de leerla varias veces no sabía lo que quería decir), dicho de manera más normal:
Control=botón (en este caso es un botón, pudiera ser un textbox, un checklist, ...)
evento= acción realizada sobre el control (click, doble click, ...)
Procedimiento= en este caso lo que quieres que Access haga, un pequeño programa
Al hacer un evento sobre un control generas una llamada a un procedimiento = al hacer click sobre el botón haces que se ejecute el "programita" (el código que luego te indicaré)
2.- Preparación previa para crear el "programita"
Vamos ha hacer que tenga dos partes
Parte 1
La primera que haga que se copien los archivos todos en otro nuevo, con la orden copy arch1.txt+arch2.txt+arch3.txt archtodo.txt.
Me has dicho que están en D: y son arch1.txt, arch2.txt, arch3.txt, el nombre del archivo con todos juntos será archtodo.txt. En este punto es importante utilizar nombres de archivos al viejo estilo 8+3 de DOS, Access falla a veces cuando el nombre del archivo tiene más de 8 caracteres.
La orden del prompt será:
Copy d:\arch1.txt+d:\arch2.txt+d:\arch3.txt d:\archtodo.txt
esta es la que hay que pasarle al shell
asegurate que al escribirlo en la ventada del prompt funciona adecuadamente
Antes habrá que borrar d:\archtodo.txt para que no pregunte si sobrescribe el archivo, igualmente con el shell
Lo más cómodo es que te hagas un archivo de proceso por lotes, un .bat, con estas dos líneas, y lo guardes en D:
del d:\archtodo.txt
copy d:\arch1.txt+d:\arch2.txt+d:\arch3.txt d:\archtodo.txt
para pasarselo al shell
Parte 2
La segunda que Access lo importe/vincule en una tabla, para esto es nesario saber si el archivo archtodo.txt tiene los valores separados por comas u otro carácter o delimitado (por posiciones en cada línea, por ejemplo, posiciones 1-15: nombre, 16-30: apellidos y 31-40: Número de teléfono)
a) Delimitado por caracteres
Si es separado por comas tendrá más o menos este aspecto
"Juan","Fernández", 913326845
"Luis","Pérez", 916549823
"María","González", 985848273
En este caso es habitual que los campos tipo texto vayan indicados con dobles comillas ("), pero no es necesario, esto se puede hacer fácilmente mediante un asistente. La coma (,) que separa los valores de cada campo puede ser otro carácter, ;, TAB, etc. He utilizado coma (,) por se un carácter bastante habitual (si usas Excel, el tipo de archivo csv, significa coma separated values, valores separados por comas) de manera que cada línea es un registro, y en cada línea cada valor separado por comas es el valor en un campo de ese registro.
b) Ancho fijo
Si es por posiciones, será más o menos con este aspecto
1234567890123456789012345678901234567890
Juan Fernández 913326845
Luis Pérez 916549823
María González 985848273
Para poder ver esto mejor, copia el texto y pégalo en cualquier editor de texto, y le das formato de fuente courier o courier new, esta fuente tiene la característica que todas las letras tienen el mismo ancho, con lo que verás que queda alineado en columnas. La primera línea de número la he puesto para que veas lo de las posiciones.
Saber de que tipo es tu archivo es necesario para saber como importarlo o vincularlo en una tabla, bastará que hagas varias pruebas, hasta que des justamente con la importación que deseas. Una vez que lo tengas claro, bastará que en el último paso del asistente de importación de archivos, justo antes de convertirlo en una tabla guardes la especificación de importación (donde quedan guardadas en el mdb la configuración para la importación de tu archivo txt), de esta manera una vez que lo hagas y lo guardes no tendrás que repetirlo.
Archivo>Obtener datos externos>Importar o Vincular. Si no vas a tener problemas de espacio en disco o la base es de menos de 1Gb, te aconsejo importar; si los archivos van a estar cambiando y no quieres estar importándolos con frecuencia Vincular. La mayor diferencia es que importando los metes en la base de datos y los puedes manipualr, es decir alimentas los datos de las tablas con los txt externos, si los vinculas no podrás nadas más que leerlos, no podrás cambiar el contenido de los txt directamente.
Una vez que se abre el asistente de importación, elige txt, y haz varias pruebas hasta que des con lo que necesitas, te aconsejo que dediques un tiempo a la ventana que sale en el botón "Avanzado" es mucho más potente y tienes en tu mano todos los parámetros de la importación/vinculación. Una vez que lo tengas guarda la especificación de importación, más adelante nos hará falta.
3.- Crear el "programita"
Hasta aquí ya está hecho casi todo,
Para escribir código en un botón, haces click con el botón derecho, y le das a generar evento, por defecto en un botón te seleccionará el evento click, verás que en la parte superior de la ventana te pone dos desplegables, en el de la inzquierda el nombre del botón y en el de la derecha pondrá click (el evento hacer click), la parte grande de abajo entre la línea Sub y la línea End Sub es donde has de escribir el procedimiento, el "programita"
Es esta ventana escribes el código, la primera parte ha de contener la línea
shell ("d:\copy_all.bat", vbHide)
VbHide, para que no se vea la ventana negra del prompt
La segunda parte es la de la importación, esta es la que te decía que es más fácil hacer con una macro, y luego convertirla a código, vama allá:
Primero haz la macro:
Macro>nueva
En acción busca TransferirTexto
En la parte de abajo de la ventana de macro te aparecen todas las opciones:
- Tipo de transferencia: delimitado o ancho fijo, según tu archivo
- Nombre de la especificación: esta es la especificación de importación que has guardado antes
- Nombre de la tabla: dale el nombre que quieras, por ejemplo TablaDatos
- Nombre del archivo: d:\archtodo.txt
- Contiene nombre de campos: según tu archivo, generalmente no
- Nombre de la tabla HTML: no te hace falta
- Página de códigos: déjalo en blanco a no ser que utilices varias codepages
guarda la macro, dale el nombre que quieras, por ejemplo MacroImport
Ahora una vez guardada, haces click con el botón derecho en el icono de la macro, y seleccionas guardar como, escoge guardarla como módulo en lugar de como macro. Esto lo que hace es que te convierte la macro en módulo de VBA.
Creará un módulo con una de las líneas algo así:
DoCmd. TransferText acImportDelim, "Especificación Delimitado", "TablaDatos", "d:\archtodo.txt", False, ""
Y borras la macro
Estas dos son las líneas de código que has de poner en el evento click del botón:
Shell("d:\copy_all.bat", vbHide)
DoCmd. TransferText acImportDelim, "Especificación Delimitado", "TablaDatos", "d:\archtodo.txt", False, ""
Buenas tardes
Muchas gracias por la paciencia y la dedicación para con migo.
Cuando llego tu correo ya había hecho algo parecido pero muy lento y lo que me escribiste me sirvió de mucho.
Mis correo es (xxxxxx)
Muchas gracias por la paciencia y la dedicación para con migo.
Cuando llego tu correo ya había hecho algo parecido pero muy lento y lo que me escribiste me sirvió de mucho.
Mis correo es (xxxxxx)
- Compartir respuesta
- Anónimo
ahora mismo