Trabajar con los datos de un archivo de texto |
|||
Por Enrique Martínez Montejo |
|||
Última revisión: 11/05/2003 |
|||
1. Utilizar objetos de acceso a datos con archivos de textoMediante el formato Text del Método de Acceso Secuencial Indexado Instalable (IISAM) de Microsoft Jet, podemos utilizar la información contenida en un archivo de texto, tanto si los campos están delimitados por caracteres como si son de longitud fija, para abrir dichos archivos de texto, o para importar, exportar o vincular los datos desde, o hacia, otros formatos de bases de datos, aunque en éste artículo, el único formato de base de datos que se utilizará es el formato de Microsoft Access 2000, utilizando para ello las dos bibliotecas más conocidas de acceso a datos, como son Microsoft DAO 3.6 Object Library (DAO) y Microsoft ActiveX Data Object (ADO). Antes de comenzar, quiero hacer hincapié en la necesidad de tener instalado previamente en nuestro sistema el archivo MSTEXTxx.DLL, que es el controlador ISAM de texto, a fin de evitar el error Imposible encontrar el ISAM instalable. De estar instalado, por defecto se encontrará en la carpeta System, o en la carpeta que indique el valor win32 de la clave del registro de windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\x.x\Engines\Text, siendo x.x la versión correspondiente al motor Microsoft Jet que esté disponible en nuestro sistema. Por tanto, si al instalar Visual Basic no se instaló dicho controlador, ejecute de nuevo el programa de instalación y seleccione los controladores ISAM apropiados para proceder a su instalación. Si piensa utilizar la biblioteca de ADO, tenga en cuenta que la versión del proveedor necesaria que hay que utilizar es la versión del proveedor Jet 4.0; el proveedor Jet 3.51 no soporta los drivers ISAM de Jet. Para descargar las distintas versiones de los componentes de acceso a datos de Microsoft (MDAC), visite la siguiente dirección: http://www.microsoft.com/data. En cuanto a la forma en que el motor Microsoft Jet reconoce los valores nulos, hay que tener en cuenta lo siguiente:
Otra cuestión importante a tener en cuenta son las limitaciones en cuanto al tamaño de las tablas y objetos de texto:
Otra limitación importante que presenta el ISAM de Texto del motor Microsoft Jet, es que sólo nos permitirá añadir nuevos registros al archivo de texto, por lo que no podremos eliminar registros o actualizar los datos existentes en dicho archivo, ya que obtendremos el siguiente mensaje de error: Este ISAM no admite la actualización/eliminación de datos en una tabla vinculada. Por tanto, no podremos ejecutar los comandos DELETE o UPDATE de SQL, así como cualquier otro método de algún objeto de acceso a datos que implique ejecutar dichas acciones. Para más información, se puede consultar el siguiente artículo de la Knowledge Base: El driver de texto ODBC sólo soporta la instrucción INSERT. A la hora de establecer una conexión con un archivo de texto, el contenido de la información necesaria para tal fin se especifica de la siguiente manera:
Por último, si tiene pensado utilizar un archivo de texto en un entorno multiusuario, váyase olvidando de tal posibilidad, porque cuando se abre un archivo de texto mediante Microsoft Jet, se tiene acceso exclusivo al archivo, y cualquier otro intento de conexión a dicho origen de datos por parte de algún otro usuario, obtendrá el correspondiente mensaje de error. |
||||||||||||||||||||||||
3. El delimitador de texto y la opción TextDelimiterComo se ha visto anteriormente, la opción Format especifica el carácter que utiliza nuestro archivo de texto para delimitar los campos que se incluyen en el mismo, y en principio, su valor puede ser cualquier carácter a excepción de las comillas dobles (''). El delimitador de texto o cualificador de texto (que es el nombre que utiliza el asistente para exportación de texto de Microsoft Access), es el carácter que utilizamos para delimitar el valor contenido en un campo de tipo alfanumérico de nuestro archivo de texto, por tanto deberemos tener especial cuidado en no confundir ambos delimitadores cuando lo utilicemos en el archivo de información de esquema Schema.ini. El carácter de delimitador de texto por defecto son las comillas dobles ("), de ahí que la opción Format no pueda tomar dicho valor, ya que obtendríamos el siguiente error: El separador de campos de la especificación de archivo de texto coincide con el separador decimal o el delimitador de texto. Pero puede ocurrir que nos veamos en la imperiosa necesidad de trabajar con un archivo de texto cuyos campos están delimitados por comillas dobles, o bien, estamos utilizando delimitadores de texto no estándar, como la comilla simple (') o la coma (,), con valores de campos de texto que además incluyen comillas simples o comas, como por ejemplo nombres ingleses o domicilios de clientes. Ante tales dificultades, la única solución que nos queda, a fin de evitar el mensaje de error mencionado anteriormente, es incluir la opción TextDelimiter en el archivo Schema.ini, cuyo valor será el carácter que nos servirá para definir el delimitador de texto, y por tanto, poder optar por otro valor distinto al predeterminado de las comillas dobles. Veamos un ejemplo. Imaginad que tenemos la siguiente línea de texto, cuyos campos están separados por comas (Format), y se utiliza la comilla simple como delimitador de texto (TextDelimiter): 'Martínez Flores, Javier','Av. Concha Espina, 34 - 4º B','Madrid','28016' Si no utilizamos ningún archivo Schema.ini para indicar los valores de ambos delimitadores, al importar el archivo de texto, los campos Nombre y Domicilio se han dividido, ya que al incluir los datos una coma, el ISAM lo ha tomado como si de un campo distinto se tratara:
En cambio, si en el archivo Schema.ini especificamos los valores correspondientes a ambos delimitadores, los datos se tomarán correctamente: Format=CSVDelimited
Si la opción TextDelimiter es distinta a las comillas dobles, la opción Format puede contener dicho carácter de separación, por lo que ya estamos en condiciones de trabajar con un archivo de texto delimitado por comillas dobles ("). Por último indicar que, si no deseamos utilizar ningún tipo de carácter como símbolo delimitador de texto (comillas dobles, simples, etc.), necesariamente debemos de indicar el valor none en el parámetro TextDelimiter de nuestro archivo de información de esquema Schema.ini: TextDelimiter=none Para más información, consúltese el siguiente artículo de la Knowledge Base: |
||||||||||||||||||||||
4. Abrir directamente un archivo de textoA continuación voy a explicar varios procedimientos para abrir directamente un archivo de texto utilizando para ello las bibliotecas de acceso a datos Microsoft Data Access Object Library (DAO) y Microsoft ActiveX Data Object Library (ADO), así como el driver de texto de Conectividad Abierta de Bases de Datos (ODBC). Resaltar que el ISAM de Texto de Microsoft Jet sólo nos permitirá añadir nuevos registros al archivo de texto, siempre y cuando el objeto Recordset se haya abierto con permisos de escritura. No podremos modificar ni eliminar datos del archivo de texto, ya que obtendremos el siguiente mensaje de error: Este ISAM no admite la actualización/eliminación de datos en una tabla vinculada. Si deseamos evitar el error, no nos queda más solución que abrir el archivo de texto en modo de sólo lectura, pero en éste caso, no podremos tampoco añadir nuevos registros. 4.1. Mediante DAO mostrando los datos en un DBGridHay que utilizar el método OpenDatabase del objeto DBEngine donde se indicará la ruta, el modo de acceso (sólo lectura o lectura/escritura), y el tipo de la base de datos de origen, el cual, siempre será TEXT;. Asimismo, y a pesar de ser un valor opcional, es necesario establecer explícitamente a True/False el valor del parámetro Opciones del método OpenDatabase, ya que de lo contrario, obtendremos el error 3051 en tiempo de ejecución. En este ejemplo, vamos a utilizar un simple control Data para que automáticamente se llene el control DBGrid, por tanto, en tiempo de diseño es necesario establecer la propiedad DataSource del control DBGrid con el nombre de un control Data, ya que el control DBGrid no admite automatización. El ejemplo abre el archivo de texto Clientes, que se encuentra en la carperta Mis documentos, creando un objeto Recordset: Dim db As Database 4.2. Mediante ADO visualizando la información en un DataGridSi utilizamos la biblioteca Microsoft ActiveX Data Object, hay que especificar en la cadena de conexión la ruta de la carpeta que contiene el archivo de texto y el tipo del ISAM que se va a utilizar, mediante la propiedad Extended Properties del objeto Connection. Tenga en cuenta que la versión del proveedor necesaria que hay que utilizar para abrir un archivo de texto mediante la biblioteca de ADO es la versión del proveedor Jet 4.0; el proveedor Jet 3.51 no soporta los drivers ISAM de Jet. Si se especifica el proveedor Jet 3.51, en tiempo de ejecución se recibirá el siguiente mensaje de error: No se pudo encontrar el ISAM instalable. Para descargar las distintas versiones de los componentes de acceso a datos de Microsoft (MDAC), visite la siguiente dirección: http://www.microsoft.com/data. El siguiente ejemplo, abre el anterior archivo utilizando el ISAM de texto del proveedor de datos Microsoft Jet: Dim cnn As ADODB.Connection Por último indicar que el punto que separa el nombre del archivo de su extensión, se puede sustituir por el símbolo #: Open "Clientes#txt", cnn, , adCmdTable Si no deseamos crear un archivo de información de esquema, bien en la cadena de conexión, bien en la consulta SQL, aparte de indicar el ISAM de texto y la ruta de la carpeta, también podemos indicar los valores que se especifican en la siguiente tabla, aunque no podremos aprovechar todas las restantes opciones que se pueden especificar en el archivo Schema.ini:
Es importante resaltar que, en líneas generales, estos valores surtirán efecto siempre y cuando no haya un archivo de información de esquema en la carpeta donde se encuentre el origen de datos, porque de lo contrario, el ISAM de texto no los tendrá en cuenta, ya que prevalecerá la configuración existente en el archivo Schema.ini. Asimismo, de no existir el archivo de información, los valores de los parámetros que no se especifiquen en la cadena de conexión, se tomarán de los existentes en el registro de Windows. La cadena de conexión del ejemplo anterior, también se podría haber especificado de la siguiente manera: .ConnectionString = "Data Source=" & App.Path & ";" &
_ A diferencia del ejemplo anterior, obsérvese en éste último ejemplo la utilización de los pares de comillas en color rojo, ya que de no indicarse, nos encontraremos con el molesto mensaje de error No se pudo encontrar el archivo ISAM instalable. Igualmente, hay que tener precaución en no separar con un espacio en blanco el signo de igualación (=) que sigue a continuación del nombre de la propiedad Extended Properties, para especificar el valor de ésta, ya que obtendremos otro mensaje de error, en este caso, El formato de la cadena de inicialización no cumple la especificación OLE DB, un sutil error que nos puede costar perder cierto tiempo en intentar descubrir su origen. Si no deseamos tener problemas con las comillas dobles o los espacios en blanco a la hora de especificar los diferentes parámetros que conforman la cadena de conexión, podemos olvidarnos de la propiedad ConnectionString y asignar explícitamente los valores de las distintas propiedades de la siguiente manera: cnn.Properties("Data Source") = App.Path 4.3. Mediante ADO utilizando el driver de texto ODBCTambién podemos utilizar la biblioteca de ADO junto con el driver ODBC de Texto para trabajar con los datos de nuestro archivo de texto. En éste caso, con tan sólo especificar en la cadena de conexión el nombre del conductor y el directorio donde se encuentra nuestro archivo, estaremos en condiciones óptimas de manipular el origen de datos. objCnn.ConnectionString = "Driver={Microsoft Text Driver
(*.txt; *.csv)};" & _ En lugar de indicar la palabra clave DBQ, también podemos especificar la palabra DefaultDir, la cual indicará el directorio por defecto, pero hay que tener en cuenta que, de no especificar ninguna de las dos palabras claves, el controlador ODBC de Texto se conectará al directorio actual que esté establecido como tal en el sistema operativo. Es importante resaltar que los fallos en la conversión de tipos de campos especificados en el archivo Schema.ini tienen como resultado que se aplique un valor NULL a la columna afectada. El siguiente ejemplo utiliza el driver ODBC de texto para devolver el número de registros de la tabla Clientes cuyo archivo de texto se encuentra en la carpeta que contiene nuestra aplicación: Dim cnnText As ADODB.Connection 4.4. Utilizando ASP con un origen de datos (DSN)Aparte de abrir un archivo de texto que esté disponible en alguna carpeta de nuestro ordenador, también podemos establecer una conexión con un archivo que esté disponible en un servidor, utilizando para ello un nombre de origen de datos (DSN). Aunque podemos crear cualquier origen de datos mediante el Administrador de orígenes de datos ODBC del Panel de Control, en ésta ocasión vamos a crear directamente un nombre de origen de datos para abrirlo mediante una página ASP, por tanto, es necesario que tengamos instalado e iniciado en nuestro ordenador los Servicios de Internet Information Server (IIS), y que guardemos el texto de más abajo con el nombre Text.dsn, por ejemplo, en un directorio virtual con permisos para ejecutar scripts. [ODBC] A continuación, guardar en el mismo directorio virtual los datos del archivo de texto, creando para ello un nuevo archivo con el nombre Datos.txt: IdCliente;Nombre;Total Por último, sólo nos queda crear el archivo EjemploDSNTexto.asp, por ejemplo, para ejecutar el código Visual Basic Script: <% Si ejecutáis la página desde vuestro navegador, obtendréis la siguiente tabla de datos: Ejemplo de ASP Abrir un archivo de texto mediante un origen de datos DSN
|
||||||||||||||||||||||||||||||
5. Vinculación de archivos de textoAl igual que vinculamos tablas de bases de datos Access, también podemos vincular a nuestra base de datos un archivo de texto delimitado. Sin embargo, para que el motor de base de datos Microsoft Jet puede uilizar la información del archivo Schema.ini, deben residir en la misma carpeta el archivo de datos y el archivo de información de esquema. Al igual que sucede cuando abrimos directamente un archivo de texto, cuando vinculamos un archivo de texto el ISAM de Microsoft Jet sólo nos permitirá añadir nuevos registros al archivo de texto, por lo que no podremos modificar ni eliminar datos del archivo de texto, ya que obtendremos el siguiente mensaje de error: Este ISAM no admite la actualización/eliminación de datos en una tabla vinculada. 5.1. Vincular con ADOX un archivo de texto a una base de datos AccessLa biblioteca de ADO no permite vincular un archivo de texto a una base de datos Access. Para ello tenemos que ayudarnos de la biblioteca Microsoft ADO Ext. 2.x for DLL and Security, más conocida en los ambientes de programación por el nombre de ADOX, la cual es una extensión de los objetos y del modelo de programación de ADO. Por tanto, en nuestro proyecto no hay que olvidarse de hacer referencia a la citada biblioteca. El siguiente ejemplo, muestra como vincular un archivo de texto, a una base de datos Access 2000: Public Sub LinkTextWithADO 5.2. Utilizar DAO para vincular un archivo de textoPara vincular un archivo de texto delimitado a una base de datos Access, hay que utilizar el método OpenDatabase para abrir la base de datos; crear un objeto TableDef, y establecer las propiedades Connect y SourceTableName del objeto TableDef para indicar el archivo de texto que se desea vincular. En el siguiente ejemplo, vamos a vincular un archivo de texto de longitud fija, por lo que necesitaremos crear un archivo de información de esquema Schema.ini, en la misma carpeta donde se encuentren los datos, para especificar el número, nombre, tipo de dato y ancho de las columnas. En éste caso, indicaremos que la primera fila no contiene los nombres de los campos. El archivo de configuración de esquema sería así: [Clientes fijo.txt] El archivo Clientes fijo.txt estará compuesto por los siguientes cinco registros. Si desea probar el ejemplo, copie y pegue los datos con el mismo formato en el que aparecen aquí: 430001 CAÑADA VAZQUEZ, JOAQUIN 12111255B 430002 MENDEZ CUBILLO, LORENZO 58777000Ñ 430006 CONSTRUCCIONES EL BUENO, S.A. A33366684 430012 MENDIETA GARCÍA, FELIPE 06254000A 430015 CARRILLO CONTRERAS, ROSARIO 55666555Z Ya sólo nos queda, ejecutar el siguiente procedimiento: Public Sub LinkTextWithDAO Si abrimos la tabla vinculada en nuestra base de datos Access, observaremos el siguiente resultado:
|
||||||||||||||||||||
6. Cómo crear y eliminar una tabla de textoMediante la instrucción CREATE TABLE correspondiente al Lenguaje de Definición de Datos (DDL) de SQL, podemos crear una tabla de texto de la misma forma que crearíamos una tabla en una base de datos Access. Es más, utilizando dicho comando, automáticamente se generará el archivo de información de esquema Schema.ini correspondiente, y en la misma carpeta donde hayamos creado el archivo de texto. De querer crear un archivo de texto delimitado, en mi opinión es la forma más fácil de generar el archivo Schema.ini, porque en principio, los parámetros del mismo serán los que aparezcan en el registro de windows. Por el contrario, si deseamos crear un archivo de texto de longitud fija, necesitaremos crear de antemano el archivo Schema.ini para especificar el ancho de las columnas. La sintaxis de la instrucción CREATE TABLE es la siguiente: CREATE TABLE Nombre_Tabla (Campo1 Tipo (tamaño), Campo2 Tipo (tamaño), ...) A continuación vamos a generar un archivo de texto de tres campos, utilizando la biblioteca de ADO: Dim cnn As ADODB.Connection Si vamos a la carpeta que contiene nuestra aplicación, podemos observar que se ha generado el archivo de texto donde sólo aparecen los nombres de los campos en la primera fila. Asimismo, también podemos observar que se ha creado el archivo de información de esquema con los valores de los parámetros existentes en el registro de nuestro sistema. Si utilizamos la biblioteca de DAO, el código sería el siguiente: Dim db As Database En cuanto a cómo eliminar un archivo de texto, lo más fácil sería eliminarlo desde el Administrador de Archivos, o utilizar la instrucción Kill de Visual Basic, pero ya que estamos utilizando bibliotecas de acceso a datos, vamos a eliminarlo como eliminaríamos cualquier otra tabla de una base de datos Access. Mediante ADO y DAO utilizaríamos el método Execute de un objeto Connection o Database, respectivamente, para ejecutar la siguiente consulta SQL: objeto.Execute "DROP TABLE Clientes#txt" Para los usuarios de DAO, comentar que también pueden eliminar el archivo de texto utilizando el método Delete de la colección TableDefs de un objeto Database previamente abierto: db.TableDefs.Delete "Clientes#txt" Tal es la vinculación existente entre el archivo de texto y su archivo de información de esquema, que al eliminar el archivo de texto, automáticamente también se elimina el archivo de información de esquema asociado, o la sección correspondiente al archivo eliminado, si el archivo Schema.ini tiene información de varios archivos de texto. Esta es la ventaja que tiene utilizar los métodos de eliminación expuestos en contraposición a utilizar la instrucción Kill. |
||
7. Importar los datos de un archivo de textoLa verdadera importancia de los distintos formatos de ISAM del que dispone el motor Microsoft Jet, reside en la capacidad que ostenta para importar/exportar datos a distintos orígenes de datos, utilizando para ello el potente Lenguaje de Consulta Estructurado (SQL). De ésta manera podemos utilizar los datos de un simple archivo de texto para importarlo a una base de datos Access, a una hoja de cálculo Excel, o a otros tipos de base de datos de escritorio como bien puede ser, dBASE o Paradox, entre otros. Esto es posible gracias a una variación de la instrucción SELECT, la cual nos permitirá crear una nueva tabla con los registros devueltos de la consulta, simplemente con agregar la cláusula INTO a la misma. De igual manera, para identificar el archivo de texto externo, incluiremos la cláusula IN para especificar el tipo de ISAM que vamos a utilizar (en nuestro caso TEXT;), y la ruta donde se encuentra la base de datos externa (el parámetro DATABASE). En general, la sintaxis de la consulta de creación de tabla es la siguiente, dependiendo de la tabla que deseemos identificar. ● Para identificar una tabla de destino: 7.1. Importar los datos a una base de AccessSi tenemos una conexión abierta con una base de datos Access, podemos importar los datos de un archivo de texto creando una nueva tabla en nuestra base de datos. En éste caso, la tabla que necesitamos identificar es la tabla de origen, que corresponderá con el archivo de texto cuyos datos queremos recuperar. A continuación, y mediante la biblioteca de ADO, vamos a crear una nueva tabla [TextImport] en nuestra base de datos Access, con los datos del archivo de texto [Clientes#txt]. Para utilizar el ejemplo con la biblioteca de DAO, simplemente necesitará ejecutar la misma consulta SQL con el método Execute de un objeto Database previamente abierto: Dim cnn As ADODB.Connection Nota importante: Pongo especial énfasis en las comillas simples para que el lector observe correctamente la sintaxis utilizada, ya que es sumamente importante incluirlas para delimitar la ruta de acceso al archivo y la versión del ISAM instalable que se va a utilizar, procurando dejar un espacio en blanco entre ambos parámetros. Es de suma importancia tener en cuenta que, si el delimitador de campos del archivo de texto no coincide con el especificado por defecto en el registro de Windows, necesariamente tendremos que especificarlo en la opción Format del archivo de información de esquema Schema.ini, a fin de que todos los campos se importen correstamente, porque de lo contrario, sólo se importará el primer campo, y tampoco lo hará de forma idónea. 7.2. Importar los datos a una hoja de cálculo ExcelEn el siguiente ejemplo, vamos a utilizar nuestro archivo de texto para importar los datos a un libro de trabajo de Excel, creando de ésta manera, una nueva hoja de cálculo. Vuelvo hacer hincapié en la necesidad de tener un archivo de información de esquema para que los datos se exporten correctamente. Es más, si la primera fila del archivo de texto no contiene el nombre de los campos, necesariamente tendremos que establecer a False el valor del parámetro ColNameHeader del archivo Schema.ini si queremos que se recupere la primera fila como un registro más. Dim sTablaOrigen As String, sChainSql As String 7.3. Importar los datos a otro archivo de textoTambién nos puede interesar crear otro archivo de texto delimitado para, por ejemplo, modificar el carácter delimitador de los campos, o cualquier otro parámetro, de un archivo de texto ya existente, por lo que necesariamente tendremos que crear un archivo Schema.ini para indicar el nuevo valor que deseamos obtener en el parámetro apropiado. En ésta ocasión, vamos a utilizar la biblioteca de DAO: Dim sTablaOrigen As String, sChainSql As String A diferencia de los ejemplos anteriores, en éste quiero hacer la salvedad de que necesariamente tendremos que especificar una extensión para el nuevo archivo de texto, utilizando para ello un punto (.), o el símbolo #, de tal forma que quede bien definido el nombre y la extensión del archivo. Y esto es así porque de no especificar la extensión obtendremos el mensaje de error: No se puede actualizar. Base de datos u objeto de sólo lectura. Un error que nos puede acarrear un verdadero dolor de cabeza si no ponemos especial cuidado en especificar la extensión del nuevo archivo de texto. Para más información sobre el tema, puede consultar el sigiente artículo de Microsoft Knowledge Base: |
||
8. Cómo exportar datos desde el propio archivo de textoAl igual que hemos utilizado una consulta SQL de creación de tabla para importar los datos de un archivo de texto, creando para ello una conexión con otro origen de datos distinto, ahora se trata de exportar los datos desde el propio archivo de texto, es decir, abriendo una conexión con éste último y exportando desde aquí los datos a una base de datos Access, por ejemplo. En éste caso, necesitaremos identificar la tabla de destino, la cuál se corresponderá con el archivo de texto que deseamos crear. Véase la sintaxis de la instrucción SELECT * INTO descrita en el punto número siete. Mediante ADO, vamos a crear una tabla en nuestra base de datos Access, con los datos de un archivo de texto delimtado: Dim cnn As ADODB.Connection Si en la propiedad Extended Properties no se desea escribir tantos pares de comillas dobles, se puede hacer referencia al tipo de ISAM de la siguiente manera: cnn.Properties("Extended Properties") = "TEXT;" A continuación, vamos a generar un archivo dBASE con los datos de nuestro archivo de texto, utilizando ésta vez, la biblioteca de DAO. Indicar que, si el nombre del archivo de dBASE es superior a ocho caracteres, no se tendrán en cuenta los caracteres que excedan de dicho número. Dim db As Database |
||
9. Cómo exportar datos a un archivo de textoLa manera más fácil de crear un archivo de texto delimitado con los datos procedentes de tablas u otros orígenes de datos, es mediante la utilización de una consulta SQL de creación de tabla. Simplemente necesitaremos establecer una conexión con el origen de datos, y exportar la tabla especificando el tipo de ISAM que vamos a utilizar y la ruta donde se creará el archivo de texto. Si al exportar los datos no disponemos de la información del archivo de configuración de esquema Schema.ini, automáticamente se generará uno en la misma carpeta donde se haya creado el archivo de texto, el cual contiene los valores por defecto establecidos en el registro de Windows. Si necesitamos especificar o modificar algún valor, necesariamente tenemos que generar un archivo Schema.ini antes de ejecutar la consulta. Debemos de tener especial cuidado en no olvidarnos de especificar la extensión del archivo de texto, ya que de lo contrario obtendremos el mensaje de error: No se puede actualizar. Base de datos u objeto de sólo lectura. 9.1. Exportar los datos de una tabla de AccessEl ejemplo mostrará cómo exportar mediante la biblioteca de ADO una tabla de Access, creando un archivo de texto delimitado: Dim cnn As ADODB.Connection 9.2. Exportar los datos de una hoja de cálculo ExcelEn ésta ocasión, el ejemplo ilustra cómo exportar desde Excel una hoja de cálculo, creando un archivo de texto delimitado, utilizando para ello la biblioteca de DAO. Al igual que utilizamos Excel como origen de datos, también podemos especificar otro tipo de ISAM disponible en nuestro sistema: Dim sConnect As String |
||
10. Añadir registros a una tabla procedentes de un archivo de texto delimitadoSi tenemos una tabla creada en Access y queremos añadir los datos existentes en un archivo de texto delimitado, podemos insertar los datos mediante la instrucción INSERT INTO, lo que en SQL se conoce como una consulta de datos añadidos o anexados, la cual añade los nuevos registros al final de la tabla o consulta ya existente. En las tablas origen y destino puede especificar una tabla o una consulta. Si especifica una consulta, el motor de base de datos Microsoft Jet añade los registros a cualquiera y a todas las tablas especificadas en la consulta. Si la tabla de destino contiene una clave principal, hay que asegurarse de que se añade un valor único y distinto de Null al campo o campos de la clave principal; de lo contrario, el motor de base de datos no añadirá los registros. También hay que tener en cuenta que, si añade registros a una tabla con un campo de tipo AutoNumérico y desea volver a numerar los registros añadidos, no incluya el campo contador en la consulta. Incluya el campo Autonumérico en la consulta sólo si desea conservar los valores originales del campo. Por último recalcar que, si la tabla o consulta no existe en la base de datos de Access, no se podrá añadir registros, debido a la inexistencia de la misma, cosa que por otra parte, es bastante lógica. 10.1. Desde la propia base de datos Access activaSi tenemos una conexión abierta con una base de datos Access, que ya contiene la tabla o consulta donde queremos añadir los registros del archivo de texto, solamente tendríamos que especificar la versión del ISAM a utilizar, el parámetro HDR y la ruta del archivo de texto en el parámetro DATABASE. El siguiente ejemplo muestra como insertar un conjunto de registros en una tabla existente de Access mediante la biblioteca de ADO. El ejemplo parte de la premisa de la no existencia de un archivo de configuración Schema.ini, por lo que necesariamente tendremos que especificar en el parámetro HDR que la primera fila del archivo de texto contiene el nombre de los campos: Dim cnn As ADODB.Connection De no existir un archivo Schema.ini, el ISAM no puede conocer de antemano el nombre de las columnas, por lo que la primera fila de nuestro archivo de texto necesariamente deberá de contener los nombres de los campos, y éstos deberán de coincidir, y en el mismo orden, con los nombre de los campos de la tabla. En este supuesto, el parámetro HDR cobra especial relevancia, porque de especificar el valor No, podríamos tener problemas al añadir los registros, debido a que el motor Jet no sabría dónde insertar los mismos. 10.2. Desde el propio archivo de texto activoAl contrario que en el punto anterior, a continuación voy a mostrar cómo se añadirían los registros en la tabla de Access, pero desde una conexión con el archivo de texto, de esta forma se observará la utilización de la cláusula IN de SQL, la cual identifica las tablas de cualquier base de datos externa a la que el motor de base de datos Microsoft Jet se puede conectar, en éste caso identificamos la tabla de destino, que se corresponderá con una tabla de la base de datos de Access. El turno ahora es para la biblioteca de DAO: Dim sConnect As String, sChainSQL As String |
||
11. Añadir nuevos registros a nuestro archivo de textoSiguiendo con las posibilidades que nos brinda el Lenguje de Consulta Estructurado (SQL), vamos a ver cómo insertar nuevos registros en un archivo de texto delimitado. Esto es útil para cuando tengamos un archivo de texto vacío, con su correspondiente archivo de información de esquema Schema.ini creado, y debidamente configurado a nuestras necesidades, y necesitemos trabajar con los datos en el propio archivo de texto, o bien, para intercambiar la información entre los distintos sistemas de gestión de bases de datos existentes en el mercado. En el supuesto que nos ocupa, es necesario que el archivo de texto exista previamente en la carpeta especificada, y que la primera fila contenga el nombre de los campos y estén en el mismo orden que los campos del archivo o tabla cuyos registros vamos a insertar en nuestro archivo de texto. Igualmente, y a fin de evitar el oportuno error, si en la conexión con la base de datos externa se especifica el parámetro HDR, éste necesariamente tendrá que ser True, ya que de nada sirve que establezcamos a True/False el parámetro ColNameHeader en el archivo de información de esquema Schema.ini. Por supuesto, de no especificar el parámetro HDR, habrá de asegurarse que el valor FirstRowHasNames de la clave del registro de Windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text, esté establecido a 01, porque de lo contrario, necesariamente tendremos que especificar el parámetro HDR=Yes. 11.1. Desde un archivo de dBASE activoEl utilizar un archivo dBASE, simplemente es para que el lector observe la capacidad de la que dispone los distintos tipos de ISAM que incluye el motor de base de datos Microsoft Jet, por lo que prácticamente podemos intercambiar información entre diferentes tipos de orígenes de datos. A continuación, y mediante la biblioteca de ADO, vamos a establecer una conexión con un archivo dBASE, e insertar los registros devueltos por una consulta SQL, en nuestro archivo de texto: Dim sConnect As String, sChainSql As String 11.2. Desde el propio archivo de texto activoA diferencia del ejemplo anterior, a continuación vamos a insertar los registros en el archivo de texto, pero desde una conexión con éste último, por tanto, mientras que en el ejemplo anterior identificábamos la tabla de destino, en éste identificaremos la tabla de origen, que se corresponderá con el archivo dBASE. Mediante la biblioteca de DAO seria de la siguiente manera: Dim sConnect As String, sChainSql As String |
||
12. Algunos artículos útiles de Microsoft Knowledge BaseLa siguiente relación de enlaces a Microsoft Knowledge Base que cito (por no decir todos), están en inglés. He traducido los títulos de los artículos a fin de facilitar al usuario hispanohablante una referencia más rápida al contenido de los mismos. En dichos artículos el usuario podrá ampliar la información contenida en éste artículo sobre cómo manipular los datos contenidos en un archivo de texto mediante el ISAM de Texto del motor Microsoft Jet. Los artículos están ordenados de mayor a menor antigüedad en la fecha de su última actualización. |
||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NOTA: El contenido de éste artículo es una recopilación de las participaciones del autor en el grupo de noticias en español de Visual Basic (microsoft.public.es.vb), así como de la información disponible en los distintos artículos que la Microsoft Knowledge Base ofrece sobre el tema en cuestión, de los cuales se hace una referencia en el apartado número doce. La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
This article is provided AS IS with no warranties, and confers no rights. You assume all risk for your use. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Enrique Martínez Montejo - 2003 | ||