Visual Basic - Guía del Estudiante Estudiante Cap. 11 11 BASES DE DATOS DATOS EN VISUAL BASIC (1) A modo de introducción Todo lo visto hasta ahora en este libro es el Visual Basic elemental que debe conocer necesariamente necesariamente para realizar realizar una aplicación. Sin embargo hay algo que falta. El 90 % de las aplicaciones que va a realizar van a llevar una base de datos. Es lógico. Una aplicación se hace normalmente para presentar datos, datos que habrá que introducir y mostrar de forma conveniente. conveniente. Lo de introducir y mostrar datos son las materias que va a ver en los conveniente, y es en eso capítulos siguientes, siguientes, pero no olvide lo lo de mostrarlos mostrarlos de forma conveniente, donde tendrá que aplicar todo lo que lleva aprendido hasta ahora. Se observa con mucha frecuencia que el alumno tiene una prisa desmesurada por llegar a los temas que tratan las bases bases de datos, dejand dejando o un poco de lado la interface interface necesari necesaria a para para su introduc introducción ción y presentación, que es lo que da ergonomía y elegancia a una aplicación. El conocimiento de bases de datos es necesario. Lo explicado hasta ahora, imprescindible. Visu Visual al Basic Basic nos nos permite permite trabaj trabajar ar direct directame amente nte con con distin distintas tas base bases s de datos datos (ACCES (ACCESS, S, dBas dBaseII eIII, I, dBaseIV dBaseIV , dBase dBase 5, Excel3, Excel3, Excel4, Excel4, Excel5, Excel5, Excel7, Excel7, FoxPro FoxPro2.x, 2.x, Foxpro3 Foxpro3.0, .0, Lotus LotusWK1, WK1, LotusW LotusWK3, K3, LotusWk LotusWk4, 4, Parad Paradox3. ox3.x, x, Paradox Paradox4.x 4.x y Parad Paradox5 ox5.x .x Esto Esto lo logra Jet , herramienta de Microsoft para administrar los mediante el Motor de Bases de Datos Jet, datos datos en base bases s de datos datos Acces Access. s. Tien Tiene e un nombre nombre que que mas mas parec parece e de una materia materia de ingeniería ingeniería aeronáu aeronáutica, tica, pero en realidad realidad no es mas que un conjunto conjunto de programas programas que se cargan en el disco duro cuando cuando instala Access o Visual Visual Basic. E esta forma de acceder a las bases de datos se le llama Acceso mediante objetos DAO. DAO. Lo de de DAO DAO viene viene de de Data Data Access Objet. Y es la forma más sencilla y rápida de acceder a una base de datos Access instalada en el propio disco duro o en un disco de red de área local rápida. (Lo de facilidad de acceso a una base de datos Access viene implícito en la política de Microsoft de facilitar la compatibilidad entre sus aplicaciones) Pero esto se quedaría muy corto si solamente se pudiese conectar con las bases de datos citadas. No se puede concebir un sistema de desarrollo que no pueda acceder a bases como Oracle, Informi x, SQL Server, etc. Estas bases bases de datos, datos, aparte de de tener su propia propia interface para acceso a datos, disponen de una forma de acceso común a todas : ODBC Lo de ODBC (Open Data Data Base Conectivity) Conectivity) es un mecanismo mecanismo de conexión entre entre bases bases de datos abiertas. Lo de abiertas significa que tienen esa interface de acceso común, interface a través de la cual puede acceder a sus datos cualquier aplicación. Esta interface utiliza el lenguaje SQL, y es necesario establecer una conexión ODBC en Windows. Lo veremos mas adelante. Los objetos DAO pueden acceder acceder también a bases bases de datos a t ravés de ODBC. Esto podemos decirlo con la versión DAO 3.5, no podemos decir lo mismo con la 2.5, procedimiento previsto pero que no funcionaba. Este pobre funcionamiento de DAO con ODBC llevó a Microsoft a crear otro tipo de acceso a datos: el RDO (Remote Data Objet), y los objetos de de acceso a datos RDO. Esto consiste consiste en objetos parecidos parecidos a los DAO, pero que en vez de atacar directamente a la base de datos como lo hace DAO, lo hacen a través de una conexión ODBC previamente establecida en Windows. Así por ejemplo, en un objeto DAO hablamos del nombre de la base de datos, refiriéndonos al nombre del fichero que contiene los datos (C:\Mis Documentos\MiBase.Mdb), y en RDO nos referimos referimos al nombre nombre de la conexión conexión ODBC (Connection) (Connection) refiriéndonos refiriéndonos al nombre nombre de una conexión ODBC ya establecida, que apunta a una base de datos que es donde vamos a leer o escribir. Este método tiene la gran ventaja de que podemos establecer hoy una conexión con una base determinada, y si queremos cambiar mañana la base de datos sobre la que vamos a trabajar, basta con cambiar esa conexión apuntando hacia otra base de datos. Así no es necesario realizar ningún cambio a nuestro código
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 1
Un error error basta bastante nte gene general ral con los objeto objetos s RDO es pens pensar ar (segu (seguram ramen ente te por por aquel aquello lo de Remote Data Objet) que solamente pueden trabajar con una base de datos que esté en otro ordenador, al cual estaremos unidos por cualquier forma de conexión. No tiene nada que ver. RDO significa solamente que accedemos accedemos a los datos a t ravés de ODBC, y podemos hacerlo (al igual que con DAO) a una base que esté en el mismo disco duro que la aplicación, o una que esté en un servidor unido a través de una Red de Area Local. Pero RDO no tiene las prestaciones que tiene DAO para trabajar con bases de datos Access. De hecho, RDO pierde grandes facilidades que aporta DAO para este tipo de bases de datos. RDO trabaja sobre una conexión ya instalada, que apunta a una base de datos ya creada. Con RDO no podemos crear esa base de datos. Esto es obvio, con RDO podemos entrar en una base de datos Oracle, por ejemplo. Nadie puede pretender que Visual Basic cree una base de datos de esa marca. Sin embargo, con ADO sí podemos crear una base de datos Access. Piense en la fac ilidad para distribuir una aplicación que tenga una base de datos Access Access cuyos camp campos os pued puedan an tene tenerr un tama tamaño ño defin definid ido o por por el prop propio io usua usuario rio.. Bast Bastar aría ía pone ponerr una una herramienta en la propia aplicación donde el usuario introdujese los tamaños de los campos tipo texto, para adaptar la base de datos a sus necesidades. Esto puede hacerlo con DAO puesto que nos permite crear bases de datos Access, pero no lo podemos hacer mediante RDO. RDO utiliza utiliza una una termino terminolog logía ía ligeram ligeramen ente te distint distinta a de DAO. DAO. Por Por ejempl ejemplo, o, sond sonde e en DAO ponemos OpenRecordset, en RDO debemos poner OpenResultset. Es una pena que no se pueda trabajar con la misma terminología y con todas las prestaciones que tiene DAO a través de ODBC. Esto mismo mismo pensó Microso Microsoft, ft, y esa fue la razón de implementar implementar en los objetos objetos DAO 3.5 la conexión ODBCDirect. ODBCDirect. ODBCDirect nos permite trabajar con los mismos objetos DAO pero a través de una conexión ODBC, que en este caso, funciona. Puede ser un poco más lenta que DAO, pero en esto hay opiniones para todos. todos. De esta forma f orma es posible seguir utilizando utili zando los viejos mé todos aprendidos aprendidos para DAO (Y lo que es mejor, reutilizar el código ya escrito en anteriores aplicaciones) a través de una conexión ODBC. Lo veremos mas adelante. adelante. Pero no debemos pensar que aquí se acaban los métodos de acceso a datos. Existe otro mas, muy reciente denominado denominado ADO. ADO. ADO quiere sustituir a DAO y RDO. En este punto ponía hace dos años que eso lo va a determinar el mercado. Hoy (Nov.2002) se puede decir que ADO ha sustituido en todas las aplicaciones nuevas a RDO, y ha dejado a DAO solamente el mercado de las pequeñas aplicaciones domésticas. ADO es una maravilla. Por eso, la Guía del Estudiante dedica un nuevo capítulo y un amplio ejemplo a ADO. Pero eso no implica que no haya que ir paso a paso. Y primero hay que aprender DAO. Pero ahora todo lo que aprenda de DAO le va a servir para ADO, pues en ADO sí coincide el código. Aprendamos pues DAO, y luego aplicaremos nuestros conocimientos a ADO. La gran ventaja de ADO es que en aquellas aplicaciones que leen una base situada en un servidor, ocupa menos la red de área local, ya que trabaja una aplicación Cliente – Servidor. Adelanto Adelanto de términos. términos. Aplicacione Aplicaciones s Cliente servidor servidor Piense en una base de datos instalada en una red no muy rápida. Si creamos un acceso a datos (recordset) con DAO, el tráfico de datos por la red es muy grande, dado que puede darse el caso de tener que ver toda la base de datos datos para extraer extraer de ella solamente solamente un dato. Una aplicación aplicación Cliente Cliente – Servidor Servidor lo que hace hace es montar montar un programa programa en el servidor, servidor, al cual cual le pedimos pedimos desde desde nuestra aplicación el dato deseado. Ese programa posiblemente tenga que ver toda la base de datos para encontrar el dato que nos interesa, pero lo hace localmente en el servidor, sin verter todos los datos a la red de área local. Una vez que lo ha encontrado, nos pasa a través de la red el dato solicitado, con lo que bajamos el tráfico por la red de forma muy importante. Lo veremos mas adelante pero no con una gran profundidad. Es un tema que se sale necesariamente de este curso debido a su extensión. Existen multitud de libros que tratan el tema.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 2
No se preocupe de los que acaba de leer. Con las explicaciones anteriores parece que esto de las bases de datos debe debe ser cosa de gurús informáticos, vedado al resto de los mortales. Nada mas lejos de la realidad. Y para demostrarlo, en lo que queda de capítulo vamos a trabajar con bases de datos SIN escribir una sola línea de código. No digo que sea lo mejor, pero puede hacer hacerse. se. Esto Esto se logra logra median mediante te control controles es OCX OCX cread creados os por por Micros Microsoft, oft, que que control controlan an directamente a ese conjunto de programas que habíamos dado en llamar Motor de bases de Datos Jet o a los programas similares de RDO o ADO. DAO. Y para DAO el control que Comenzaremos el estudio de bases de datos con los objetos DAO. Data. Existen controles organiza el trabajo al Motor Jet es el Control Data. controles similares para RDO y para ADO. Pero no corramos y centrémonos sobre DAO y nuestro motor Jet
DAO - Acceso a bases bases de datos mediante mediante el Control Data Para acceder a estas Bases de Datos basta con introducir un control Data en el formulario, y fijarle las propiedades apropiadas para que trabaje sobre uno u otro tipo de base de datos. El control Data nos permite acceder de una forma sencilla a cualquier base de datos de estos tipos, tipos, y sirve sirve de enlace enlace entre entre la base base de datos datos y los los contr controle oles s que que son son habili habilitad tados os para presentar los datos de esa base. Utiliza el motor de bases de datos Jet para el acceso a los datos. El Control Data El control Data puede tomarse directamente de la caja de herramientas. Al contrario que los controles similares RDO y ADO, este está siempre en la caja de herramientas. En el formulario tiene el aspecto de una barra deslizante :
Decíamos que el control Data sirve de enlace entre la base de datos y los controles que pueden presentar datos. Estos controles a los que nos referimos son los llamados Controles Enlazados a Datos, Datos, y que son viejos vi ejos conocidos nuestros, al menos algunos de ellos. Los dos más sencillos son el control Label y el control TextBox Un control Label puede presentar un dato. Si queremos que ese dato sea un campo de una tabla de una base de datos, basta que enlacemos la base de datos al control data, y que enlacemos luego luego el control Label con el control Data. Si hacemos lo mismo con el TextBox, TextBox, no solamente podremos presentar datos de la BD, sino que los podemos introducir, al ser el TextBox un control bidireccional. Veamos como se enlaza un control data a una base de datos. Se supone que el alumno conoce la estructura de una base Access, BD con la que vamos a iniciar este estudio. De cualquier forma, y para los que han suspendido la asignatura de base de datos Access, citar sola solame ment nte e que una una base base de dato datos s Acce Acces ss cont contie iene ne dentr entro o de un fiche fichero ro (P.e (P.e.. C:\MiCarpeta\MiBase.Mdb) varias Tablas (P.e. (P.e. Tabla1, Tabla1, Tabla2 Tabla2 y Tabla3) Tabla3) Cada tabla es en sí una base de datos en el sentido estricto. Tiene un número indeterminado de registros, (filas) que guardan guardan la información en varios v arios Campos. Campos.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 3
El f ichero, que tiene por extensión Mdb es la base de datos, y ese nombre (Dirección completa de la carpeta y nombre del fichero) es lo que debemos poner al control Data en su propiedad DataBaseName. DataBaseName. Con esto, el control data ya sabe sabe donde donde tiene que ir a leer los datos. Pero le falta todavía por saber en que que tabla dentro de esa BD los tiene que leer. leer. El nombre de la tabla RecordSource. Para elegir esta se lo indicamos al control Data en la propiedad RecordSource. esta propiedad basta con desplegar desplegar la lista de las tablas haciendo click en la flecha de la l ínea de la propiedad RecordSource. Dado que el control Data ya sabe en que base de datos debe leer los datos (Ya tiene puesta la propiedad DataBaseName), ya puede saber cuantas tablas tiene y los nombres de estas estas tablas. tablas. Elija la tabla deseada. deseada. En nuestro nuestro ejemplo, Authors
Con Con esto esto ya podrí podría a traba trabajar jar,, pero pero le faltan faltan aún aún cierto ciertos s detall detalles. es. Por ejempl ejemplo, o, el tipo tipo de recordset que debe crear. (Dynaset, Snapshot, Table) Esto se lo indicamos en la propiedad RecordsetType, RecordsetType, que por defecto le va a poner Dynaset. (Ya veremos que es cada uno de ellos) Y ya tenemos casi todas las propiedades del control Data cubiertas. Las demás son las típicas típicas de todos todos los contro controle les. s. Casi Casi toda todas s las propi propied edad ades, es, porqu porque e hay hay una una que que se ha introducido en la versión 6 de VB para permitir las dos formas de atacar a la base de datos, con el motor Jet o a través del citado ODBCDirect.. ODBCDirect.. Esa propiedad es DefaultType y nos permite elegir entre usar el motor de base de datos Jet (Poniendo a esta propiedad el valor 2 o dbUseJet) dbUseJet) o usar usar ODBCDirect (Poniéndole (Poniéndole el valor 1 ó dbUseODBC) El valor por defecto es usar el motor Jet y así trabajaremos en principio. Ya tenemos enlazado el control Data a la base de datos. Falta ahora enlazar una etiqueta y un TextBo extBox x al cont contro roll Data Data para para tene tenerr el enla enlace ce comp comple leto. to. Eso Eso es aún aún más más senc sencill illo. o. Si desplegamos las propiedades del TextBox por ejemplo, veremos que tiene unas propiedades que cuando lo estudiamos, las habíamos pasado un poco por alto: DataSource y DataField. En la figura puede ver que la propiedad DataSource puede desplegarse, mostrando en este caso caso el nombre del único control control Data que tenemos tenemos en el formulario: formulario: Data1 Si tuviésemos mas controles Data, aparecerían los nombres de todos ellos. Se elige uno.
A contin continua uació ción n debe debemos mos seña señalar larle le qué qué campo campo quere queremo mos s que que nos nos prese presente nte.. Podemo Podemos s despleg desplegar ar la lista, donde podemos podemos ver los campos de la tabla tabla elegida elegida para la propieda propiedad d RecordSource RecordSource del control Data. Elegimos uno y ejecutamos la aplicación.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 4
Podemos observar que ya funciona. Si ponemos tantos TextBox como campos tiene la tabla elegida, podemos ver todo el contenido de la Base de datos moviéndonos a lo largo de ella mediante las flechas de cursor del control Data. Todo ello sin escribir una línea de código tal y como habíamos prometido. Entremos ahora en un estudio un poco más avanzado del control Data. El control Data proporciona acceso a datos almacenados en bases de datos usando uno de los Recordset. El control Data le permite ir de registro en registro y presentar tres tipos de objetos Recordset. y manip manipula ularr los los dato datos s de los en control controles es enlaz enlazad ados os.. Sin un control control Data, Data, los controles enlazados con datos de un formulario no pueden pueden tener acceso automáticamente a los datos. Los controles enlazados solamente pueden tener acceso a un control Data si este está en el mismo Formulario. En el tema de Bases de Datos se emplean términos no conocidos aún. Se irán viendo a lo largo del curso, pero no queda otro remedio mas que comenzar a utilizarlos. Se irán haciendo avances de estos términos, que serán explicados en profundidad en su momento. Avance de términos. Objeto Recordset (conjunto Recordset (conjunto de registros) Es un conju conjunto nto lógic lógico o de regis registro tros. s. Los Los tres tres tipos tipos de objet objetos os Record Recordset set son son Dynaset , (Permite la lectura y escritura de un registro) Snapshot (Realiza una lectura instantánea de los registros, no permitiendo modificarlos) y Table. Table. (Represe (Representac ntación ión en el códig código o de una tabla base que puede utilizarse para agregar, modificar o eliminar registros de una sola tabla). Controles enlazados Son los controles que pueden presentar directamente datos de uno o varios campos de una Base de Datos. Los controles DBList, DBCombo y DBGrid tienen la posibilidad de presentar un conjunto de registros cuando se asocian con un control Data. Los controles CheckBox, TextBox, Label, Picture, Image, ListBox y ComboBox también son controles enlazados con datos y pueden asociarse a un único campo de un Recordset administrado por un control Data. La mayoría de las operaciones de acceso a datos se pueden realizar usando el control Data sin escribir escribir ningún ningún código. Los controles controles enlazados enlazados con un control Data presentan presentan de forma automática los datos de uno o más campos del registro actual o, en algunos casos, de un conjunto de registros a ambos lados del registro actual. actual. El control Data realiza todas las operaciones sobre el registro actual. actual. Avance de términos Registro Actual . Un registro es un conjunto completo de campos. Una base puede tener muchos registros, pero el “puntero” de la base de datos apunta a un único registro en cada momento. Ese registro al que apunta el puntero se llama registro actual. Si el control Data recibe instrucciones de moverse a un registro diferente, todos los controles enlazados pasan automáticamente los cambios al control Data para ser guardados en la base de datos. El control Data se sitúa después en el registro requerido y pasa los datos del registro actual actual a los control controles es enlaz enlazad ados os dond donde e son son prese presenta ntado dos. s. Esto Esto signific significa a que que se pued pueden en modificar los datos de una base de datos simplemente cambiando los datos en los controles enlazados que lo permitan, y moviendo el puntero de la base de datos, es decir, cambiando el registro actual. Una vez iniciada la aplicación, Visual Basic usa las propiedades del control Data para abrir la base base de datos seleccionad seleccionada, a, abrir un objeto objeto Databas Database e y crear crear un objeto Recordse Recordset. t. Las propiedades Database y Recordset del control Data hacen referencia a los objetos Database y Recordset Recordset recién creados que pueden pueden ser manipulados por el control Data. Siempre podremos
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 5
conocer el Recordset usado por el control Data leyendo esa propiedad VariableTipoRecordset =Data1.Recordset =Data1. Recordset Y si tenemos otro control Data en la aplicación (Puede estar en otro formulario) siempre podemos hacer que el recordset de este segundo control Data sea igual al del primero Set Data2.Recordset Data2.Recordset = VariableTipoRecordset (Obviamente el ámbito de VariableTipoRecord VariableTipoRecordset set debe permitir que se vea en los fo rmularios donde está Data1 y Data2 Cuando se usa un control Data para crear un objeto Recordset o cuando se crea un objeto Recordset en el código y se asigna al control Data, el motor de base de datos Jet de Microsoft puebla puebla automáticame automáticamente nte el objeto objeto Recordse Recordset. t. Como resultado, resultado, los marcadore marcadores s (y en los objetos Recordset de tipo snapshot, los datos del conjunto de registros) se guardan en la memoria local; el usuario no necesita manipular el control Data y no es necesario invocar el método MoveLast en el código para conocer el número total de registros. Los bloqueos de página usados para crear el Recordset se liberan más rápidamente, haciendo posible que otros objetos Recordset accedan a los mismos datos. Los objetos Recordset creados en el código pero que no se asignan a un control Data no son poblados automáticamente por el motor Jet. Se deben poblar desde el código. El párrafo anterior, tomado casi literalmente de la información de Microsoft, exige al menos una explicación. Cuando se crea un Recordset mediante un control Data, se leen inmediatamente todos los registros que forman parte de ese Recordset (Recuerde que un Recordset es un conjunto de registros). De esta forma, en una base que estuviera compartida por varios usuarios a través de una Red de Area Local (RAL) un usuario leería todos los datos en el mismo momento de la creación del Recordset por el control Data, llevaría esos datos a su memoria RAM y no volvería a estorbar en la base de datos (cuando un usuario de una RAL lee un dato en una BD, bloquea esta BD mientras dura su lectura y no pueden acceder a ella otros usuarios) Si el Recordset se crea por código, se lee solamente un registro (la base se bloquea en el momento de la lectura e inmediatamente se libera), y cuando se le pide otra operación (p.e. que avance un registro) vuelve a bloquear la BD, lee ese registro y la desbloquea. En principio el leer el Recordset de una vez parece que tiene ventajas en aquellas instalaciones que tienen una base de datos compartida. Todo ello a un precio. Ocupar mas memoria RAM en cada uno de los PCs de los usuarios. Esta limitación hace en algún caso que no sea posible utilizar un control Data por falta de memoria RAM en los puestos de usuario. El control Data puede manipularse con el mouse, moviéndose de registro en registro o al principio o al final del Recordset. El control Data no permite que el usuario se pase de los límites del Recordset usando usando el mouse. No se puede mover el enfoque al control Data.
Observación muy importante El control Data crea un objeto Database y un objeto Recordset automáticamente. Estos objetos de acces acceso o a datos datos son idéntic idénticos os a los creados creados median mediante te códig código, o, y tiene tienen n las mismas propiedades propiedades y métodos. Podemos referi rnos a ellos usando el nombre del control Data seguido del nombre del objeto (Database o Recordset). Por ejemplo : Data1.Database
Data1.Recordset
El objeto Database creado por un control Data no se cierra aunque se cambie la propiedad Datab Databas aseN eName ame del del control control Data. Data. Lo mismo mismo ocurre ocurre con con el objeto objeto Record Recordset set.. Solame Solamente nte podemos cerrarlos utilizando el método Close :
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 6
Data1.Database. Close
Data1.Recordset. Close
Esta observación debe ser tenida muy en cuenta sobre todo cuando el control Data abre la Base de Datos de forma exclusiva, o cuando tenemos que hacer una operación con la Base de Datos que exija que esté cerrada. Por ejemplo, el método CompactDatabase y otros métodos que veremos mas adelante. Objetos para acceso a datos Los objetos para acceso a datos Database y Recordset creados por el control Data tienen cada uno sus propiedades y métodos propios y se pueden escribir procedimientos que usen estas propiedades y métodos para manipular los datos. Por ejemplo, el método MoveNext de un objeto Recordset mueve el registro actual al siguiente registro del Recordset. Para invocar este método, se podría usar el siguiente código: Data1.Recordset. MoveNext El control control Data puede puede crear crear cualquie cualquiera ra de los tres tipos de objetos objetos Recordset Recordset (Dynaset, (Dynaset, Snapshot, Table) Table) Si no se indica el tipo a crear, se crea un Recordset de tipo Dynaset.
Nota. Las constantes usadas para requerir un tipo específico de Recordset cuando se usa un control Data son diferentes de las constantes usadas para determinar el tipo de Recordset creado o que se va crear usando el método OpenRecordset. OpenRecordset. Para seleccionar un tipo específico de Recordset, Recordset, establezca la propiedad RecordsetType del control Data a: Tipo de Recordset
Valor
Constante control Data
Constante OpenRecordset
Table Dynaset Snapshot
0 1 2
vbRSTypeTable vbRSTypeDynaset vbRSTypeSnapshot
dbOpenTable dbOpenDynaset dbOpenSnapshot
Diferencias entre la Edición Standard y la Edición Profesional de Visual Basic En cuanto cuanto al acces acceso o a datos datos,, la diferen diferencia cia princi principal pal entre entre las edicion ediciones es Están Estánda darr y la Profesional de Visual Basic es la capacidad de crear nuevos objetos para acceso a datos. En la edición edición Estándar NO se puede pueden n decla declarar rar en el código código (con la palab palabra ra clave Dim) variables como objetos para acceso a datos. Esto quiere decir que sólo el control Data puede crear objetos Database y Recordset. En la edición Profesional y Empresarial de Visual Basic, SI se puede crear un nuevo objeto Recordset y asignarlo a la propiedad Recordset del control Data. ¡Esta diferencia ha lle vado a la locura l ocura a muchos alumnos y programadores usando usando la versión ver sión de su casa y la de su empresa o centro escolar ! En la pequeña aplicación realizada al comienzo de este tema ha visto que los controles enlazados a datos permiten visualizar e introducir datos en la base de datos a través del control Data. Efectivamente, no tendría sentido poner un control data sin enlazarlo a otros control controles es para para que que estos estos nos nos sirvan sirvan de eleme elemento ntos s de prese presenta ntació ción n y captur captura a de datos datos.. Veremos mas adelante en este capítulo los controles enlazados a datos. Consultas almacenadas Otra opción importante importante cuando cuando se usa el control control Data es la posibilid posibilidad ad de presenta presentarr una consulta consulta realizada realizada previamente previamente en Access. Access. Si se ha creado creado previamente previamente una consulta consulta,, el control Data nos mostrará esa consulta como si se tratase de una tabla más de la base de datos, al desplegar desplegar la lista de tablas para cubrir la propiedad propiedad RecordSource. Puede por lo tanto
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 7
presentar solamente los campos que necesite en su aplicación, tomados de una tabla (o de varias tablas si ha establecido las relaciones oportunas) y de esta forma su aplicación va a trabajar más rápido que si tuviese que seleccionar esos campos mediante una instrucción SQL Para presentar una consulta, establezca la propiedad RecordSource del control Data a l nombre de esa consulta (En vez de poner el nombre de una tabla, ponga el nombre de la consulta). Esto no puede hacerse si la consulta contiene parámetros. Esto le ocurre cuando la consulta se ha creado partiendo de los datos de otra consulta. Es mucho mucho más rápida rápida una una consul consulta ta utiliza utilizand ndo o una una consul consulta ta ya cread creada a en Access Access que que introduciendo la consulta en SQL. La razón es muy sencilla. Al crear una consulta es Access quien quien crea una especie especie de “tabla nueva” nueva” en la propia propia base de datos. datos. Esta tabla tabla nueva no contiene datos, sino referencias a registros de una tabla. Por lo tanto, el motor de bases de datos se limita a r ecorrer esa “tabla nueva”, tomar el número del registro que debe presentar presentar,, ir a ese registro y tomar el dato que contiene. Si lo que hace es una consulta SQL, se debe obtener la información registro a registro según las condiciones establecidas en la cláusula SQL. Esta segunda opción tarda logicamente más. Y si está leyendo la base de datos a través de una red de área local, la ocupación de esta red es mucho menor si el recordset se crea con la consulta de Access. Estamos hablando hablando de de una consulta consulta SQL establecida en el control Data. ¿Dónde? Justamente en la propie propieda dad d Record RecordSo Sourc urce e del del contr control ol data. data. Hasta Hasta ahora ahora había habíamos mos pues puesto to en esa esa propiedad el nombre de una tabla o de una consulta ya hecha en Access. Si en vez del nombre de la tabla ponemos una consulta SQL, la cosa también funciona: Con una Tabla Data1.RecordSource Data1.RecordSource = “Autores” Con una consulta SQL Data1.RecordSource Data1.RecordSource = “Select * From Autores Where Apellidos = ‘Cervantes Saavedra’” Esta Esta consul consulta ta obtie obtiene ne de la tabla tabla Autores, Autores, solam solament ente e los los regist registro ros s en los los que que el campo campo Apellidos Apellidos sea igual a “Cervantes “Cervantes Saavedra” Funciona, Funciona, pero para averiguar el número número de registros que tienen esos apellidos deberá recorrerlos todos, comprobar si son iguales a los expresados en la sentencia SQL y en caso afirmativo pasarlos al recordset creado. Si se hubiera creado una consulta previamente en Access, y pusiésemos el nombre de la consulta en la propieda propiedad d RecordSo RecordSource urce del control control Data, Data, éste iría directamen directamente te a los registros registros que gozan de tan ilustres apellidos, ya que Access habría hecho una tabla con los números de los registros que cumplen esa condición (esa tabla no contiene los datos, sino el número de los registros que los contienen), el control data leería esos números e iría a los registros indicados en esos números, evitando de esta forma tener que leer el contenido del campo Apellidos del resto de los registros. De cualquier forma, si la base de datos datos está en el mismo ordenador ordenador que la aplicación, esto empieza a ser importante cuando trate tablas con muchos registros. Si está en una red de área local no hace falta tener muchos registros para comprobar que se ralentiza la aplicación. Propiedades del control Data Align El control Data puede programarse para que se ajuste automáticamente a la parte superior o inferior de su formulario primario usando la propiedad Align. Align. En cualquier caso, el control Data ajusta su tamaño horizontal al de su formulario primario cuando el tamaño de éste cambia. Esta propiedad permite situar un control Data en un formulario MDI sin requerir un control Picture que lo contenga. Appearance Flat y 3-D Backcolor
LSB
Color de fondo de la parte intermedia del control
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 8
Administración de BOF/EOF Las propiedades BOFAction y EOFAction establec establecen en el comportamie comportamiento nto del control control Data cuando llega al principio o final de los registros. En esos casos se produce el BOF y EOF respectivamente. BOF (Begin Of File). Se produce el BOF cuando el control Data se posiciona sobre el registro inmediatamente anterior al primero prim ero (No es un juego de palabras). Este registro será el -1. EOF (End Of File) Se produce la condición EOF cuando el control Data se posiciona en el registro inmediatamente posterior al último. Este registro será también el - 1. La propiedad propiedad BOFAction permite seleccionar el comportamiento del Data cuando nos hemos pasado de registros por abajo. Tiene las opciones MoveFirst (se mueve al primer registro) o BOF (se queda donde está) La propiedad EOFAction establece el comportamiento del control Data cuando se sobrepasa el último registro. Podemos indicarle que se mueva al último registro ( MoveLast), MoveLast), que se quede donde está (EOF ( EOF), ), o que introduzca un nuevo registro (AddNew ( AddNew)) Caption
El nombre que figurará en la parte intermedia del control.
Connect Muy Importante. En esta propiedad debemos indicarle al control Data el tipo de base de datos a la que va a conectarse. Admite todas las bases enumeradas al principio de este capítulo. DatabaseName En esta propiedad se le indica el nombre (Con su Path) de la base de datos a la que debe conectarse. Para facilitar la búsqueda de la base de datos, haciendo click en esta propiedad en la caja de propiedades, podemos sacar un cuadro de diálogo haciendo click de nuevo en los tres puntos que que aparecen aparecen a la derecha de la propiedad. propiedad. El cuadro de diálogo seleccionará directamente las extensiones de los ficheros de bases de datos acordes con el Connect. tipo de base de datos seleccionada en la propiedad Connect. Database
(Solo en ejecución)
Esta propiedad es sólo de lectura. Devuelve una referencia a un objeto Database subyacente de un control Data. Variable = nombredelcontroldata. nombredelcontroldata.Database Database
Sintaxis
El objeto Database creado por el control Data se basa en las propiedades DatabaseName, Exclusive, ReadOnly y Connect del control. Los objetos Database tienen propiedades y métodos que puede utilizar para administrar los datos. Puede utilizar cualquier método de un objeto Database con la propiedad Database de un control Data, como Close y Execute. También puede examinar la estructura interna de la Database empleando su colección TableDefs y, a su vez, las colecciones Fields e Indexes de objetos TableDef individuales. NOTA. Aunque puede crear un objeto Recordset y pasarlo a la propiedad Recordset de un control Data, no puede abrir una base de datos y pasar el objeto Database recién creado a la propiedad Database del control Data. DragIcon, DragIcon, DragMode , Enabled Igual que todos los controles. DefaultType
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 9
Devuelve o establece un valor que indica el tipo del origen de de datos (Motor Jet u ODBCDirect) que se usan en el control Data. Data. Sintaxis
NombreDelControlData.DefaultType = 1 NombreDelControlData.DefaultType
Puede tomar los valores 1 (Usa ODBCDirect) ODBCDirect) y 2 (Usa el Motor Jet) Pueden usarse usarse también las constantes dbUseODBC o dbUseJet respectivamente EditMode Solo lectura en tiempo de ejecución. Devuelve un valor que indica el estado de modificación del registro actual. Sintaxis
Variable = NombreDelControlData.EditMode NombreDelControlData.EditMode
Variable tomará uno de los siguientes valores : dbEditNone dbEd dbEdit itIn InPro Progr gres ess s
No se está realizando ni ninguna operación de de modific ficación. Se ha invoc invocad ado o el el méto método do Edit Edit y el el regi regist stro ro act actua uall se se enc encue uentr ntra a en en el el búfer de copia. dbEditAdd Se ha invo nvocado el método AddNew y el registro actual del búfer de copia es un registro nuevo que aún no se ha guardado en la base de datos. La propiedad EditMode es especialmente útil cuando se desea partir de la funcionalidad predeterminada de un control Data, o cuando no se utiliza un control Data en Visual Basic Edición profesional. Puede comprobar el valor de la propiedad EditMode y el del parámetro acción del procedimiento del evento Validate para determinar si se debe invocar el método Update. También puede comprobar si el valor de la propiedad LockEdits es True y el de EditMode es dbEditInProgress para determinar si la página de datos actual se encuentra bloqueada. Exclusive Devuelve o establece un valor (True / False) que indica si la base de datos está abierta para acceso de un único usuario o de múltiples usuarios. Font, Font , ForeColor , Height, Height, Index, Index, Left, Left, MouseIcon, MouseIcon , MousePointer , Name, Name, igual que el resto de los controles. Negotiate Propiedad característica de los controles que tienen la propiedad Align. Align. Establece un valor que determina si se muestra un control que puede alinearse cuando un objeto activo del formulario muestra una o más barras de herramientas. No está disponible en tiempo de ejecución. Options Devuelve o establece un valor que especifica una o más características del objeto Recor Records dset et de la propie propieda dad d Record Recordset set del del control control Data. Data. Pued Puede e pone ponerse rse en el cuadro cuadro de propiedades o en tiempo de ejecución. Puede tomar los siguientes valores o nombres de constantes (estos nombres solo si los introduce en tiempo de ejecución) 1
dbDenyWrite
2
dbDenyRead
4 8
dbReadOnly dbAppendOnly
16
dbInconsistent
32
dbConsistent
LSB
En un entorno mult iusuario, otros usuarios no pueden realizar cambios en registros del Recordset. Recordset. En un entorno multiusuario, otros usuarios no pueden leer registros (sólo Recordset de tipo tabla). No se pueden realizar cambios en registros del Recordset. Puede agregar nuevos registros al Recordset, pero no puede leer los registros existentes. Las actualizaciones pueden aplicarse a todos los campos del Recordset, Recordset, aunque infrin jan la condición de unión. (Predeterminado) Las actualizaciones sólo se aplican a los campos que no infringen la condición de unión.
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 10
64
dbSQLPassThrough
256
dbForwardOnly
512
dbSeeChanges
Cuando se utilizan controles Data con una instrucción SQL en la propiedad RecordSource, envía la instrucción SQL a una base de datos ODBC, como SQL Server o Oracle, para su procesamiento. El Recordset es un desplazamiento sólo hacia adelante. El único único métod método o de movimient movimiento o permiti permitido do es MoveNex MoveNext. t. Esta Esta opción no puede utilizarse en objetos Recordset manipulados con el control Data. Genera un error interceptable si otro usuario está cambiando datos que usted edita.
Para establece establecerr mas de un valor de los descritos descritos,, basta basta con sumar sus v alores. alores. También También puede puede establec establecer er más de un valor para esta propieda propiedad, d, combinand combinando o opcione opciones s sumando sumando valores entre sí. Por ejemplo, para establecer dbReadOnly y dbInconsistent puede utilizar este código: Data1.Options Data1.Options = dbAppendOnly + dbInconsistent Para determinar si la propiedad contiene un valor específico, puede utilizar el operador And. Por ejemplo, para averiguar si el Recordset está abierto para acceso de sólo lectura, podría usar este código: If Data1.Options And And dbReadOnly Then... Si cambia la propiedad Options en tiempo de ejecución, deberá utilizar el método Refresh para que el cambio sea efectivo. ReadOnly Devuelve o establece un valor que determina si la Database del control está abierta para acceso de sólo lectura. RecordsetType Devuelve o establece un valor que indica el tipo de objeto Recordset que desea que cree el control Data. Los valores o nombre de la constante que puede adoptar son los siguientes: 0 1
vbRSTypeTable vbRSTypeDynaset
2
vbRSTypeSnapshot
Un Recordset de tipo tabla. (Predeterminado) Un Recordset de tipo hoja de respuestas dinámica. Un Recordset de tipo instantánea.
Si no especifica un RecordsetType antes de que el control Data cree el Recordset, se creará un Recordset de tipo hoja de respuestas dinámica. (Dynaset ( Dynaset))
Recordset Devuelve o establece un objeto Recordset definido por las propiedades de un control Data o por un objeto Recordset existente. Veremos mas adelante las propiedades de un objeto Recordset, propiedades que son en todo aplicables al Recordset del control Data. El Recordset es como se adelantó, un conjunto de registros. Si las propiedades Connect, DatabaseName, Options, RecordSource, Exclusive, ReadOnly y RecordsetType establecidas para el control Data son válidas, se crea un Recordset automáticamente basándose en dichas propiedades. propiedades. Ese será el Recordset del control Data. Pero también puede crearse previamente
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 11
un Recordset mediante la instrucción OpenRecordset y forzar que el Recordset del control Data sea justamente ese mediante la instrucción Set Data1.Recordset = MiRecordset Sea cual fuera la forma de crearlo, a partir del momento en que el Data tenga su Recordset podemos referirnos a él, por ejemplo para ir al primer registro (Data1.Recordset.MoveFirst), avanzar un registro registro (Data1.Recordset.MoveNext), (Data1.Recordset.MoveNext), al anterior (Data1.Recordse (Data1.Recordset.MovePrevious) t.MovePrevious) ir al último (Data1.Re (Data1.Record cordset.M set.MoveLa oveLast), st), añadir añadir un registro registro (Data1.R (Data1.Record ecordset. set.AddN AddNew), ew), guardar los cambios en la Base de Datos (Data1.Recordset.Update), o borrar el registro actual (Data1.Recordset.Delete) Si se cambia alguna de las propiedades citadas al principio que cambien el Recordset, es necesario volver a crearlo. Para ello basta basta con utilizar el Método Refresh. Refresh. (Data1.Refresh) RecordSource Devuelve o establece la tabla, el objeto QueryDef (Consulta) o la instrucción SQL subyacente para un control Data. Esta propiedad puede fijarse en el cuadro de propiedades del control data, (el caso mas usado) o introducirse como código. En los dos primeros casos, lo normal es introducir el nombre de una tabla o una consulta de las existentes en la base de datos especificada en la propiedad DatabaseName, nombres que se pueden elegir desplegando la lista que se obtiene haciendo click sobre la flecha que aparece al lado de la casilla de esta propiedad. Observe que en la lista desplegada figuran los nombres de las tablas y de las consultas que tiene la Base de Datos elegida en la propiedad DatabaseName. Ni que decir tiene que para poder introducirla de esta forma es necesario fijar previamente la propiedad DatabaseName. Puede introducirse en tiempo de ejecución mediante código con la siguiente expresión : NombreDelControlData.RecordSource = “NombredelaTabla NombreDelControlData.RecordSource Donde NombredelaTabla es una expresión de cadena que especifica el nombre de una Tabla o Consulta, de las una Consulta, las que que comp compon onen en la base base de dato datos s espe especifi cifica cada da en la prop propie ieda dad d DatabaseName, DatabaseName, o una consulta SQL válida vá lida que util iza sintaxis apropiada apropiada para la base de datos DataBaseName. La propied especificad especificada a en la propieda propiedad d DataBaseName. propiedad ad RecordSource especifica especifica el origen de los recursos accesibles a través de controles enlazados del formulario. Si establece la propiedad RecordSource como el nombre de una tabla existente en la base de datos, todos los campos de esa tabla serán visibles a los controles enlazados adjuntos a este control Data. El orden de los registros recuperados lo establece el objeto Index que selecciona mediante la propiedad propiedad Index del Recordset. Si no establece la propiedad Index, los datos se devolv erán sin ningún orden concreto. Si establece la propiedad RecordSource como el nombre de una consulta existente en la base de datos, todos los campos devueltos por la consulta serán visibles a los controles enlazados adjuntos al control Data. El orden de los registros recuperados lo establece la consulta Si en la consulta no se ha especificado un orden, los datos se devolverán sin ningún orden concreto. Si establece la propiedad RecordSource como una instrucción SQL que devuelve registros, todos los campos devueltos por la consulta a SQL serán visibles a los controles enlazados adjuntos al control Data. Esta instrucción puede incluir una cláusula ORDER BY para cambiar el orden de los registros devueltos por el Recordset creado por el control Data o una cláusula WHERE para filtrar los registros. Después de cambiar el valor de la propiedad RecordSource en tiempo de ejecución, deberá utilizar el método Refresh para activar el cambio. Nota. Aseg Asegúr úres ese e de que que cada cada contr control ol enlaz enlazad ado o tiene tiene un valor valor válido válido para para su propie propieda dad d DataField. DataField. Si cambi cambia a el valor valor de la prop propie ieda dad d RecordSource de un contr control ol Data Data y, a
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 12
continuación, utiliza Refresh, Refresh, el Recordset identificará el nuevo objeto. Esto puede invalidar los valores de DataField de controles enlazados y producir un error interceptable.
Las Propiedades Propiedades Tag, Tag, Top, Top, Visible, Visible, WhatThisHelpID, WhatThisHelpID , Width, Width, igua iguall que que el rest resto o de los controles. METODOS DEL CONTROL DATA (Se explican aquí los métodos que inciden inciden directamente en el tratamiento de bases de de datos. No se comentan los métodos Drag, Move y ZOrder que son idénticos a los del resto de controles) Método Refresh De momento es aplicable al control Data. Veremos que también es aplicable a otros objetos de acceso a datos (QueryDef). El método Refresh no puede utilizarse con colecciones que no sean persistentes, como Databases, Recordsets o Workspaces. Workspaces. Actualiza los datos del recordset del control data. Imagínese que el control data accede a una base de datos compartida. Mediante este método actualizamos el contenido del recordset del Data y por lo tanto tanto los datos presenta presentados dos a través de los controles controles enlazados enlazados.. El método Refresh también se utiliza para cerrar y volver a generar el objeto Recordset o las estructuras de datos creadas por un control Data. NombredelcontrolData.Refresh
Sintaxis
Puede utilizar el método Refresh sobre un control Data para abrir o reabrir la base de datos (si han variado las propiedad propiedades es DatabaseNa DatabaseName, me, ReadOnly ReadOnly,, Exclusive o Connect Connect)) y volver a generar el objeto Recordset indicado por la propiedad Recordset del control. Método UpdateControls Actualiza los datos presentes en los controles enlazados enlazados a datos vinculados al control Data. Sintaxis
Nombredelcontroldata.UpdateControls Nombredelcontroldata.UpdateControls
Utilice este método para restablecer en los controles enlazados sus valores originales, por ejemplo cuando un usuario modifica los datos y luego decide cancelar los cambios. Este método produce el mismo efecto que hacer actual de nuevo al registro actual, excepto en que no se produce ningún evento ni introduce en la Base de Datos los posibles valores que se hubiesen cambiado en los controles enlazados. Método UpdateRecord Guarda en la base de datos los valores actuales de los controles enlazados. Sintaxis
NombredelcontrolData.UpdateRecord
Puede utilizar este método para guardar el contenido actual de los controles enlazados en la base de datos. datos. Los cambios introducidos en los los controles enlazados a datos datos se pasan pasan a la base de datos al cambiar el registro actual, bien mediante código (Data1.Recordset.MoveNext, p.e.) o usando usando las flechas del del control data, o cambiando cambiando el registro actual actual en un DBGrid. Sin embargo embargo hay circunstan circunstancias cias en las que no es apropiad apropiado o hacer hacer esto. esto. Mediante Mediante el método método UpdateRecord UpdateRecord introducimos los cambios en la BD. Este método no desenca desencadena dena el evento Validate. En algunos casos, la actualización puede no tener lugar, lugar, debido a que la operación vul nere las
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 13
restricciones de integridad referencial, o que la página que contiene el registro esté bloqueada, o que la base de datos u objeto Recordset no sean actualizables, o a que el usuario no cuente con el permis permiso o adecu adecuad ado o para para la opera operació ción. n. En cualqu cualquier iera a de esta estas s circun circunsta stanci ncias as,, se producirá un error interceptable. Estos son los métodos del Control Data. Este control tiene su Recordset, y el Recordset del control Data tiene sus métodos, idénticos a los de un Recordset creado por código. EVENTOS DEL CONTROL DATA Error Se produce solamente como resultado de un error de acceso a datos que tiene lugar cuando no está ejecutando código Visual Visual Basic. Lo explicamos. El control data carga los datos durante la carga del formulario que lo contiene, abriendo la base indicada en su propiedad DataBaseName. Imagínese que no existe esa base de datos en el disco. En ese caso no se producirá ningún interceptable ya que no se ejecuta ningún código escrito. Tampoco se ejecuta ningún código escrito cuando el usuario hace click en uno de los botones del control data. El procedimiento Error del control Data se ejecuta cada vez que ocurre un error por una maniobra de este tipo, y pasa el código de error como parámetro. Analizando el código de error podemos escribir escribir código en este procedimiento procedimiento para paliar el error. La ayuda de de VB tiene un buen ejemplo del uso de este procedimiento. Este ejemplo presenta un cuadro de diálogo Abrir si no se ha podido encontrar la base de datos datos especificad especificada a en la propieda propiedad d DataBaseName del control control Data después de haber haber terminado el evento Form_Load. Private Sub Data1_ Error Error (DataError (DataError As Integer , Response As Integer ) Select Case DataError 'Si no se ha encontrado el archivo de base de datos se produce el error 3024 Case 3024 'Presentar un cuadro de diálogo Abrir. CommonDialog1.ShowOpen End Select End Sub Reposition Se produce después de que un registro se convierte en el registro actual. Private Sub Objeto _ Reposition() Reposition () Donde objeto = Nombre del control Data Cuando se carga un control Data, El primer registro de su objeto Recordset se convierte en el registro actual, provocando el evento Reposition. Reposition. Cuando Cuando un usuario usuario haga clic en uno uno de los botones del control Data, moviéndose de registro en registro o si se usa uno de los métodos Move Move del del obje objeto to Reco Record rdse sett asoc asocia iado do al cont contro roll data data,, como como Move MoveNex Next, t, MoveFi MoveFirs rst, t, MovePrevious, MovePrevious, los métodos métodos Find, como FindFirst, FindFirst, FindNext, o cualquier cualquier otra propiedad propiedad o método que cambie el registro el actual, se produce el evento Reposition después de que cada registro se convierta en el actual. Este evento se puede usar para realizar cálculos basándose en los datos del registro actual o para cambiar el formulario en respuesta respuesta a los datos del registro actual. Validate
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 14
Se produce antes de que un registro diferente se convierta en el registro actual; antes del método Update (excepto cuando los datos se guardan con el método UpdateRecord); y de los métodos Delete, Unload o la operación Close. Private Sub objeto _ Validate Validate ([ índice As Integer,] acción As Integer, guardar As guardar As Integer) objeto = Nombre del control Data índice = Indice del control Data dentro de una matriz de controles (Si ha lugar) acción = Un entero que indica la operación que ha producido producido el evento, e vento, como se describe mas adelante guardar = guardar = una expresión booleana que especifica si los datos asociados han cambiado, como se describe mas adelante. Acción puede tomar estos valores : 0
vbDataActionCancel
1 2 3 4 5 6 7 8 9 10 11
vbDataActionMoveFirst vbDataActionMovePrevious vbDataActionMoveNext vbDataActionMoveLast vbDataActionAddNew vbDataActionUpdate vbDataActionDelete vbDataActionFind vbDataActionBookmark vbDataActionClose vbDataActionUnload
Cancela la operación cuando se sale del procedimiento Sub. Método MoveFirst. Método Mo MovePrevious. Método MoveNext. Método MoveLast. Método AddNew. Operación Update (no UpdateRecord). Método Delete. Método Find. La propiedad Bookmark no ha sido def inida. Método Close. El formulario se va a descargar.
Los valores de guardar son: True rue False False
Los Los dat datos os asoc asocia iado dos s han han camb cambia iado do.. Los Los dato datos s asoci asociad ados os no no han han cambia cambiado do..
El evento Validate se usa para realizar las últimas comprobaciones sobre los registros que se van a escribir en la base de datos. Vea la ayuda de Visual Basic para mayor detalle de este evento.
CONTROLES ENLAZADOS A DATOS Los controles enlazados a datos son aquellos que pueden presentar datos de una base de dato datos, s, a travé través s de un cont contro roll Data Data.. Los Los contr control oles es enla enlaza zado dos s a dato datos s permi permite ten n crea crear r aplica aplicacio cione nes s con acces acceso o a datos datos con muy poco poco códig código, o, o inclus incluso o ningu ninguno no.. Para Para utiliza utilizar r cualquiera de estos controles enlazados conectables a datos debe incluir uno o más controles Data en un formulario. El control Data establece un enlace entre la base de datos y los controles enlazados para la manipulación de los datos. El control Data que sirve de enlace entre la Base de Datos y los controles enlazados debe estar obligatoriamente en el mismo formulario que los controles. Los controles asociados a datos tienen todos la propiedad DataSource, que es la propiedad donde se debe poner el nombre del control Data asociado a ellos. Existen en Visual Basic trece controles enlazados a datos, además del control Data : Data Ya comentado, se utiliza para tener acceso a los datos de las bases a través de controles enlazados de un formulario. Crea y administra los objetos Database y Recordset
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 15
para su uso por parte de los controles enlazados. Requerido para su uso con todos los demás controles enlazados. DBCombo Se utiliza para obtener una combinación enlazada formada por un cuadro de lista y un cuadro de texto. La lista puede llenarse automáticamente a partir de un control Data. El usuario puede elegir un elemento de la lista o introducir un valor en el cuadro de texto. Puede utilizarse utilizarse para proporcio proporcionar nar acceso de lectura / escritura escritura a un campo de texto específico específico seleccionado seleccionado en la lista. DBList Se usa para mostrar una lista generada a partir de un control Data en la que el usuario puede elegir un elemento. La lista puede rellenarse automáticamente desde un control Data, y puede proporcionar acceso de lectura / escritura a un campo de texto específico seleccionado en ella. DBGrid Se utiliza para mostrar a la vez todos los registros del recordset del control Data. El DBGrid se rellena automáticamente con todos los registros, y muestra todos los campos del recordset de control Data, formando una cuadrícula con filas y columnas. El usuario puede elegir un elemento de la cuadrícula para variar el valor en ese campo y registro o introducir un nuevo registro. El hecho de colocarse sobre un determinado registro de la cuadrícula, fuerza a ese registro a convertirse en el registro actual del control Data al que está asociado. asociado. Label Se usa para el texto que el usuario no debe modificar. Puede utilizarse para ofrecer acceso de sólo lectura a un campo de te xto específico. TextBox Se utiliza para almacenar texto que el usuario puede introducir o modificar. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto específico. CheckBox Se utiliza para crear un cuadro que el usuario puede elegir de forma sencilla para indicar si algo es verdadero o falso, o para mostrar varias opciones entre las que el usuario pueda elegir más de una. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo booleano o de bit específico. ComboBox Se utiliza para obtener una combinación de un cuadro de lista y un cuadro de AddItem. El usuario puede elegir un elemento de la texto. La lista se rellena con el método AddItem. lista o introducir un valor en el cuadro de texto. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto seleccionado seleccionado en la lista. Consulte el control DBCombo ListBox Se utiliza para mostrar una lista en la cual el usuario puede elegir un elemento. La lista se rellena con el método AddItem. AddItem. Puede usarse para proporcionar acceso de lectura / escritura a un campo de texto específico seleccionado en la lista. Consulte el control DBList PictureBox Se usa para mostrar una imagen gráfica de un mapa de bits, un icono o un metaarchivo en un formulario. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de imagen o binario específico. Image Se utiliza para mostrar una imagen gráfica de un mapa de bits, un icono o un metaarchivo archivo en un formula formulario. rio. Las Las imágen imágenes es mostra mostrada das s en un control control Image Image utiliza utilizan n menos menos recursos que las de los controles PictureBox. Puede usarse para proporcionar acceso de lectura / escritura a un campo de imagen o binario específico. MSFlexGrid Es un control enlazado a datos de reciente incorporación. Apareció con la versión 5 de VB y es un control parecido al DBGrid, pero con algunas ventajas y otros inconveniente. En este caso, estando asociado a un control Data, el MSFlexGrid solamente permite leer datos, no podemos podemos variar el contenido de ningún registro. registro. Tampoco se mueve el registro actual del control Data cuando seleccionamos seleccionamos otra fi la del MSFlexGrid.
PROPIEDADES RELACIONADAS CON DATOS COMUNES A ESTOS CONTRO LES
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 16
Los controles enlazados a datos tienen unas propiedades para el acceso a datos basadas en el enlace con la base de datos a través del control Data. Las propiedades comunes a todos ellos son : DataSource Fuente de datos. Es el nombre del control Data que lo enlaza con la B.D. Este control Data es el que determina la Tabla donde están los campos con los datos. Esta Tabla se determina mediante la propiedad RecordSource RecordSource del control Data. DataField Es el nombre del campo, dentro de la Tabla de la base de datos, que se va a prese present ntar ar en el control control enlaz enlazad ado o a datos datos.. Esta Esta propie propieda dad d no la tiene tiene el DBGrid ni el MSFlexGrid debido a que presentan todos los campos de la Tabla de la base de datos seleccionada seleccionada en el control Data. Si se le ha forzado al control Data la propiedad Recordset, los campos que se pueden mostrar en los controles enlazados a datos son justamente, los del ese Recordset al que se le ha forzado. Vamos a estudiar cada uno de los controles enlazados a datos con un poco mas de detalle. Control Label Posiblemente el control Label es el control más sencillo para mostrar el contenido de un campo de una base de datos. Como todos los controles enlazados a datos, el Label permite presentar los datos e introducirlos en la base a través del control Data. Lo que ocurre con el Label es que su propiedad Caption no se puede introducir directamente por teclado, y deberá cambia cambiarse rse por por códig código. o. Esto Esto pued puede e ser ser una una ventaja ventaja (no hay hay posib posibilid ilidad ad de introd introducir ucirlo lo accidentalmente) y un inconveniente, al tener que escribir código para hacerlo. El control Label, al poder ser origen (a través del formulario que lo contiene) y destino de un enlace DDE, esto nos puede resolver muchos problemas de introdución de distintos datos de otras aplicaciones que no tengan acceso directo a una base de datos. El cont control rol Labe Label, l, en lo refer referen ente te al enla enlace ce a dato datos, s, solam solamen ente te tiene tiene las las prop propie ieda dade des s DataField. mencionadas de DataSource y DataField. Control TextBox Todo lo dicho del control Label es aplicable al TextBox, TextBox, que además además presenta la particularidad de que en este control sí se puede escribir directamente desde el teclado. De esta forma podemos introducir datos o cambiar los existentes en la base de datos. Control CheckBox El contro controll Check CheckBox Box permite permite prese presenta ntarr e introd introducir ucir datos datos de tipo Boole Boolean ano. o. Tien Tiene e las propiedades DataSource y DataField en lo relativo a acceso a datos. Controles ListBox y ComboBox Estos controles tienen una característica especial respecto a su comportamiento con el enlace a la base de datos. La lista no se puede cargar directamente desde la base de datos, sino a través de un control intermedio, por ejemplo un Label, donde presentaremos un campo de la base de datos. El texto de la propiedad Caption de este Label se introduce en el ListBox o ComboBox mediante el método AddItem. Una vez introducidos todos los elementos de ese camp campo o que que nos nos inte intere rese sen, n, cada cada vez que que la base base de dato datos s se sitú sitúa a sobr sobre e el regi regist stro ro correspondiente a uno de los elementos que está en el ListBox o ComboBox, éste cambia su ListIndex para seleccionar el elemento correspondiente correspondiente al registro actual del control Data. El ListBox puede contener elementos correspondientes a la base de datos y otros ajenos. Puede emplearse esta característica del ListBox para seleccionar un elemento entre varios elementos tomados de la BD y otros introducidos por otro procedimiento, con la particularidad
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 17
de que que el ListI ListInd ndex ex de este este List ListBox Box irá irá a posi posicio ciona nars rse e sobr sobre e el elem elemen ento to de la BD correspondiente correspondiente al registro actual del Control Data. Tienen las propiedades DataSource y DataField en lo relativo a acceso a datos. Controles DBList y DBCombo Para agregar estos controles controles debe insertar el OCX Microsoft Micr osoft Data Bound List Controls 6.0 Estos controles tienen dos enlaces a controles data. Uno para rellenar la lista, que se lo RowSource, acompañado debemos indicar en la propiedad propiedad RowSource, acompañado del nombre nombre del campo con con el que ListField, y otro enlace a otro control la va a rellenar, que introduciremos en la propiedad ListField, Data, que se lo debemos indicar en la propiedad DataSource. DataSource. El campo de este segundo control Data se lo indicaremos en la propiedad DataField. DataField. El comportamie comportamiento nto de de estos estos dos dos controles es el siguiente: Mediante el enlace a través de la propiedad RowSource se rellena la lista, utilizando los datos del campo elegido en la propiedad ListField. ListField. Imaginemos que la tabla a la que nos conectamos con estas propiedades es la Tabla A. A. La tabla tabla a la que que enlazamos el DBList mediante la propiedad DataSource, DataSource, le llamamos Tabla B. Con este invento vamos a pasar un dato desde la tabla A a la tabla B. El dato que vamos a pasar está en la tabla A en el campo señalado en la propiedad BoundColumn del DBList. El registro registro de de la tabla A de donde cogemos el dato será el seleccionado en el DBList. El registro de la tabla B donde vamos a meter el dato será el registro actual de ese control data, control actual que habremos seleccionado mediante cualquier método. El campo de esa tabla B que vamos a variar será el campo indicado en la propiedad DataField. DataField. (Esto (Esto se vuelve vuelve a explic explicar ar mas mas abajo, pero para entenderlo no hay mas remedio que realizar una práctica) Control PictureBox y Control Image Pueden mostrar una imagen almacenada en una Base de Datos. Mediante el control Data, se puede introducir la imagen presente en uno de estos controles en la Base de Datos. El campo que contenga una imagen en una BD debe ser tipo Objeto OLE (Binario Largo en versiones anteriores de Access), y el tipo de imágenes i mágenes que se pueden pueden introducir son los mapas de bits bits (Arch (Archivo ivos s con con exte extens nsió ión n .BMP .BMP), ), los los arch archivo ivos s de icon icono, o, (Exte (Extens nsió ión n .ICO) .ICO) y los los metaarchivos. (Metafiles, extensión .WMF) Para introducir un gráfico en una BD es mas práctico introducirlo mediante un control Data y un control Picture o Image que creando por código un Recordset. En realidad deberíamos decir que es el único método práctico de introducir / sacar imágenes de una Base de Datos Control DBGrid Es posiblemente el control que más se use para presentar y modificar datos de una B.D. El control DBGrid presenta todos los registros y todos los campos de la Base de Datos. Por eso, necesita obligatoriamente un control Data para poder presentar datos. Otros controles (Label, TextBox, Picture, etc.) que solamente presentan un dato (un campo de un registro) pueden trabajar sin necesidad de un control data, creando un Recordset mediante código. (Lo ver emos un poco mas adelante). Sin embargo el control DBGrid, al presentar todos los datos de la base de datos necesita un control Data. Veamos porqué. Cuando creamos creamos un objeto Recordset mediante la instrucción : (se verá mas adelante) adelante) Set Mirecordset = MiDataBase. MiDataBase.Openrecordset (“Select campo1, campo2 from Mitabla”) lo que estamos haciendo es seleccionar, de todos los campos que pueda tener la tabla llamada Mitabla, los denominados campo1 y campo2. Cada vez que seleccionemos un registro, es ese registro solamente el que se mantiene en la memoria del ordenador, (el registro actual) y de ese registro, solamente metemos los datos del campo1 y campo2.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 18
Cuando creamos un Recordset mediante un control Data, se meten en la memoria TODOS los registros de la tabla especificada en el control data. Por lo tanto, al permanecer todos los registros de esa tabla en memoria, podremos presentar sus valores en el control DBGrid. DBGrid. No lo podremos hacer con un Recordset creado mediante código, que solamente mantiene un registro en memoria. Debe Debere remo mos s expli explica carr qué qué ocur ocurre re cuan cuando do se crea crea un Reco Record rdse sett medi median ante te códi código go,, y posteriormente se fuerza a que el Recordset del control data sea igual a ese Recordset creado. Con el Recordset creado con la instrucción anterior, podemos forzar a un control Data que su Recordset Recordset sea igual al ya creado mediante la instrucción : Set Data1.Recordset Data1. Recordset = MiRecordset En este caso, el control Data1 tomará todos los registros con los campos campo1 y campo2 de la base de datos y los meterá en la memoria RAM. Así ya podemos rellenar las cuadrículas del control DBGrid. Obse Observe rve que que una una aplica aplicació ción n de acceso acceso a datos datos ocupar ocupará á mucha mucha mas memoria memoria RAM si establecemos el enlace con la base de datos mediante un control Data que si lo hacemos creando creando Recordse Recordsets ts a medida. Pero si necesitamo necesitamos s presentar presentar los datos en un DBGrid, no quedará mas remedio que usar un control Data. Si nuestra aplicación no tiene que presentar en el DBGrid DBGrid todos todos los campos campos de la tabla tabla de la B.D. B.D. podem podemos os crear previamen previamente te un Recordset mediante código y a continuación forzar que el Recordset del control Data sea igual al Recordset creado, utilizando util izando la expresión anterior. El control DBGrid tendrá tantas columnas como como campos tenga el Recordset. El número de filas será igual al número de registros que tiene la tabla. Si se sobrepasa el espacio físico del DBGrid para poder poder presenta presentarlos, rlos, aparece aparecerán rán automáticame automáticamente nte flechas flechas de deslizamien deslizamiento to vertical. El ancho de las columnas puede cambiarse mediante la propiedad Width del objeto Columns del DBGrid. DBGrid1.Columns(n).Width = Valor DBGrid1.Columns(n).Width Donde n es el número de la columna (la primera es la 0) y el valor debe expresarse según las unidades unidades de medida (ScaleW idth) del Formulario que lo contiene. Del control DBGrid podemos destacar estas propiedades : AllowAddNew Devuelve o establece un valor que indica si el usuario puede agregar nuevos registros al objeto Recordset subyacente subyacente a un control DBGrid. La última fila que se muestra en el control DBGrid se deja en blanco para permitir a los usuarios introducir nuevos registros. Si la propiedad AllowAddNew es False, los usuarios no pueden pueden establecer el foco en dicha fila. fil a. El Recordset subyacente puede, por otras razones, no permitir inserciones incluso en el caso de que la propiedad AllowAddNew sea True. En este caso, se producirá un error si el usuario intenta agregar un registro. AllowDelete Devuelve o establece un valor que indica si el usuario puede eliminar registros del objeto Recordset subyacente a un control DBGrid. Utilice la propiedad AllowDelete para impedir que los usuarios eliminen registros del conjunto
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 19
de registros a través de la interacción con el control DB Grid. El objeto Recordset subyacente puede, por otras razones, no permitir eliminaciones incluso en el caso de que la propiedad AllowDelete sea True. En este caso, se producirá un error si el usuario intenta eliminar un registro. AllowRowSizing Devuelve o establece un valor que indica si un usuario puede modificar el tamaño de las filas del control DBGrid. Sintaxis
nombre.AllowRowSizing = [True / False]
Si la propiedad AllowSizing es True, el puntero del mouse se convierte en una flecha de doble cabeza (Size N S) cuando se sitúa sobre el divisor de filas entre selectores de registro, y el usuario puede modificar el tamaño de las filas mediante arrastre. Cualquier cambio de tamaño de columna provoca un evento e vento RowResize. AllowUpdate Devuelve o establece un valor que indica si un usuario puede modificar datos del control DBGrid. Sintaxis
nombre.AllowUpdate = [True / False]
Cuando la propiedad AllowUpdate es False, el usuario puede aún desplazarse a través del control DBGrid y seleccionar datos, pero no puede modificar ninguno de los valores; cualquier intento de hacerlo se ignora. Puede también hacer uso de las propiedades del objeto Columns para hacer que columnas individu individuale ales s del del contro controll DBGrid DBGrid sean sean de sólo sólo lectur lectura, a, pero pero los valores valores de la propie propieda dad d AllowUpdate tienen prioridad sobre los valores establecidos para las columnas (sin modificar éstos). Nota El objeto Recordset Recordset puede puede no permitir actualizaciones incluso si AllowUpdate es True para el control control DBGrid; DBGrid; en este caso se produce produce un error intercept interceptable able cuando cuando el usuario usuario intenta cambiar el registro. ColumnHeaders Devuelve o establece un valor que indica si los encabezados de columna se muestran en el control DBGrid. Sintaxis
objeto.ColumnHeaders = [True / False]
Si es True se muestran los encabezados de columna del control DBGrid, y si es False no se muestran. DataMode Establece un valor que especifica si el control DBGrid funciona en modo enlazado o no enlazado. Esta propiedad no está disponible en tiempo de ejecución. Los valores que puede tomar la propiedad DataMode son: 0-Bound. El control DBGrid está enlazado con el control Data. 1-Unbound. 1-Unbound. El control DBGrid no está enlazado directamente directamente al control Data. Un DBGrid está enlazado cuando se le asigna un control Data en su propiedad DataSource. En este caso, presenta sin mas los datos del Recordset de ese control Data. Si le especificamos en la propiedad DataMode que no esté enlazado, utilizaremos código en los procedimientos
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 20
del control Data para pasarle los datos cuando nos interese.
DefColWidth Devuelve o establece un valor que indica el ancho de columna predeterminado para todas las columnas del control DBGrid. Sintaxis
objeto.DefColWidth [= valor]
donde valor es un entero basado en el modo de escala del control. Si se da a la propiedad DefColWidth el valor 0, el control establece automáticamente el tamaño de todas las columnas en base al ancho del encabezado de columna o al valor de la propiedad Size del campo subyacente, seleccionando el más largo de los dos. RecordSelectors Los selectores de registros aparecen aparecen a la izquierda de las filas en el control DBGrid. Cuando Cuando el usuario elige el selector, selector, el registro completo (fila ( fila del control DBGrid) se selecciona. La propiedad RecordSelectors devuelve o establece un valor que indica si se muestran los selectores de registro en el control DBGrid. Sintaxis
objeto.RecordSelectors = [True / False]
El Objeto Columns aplicado al control DBGrid. El objeto Columns es un objeto no privativo del control DBGrid, que contiene todas las columnas y las propiedades de las columnas de un control. Podemos cambiar las propiedades de cada una de las columnas de un DBGrid mediante las propiedades del objetos Columns asociado a él. Por ejemplo, el encabezamiento de una columna en un DBGrid es, por defecto, el nombre nombre del campo campo que que se va a prese presenta ntarr en esa column columna. a. Si quere queremo mos s pone ponerr otro otro encabezamiento encabezamiento a una columna, ejecutaremos la expresión : DBGrid1.Columns( DBGrid1.Columns(0 0).Caption = "Cabecera" "Cabecera" donde el 0 entre paréntesis significa que estamos afectando a la columna número 0 (la primera pri mera por la izquierda). Si queremos cambiar su anchura : DBGrid1.Columns( DBGrid1.Columns(3 3).Width = 1000 En este este caso caso estamos estamos f ijando ijando la anch anchura ura de la column columna a cuarta cuarta por por la izquie izquierda rda a 1000 1000 unidades unidades de medida de las del Formulario que contiene al DBGrid. DBGr id.
CONTROLES DBList y DBCombo Los dos controles DBList y DBCombo se implementan de la misma manera. manera. Las dos dos únicas únicas diferencias estriban en la forma en que se presenta la información al usuario y la presencia de la porción del control DBCombo en el cuadro de texto, que se emplea para introducir valores. Los controles DBList y DBCombo tienen dos modos que pueden utilizarse individualmente o al mismo tiempo:
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 21
Autollenado: Autollenado : Llena automáticamente la lista con un campo campo seleccionado seleccionado de entre todos todos los registros registros administrado administrados s por el control control Data especificado especificado por la propied propiedad ad RowSource del control DBList o DBCombo. Actualización Actualización automática automática: Enla Enlaza za el regi registr stro o sele selecci ccion onad ado o en el cont control rol a un camp campo o específico del objeto Recordset administrado por el control Data especificado por la propiedad DataSource. DataSource. Esto explicado en otras palabras significa lo siguiente : En control DBList o DBCombo puede trabajar sobre dos controles Data. Uno para rellenar la lista. El control Data y el campo que rellena la lista son los especificados en las propiedades RowSource y ListField del control DBList o DBCombo. Respecto a este control Data estos controles funcionan solamente como receptores de datos : No pueden cambiar el contenido de los registros con con los que rellenan su lista. (Llamemos a esta esta base de datos Base A en en esta explicación) El otro control Data es el que estos controles usan para introducir datos en su BD asociada. El control Data y el campo de la BD asociados a estos controles DBList y DBCombo, son los especificados en las propiedades DataSource y DataField . Es sobre esta base de datos y el campo correspondiente sobre los que estos controles DBList y DBCombo actúan cambiando o introduciendo datos. (Llamemos a esta otra base de datos Base B) Basta con seleccionar un elemento de la lista (que pertenece a la base A) y un campo (X) del registro de la base A al que pertenece ese elemento se colocará en el campo correspondiente (el indicado en la propiedad DataField del control control DBList DBList o DBCombo) DBCombo) de la base base B. En el caso del DBCombo, podemos escribir directamente el dato en su caja de texto en vez de seleccionarlo de la lista. Ese campo (X) cuyo dato pasamos de la base A a la base B no tiene porqué ser el elemento que vemos en la lista. Puede ser otro campo de la base A. Será el que introduzcamos en la propiedad BoundColumn del DBList o DBCombo. Es la propiedad que viene a continuación. Léasela con la atención que se merece. Propiedad BoundColumn Devuelve o establece el nombre del campo de origen de un objeto Recordset que se utiliza para suministrar un valor de datos a otro Recordset. Resumamos. En un DBList o DBCombo presentamos en su lista un determinado campo de una BD. Esa BD tendrá mas campos. Un poco mas arriba decíamos que ese elemento de la lista podíamos pasarlo a otra BD (La especificada en la propiedad propiedad DataSource, DataSource, y en su campo DataField ). ). ¿Podríamos pasar pasar a esa BD, en vez del elemento de la lista, otro campo de esa esa BD origen ?. Podríamos, por ejemplo, presentar presentar en la lista el nombre de una persona, persona, nombre que hemos tomado de un listín telefónico, y en vez de pasar el nombre que es el que figura en la lista, pasar su número de teléfono, que es otro campo de la misma BD. La respuesta es SI. Para ello, pongamos en la propiedad BoundColumn del DBList o DBCombo que estamos usando, el nombre del campo que contiene el número de teléfono. Observe que por defecto, esa propiedad se rellena con el mismo campo que el especificado en la propiedad ListField . Eso no quiere decir que no se pueda cambiar. Para cambiarlo, haga click en la flecha vertical que aparece en la casilla de propiedades, y donde verá que aparecen todos los campos de la base base de datos seleccion seleccionada ada en el control control Data asociado asociado a este control. Tambié También n puede puede cambiarlo en tiempo de ejecución con la siguiente sintaxis : nombredelDBList.BoundColumn nombredelDBList.BoundColumn = nombredelcampo Con estas ideas expresadas aquí, puede comenzar a leer el texto de ayuda de esta propiedad.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 22
No se desespere si no entiende algo de lo allí expresado.
BoundText Devuelve o establece el valor de la propiedad BoundColumn de un control DBCombo o DBList pasado desde o hacia la propiedad DataField después de realizar una selección. Es decir, es el contenido del campo especificado en la propiedad BoundColumn comentada anteriormente. Esta propiedad está disponible solamente en tiempo de ejecución. Esta propiedad es de lectura y escritura. Es sencilla de usar para conocer el contenido del campo especificado en BoundColumn. BoundColumn . (lectura del valor) Cuando la queramos utilizar para forzar el valor de esta propiedad a un valor determinado, debemos utilizar la siguiente sintaxis : objeto.BoundText objeto.BoundText [= valor] En este caso, el DBList o DBCombo intenta buscar un elemento coincidente en el campo especificado en la propiedad BoundColumn de todos los registros de la BD asociada. Si encuentra uno igual , se establece el val or de la propiedad BoundText basándose BoundText basándose en el campo especificad especificado o por la propied propiedad ad BoundColumn. BoundColumn . Si no se encue encuentra ntra dicha coincide coincidenci ncia, a, la propiedad BoundText se BoundText se establece establece en el valor va lor Null. Es decir, si hay coincidencia con algún valor de ese campo, BoundText seguirá con el valor BoundText se pone a Nulo. especificado. Si no la hay, BoundText se
MatchWithList Propiedad solo de lectura. Devuelve True si el contenido actual de la propiedad BoundText coincide con uno de los registros de la parte de lista del control. Variable = objeto.MatchWithList
Sintaxis
Si Variable = True el contenido de la propiedad BoundText coincide con uno de los registros de la lista. Si es False, el contenido de la propiedad BoundText no coincide con ninguno de los registros de la lista. Cuan Cuando do intro introdu duce ce un valor valor en la part parte e de texto texto del del cont control rol DBCo DBComb mbo, o, la prop propie ieda dad d MatchWithList se establece como True si el valor introducido es uno de los elementos que aparecen en la lista. Usando esta propiedad, el código puede interceptar entradas que no están la lista, o proporcionar código para agregar agregar la nueva entrada a la tabla de origen. DataChanged Devuelve o establece un valor que indica que han cambiado los datos del control enlazado por algún proceso distinto de la recuperación de datos del registro actual. No está disponible en tiempo de diseño. Sintaxis
objeto.DataChanged [=Variable [=Variable]] Variable = objeto.DataChanged objeto.DataChanged
‘establece la propiedad ‘lee el valor actual de esta propiedad propiedad
Variable puede ser True, indicando que los datos que hay actualmente en el control no son iguales que los del registro actual, y False (Predeterminado) que indica que los datos que hay actualmente en el control (si los hay) son iguales que los del registro actual.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 23
Comentarios Cuando un control Data se mueve de un registro a otro, pasa datos desde los campos del registro actual a controles enlazados al campo específico o el registro completo. Cuando se muestran datos en los controles enlazados, la propiedad DataChanged se establece como False. Si el usuario o alguna operación cambia el valor del control enlazado, la propiedad DataChanged se establece como True. Si pasa a otro registro la propiedad DataChanged no se ve afectada. Cuando el control Data comienza a mover a otro registro, se produce el evento Validate. Si DataChanged DataChanged es True True para algún control enlazado, el control Data invoca automáticamente los métodos Edit y Update para enviar los cambios a la base de datos. Si no desea guardar los cambios de un control enlazado en la base de datos, puede establecer la propiedad DataChanged como False en el evento Validate. Validate . MatchEntry Devuelve Devuelve o estab establec lece e un valor que que indica indica cómo cómo el control control DBCombo DBCombo o DBList DBList realiza realiza búsquedas basándose en la entrada del usuario. objeto.MatchEntry = valor
Sintaxis
Donde valor es una constante o un valor que define el comportamiento de un control cuando tiene el enfoque y e l usuario introduce uno o más caracteres. 0 vbM vbMatch atchE EntryS trySim impl ple e Coin Coinci cid dencia cia básica sica:: (Pre (Pred determ termin ina ado) El control trol busca sca la siguiente coincidencia del carácter introducido usando la primera letra de entradas de la lista. Al escrib escribir ir repeti repetidam damen ente te la misma misma letra letra se recorre recorren n todas todas las entrad entradas as de la lista lista que que comienzan por esa letra. 1 vbMa vbMatc tchE hEnt ntry ryEx Exte tend nded ed Coin Coinci cide denc ncia ia ampl amplia iada da:: El cont contro roll bus busca ca una una ent entra rad da que que coincida coincida con todos los caracteres caracteres introducido introducidos. s. La búsqueda búsqueda se realiza a medida medida que se escriben los caracteres, refinando progresivamente la búsqueda. búsqueda. Cuando Cuando la propied propiedad ad MatchEntry MatchEntry se establece establece como vbMatchEntryExtend vbMatchEntryExtended ed y el usuario usuario presion presiona a la tecla de retroceso retroceso o espera espera varios segund segundos, os, la cadena cadena de coinciden coincidencias cias de restablece. SelectedItem (Solo DBCombo) Devuelve un valor que contiene contiene un marcador marcador para el registro registro selecciona seleccionado do en un control DBCombo. DBCombo1.SelectedItem
Sintaxis
Cuan Cuando do selecci seleccion ona a un eleme elemento nto de la parte parte de lista lista del del contr control ol DBComb DBCombo, o, la propie propieda dad d Sele Select cted edIte Item m conti contien ene e un marc marcad ador or que pued puede e utiliz utilizar ar para para repo reposi sici cion onar ar el regi regist stro ro seleccionado seleccionado en el Recordset como especifica la propiedad propiedad RowSource. SelText SelText SelText devuelve o establece una cadena cadena con el texto actualmente seleccionado, seleccionado, o es una una cadena de longitud cero () si no hay caracteres seleccionados. VisibleCount Devuelve un valor que indica el número de elementos visi bles del control DBCombo o DBList.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 24
Sintaxis
objeto.VisibleCount
La propiedad VisibleCount devuelve un entero desde 0 al número de elementos visibles del control. Un elemento se considera visible únicamente si una parte del texto es vi sible. VisibleItems Devuelve Devuelve una una matriz matriz marcad marcadore ores, s, uno uno para para cada cada eleme elemento nto visible visible de la lista lista del del contro controll DBCombo o DBList. Sintaxis
objeto.VisibleItems
Estos Estos marcadore marcadores s pueden pueden emplearse emplearse para obtener obtener registro registros s individuales individuales del conjunto conjunto de registros empleado para rellenar la lista. Y aquí se terminan terminan las propiedades propiedades de DBList y DBCombo. DBCombo. ¡La lata que dan y lo poco que se usan!
Controles Picture e Image para acceso a datos a través del control Data. Merece la pena hablar del almacenamiento de imágenes en una base de datos. Es posible introducir imágenes en una base de datos Access. El campo debe ser del tipo Objeto OLE y puede manejarse de dos formas, una de forma sencilla, mediante un control Data, y otra de GetChunk. Estos forma un poco complicada, mediante los métodos AppendChunk y GetChunk. Estos dos métodos los veremos un próximo próxi mo capítulo. Pero adelanto que es complicado usarlos. usarlos. Es muy sencillo sin embargo introducir y presentar imágenes residentes en una base de datos mediante los controles Picture e Image. Estos controles son enlazados a datos y pueden guard guardar ar una una imagen imagen o prese presenta ntarla rla.. Basta Basta para para ello ello pone ponerr los valores valores adecu adecuad ados os en las propiedades DataSource y DataField para elegir un campo tipo Objeto OLE de la base de datos datos y está está el proble problema ma resue resuelto lto.. Sobre Sobre todo todo para para pres presen entar tar la imagen imagen,, que que lo hace hace automáticamente. No es lo mismo para introducir los datos, pero también es muy sencillo. Basta para ello disponer de un CommonDialog, por ejemplo, para buscar una imagen dentro del disco. El fichero puede ser un BMP, JPG o WMF. Abrimos el CommonDialog (CD1) y buscamos la imagen deseada. A continuación la cargamos en el Control Picture o Image que está enlazado enlazado a datos mediante el método LoadPicture. LoadPicture. Para introducir la imagen en la base de datos basta con cambiar de registro, o uti lizar el método UpdateRecord UpdateRecord del control Data. Para presentar presentar una imagen es preferible usar el control I mage con la propiedad Stretch = False a usar el control Picture. Con el Image y esa propiedad puesta a False, siempre veremos la imagen con el tamaño diseñado en el formulario. Hacerlo con el control Picture se puede, pero es algo mas complicado. Pese a que, como se ha visto, se pueden meter imágenes en la base de datos Access, no es aconsejable hacerlo debido al volumen tan grande de datos que genera. Es preferible guardar la imagen en el fichero con la imagen, y meter en la base de datos la dirección completa del fichero. Para abrirlo no hay mas que leer la dirección del fichero, y presentarlo en el Picture o Image mediante el método mé todo LoadPicture.
Control MSFlexGrid El control MSFlexGrid es un control similar al DBGrid, pero pensado fundamentalmente para enlazarlo a datos datos a través del control Adodc1 Adodc1 (El control similar al Data en ADO). Sin embargo también funciona con el control Data, aunque con prestaciones reducidas. Estando enlazado al control Data, muestra los datos datos solo para lectura. Tampoco permite cambiar el registro actual del control Data haciendo click sobre una de las líneas del MSFlexGrid. Estas dos condiciones le hacen el control ideal para presentar todos los datos del control Data para aquellos casos en los que no se permite cambiarlos al usuario.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 25
Nota final al control Data Puede ver en la información de Microsoft palabras como “los antiguos controles Data y Control de datos datos remotos (RDC)”. (RDC)”. No se desanime desanime.. El control Data Data y DAO tienen tienen mucho que decir decir todavía en la programa programación ción en Visual Visual Basic. Basic. Efectivamente Efectivamente hay controles controles más modernos modernos creados mediante la tecnología ActiveX que aportan unas prestaciones prestaciones mayores que estos dos controles. Y formas de acceso a datos mucho más modernas y abiertas que el motor Jet. Pero tienen también su contrapartidas. Estudie bien el control control Data y el acceso a través de DAO. Llevará mucho cami no recorrido para estudiar posteriormente ADO.
LSB
Visual Basic Guía del Estudiante
Capítulo 11
Pág. 26