Você está na página 1de 235

SERVICIO NACIONAL DE ADIESTRAMIENTO EN TRABAJO INDUSTRIAL

DESARROLLO
DE SOFTWARE

MANUAL DE APRENDIZAJE

LENGUAJE DE
PROGRAMACIÓN III

CÓDIGO: 89001709

Profesional Técnico
LENGUAJE DE PROGRAMACIÓN III

ÍNDICE

TAREA
CONTENIDO N° PÁG.

ESTABLECER LO SFUNDAMENTOS DE LA PROGRAMACIÓN ORIENTADA
I. 6
A OBJETOS (POO).
1.1. Definir el concepto de POO. 6
1.2. Configurar objetos ADO.NET en una aplicación Windows Forms. 11
1.3. Diseñar bibliotecas de clases con Visual BASIC.NET 24
II. ACCEDER A BASES DEDATOS UTUILIZANDO VISUAL BASIC.NET 45
2.1. Acceder a bases de datos utilizando VISUAL BASIC.NET 45
2.2. Acceder y manipular datos utilizando DATASET. 63
2.3. Configurar y utilizar controles de datos de VISUALBASIC.NET 69
2.4. Desarrollar casos prácticos de controles con acceso a datos. 75
CONFIGURAR LAS IMPRESIONES Y REPORTES EN APLICACIONES
III. 90
WINDOWS FORM.
3.1. Imprimir desde una aplicación Windows Form. 90
3.2. Configurar los diálogos de impresión y configuración de página. 93
3.3. Reportes con Report Manager. 101
IV. ACCEDER AL SISTEMA DE ARCHIVOS. 140
4.1. Trabajar con unidades de disco, carpetas y archivos. 140
4.2. Obtener las propiedades de una carpeta o archivo. 158
4.3. Comprimir y descomprimir archivos con VisualBasic.NET (VBN). 164
V. ELABORAR PRUEBAS Y DEPURCIÓN DE ERRORES. 168
5.1. Depurar paso a paso los procedimientos. 168
5.2. Establecer puntos de ruptura. 170
5.3. Manejar las excepciones con TRY…CATCH 173
5.4. Capturar errores para realizar el análisis respectivo. 178
5.5. Elaborar ejercicios prácticos de casos con VBN. 182
VI. DISTRIBUIIR LAS APLICACIONES WINDOWS ELABORADAS CON VBN. 201
6.1. Crear un proyecto de instalación utilizando el asistente. 201
6.2. Crear accesos directos en el escritorio y menú del usuario activo. 210
6.3. Desarrollar aplicaciones con conexión remota. 211
ELABORAR APLICACIONES WEB CON CONEXIÓN A BASE DE DATOS CON
VII 215
PHP.
7.1. Configurar el servidor Apache de PHP. 215
7.2. Reconocer el lenguaje PHP. 220
7.3. Programar las instrucciones básicas condicionales y repetitivas de
221
PHP.
7.4. Crear formularios que proceden datos con PHP. 228
7.5. Elaborar un Crud a la base de datos. 235

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 5


LENGUAJE DE PROGRAMACIÓN III

I. ESTABLECER LOS FUNDAMENTOS DE LA PROGRAMACIÓN


ORIENTADA A OBJETOS (POO).

OPERACIONES:
- Definir el Concepto de POO.
- Configurar Objetos ADO .Net en una Aplicación Windows Forms.
- Diseñar Biblioteca de Clases con Visual Basic.Net

EQUIPOS Y MATERIALES:

- Computadora con microprocesadores Core 2 Duo o de mayor capacidad.


- Sistema operativo Windows.
- Acceso a internet.
- Software visual Studio 2012, Block de Notas.

ORDEN DE EJECUCIÓN:

- Reconocer la Estructura de POO.


- Reconocer el Funcionamiento de Objetos ADO .Net
- Desarrollar Entornos de Trabajo Biblioteca de Clases.

1.1. DEFINIR EL CONCEPTO DE POO.

La programación Orientada a Objetos POO u OOP nos enseña un método


basado en las interacciones de los objetos. La programación orientada a
objetos es asumida como una filosofía, que involucra un modelo de
programación, conteniendo una teoría y metodología. Un lenguaje orientado a
objetos viene a ser un lenguaje de programación que permite el diseño de
Aplicaciones Orientadas a Objetos. Es recomendable que todo programador
que se dedique a desarrollar aplicaciones orientadas a objetos aprenda primero
la filosofía y después el lenguaje, ya que se podría asumir que filosofía sólo hay
una y lenguajes de programación muchos.

Objeto: Un objeto es un conjunto de variables o datos que contiene métodos o


funciones que se encuentran relacionados entre sí. Los objetos dentro de una
programación se utilizan para poder modelar objetos o entidades ubicados en
el mundo real. Un objeto es, por tanto, la representación en un programa de un
concepto, y contiene toda la información necesaria para abstraerlo; datos que
describen sus atributos o características y operaciones que pueden realizarse
sobre los mismos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 6


LENGUAJE DE PROGRAMACIÓN III

Los atributos del objeto que vienen a ser el estado y lo que el objeto puede
hacer que vendría a ser su comportamiento están expresados por las variables
y los métodos que componen el objeto respectivamente. Por ejemplo, un objeto
podría ser un Auto el cual tendría como estado actual su velocidad de 50 km/h,
y su aceleración podría aumentar a 60 km/h en 5 segundos; Estas variables se
conocen como variables instancia o variables miembro porque contienen el
estado del objeto Auto y, en programación orientada a objetos, un objeto
particular se denomina Instancia.

Además de estas variables, el objeto Auto podría tener métodos para frenar,
cambiar la velocidad, y cambiar de marcha (el Auto no tendría que tener un
método para cambiar su velocidad pues ésta es función de la caja de cambios
y del acelerador, la marcha en la que está y de si los frenos están siendo
utilizados o no, entre otros muchos factores). Estos métodos se denominan
formalmente métodos instancia o métodos miembro, ya que cambian el estado
de una instancia u objeto Auto particular.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 7


LENGUAJE DE PROGRAMACIÓN III

Se podría simplificar que la POO es una forma especial de programar, más


cercana a como se expresan las cosas en la vida real que otros tipos de
programación.

Con la POO se puede aprender a pensar las cosas de una manera distinta,
para escribir los programas en términos de objetos, propiedades y métodos
principalmente.

Elementos y Características de la POO: Los elementos de la POO, pueden


entenderse como los materiales que se necesitan para diseñar y programar un
sistema, mientras que las características, podrían asumirse como las
herramientas de las cuáles se dispone para construir el sistema con los
materiales.

Entre los elementos más importantes se pueden encontrar:

- Clases: Son declaraciones de objetos, también se podrían definir como


abstracciones de objetos. Esto quiere decir que la definición de un objeto es
la clase. Cuando se programa un objeto y se define sus características y
funcionalidades en realidad lo que se está realizando es programar una
clase.

Normalmente en el mundo real existen varios objetos de un mismo tipo, o de


una misma clase. Por ejemplo, el Auto es uno de los muchos autos que
existen en el mundo. Usando la terminología de la programación orientada a
objetos, diremos que el auto es una instancia de la clase de objetos
conocida como Autos. Todas los Autos tienen algunos estados o atributos
(color, marca, modelo, cuatro ruedas) y algunos métodos (aceleración,
frenar) en común. Sin embargo, el estado particular de cada Auto es
independiente del estado de los demás Autos. La particularización de estos
atributos puede ser diferente. Es decir, un Auto podrá ser rojo, y otro azul,
pero ambos tienen en común el hecho de tener una variable “color”. De este
modo se puede definir una plantilla de variables y métodos para todos los
Autos. Las plantillas para crear objetos se les denominan clases.

- Propiedades o atributos. Son las características de los objetos. Cuando se


define una propiedad normalmente se especifica su nombre y su tipo. Se
podría definir que las propiedades son algo así como variables donde se
almacenaran datos relacionados con los objetos. Las propiedades, son las
características intrínsecas del objeto. Éstas, se representan a modo de
variables, solo que técnicamente, pasan a denominarse propiedades.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 8


LENGUAJE DE PROGRAMACIÓN III

- Métodos. Son las funcionalidades asociadas a los objetos. Cuando se


programan las clases se les llama métodos. Los métodos son como
funciones que están asociadas a un objeto.

- Herencias: Una de las características principales de la POO es el uso de


Herencias. El mecanismo de herencia permite definir nuevas clases
partiendo de otras ya existentes. Las clases que derivan de otras heredan
automáticamente todo su comportamiento, pero además pueden introducir
características particulares propias que las diferencian. Cada subclase
hereda los estados (en forma de declaración de variables) de la superclase
de la cual deriva. Los Autos deportivos, los de carretera y los de carrera
comparten algunos estados: modelo, velocidad, etc.; Además, cada subclase
hereda los métodos de su superclase.

La herencia es una herramienta clave para poder abordar la resolución de un


problema de forma organizada, ya que permite definir una relación jerárquica
entre todos los conceptos que se están manejando. Es posible emplear esta
técnica para descomponer un problema de cierta magnitud en un conjunto
de problemas subordinados a él. La resolución del problema original se
consigue cuando se han resuelto cada uno de los problemas subordinados,
que a su vez pueden contener otros. Por consiguiente, la capacidad de
descomponer un problema o concepto en un conjunto de objetos
relacionados entre sí cuyo comportamiento es fácilmente identificable puede
ser extraordinariamente útil para el desarrollo de programas informáticos.
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 9
LENGUAJE DE PROGRAMACIÓN III

Algunos objetos comparten las mismas propiedades y métodos que otro


objeto, y además agregan nuevas propiedades y métodos. A esto se lo
denomina herencia: una clase que hereda de otra.

Las clases derivadas o subclases proporcionan comportamientos


especializados a partir de los elementos comunes que hereda de la clase
base. A través del mecanismo de herencia los programadores pueden
reutilizar el código de la superclase tantas veces como sea necesario. Los
programadores pueden implementar las llamadas superclases abstractas,
que definen comportamientos genéricos. Las clases abstractas definen e
implementan parcialmente comportamientos, pero gran parte de estos
comportamientos no se definen ni se implementan totalmente. De esta
forma, otros programadores pueden hacer uso de estas superclases
detallando esos comportamientos con subclases especializadas. El propósito
de una clase abstracta es servir de modelo base para la creación de otras
clases derivadas, pero cuya implantación depende de las características
particulares de cada una de ellas. Un ejemplo de clase abstracta podría ser
la clase vehículo. Esta clase sería una clase base genérica, a partir de la
cual se podría ir creando todo tipo de clases derivadas.

- Objetos: Los objetos son ejemplares de una clase cualquiera. Cuando se


crea un ejemplar se tiene que especificar la clase a partir de la cual se
creará. Esta acción de crear un objeto a partir de una clase se llama
instanciar que en ingles se le conoce como Instace. Para crear un objeto se
tiene que escribir una instrucción especial que puede ser distinta
dependiendo el lenguaje de programación que se emplee.

miAuto = new Auto()

Con la instrucción new se especifica la creación de una instancia de la clase


Auto. Dentro de los paréntesis se deberá de colocar los parámetros con los
que se inicializara el objeto de la clase Auto.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 10


LENGUAJE DE PROGRAMACIÓN III

Estados de un objeto; Cuando se tiene un objeto, sus propiedades toman


valores. Por ejemplo, cuando se tiene un Auto la propiedad color tomará un
valor en concreto, que podría ser azul o verde. El valor concreto de una
propiedad de un objeto se llama estado. Para acceder a un estado de un
objeto para ver su valor o cambiarlo se utiliza el operador punto.

miAuto.color = Azul

El objeto es miAuto, luego se colocará el operador punto y por último el


nombre de la propiedad a la que se va a acceder. Se puede apreciar en el
ejemplo que se está determinando el valor del estado de la propiedad del
objeto a azul con una simple asignación.

Mensajes en los Objetos; Un mensaje en un objeto es la acción de efectuar


una llamada a un método. Por ejemplo, cuando se le indica a un objeto Auto
que arranque, lo que se está determinando es que se ponga en marcha.
Para mandar mensajes a los objetos se utiliza el operador punto, seguido del
método que se desea invocar.
miAuto.Arrancar()

Dentro del paréntesis irán los parámetros como en una función.

1.2. CONFIGURAR OBJETOS ADO.NET EN UNA APLICACIÓN WINDOWS


FORMS.

ADO.NET: ActiveX Data Objects para .Net; incluye un conjunto de clases que
proporcionan servicio de acceso a Bases de Datos. Muchas de las aplicaciones
y distribuciones trabajan sobre bases de datos, es por ello que Microsoft
decidió crear una tecnología de acceso a datos muy potente. ADO.Net no
depende de conexiones continuamente activas, ya que se diseñó en torno a
una arquitectura donde las aplicaciones se conectan a una base de datos
durante el tiempo necesario para poder leer o manipular la información, de esta
manera la base de datos no contiene conexiones que se encuentren inactivas e
improductivas por un tiempo innecesario, lo que permite dar servicio a muchos
más usuarios y facilitar su escalabilidad dentro de la aplicación.

Estas interacciones con la base de datos se realizara mediante sentencias y


ordenes que se encapsulan en código SQL, y el uso de los procedimientos
almacenados son de mucha utilidad para realizar las operaciones sobre el
origen de datos. Los datos que se requieren se almacenan en la memoria
caché lo que permitirá trabajar sin la conexión activa. Los conjuntos de datos
son independientes a los orígenes de datos; el momento que la aplicación lo

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 11


LENGUAJE DE PROGRAMACIÓN III

requiera se volverá a establecer la conexión y se actualizara el conjunto de


datos de la memoria.

El formato de transferencia es XML, esta representación no utiliza información


binaria, si no que se basa en texto, lo que permite ser enviada mediante
cualquier protocolo HTTP.

Componentes de ADO.Net: ADO.Net es un conjunto de clases que


pertenecen al espacio System.Data para acceso a los datos de un Origen de
Datos, es decir ADO.Net proporciona un conjunto de componentes para crear
aplicaciones distribuidas de uso compartido de datos. Estos componentes se
encuentran diseñados para separar el acceso a los datos de la manipulación de
los mismos. Estos componentes son los siguientes:

- DataSet (Net Framework), que es un conjunto de componentes, dentro de


los que destacan son Connection para la conexión, Command para las
ordenes o comandos, DataReader para la lectura de los datos y DataAdapter
para el adaptador de datos.

Capa de Capa de la Lógica de Capa de

Conjunto de Datos Origen de

Aplicación
Adaptador Conexión Origen de

Se puede decir que el trabajo de conexión con la base de datos o la ejecución


de una sentencia SQL determinada para recuperar datos de la base de datos,
lo realizara el proveedor de acceso a datos; en cambio el hecho de recuperar
esos datos para manipularlos, tratarlos o volcarlos a un determinado control o
dispositivo es una acción ejecutada por una capa superior formada por un
conjunto de datos agrupados en tablas.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 12


LENGUAJE DE PROGRAMACIÓN III

ASP.Net y Formularios
Formularios Windows
Web

System.Data

Conjunto de Datos

Proveedor de Acceso a Datos

Bases de Datos

Manejo de Capas:

Conjunto de Datos:
Un Formulario WindowsForm, para acceder a los datos de un origen de datos,
lo que realiza es utilizar un adaptador de datos para leer la información de la
base de datos y poder almacenarla en un conjunto de datos. También se puede
interactuar directamente con la base de datos utilizando un objeto de órdenes
para acceso a los datos, que incluya una sentencia SQL o una referencia a un
procedimiento almacenado. Un conjunto de datos puede incluir una o más
tablas que se basan en el origen de datos, así mismo guarda información sobre
las relaciones entre ellas y las restricciones. Estas partes se muestran al
programador mediante propiedades y colecciones. El componente principal
para la arquitectura sin conexión es la clase de objetos DataSet (Conjunto de
Datos) que pertenece al espacio System.Data que se podrá utilizar con
diferentes orígenes de datos. DataSet incluye la colección DataTableCollection
de objetos DataTable (Filas de las Tablas), a la cual se podrá tener acceso a
través de la propiedad Tables del DataSet y la colección DataRelationColletion
del objeto DataRelation (Relaciones entre tablas). Así mismo la clase
DataTable incluye la colección DataRowCollection de objetos DataRow (Filas
de las Tablas), la colección DataColumnCollection de objetos DataColumn
(Columna de Datos) y la colección ConstraintCollection de objetos Constraint
(Restricciones). La representación de un DataSet seria de la siguiente manera:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 13


LENGUAJE DE PROGRAMACIÓN III

DataSet

DataTableCollection

DataTable
DataRowCollection
DataRow

DataColumnCollection
DataColumn

ConstraintCollection
Constraint

DataRelationCollection
DataRelation

La Clase DataRow incluye la propiedad RowState, que permitirá si la fila


cambio y de qué manera, desde que la tabla de datos se cargó por primera
vez. Los valores que puede tomar esta propiedad son Added, Deleted, Modified
y Unchanged.

Proveedor de Datos:
Teniendo en cuenta el .Net Framework, un proveedor de datos es utilizado
como puente entre una aplicación y un origen de datos, que se podrá utilizar
para recuperar datos desde el origen de datos para poder actualizarlos. Los
componentes principales de un proveedor de datos .Net son:

- Conexión con el Origen de Datos, esto se realiza con el objeto Connection la


cual establecerá una conexión a un origen de datos seleccionado.
- Orden para el acceso a los datos, esto se realiza con el objeto Command el
cual permite ejecutar una orden SQL o un Procedimiento Almacenado para
el origen de datos.
- Lector de Datos, esto se realiza mediante el objeto DataReader, el cual
permite de una forma rápida el acceder a los datos recuperados después de
una consulta a la base de datos. Este acceso es solo de lectura.
- Adaptador de Datos, esto se realiza mediante el objeto DataAdapter, el cual
permite llenar un DataSet y realizar las actualizaciones necesarias en el
origen de datos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 14


LENGUAJE DE PROGRAMACIÓN III

Proveedor de Datos .Net

Connection DataAdapter

Transaction SelectComman

InsertCommand
Command
Parameters UpdateComman

DeleteComman
DataReader

.Net incluye los proveedores de datos ODBC, OLE DB, Oracle y SQL Server,
que se utilizan mediante los espacios System.Data.Odbc, System.Data.OleDb,
System.Data.OracleClient y System.Data.SqlClient. Cada tipo de datos tiene
sus propias clases Connection, Command, DataReader y DataAdapter para
cada sistema de gestión de datos SGBD; por ejemplo si se necesita crear una
conexión SQL se utilizara SqlConnection.

El proveedor Odbc permite conectar a diferentes orígenes de datos utilizando


los orígenes ODBC, el proveedor OleDb permite conectar a orígenes a través
de OLE DB, el proveedor OracleClient es un proveedor de acceso a datos
nativo especialmente diseñado para bases de datos Oracle, y por último el
proveedor SqlClient es un proveedor de acceso a datos nativo, que permite
conectarnos con orígenes de datos Ms SQL Server. También hay otros
motores de bases de datos como son PostgresSQL, MySQL, AS/400, etc. Para
ello se deberá de trabajar con System.Data.Common que proporciona clases
para la creación de objetos DbProviderFactory para trabajar con orígenes de
datos específicos.

ADO.Net ofrece diferentes modelos para la conexión a los orígenes de datos,


pero a pesar de los diferentes proveedores de datos, todos ellos se han
estandarizado de la misma manera. Cada proveedor se basa en el mismo
conjunto de interfaces y clases base. Cada objeto Connection implementa la
interfaz IDbConnection, que define los métodos básicos, tales como Open y
Close.

Objeto Conexión: Cuando se establece una conexión a un origen de datos


ADO.Net se utiliza el objeto Connection. Para establecer una conexión Ms SQL
Server se utilizara SqlConnection y para conectarse a un origen de datos OLE
DB se utiliza OleDbConnection y para conectarse a un origen de datos Oracle
se utilizara el objeto OracleConnection.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 15


LENGUAJE DE PROGRAMACIÓN III

Básicamente la función de un objeto Connection es presentar atributos y


métodos para permitir establecer y modificar las propiedades de la Conexión
como serian el identificador de usuario y la contraseña, entre otras.
Ejemplo: Para definir una conexión OLE DB, el código sería el siguiente:
Dim Conexion As OleDbConnection = New OleDbConnection(StrConexion)

El argumento StrConexion hace referencia a la cadena de conexión; esta


cadena está compuesta por una serie de elementos nombre/valor separados
por punto y como (;). El orden no es importante. Las cadenas de conexión
varían según el proveedor SGBD que se esté utilizando. Los elementos más
utilizados son los siguientes:

- El Servidor.
- Base de Datos.
- La Autenticación (Usuario y Contraseña).

Una cadena de conexión para SQL Server, utilizando el Servidor, la base de


datos “Institución” y una Autenticación Windows para SQL Server (este tipo de
Autenticación Windows no utiliza Usuario ni contraseña); sería la siguiente:
Dim StrConexion As String = "Data Source=DESKTOP-FRUVH1J\SQLEXPRESS;" &
"Initial Catalog=Institucion; Integrated Security=True"

Si el tipo de servidor es PostgreSQL Server se deberá de asignar el Usuario y


el Password, de la siguiente manera:
Dim StrConexion As String = "SERVER=localhost;" &
"Database=Institucion; User Name=*****; Password=*****"

Si se utiliza un motor de base de datos OLE DB, la cadena de conexión seguirá


siendo similar pero se proporcionara el nombre del proveedor que identifique el
controlador OLE DB. Para una conexión con una base de datos Ms Access, se
deberá de ingresar la siguiente cadena:
Dim StrConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;" &
"Data Source=C:/Institucion.accdb;"

Para las conexiones Microsoft SQL Server se tendrá que utilizar el espacio
System.Data.SqlClient
Imports System.Data.SqlClient

Para realizar la cadena de conexión para Microsoft SQL Server con


Autenticación de Windows seria de la siguiente manera:
Dim conexion As SqlConnection = New SqlConnection(strconexion)

Dim StrConexion As String = "Server=DESKTOP-FRUVH1J\SQLEXPRESS;" &


"Initial Catalog=Institucion; Integrated Security=True"

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 16


LENGUAJE DE PROGRAMACIÓN III

Para realizar la cadena de conexión para Microsoft SQL Server con


Autenticación de SQL Server seria de la siguiente manera:
Dim conexion As SqlConnection = New SqlConnection(strconexion)

Dim StrConexion As String = "Server=DESKTOP-FRUVH1J\SQLEXPRESS;" &


"Database=Institucion; User Id=sa; Password=root"

Cuando se va a utilizar OLE DB en un sistema X64 se deberá de saber que


existen controladores OLE DB para 32 y 64 bits. El proveedor
Microsoft.Jet.OLEDB.4.0 es para 32 bits y Microsoft.ACE.OLEDB.12.0
dependiendo de la versión del Office será para 32 y 64 bits.

Objeto Orden: Una vez desarrollada la conexión a un origen de datos, se


puede utilizar un objeto Command para ejecutar sentencias SQL y devolver
resultados desde el origen de datos. Para crear este objeto se debe de invocar
al constructor, una vez creado el objeto, La instrucción SQL encapsulada podrá
ser consultada o modificada por la propiedad ComandText.

Para un origen de datos OLE DB se deberá utilizar OleDbCommand, para


orígenes ODBC se utilizara OdbcCommand, para Microsoft SQL Server se
utilizara SqlCommand y para Oracle se utilizara OracleCommand. Orden SQL
para acceder al origen de datos:
'OLEDB
Dim ordenSQL As OleDbCommand = New OleDbCommand( _
"Select cli_nombre, cli_apellido from Clientes", _
Conexion)

'SQL Server
Dim ordenSQL As SqlCommand = New SqlCommand( _
"Select cli_nombre, cli_apellido from Clientes", _
Conexion)

Para ejecutar esta orden se podría utilizar los siguientes métodos:


ExecuteNonQuery()
ExecuteReader()

ExecuteNonQuery; se utiliza para ejecutar operaciones de manipulación de


datos como UPDATE, INSERT o DELETE, no se utiliza para un select, el valor
que devolverá es el número de filas afectadas por la orden ejecutada:
ordenSQL.ExecuteNonQuery()

Es factible utilizar este método para operaciones de definición como: CREATE,


ALTER o DROP.

ExecuteReader; se utiliza para ejecutar una consulta SELECT y devolverá un


objeto DataReader.
'OLEDB
Dim lector As OleDbDataReader = ordenSQL.ExecuteReader()

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 17


LENGUAJE DE PROGRAMACIÓN III

'SQL Server
Dim lector As SqlDataReader = ordenSQL.ExecuteReader()

Objeto Lector de Datos: Cuando se necesite leer datos y no manipularlos, no


será necesario almacenarlos en un conjunto de datos, solo se necesita utilizar
un objeto lector de datos. Este objeto lector obtiene los datos del origen de
datos y los pasa de manera directa a la aplicación, un adaptador de datos
utiliza un objeto lector de datos para llenar un conjunto de datos.

El objeto lector en .Net para SQL Server es SqlDataReader y para OLE DB es


OleDbDataReader.

Aplicación
DataReader Command

Connection
Origen de Datos

Ejemplo de cómo utilizar un lector de datos proporcionado por la orden SQL


SELECT:
'OLEDB
Conexion.Open()
Dim lector As OleDbDataReader = ordenSQL.ExecuteReader()
While (lector.Read())
Console.WriteLine(lector.GetString(0) + ", " + _
lector.GetString(1))
End While
lector.Close()
conexion.Close()

'SQL Server
Conexion.Open()
Dim lector As SqlDataReader = ordenSQL.ExecuteReader()
While (lector.Read())
Console.WriteLine(lector.GetString(0) + ", " + _
lector.GetString(1))
End While
lector.Close()
conexion.Close()

El método Read desplaza el cursor del DataReader, de sólo lectura y avance


hacia delante, hasta el siguiente registro. La posición inicial es antes del primer
registro, por lo tanto, se debe llamar a Read para iniciar el acceso a los datos.
Una vez finalizada la lectura se debe llamar al método Close para liberar el
DataReader de la conexión, objeto Connection.

Para poder recuperar las columnas de la fila actual del conjunto de datos
proporcionado por el DataReader, se puede utilizar la funcionalidad
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 18
LENGUAJE DE PROGRAMACIÓN III

proporcionada por este objeto. GetValue obtiene el valor de la columna


especificada en su formato nativo, GetValues rellena la matriz de objetos
pasada como un argumento con los valores de la fila actual, GetString obtiene
el valor de la columna especificada como cadena, GetInt32 obtiene el valor de
la columna especificada como un entero de 32 bits con signo, etc.

Adaptador de Datos: Es un conjunto de objetos utilizado para intercambiar


datos entre un origen de datos y un conjunto de datos que viene a ser un
DataSet. Esto quiere decir que una aplicación leerá los datos de una base de
datos para un conjunto de datos para poder manipularlos. En algunas
oportunidades se volverá a escribir en la base de datos los datos modificados
del conjunto de datos.

Para base de datos OLE DB, se utilizara OleDataAdapter junto con sus objetos
OleDbCommand y OleDbConnection de manera conjunta. Para bases de datos
ODBC se utilizara OdbcDataAdapter junto con los objetos OdbcCommand y
OdbcConnection.

Para bases de datos Ms SQL Server se utilizara SqlDataAdapter con sus


objetos SqlCommand y SqlConnection. Para bases de datos Oracle se utilizara
OracleDataAdapter con sus objetos OracleCommand y OracleConnection; del
espacio de nombres System.Data.OleDb, System.Data.Odbc,
System.Data.SqlClient y System.Data.OracleClient.

Cada adaptador de datos intercambia datos entre una sola tabla de un origen
de datos y un solo objeto DataTable (tabla de datos) del conjunto de datos. Lo
que se entiende es que se deberá de utilizar el objeto DataTable tantas veces
como tablas se tengan en el conjunto de datos. De esta manera cada tabla del
conjunto de datos tendrá su correspondiente tabla en el origen de datos.
Llenado de un DataSet:

Conjunto de DataAdapter

Dato SelectCommand

InsertComman Connection

Dato
DeleteComman

UpdateComman

Aplicación Origen de Datos

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 19


LENGUAJE DE PROGRAMACIÓN III

Un adaptador contiene las propiedades SelectCommand, InsertCommand,


DeleteCommand, UpdateCommand y TableMappings para poder facilitar la
lectura y actualización de los datos en un origen de datos.

SelectCommand; hace referencia a una orden que recuperara filas del origen
de datos, se entiende por objeto Command al que almacena una instrucción
SQL o un procedimiento almacenado.

InsertCommand; hace referencia a una orden que insertara filas en el origen


de datos.

UpdateCommand; hace referencia a una orden que actualizara o modificara


filas en el origen de datos.
DeleteCommand; hace referencia a una orden para Eliminar una fila en el
origen de datos.

MODOS DE CONEXIÓN.
Esta acción es la que más recursos consume del sistema, es por ello que se
debe de tener en cuenta las siguientes consideraciones:

- La conexión se debe de realizar con los proveedores de acceso a datos


nativos, ya que son más rápidos que los proveedores de datos OLE DB y
ODBC.
- La conexión se deberá de abrir lo más tarde posible, se debe de
implementar todas las variables antes de hacerla.
- La conexión se deberá de cerrar loa antes posible.

El objeto DataSet permite almacenar datos de una determinada base de datos,


esto hace posible que se puedan trabajar con los datos de una tabla aunque la
conexión este cerrada, pero siempre se debe de tener en cuenta que no será
favorable para nuestra aplicación si el manejo de data es muy grande.

El adaptador de datos trabaja de puente entre el DataSet y el origen de datos


para la recuperación y almacenamiento de datos. Para este fin el DataAdapter
brinda el método Fill, que permite modificar los datos del DataSet de forma que
coincidan con los orígenes de datos y el método Update modificara los datos
del origen de datos para que coincidan con el DataSet.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 20


LENGUAJE DE PROGRAMACIÓN III

Aplicación

DataSet

Proveedor de Acceso a Datos

DataReader

Command DataAdapte

Connection

Base de Datos

En algunos casos es bueno trabajar estando la aplicación conectada a la base


de datos. Para ello se utiliza el objeto DataReader, pero este objeto tiene
algunas particularidades que son:

- El objeto DataReader recupera un conjunto de valores llenando un pequeño


búfer de datos.
- Si los registros del búfer se terminan, el DataReader regresa a la base de
datos para recuperar más registros. Si el servicio de SQL Server estuviera
detenido en ese momento, o el origen de datos estuviera en la misma
condición, la aplicación generaría un error a la hora de leer el siguiente
registro.

El DataReader es un objeto conectado, pero que trabaja en segundo plano con


un conjunto de datos.

PROBANDO UNA CONEXIÓN:


Cuando ya se ha creado la Base de Datos y se ha definido la cadena de
conexión, se deberá de crear el objeto Conexión y utilizar los métodos Open y
Close para abrir y cerrar dicha Conexión. Para este fin se desarrollara el
siguiente ejemplo el cual contendrá un botón de comando que permitirá abrir y
cerrar la Conexión a la base de datos, y mostrando el estado en la misma
ventana, así mismo mostrara la versión del SQL Server utilizado.
• Crear un Nuevo Proyecto en Visual Basic, del tipo Windows, “Aplicación de
Windows Forms”.
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 21
LENGUAJE DE PROGRAMACIÓN III

• Colocar el nombre de la Aplicación “ProbarConexión”.

• Ingresar los siguientes objetos y propiedades:

Objeto Propiedad Valor


Form1 Name frmConexion
Text Probar Conexión
Label1 Name lblVersion
Text Versión o “ “
Label2 Name lblEstadoConexion
Text Estado o “ “
Button1 Name btMostrarDatos
Text Mostrar Datos

• Se ingresará el siguiente código para los objetos y eventos:

Imports System.Data.SqlClient

Public Class frmConexion


Private con As SqlConnection = Nothing

Private Sub frmConexion_Load(sender As Object,


e As EventArgs) Handles MyBase.Load

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 22


LENGUAJE DE PROGRAMACIÓN III

'Crear la Conexión

Dim Conexion As String = "Data Source=DESKTOP-FRUVH1J\SQLEXPRESS;" &


"Initial Catalog=InstitutoSenati; Uid=sa; Password=root"
con = New SqlConnection(Conexion)
End Sub

Private Sub btMostrarDatos_Click(sender As Object,


e As EventArgs) Handles btMostrarDatos.Click
Try
'Probar la conexión
con.Open()
lblVersion.Text = "Versión del Servidor: " &
Convert.ToString(con.ServerVersion)
lblEstadoConexion.Text = "La Conexión está: "
lblEstadoConexion.Text += con.State.ToString()
lblEstadoConexion.Text += vbLf & "Se Accede a la Base de Datos"
Catch ex As Exception
'Manipular la Excepción
lblEstadoConexion.Text = "Error al Acceder a la Base de Datos. " +
ex.Message
Finally
'Asegurarse que la Conexión quede Cerrada
'Aunque la Conexión estuviera Cerrada
'Llamar a Close() no produce Error
con.Close()
lblEstadoConexion.Text += vbLf & "Ahora la Conexión está: " &
con.State.ToString()
End Try
End Sub
End Class

• El bloque Finally asegura que la conexión con la base de datos quedara


cerrada.
• Ejecutar la aplicación y ver los resultados al dar clic en el botón “Mostrar
Datos”.

• Se debe de crear una base de datos llamada “InstitutoSenati” en SQL


Server, para no generar errores a la hora de la conexión.
Nota: Ejercicio N° 1 del Capítulo 1 del Manual; nombre aplicación:
“ProbarConexion”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 23


LENGUAJE DE PROGRAMACIÓN III

1.3. DISEÑAR BIBLIOTECAS DE CLASES CON VISUAL BASIC .NET

El enlace de datos es un proceso que establece una conexión entre la interfaz


gráfica del usuario (IGU) de la aplicación y la lógica del negocio, para que
cuando los datos cambien su valor, los elementos de la IGU que estén
enlazados a ellos reflejen los cambios de manera automática.

Este proceso de trabajo de los datos se debe de implementar manualmente, lo


cual genera un código muy amplio, pero utilizando los objetos que proporciona
la biblioteca .Net, esto se convierte en acciones sencillas de realizar.

Enlace de Datos Manual:


Se desarrollará una aplicación que mostrará los datos de una persona, es este
caso su número telefónico.

• Para ello se deberá de crear una nueva aplicación Windows Form:


“EnlaceDatos”

• Insertará los siguientes objetos:

Objeto Propiedad Valor


Form1 Name frmEnlaceDatos
Text Enlace de Datos
Label1 Name lblNombre
Text Nombre:
Label2 Name lblTelefono
Text Teléfono:
TextBox1 Name txtNombre
TextBox2 Name txtTelefono
Button1 Name btDatos
Text Datos del Objeto Subyacente
Button2 Name btModificar
Text Modificar Objeto Subyacente

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 24


LENGUAJE DE PROGRAMACIÓN III

• Los datos que se mostrarán en el formulario procederán de un objeto de una


clase CTelefono y deberán de estar sincronizados.

Aplicación CTelefono

• Crear una carpeta Clases en el Proyecto:

• Dentro de la carpeta Clases se deberá generar la Clase CTelefono que va a


representar los datos que muestra el formulario.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 25


LENGUAJE DE PROGRAMACIÓN III

Public Class CTelefono


Private _nombre As String = "Un nombre"
Private _telefono As String = "000000000"

Public Property Nombre() As String


Get
Return _nombre
End Get
Set(value As String)
_nombre = value
End Set
End Property

Public Property Telefono() As String


Get
Return _telefono
End Get
Set(value As String)
_telefono = value
End Set
End Property
End Class

• Ingresar el siguiente código al Formulario:

Public Class frmEnlaceDatos


Private objTfno As New CTelefono

Public Sub New()


' Llamada necesaria para el diseñador.
InitializeComponent()

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 26


LENGUAJE DE PROGRAMACIÓN III

txtNombre.Text = objTfno.Nombre
txtTelefono.Text = objTfno.Telefono
' Agregue cualquier inicialización después de la llamada a
InitializeComponent().

End Sub

Private Sub btDatos_Click(sender As Object,


e As EventArgs) Handles btDatos.Click
Dim sDatos As String = objTfno.Nombre & vbLf & objTfno.Telefono
MessageBox.Show(sDatos)
End Sub

End Class

• Ejecutar la aplicación y dar clic al botón btDatos, deberá de mostrar en un


cuadro de mensaje la información introducida en la clase. Se ha creado un
objeto CTelefono que es denominado objTfno, iniciando con los valores de la
clase ya que inicia con las cajas de texto con las propiedades Nombre y
Telefono del objeto. El botón btDatos permite mostrar los datos del objeto,
utilizando un método MessageBox.Show, la que mostrara la información.

• Se ingresará el código para el btModificar que sería de la siguiente manera:

Private Sub btModificar_Click(sender As Object,


e As EventArgs) Handles btModificar.Click
objTfno.Nombre = "José Gonzales"
objTfno.Telefono = "5632676"
txtNombre.Text = objTfno.Nombre
txtTelefono.Text = objTfno.Telefono
End Sub

• Al ejecutar la aplicación y presionar el btModificar se podrá apreciar que los


datos cambian y si se le da clic al botón btDatos nos mostrará la ventana de
mensaje con los datos actualizados. Pero la deficiencia es que por más que
se cambie los valores en los cuadros de texto, estos no modifican el
resultado final.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 27


LENGUAJE DE PROGRAMACIÓN III

• Para ello se podría trabajar en el evento TextChanged del control TextBox,


que podrá interceptar para actualizar la propiedad correspondiente del objeto
de la clase CTelefono.

Private Sub txtNombre_TextChanged(sender As Object,


e As EventArgs) Handles txtNombre.TextChanged
objTfno.Nombre = txtNombre.Text
End Sub

Private Sub txtTelefono_TextChanged(sender As Object,


e As EventArgs) Handles txtTelefono.TextChanged
objTfno.Telefono = txtTelefono.Text
End Sub

• Modificar los datos en los cuadros de texto y presionar el btDatos para


verificar que los datos han cambiado.

Nota: Ejercicio N° 2 del Capítulo 1 del Manual; nombre aplicación:


“EnlaceDatos”.

Notificación al Cambiar una Propiedad:


Una forma más profesional de que la interfaz gráfica registre los cambios de un
objeto con el que está vinculada es que el objeto genere un evento cuando
cambia alguna de sus propiedades para que la interfaz gráfica lo pueda
interceptar y responder actualizándose. Una forma sencilla de hacer esto es

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 28


LENGUAJE DE PROGRAMACIÓN III

que la clase del objeto implemente la interfaz INotifyPropertyChanged del


espacio de nombres System.ComponentModel. La interfaz
INotifyPropertyChanged se utiliza para notificar a los clientes, generalmente
enlazados, que una propiedad ha cambiado. Esta interfaz proporciona el
evento PropertyChanged que habrá que generar cuando el valor de una
propiedad cambie.

Considerando la clase CTelefono con sus propiedades Nombre y Telefono. Si


esta clase implementa la interfaz INotifyPropertyChanged, un objeto de la
misma podrá notificar que cambio una de sus propiedades generando el evento
PropertyChanged.

Imports System.ComponentModel

Public Class CTelefono


Implements INotifyPropertyChanged
Private _nombre As String = "David Cubas"
Private _telefono As String = "984567432"

Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs)


Implements INotifyPropertyChanged.PropertyChanged

Private Sub NotificarCambio(nombreProp As String)


RaiseEvent PropertyChanged(Me,
New PropertyChangedEventArgs(nombreProp))
End Sub

Public Property Nombre() As String


Get
Return _nombre
End Get
Set(value As String)
_nombre = value
NotificarCambio("Nombre")
End Set
End Property

Public Property Telefono() As String


Get
Return _telefono
End Get
Set(value As String)
_telefono = value
NotificarCambio("Telefono")
End Set
End Property
End Class

El código muestra que un objeto CTelefono generará un evento


PropertyChanged cada vez que cambie el valor de alguna de sus propiedades.
Se podrá observar que cuando se asigna un nuevo valor a la propiedad se
invoca el método NotificarCambio que generará dicho evento. También se

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 29


LENGUAJE DE PROGRAMACIÓN III

puede observar que el método que responderá a este evento tiene dos
parámetros, el primero es una referencia al objeto CTelefono que genera el
evento, y el segundo los datos de tipo PropertyChangedEventArgs
relacionados con el evento, que en este caso se corresponden con el nombre
de la propiedad que ha cambiado.

Se puede utilizar este evento para mantener la interfaz del usuario sincronizada
con el objeto CTelefono, operación que antes se podía realizar manualmente
en el método btModificarObj_Click y que ahora, al no realizarla, quedaría de la
siguiente manera:

Private Sub btModificarObj_Click(sender As System.Object,


e As System.EventArgs) Handles btModificarObj.Click
objTfno.Nombre = "José Rivas"
objTfno.Telefono = "987342321"
End Sub

La modificación que realiza el método anterior sobre cada una de las


propiedades Nombre y Telefono generará para cada una de ellas el evento
PropertyChanged que la ventana principal, Clase Form1, interceptará para
actualizar la caja de texto correspondiente.

Imports System.ComponentModel

Public Class Form1


Private objTfno As New CTelefono()

Public Sub New()


' Llamada necesaria para el diseñador.
InitializeComponent()
txtNombre.Text = objTfno.Nombre
txtTelefono.Text = objTfno.Telefono
AddHandler objTfno.PropertyChanged,
AddressOf objTfno_PropertyChanged
' Agregue cualquier inicialización después de la llamada a
InitializeComponent().
End Sub

Private Sub objTfno_PropertyChanged(sender As Object,


e As PropertyChangedEventArgs)
Select Case e.PropertyName
Case "Nombre"
txtNombre.Text = objTfno.Nombre
Case "Telefono"
txtTelefono.Text = objTfno.Telefono
Exit Select
End Select
End Sub

End Class

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 30


LENGUAJE DE PROGRAMACIÓN III

Nota: Ejercicio N° 3 del Capítulo 1 del Manual; nombre aplicación:


“EnlaceDatos2”

Enlace de Datos con las Clases de Visual.Net

Se puede decir que el enlace de datos es un mecanismo que establece una


conexión entre la interfaz gráfica del usuario (Formulario) y los datos que
pueden proporcionar las Bases de Datos de diferentes proveedores. Este
mecanismo permite que los elementos que están enlazados a los objetos de
datos muestren los cambios de manera automática cuando estos cambian su
valor y a su vez cuando los elementos de la interfaz cambian su valor. La base
para este mecanismo es vincular o enlazar pares de propiedades y proveer un
mecanismo de notificación de cambios; Visual .Net sigue el mismo mecanismo
pero deja todo el proceso de sincronización y conversión de los datos para el
objeto de enlace, el proceso de enlace es proporcionado por la clase Binding.

Elemento Objeto de Enlace Objeto

Propiedad Sincronización Propiedad

Los componentes de los enlaces son los siguientes:

- Un objeto destino del Enlace. El Elemento.


- Propiedad de Destino. Propiedad del Elemento.
- Objeto origen del Enlace. El Objeto.
- Ruta de Acceso, al valor que se va a utilizar del objeto origen del enlace.
Propiedad del Objeto.

En una aplicación la ruta podría ser determinada por una variable o en un


cuadro de texto. En el ejemplo anterior el enlace es una caja de texto, la

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 31


LENGUAJE DE PROGRAMACIÓN III

propiedad destino es su propiedad Text, el objeto origen del enlace es el objeto


CTelefono y el valor que se utiliza del objeto de origen del enlace es su
propiedad Nombre o Telefono.

Un objeto de cualquier clase que trabaje con IBindingList o ITypedList, como


sucede con DataSet, DataTable, DataView o DataViewManager. Cuando el
origen de datos es DataSet, DataTable o DataViewManager, en realidad lo que
se está creando es un enlace a DataView. Las filas enlazadas son realmente
objetos DataRowView.

Una colección que implementa IList como, por ejemplo, ArrayList. Es necesario
crear y llenar la colección antes de crear el enlace. Todos los objetos de la lista
deben ser del mismo tipo, de lo contrario, se produce una Excepción.

Clase Binding:

Cuando se habla de un enlace a datos en .Net se da por definido un objeto


Binding. Este objeto conecta de forma sencilla las propiedades de dos objetos
diferentes, uno que tendrá el destino del enlace que podrían ser los controles
de un Windows Form, y el otro vendría a ser el que contendrá el origen de
datos que sería una Base de Datos o cualquier objeto que contenga datos.
Para realizar esta conexión Binding brinda las siguientes propiedades para
dicho fin:

- DataSource: Esta propiedad obtiene el origen de datos.


- ControlUpdateMode: Esta propiedad indica si se realizaron cambios en el
origen de datos, el valor predeterminado es OnPropertyChanged, que
especifica que el control enlazado se actualiza cuando cambia el valor del
origen de datos o cuando cambia la posición en el mismo. El otro valor es
Never, que especifica que el control enlazado nunca se actualiza cuando
cambia un valor del origen de datos.
- DataSourceUpdateMode: Esta propiedad nos indica cuando se realizan los
cambios en la propiedad del control enlazado al origen de datos. El valor
predeterminado es OnValidation que especifica que el origen de datos se
actualiza cuando se valida la propiedad del control. Los otros valores son
OnPropertyChanged, el origen de datos se actualiza cada vez que cambia el
valor de propiedad del control, y Never, el origen de datos nunca se
actualiza.
- PropertyName: Esta propiedad indica el nombre de la propiedad enlazada
del control.
- FormattingEnabled: Esta propiedad almacena un valor booleano que indica
si se aplica formato y conversión de tipos a los datos de la propiedad del
control.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 32


LENGUAJE DE PROGRAMACIÓN III

Los Eventos que trabaja este control, son los siguientes:

- BindingComplete, Este evento se genera cuando la propiedad


FormattingEnabled está en True y se ha completado una operación de
enlace.
- Format, Este evento se genera cuando se insertan datos en el control desde
el origen de datos, por lo que se puede controlar este evento para convertir
los datos sin formato del origen de datos en los datos con formato que se
van a mostrar.
- Parse, Este evento se genera cuando cambia el valor de un control con
enlace a datos, por lo que se puede controlar este evento para quitar el
formato del valor mostrado antes de almacenarlo en el origen de datos.

Ejemplo: Teniendo en cuenta el ejercicio anterior, se sincroniza las propiedades


Nombre del objeto objTfno y Text del cuadro de texto txtNombre:
txtNombre.DataBindings.Add(New Binding("Text", objTfno, "Nombre"))

Se puede observar que los controles que pueden tener un enlace tienen una
propiedad DataBindings que hace referencia a una colección
ControlBindingsCollection de objetos Binding. Para poder agregar un Binding a
la colección, se debe de llamar al método Add de la colección, lo que permitirá
enlazar una propiedad del control a una propiedad de un objeto.

Tipos de Enlace:
Un enlace a datos puede ser de características sencillas o complejas
dependiendo de su estructura. Se le dice un enlace sencillo cuando un control
se enlaza a un único elemento de datos, con una propiedad de un control a la
cual se le enlazara a un campo de una base de datos. Este viene a ser el tipo
de enlace típico para controles que suelen mostrar un único valor, como podría
ser el control TextBox. Se dice que un enlace es complejo cuando un control
puede enlazarse a varios elementos de datos, es decir a más de un registro de
una base de datos; este tipo de controles podrían ser los DataGridView,
ListBox y ComboBox.

Componentes BindingSource:
Los Windows Form permiten enlazar un origen de datos al componente
BindingSource, para luego hacer de intermediario entre el origen de datos y los
controles enlazados.

Notificación de Cambios en Enlaces dentro de Windows Form:


Si el enlace es sencillo, el objeto debe de proporcionar la notificación de
cambios cuando cambia el valor de la propiedad enlazada, implementando la
interfaz INotifyPropertyChanged.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 33


LENGUAJE DE PROGRAMACIÓN III

Si se utilizan objetos que implementan la interfaz INotifyPropertyChanged, no


es preciso utilizar BindingSource para enlazar el objeto a un control, aunque es
recomendable utilizarlo por la facilidad que ofrece.

Si el enlace es que una lista de objetos es decir un enlace complejo; el control


debe de ser informado sobre el cambio de las propiedades de los elementos de
la lista cuando este enlazado a una de estas propiedades, o sobre los cambios
de la lista, cuando se agrega o se elimina un elemento de la lista. Para ello la
lista debe de contener la interfaz IBindingList, que proporciona ambos tipos de
notificación de cambios. BindingList es una implementación de IBindingList y se
ha diseñado para el enlace de datos de formularios Windows Form. Si esta lista
enlazada no implementa la interfaz IBindingList, entonces se tendrá que
enlazar el componente BindingSource.

Crear un Enlace:
Para probar el enlace desde Visual.Net se desarrollara la siguiente aplicación
como ejemplo práctico:

• Para ello se deberá de crear una nueva aplicación Windows Form:


“EnlaceDatos3”.

• Insertar los siguientes objetos:

Objeto Propiedad Valor


Form1 Name frmEnlaceDatos
Text Enlace de Datos
Label1 Name lblNombre
Text Nombre:
Label2 Name lblTelefono
Text Teléfono:
TextBox1 Name txtNombre
TextBox2 Name txtTelefono

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 34


LENGUAJE DE PROGRAMACIÓN III

Button1 Name btDatos


Text Datos del Objeto Subyacente
Button2 Name btModificar
Text Modificar Objeto Subyacente

• Crear una carpeta Clases en el Proyecto:

• Dentro de la carpeta Clases se deberá generar la Clase CTelefono que va a


representar los datos que muestra el formulario.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 35


LENGUAJE DE PROGRAMACIÓN III

Public Class CTelefono


Private _nombre As String = "Un nombre"
Private _telefono As String = "000000000"

Public Property Nombre() As String


Get
Return _nombre
End Get
Set(value As String)
_nombre = value
End Set
End Property

Public Property Telefono() As String


Get
Return _telefono
End Get
Set(value As String)
_telefono = value
End Set
End Property
End Class

• Ingresar el siguiente código al formulario:

Public Class frmEnlaceDatos


Private objTfno As New CTelefono

Public Sub New()

‘Llamada necesaria para el diseñador.


InitializeComponent()
txtNombre.DataBindings.Add(
New Binding("Text", objTfno, "Nombre"))
txtTelefono.DataBindings.Add(
New Binding("Text", objTfno, "Telefono"))

End Sub

Private Sub btDatos_Click(sender As Object,

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 36


LENGUAJE DE PROGRAMACIÓN III

e As EventArgs) Handles btDatos.Click


Dim sDatos As String = objTfno.Nombre & vbLf & objTfno.Telefono
MessageBox.Show(sDatos)
End Sub

Private Sub btModificar_Click(sender As Object,


e As EventArgs) Handles btModificar.Click
objTfno.Nombre = "José Gonzales"
objTfno.Telefono = "5632676"

End Sub

End Class

Una vez ejecutada la aplicación, se podrá observar que la interfaz gráfica se


encuentra sincronizada con el objeto CTelefono.

También se puede realizar el enlace utilizando un objeto BindingSource,


utilizando si propiedad DataSource que hará referencia al origen de datos y
opcionalmente se podría utilizar la propiedad DataMember

Dim bs As New BindingSource()


bs.DataSource = objTfno
txtNombre.DataBindings.Add(New Binding("Text", bs, "Nombre"))
txtTelefono.DataBindings.Add(New Binding("Text", bs, "Telefono"))

Ahora el enlace de los controles al origen de datos se da por el BindingSource.

Enlaces con otros Controles:


También es posible conectar este tipo de propiedades con otras propiedades
de los diferentes controles. Por ejemplo se podría conectar con el ForeColor de
un TextBox:

txtTelefono.DataBindings.Add(
New Binding("ForeColor", txtNombre, "ForeColor"))

En este código se enlaza la propiedad ForeColor del cuadro de texto


txtTelefono con la propiedad ForeColor del cuadro de texto txtNombre.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 37


LENGUAJE DE PROGRAMACIÓN III

Aplicación de Conversiones:
Se pueden convertir los datos antes de mostrarlos en el destino o inclusive
antes de almacenarlos en el origen, esto se realiza con los eventos Format y
Parse. Format se utiliza cuando los datos van de origen a destino, porque se
tendrían que cambiar el destino debido a que el origen cambio. Parse se utiliza
cuando los datos van de destino a origen, porque se debe de cambiar el origen
ya que el destino ha cambiado.

En el ejemplo anterior de “EnlaceDatos3”, se puede indicar que muestre el


telefono con un formato determinado y que lo guarde en otro formato diferente.
Para este fin se debe de cambiar el atributo “_telefono” y la Propiedad Telefono
de tipo String a Decimal:

objTfno.Telefono = 123456789

Si lo que se desea es que el número de teléfono que está almacenado en


Decimal, se muestre con el formato “000 000 000”, se debe de considerar la
transformación a formato String. Esto se controlara en el evento Format y
Parse, para ello se añadirá los controles de estos eventos de tipo
ConvertEventHandler y el objeto Binding vinculado al cuadro de texto
txtTelefono:

Public Sub New()

‘Llamada necesaria para el diseñador.


InitializeComponent()
txtNombre.DataBindings.Add(
New Binding("Text", objTfno, "Nombre"))
txtTelefono.DataBindings.Add(
New Binding("Text", objTfno, "Telefono"))
'Controlar los Eventos Parse y Format del Enlace txtTelefono:
Dim bTelefono As Binding = txtTelefono.DataBindings("Text")
AddHandler bTelefono.Parse, AddressOf StringToDecimal
AddHandler bTelefono.Format, AddressOf DecimalToString

End Sub

Cuando se genera el evento Parse se ejecuta el método StringToDecimal, este


evento se genera siempre que el valor mostrado por el cuadro de texto
txtTelefono origen del enlace tiene que actualizarse.

Private Sub StringToDecimal(sender As Object, e As ConvertEventArgs)


'Parse ocurre siempre que haya que Actualizar
'La Propiedad Telefono con el contenido txtTelefono
If e.DesiredType <> GetType(Decimal) Then
Return
Try
e.Value = Decimal.Parse(e.Value.ToString())

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 38


LENGUAJE DE PROGRAMACIÓN III

Catch ex As Exception
MessageBox.Show("Introducir el Teléfono sin Espacios")
End Try
End If
End Sub

La Clase ConvertEventArgs permite aplicar o quitar el formato de valores


mostrados por un control Windows Forms enlazado a un origen de datos a
través de un objeto Binding y su propiedad DesiredType que permite
comprobar el tipo de la propiedad a la que se va a convertir el valor. En el
ejemplo un valor String se convierte a un formato Decimal; en el evento Parse
se obtiene el valor con formato, se revisa y si es apto se vuelve a convertir al
formato del tipo de datos del origen de datos.

Cuando se genera el evento Format se ejecuta el método DecimalToString.


Este evento se genera siempre que el cuadro de texto txtTelefono muestre un
nuevo valor debido a que la propiedad Telefono del objeto CTelefono ha
cambiado.

Private Sub DecimalToString(sender As Object, e As ConvertEventArgs)


'Format ocurre siempre que haya que mostrar en txtTelefono
'El valor de la propiedad Telefono
If e.DesiredType <> GetType(String) Then
Return
e.Value = CDec(e.Value).ToString("# 000 000 000")
End If
End Sub

La propiedad DesiredType de ConvertEventArgs permite comprobar el tipo de


la propiedad al que se va a convertir el valor que en este caso es String, en
este caso se observa que el valor sin formato proporcionado por la propiedad
Value de ConvertEventArgs es el valor Decimal que se convierte en String con
un formato. En el evento Format se obtiene el valor sin formato de la propiedad
Value de ConvertEventArgs, se aplica el formato y se restablece esta
propiedad con ese nuevo valor que será mostrado en el control.

Otra verificación que se puede hacer es que el nombre sea una cadena vacía,
que solo contendrá letras y espacios en blanco y que siempre empiece por una
letra. Esto se realiza con el evento Parse del enlace correspondiente al cuadro
de texto txtNombre, para ello se añade el controlador de este evento al objeto
Binding vinculado al control txtNombre:

Dim bNombre As Binding = txtNombre.DataBindings("Text")


AddHandler bNombre.Parse, AddressOf bNombre_Parse

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 39


LENGUAJE DE PROGRAMACIÓN III

Al generar el evento Parse se va a ejecutar el método bNombre _Parse. Este


evento se genera siempre que el valor mostrado en el cuadro de texto
txtNombre cambie.

Private Sub bNombre_Parse(sender As Object, e As ConvertEventArgs)


'Parse ocurre siempre que haya que actualizar
'La propiedad Nombre con el contenido txtNombre
If e.DesiredType <> GetType(String) Then
Return
Try
'Expresión regular: una o más letras y espacios
Dim ex_reg As New Regex("^([a-zA-ZñÑáÁéÉíÍóÓúÚ]\s*)+$")
If Not ex_reg.IsMatch(e.Value.ToString()) Then
Throw New FormatException("Debe especificar un nombre")
End If
Catch exc As FormatException
MessageBox.Show(exc.Message)
End Try
End If
End Sub

Orígenes de Datos Compatibles Con Windows Forms:


Con Windows Forms se puede realizar enlaces complejos. Para ello se utiliza
IList, IBindingList, IBindingListView, IEditableObject, ICancelAddNew,
IDataErrorInfo, ITypedList, IListSource o INotifyPropertyChanged, entre otras,
con la interfaz IEnumerable si se realiza el enlace a través de un componente
BindingSource.

Las Clases Array, ArrayList o CollectionBase implementan la interfaz IList. La


Clase BindingList permite crear una colección que ofrece posibilidades de
ordenación básicas. Un objeto que implementa la interfaz
INotifyPropertyChanged genera un evento cuando el valor de cualquiera de sus
propiedades cambia.

- Windows Forms permite enlazar propiedades de un control con propiedades


públicas de un objeto utilizando la Clase Binding.
- Matriz o Colección que actúa como origen de datos debe de implementar la
interfaz IList; un ejemplo sería una Matriz de la Clase ArrayList. Se pueden
utilizar colecciones BindingList(Of T) que es una versión genérica de la
interfaz IBindingList la cual va a ampliar la interfaz IList agregando
propiedades, métodos y eventos.
- BindingSource, es el origen de datos más utilizado en Windows Forms sobre
todo con ADO.Net; también permite utilizar con los controles DataGridView y
ComboBox.
- IEnumerable, esta interfaz se tienen que realizar a través de un componente
BindingSource.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 40


LENGUAJE DE PROGRAMACIÓN III

- ADO.Net, proporciona varias estructuras: DataColumn, DataTable,


DataView, DataSet y DataViewManager.

Cada Formulario tiene al menos un objeto BindingContext que maneja los


objetos BindingManagerBase. Para cada origen de datos existe un objeto
CurrencyManager o PropertyManager.
Dim cm As CurrencyManager =
TryCast(Me.BindingContext(colTfnos), CurrencyManager)
MessageBox.Show(TryCast(cm.Current, CTelefono).Nombre)

Enlace a Colecciones de Objetos.

El origen de un enlace puede ser un objeto único, para realizar una consulta a
una base de datos se puede utilizar controles como ListBox, ComboBox y
DataGridView. Para poder enlazar estos controles se debe de utilizar la
propiedad DataSource.

• List:
Viene a ser un equivalente a la Clase ArrayList, esta es más práctica y
manejable ya que trabaja una interfaz gráfica.

Ejemplo:
- Generar un Nuevo Proyecto Windows Forms “Binding_Source”.
- Insertar los siguientes objetos:

Objeto Propiedad Valor


Form1 Name Form1
Text Datos
List1 Name listTfnos
TextBox1 Name ctTfnoSelec
ReadOnly True
TextBox2 Name ctNombre
TextBox3 Name ctTfno
Button1 Name btAñadir
Text Añadir
Button2 Name btBorrar
Text Borrar
Button3 Name btModificar
Text Modificar

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 41


LENGUAJE DE PROGRAMACIÓN III

- Ingresar una carpeta Clases, e ingresar un archivo de Clases “CTelefono”.


Public Class CTelefono
Private _nombre As String = "Un nombre"
Private _telefono As Decimal = 0

Public Property Nombre() As String


Get
Return _nombre
End Get
Set(value As String)
_nombre = value
End Set
End Property

Public Property Telefono() As Decimal


Get
Return _telefono
End Get
Set(value As Decimal)
_telefono = value
End Set
End Property
End Class

- Agregar un nuevo archivo de Clase “FactoriaCTelefono”.

Public Class FactoriaCTelefono


Private Shared _telefonos As List(Of CTelefono)

‘Nuevo CTelefono
Public Shared Function CrearCTelefono(nom As String, tfn As Decimal) As
CTelefono
Dim tfno As New CTelefono()
tfno.Nombre = nom
tfno.Telefono = tfn
Return tfno
End Function

Public Shared Function ObtenerColeccionCTelefono() As List(Of CTelefono)


_telefonos = New List(Of CTelefono)()
Dim rnd As New Random()
For i As Integer = 1 To 9
_telefonos.Add(CrearCTelefono("Persona " & i,
rnd.Next(636000000, 636999999)))
Next
Return _telefonos
End Function

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 42


LENGUAJE DE PROGRAMACIÓN III

End Class

- Ingresar el código para el objeto Form1

Public Class Form1


Private colTfnos As List(Of CTelefono)
Private bs As BindingSource

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs)


Handles MyBase.Load
colTfnos = FactoriaCTelefono.ObtenerColeccionCTelefono()
bs = New BindingSource()
bs.DataSource = colTfnos
listTfnos.DataSource = bs
listTfnos.DisplayMember = "Nombre"
ctTfnoSelec.DataBindings.Add("Text", bs, "Telefono")
End Sub

Private Sub btAñadir_Click(sender As System.Object, e As System.EventArgs)


Handles btAñadir.Click
Dim tef As Decimal = 0
If ctNombre.Text.Length <> 0 AndAlso ctTfno.Text.Length <> 0 _
AndAlso Decimal.TryParse(ctTfno.Text, tef) Then
colTfnos.Add(FactoriaCTelefono.CrearCTelefono(ctNombre.Text, tef))
bs.Position = bs.Count
bs.CurrencyManager.Refresh()
End If
End Sub

Private Sub btBorrar_Click(sender As System.Object, e As System.EventArgs)


Handles btBorrar.Click
If bs.Position < 0 Then Return
colTfnos.RemoveAt(bs.Position)
bs.CurrencyManager.Refresh()
End Sub

Private Sub btModificar_Click(sender As System.Object, e As


System.EventArgs) Handles btModificar.Click
Dim cambios As Boolean = False
If ctNombre.Text.Length <> 0 Then
TryCast(bs.Current, CTelefono).Nombre = ctNombre.Text
cambios = True
End If
Dim tef As Decimal = 0
If ctTfno.Text.Length <> 0 _
AndAlso Decimal.TryParse(ctTfno.Text, tef) Then
TryCast(bs.Current, CTelefono).Telefono = tef
cambios = True
End If
If cambios Then bs.CurrencyManager.Refresh()
End Sub
End Class

- Se puede ejecutar la aplicación y se puede agregar nuevos registros al


origen, en el ejemplo se ingresara a “José” y su número telefónico
“983966874”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 43


LENGUAJE DE PROGRAMACIÓN III

Nota: Ejercicio N° 5 del Capítulo 1 del Manual; nombre aplicación:


“Binding_Source”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 44


LENGUAJE DE PROGRAMACIÓN III

II. ACCEDER A BASES DE DATOS UTILIZANDO VISUAL BASIC. NET

OPERACIONES:

- Programar el Mantenimiento a una Tabla de una Base de Datos.


- Acceder y Modificar datos Utilizando DataSet.
- Configurar y Utilizar Controles de Datos de Visual Basic .Net.
- Desarrollar Casos Prácticos de Controles con Acceso a Datos Utilizando
Visual Basic .Net

EQUIPOS Y MATERIALES:

- Computadora con microprocesadores Core 2 Duo o de mayor capacidad.


- Sistema operativo Windows.
- Acceso a internet.
- Software visual Studio 2012.

ORDEN DE EJECUCIÓN:

- Reconocer el trabajo en BD, con operaciones básicas.


- Reconocer el Funcionamiento del DataSet.
- Desarrollar Ejercicios para Acceso a Datos y Controles.

2.1. ACCEDER A BASES DE DATOS UTILIZANDO VISUAL BASIC.NET

PROGRAMAR EL MANTENIMIENTO A UNA TABLA DE UNA BASE DE


DATOS:

Accediendo a los Datos:


Se creara un Proyecto “BaseDeDatos” de tipo Biblioteca de clases. Archivo –
Nuevo Proyecto – Biblioteca de Clases

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 45


LENGUAJE DE PROGRAMACIÓN III

Se debe de generar las clases Alumno.vb, Asignatura.vb, Asignaturas.vb,


bbdd.vb y ListAlumnos.vb, eh ingresar el código para cada una de las clases:

- Clase Alumno.vb

Imports System.ComponentModel
Imports System.Collections.ObjectModel

Public Class Alumno


Implements INotifyPropertyChanged
Private _idAlumno As Integer
Public Property IdAlumno() As Integer
Get
Return _idAlumno
End Get
Set(value As Integer)
If bbdd.ObtenerAlumnoPorId(value) IsNot Nothing Then
Throw New Exception("IdAlumno duplicado")
End If
_idAlumno = value
OnPropertyChanged(New PropertyChangedEventArgs("IdAlumno"))
End Set
End Property

Private _nomAlumno As String


Public Property NomAlumno() As String
Get
Return _nomAlumno
End Get
Set(value As String)
_nomAlumno = value

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 46


LENGUAJE DE PROGRAMACIÓN III

OnPropertyChanged(New PropertyChangedEventArgs("NomAlumno"))
End Set
End Property

Private _dirAlumno As String


Public Property DirAlumno() As String
Get
Return _dirAlumno
End Get
Set(value As String)
_dirAlumno = value
OnPropertyChanged(New PropertyChangedEventArgs("DirAlumno"))
End Set
End Property

Private _estAlumno As String


Public Property EstAlumno() As String
Get
Return _estAlumno
End Get
Set(value As String)
_estAlumno = value
OnPropertyChanged(New PropertyChangedEventArgs("EstAlumno"))
End Set
End Property

Private _becaAlumno As Boolean


Public Property BecaAlumno() As Boolean
Get
Return _becaAlumno
End Get
Set(value As Boolean)
_becaAlumno = value
OnPropertyChanged(New PropertyChangedEventArgs("BecaAlumno"))
End Set
End Property

Private _listaCoAsignaturas As BindingList(Of Asignaturas)


Public Property ListaCoAsignaturas() As BindingList(Of Asignaturas)
Get
Return _listaCoAsignaturas
End Get
Set(value As BindingList(Of Asignaturas))
_listaCoAsignaturas = value
OnPropertyChanged(New PropertyChangedEventArgs("ListaCoAsignaturas"))
End Set
End Property

Private _listaAsigsObs As BindingList(Of Asignatura)


Public Property ListaAsigsObs() As BindingList(Of Asignatura)
Get
_listaAsigsObs = ObtenerAsigsObsOps("Obligatorias")
Return _listaAsigsObs
End Get
Set(value As BindingList(Of Asignatura))
_listaAsigsObs = value
OnPropertyChanged(New PropertyChangedEventArgs("ListaAsigsObs"))
End Set

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 47


LENGUAJE DE PROGRAMACIÓN III

End Property

Private _listaAsigsOps As BindingList(Of Asignatura)


Public Property ListaAsigsOps() As BindingList(Of Asignatura)
Get
_listaAsigsOps = ObtenerAsigsObsOps("Optativas")
Return _listaAsigsOps
End Get
Set(value As BindingList(Of Asignatura))
_listaAsigsOps = value
OnPropertyChanged(New PropertyChangedEventArgs("ListaAsigsOps"))
End Set
End Property

Private Function ObtenerAsigsObsOps(tipo As String) As BindingList(Of


Asignatura)
If _listaCoAsignaturas IsNot Nothing Then
For Each asigs As Asignaturas In _listaCoAsignaturas
If asigs.Tipo = tipo Then
Return asigs.ListaAsignaturas
End If
Next
End If
Return Nothing
End Function

Public Function ObtenerAsignatura(idAsig As Integer) As Asignatura


Dim colAsigs As BindingList(Of Asignatura)
'Obligatorias
colAsigs = ListaAsigsObs
If colAsigs IsNot Nothing Then
For Each asig As Asignatura In colAsigs
If asig.IdAsignatura = idAsig Then
Return asig
End If
Next
End If
‘Optativas
colAsigs = ListaAsigsOps
If colAsigs IsNot Nothing Then
For Each asig As Asignatura In colAsigs
If asig.IdAsignatura = idAsig Then
Return asig
End If
Next
End If
Return Nothing
End Function

Public Event PropertyChanged As PropertyChangedEventHandler _


Implements INotifyPropertyChanged.PropertyChanged
Public Sub OnPropertyChanged(e As PropertyChangedEventArgs)
RaiseEvent PropertyChanged(Me, e)
‘generar evento
End Sub

Public Overrides Function ToString() As String


Return NomAlumno

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 48


LENGUAJE DE PROGRAMACIÓN III

End Function

Public Sub New()


IdAlumno = 0
NomAlumno = "¿Nombre?"
DirAlumno = "¿Dirección?"
EstAlumno = "¿Estudios?"
BecaAlumno = False
ListaCoAsignaturas = New BindingList(Of Asignaturas)()
Dim asignaturas As BindingList(Of Asignatura)
'Obligatorias
asignaturas = New BindingList(Of Asignatura)()
asignaturas.Add(New Asignatura(-1, "¿Asignatura ob?", 0.0F))
ListaCoAsignaturas.Add(New Asignaturas("Obligatorias", asignaturas))
‘Optativas
asignaturas = New BindingList(Of Asignatura)()
asignaturas.Add(New Asignatura(-1, "¿Asignatura op?", 0.0F))
ListaCoAsignaturas.Add(New Asignaturas("Optativas", asignaturas))
End Sub

Public Sub New(id As Integer, nom As String, dir As String, est As String,
beca As Boolean, lista As BindingList(Of Asignaturas))
IdAlumno = id
NomAlumno = nom
DirAlumno = dir
EstAlumno = est
BecaAlumno = beca
ListaCoAsignaturas = lista
End Sub
End Class

- Clase Asignatura.vb

Imports System.ComponentModel

Public Class Asignatura


Implements INotifyPropertyChanged
Private _idAsignatura As Integer
Public Property IdAsignatura() As Integer
Get
Return _idAsignatura
End Get
Set(value As Integer)
_idAsignatura = value
OnPropertyChanged(New PropertyChangedEventArgs("IdAsignatura"))
End Set
End Property

Private _nomAsignatura As String


Public Property NomAsignatura() As String
Get
Return _nomAsignatura
End Get
Set(value As String)
_nomAsignatura = value
OnPropertyChanged(New PropertyChangedEventArgs("NomAsignatura"))
End Set

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 49


LENGUAJE DE PROGRAMACIÓN III

End Property

Private _nota As Single


Public Property Nota() As Single
Get
Return _nota
End Get
Set(value As Single)
_nota = value
OnPropertyChanged(New PropertyChangedEventArgs("Nota"))
End Set
End Property

Public Event PropertyChanged As PropertyChangedEventHandler _


Implements INotifyPropertyChanged.PropertyChanged
Public Sub OnPropertyChanged(e As PropertyChangedEventArgs)
RaiseEvent PropertyChanged(Me, e)
‘generar evento
End Sub

Public Overrides Function ToString() As String


Return NomAsignatura
End Function

Public Sub New()


Me.New(-1, "", -1)
End Sub
Public Sub New(id As Integer, nomAsig As String, nt As Single)
IdAsignatura = id
NomAsignatura = nomAsig
Nota = nt
End Sub
End Class

- Clase Asignaturas.vb

Imports System.Collections.ObjectModel
Imports System.ComponentModel

Public Class Asignaturas


Private _tipo As String
‘Obligatoria, Optativa
Public Property Tipo() As String
Get
Return _tipo
End Get
Set(value As String)
_tipo = value
End Set
End Property

Private _listaAsignaturas As BindingList(Of Asignatura)


Public Property ListaAsignaturas() As BindingList(Of Asignatura)
Get
Return _listaAsignaturas
End Get
Set(value As BindingList(Of Asignatura))

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 50


LENGUAJE DE PROGRAMACIÓN III

_listaAsignaturas = value
End Set
End Property

Public Sub New()


Tipo = ""
ListaAsignaturas = New BindingList(Of Asignatura)()
ListaAsignaturas.Add(New Asignatura(-1, "¿Asignatura?", 0.0F))
End Sub

Public Sub New(tipo__1 As String, lista As BindingList(Of Asignatura))


Tipo = tipo__1
ListaAsignaturas = lista
End Sub
End Class

- Clase bbdd.vb

Imports System.Collections.ObjectModel
Imports System.ComponentModel
Imports System.Windows.Forms

Public Class bbdd


Shared Sub New()
ObtenerAlumnos()
End Sub

Private Shared _alumnos As ListAlumnos


Public Shared ReadOnly Property Alumnos() As ListAlumnos
Get
Return _alumnos
End Get
End Property

‘Crear la base de datos


Private Shared Function ObtenerAlumnos() As ListAlumnos
_alumnos = New ListAlumnos()
Dim coAsignaturas As BindingList(Of Asignaturas)
Dim asignaturas As BindingList(Of Asignatura)
Dim rnd As New Random()
For i As Integer = 1 To 9
Dim idAl As Integer = i + i * 10 + i * 100
‘111, 222,...
Dim nomAl As String = "Alumno " & Convert.ToChar(64 + i)
Dim dirAl As String = "Dirección 0" & i
Dim estAl As String = ObtenerEstudios(rnd.[Next](9)).Text
Dim becaAl As Boolean = If(i Mod 3 = 0, True, False)
coAsignaturas = New BindingList(Of Asignaturas)()
‘Obligatorias
asignaturas = New BindingList(Of Asignatura)()
For a As Integer = 0 To rnd.[Next](3, 6) - 1
Dim idAsOb As Integer = (i - 1 + a) Mod 9
Dim asig As String = ObtenerAsigsOB(idAsOb).Text
'Asignatura ob?,...
Dim nota As Single = CSng(CInt(rnd.NextDouble() * 100) / 10.0F)
asignaturas.Add(New Asignatura(CInt(ObtenerAsigsOB(idAsOb).Tag),
asig, nota))

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 51


LENGUAJE DE PROGRAMACIÓN III

Next
coAsignaturas.Add(New Asignaturas("Obligatorias", asignaturas))
‘Optativas
asignaturas = New BindingList(Of Asignatura)()
For a As Integer = 0 To rnd.[Next](2, 4) - 1
Dim idAsOp As Integer = (i - 1 + a) Mod 9
System.Diagnostics.Debug.WriteLine(idAsOp)
Dim asig As String = ObtenerAsigsOP(idAsOp).Text
'Asignatura op?,...
Dim nota As Single = CSng(CInt(rnd.NextDouble() * 100) / 10.0F)
asignaturas.Add(New Asignatura(CInt(ObtenerAsigsOP(idAsOp).Tag),
asig, nota))
Next
coAsignaturas.Add(New Asignaturas("Optativas", asignaturas))
_alumnos.Add(New Alumno(idAl, nomAl, dirAl, estAl, becaAl,
coAsignaturas))
Next
Return _alumnos
End Function

Public Shared Function ObtenerAlumnoPorId(idAl As Integer) As Alumno


For Each al As Alumno In Alumnos
If al.IdAlumno = idAl Then
Return al
End If
Next
Return Nothing
End Function

Public Shared ReadOnly Property ObtenerEstudios() As ToolStripMenuItem()


Get
Dim ests As ToolStripMenuItem() = New ToolStripMenuItem(8) {}
For i As Integer = 0 To 8
ests(i) = New ToolStripMenuItem("Estudios 0" & (i + 1))
Next
Return ests
End Get
End Property

Public Shared ReadOnly Property ObtenerTiposAsigs() As ToolStripMenuItem()


Get
Dim tipo As ToolStripMenuItem() = New ToolStripMenuItem(1) {}
tipo(0) = New ToolStripMenuItem("Obligatorias")
tipo(1) = New ToolStripMenuItem("Optativas")
Return tipo
End Get
End Property

Public Shared ReadOnly Property ObtenerAsigsOB() As ToolStripMenuItem()


Get
Dim asOB As ToolStripMenuItem() = New ToolStripMenuItem(8) {}
For i As Integer = 0 To 8
asOB(i) = New ToolStripMenuItem("Asignatura ob" & (i + 11))
'ID asignatura
asOB(i).Tag = i + 11
Next
Return asOB
End Get

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 52


LENGUAJE DE PROGRAMACIÓN III

End Property

Public Shared ReadOnly Property ObtenerAsigsOP() As ToolStripMenuItem()


Get
Dim asOP As ToolStripMenuItem() = New ToolStripMenuItem(8) {}
For i As Integer = 0 To 8
asOP(i) = New ToolStripMenuItem("Asignatura op" & (i + 61))
'ID asignatura
asOP(i).Tag = i + 61
Next
Return asOP
End Get
End Property
End Class

- Clase ListAlumnos.vb

Imports System.ComponentModel

Public Class ListAlumnos


Inherits BindingList(Of Alumno)
End Class

Crear un proyecto “EnlaceDeDatosObjetos” y añadir la referencia a la


Biblioteca de Clases “BaseDeDatos”. Clic derecho al proyecto – Agregar
Referencia.

Seleccionar Examinar y darle clic al botón examinar y ubicar el archivo de clase


“BaseDeDatos.Dll”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 53


LENGUAJE DE PROGRAMACIÓN III

Quedaría de la siguiente manera:

Se agregara un nuevo origen de datos. Menú Ver – Otras Ventanas – Orígenes


de Datos.

Seleccionar Objeto en la ventana Asistente para la Configuración de Orígenes


de Datos:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 54


LENGUAJE DE PROGRAMACIÓN III

Seleccionar los objetos que se desea enlazar:

Deberá quedar de la siguiente manera:

Arrastrar el elemento ListAlumnos al Formulario para generar un DataGridView

Se puede observar que se ha generado un BindingNavigator, que es una Barra


de Navegación Enlazada a Datos.

Vinculación Maestro Detalle: Esto incluye dos partes, una vista que muestra
una lista de elementos, normalmente una colección de datos, y una vista de
detalles del elemento que se selecciona en la lista anterior.

Se implementará una nueva rejilla para los tipos de asignaturas que


corresponden a los alumnos y otra grilla para las asignaturas correspondientes
al tipo de asignaturas seleccionadas y un TextBox que mostrara la nota.

Código para el Formulario:


Imports BaseDeDatos

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 55


LENGUAJE DE PROGRAMACIÓN III

Public Class Form1


Private Sub Form1_Load(sender As System.Object, e As System.EventArgs)
Handles MyBase.Load
ListAlumnosBindingSource.DataSource = bbdd.Alumnos
End Sub

End Class

Ejecutar la aplicación:

Nota: Ejercicio N° 1 del Capítulo 2 del Manual; nombre aplicación:


“EnlaceDeDatosObjetos”

Mantenimiento a una Tabla de una Base de Datos:

- Se creará un proyecto con el nombre “Mantenimiento”.

- Crear una Base de Datos en SQL con el nombre “Instituto” y añadir una tabla
“Alumnos” con la siguiente estructura:

/* Crear la Base de Datos Instituto */

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 56


LENGUAJE DE PROGRAMACIÓN III

Create database Instituto


/* Abrir la Base de Datos */
use instituto
/* Crear Tabla Alumnos */
Create Table Alumnos (
alu_codigo integer primary key not null,
alu_nombre varchar(50),
alu_apepaterno varchar(50),
alu_apematerno varchar(50),
alu_sexo varchar(50),
alu_telefono varchar(20),
alu_edad char(2),
alu_direccion varchar(50)
)
/* Insertar 3 Alumnos */
Insert Into Alumnos Values (1,
'Manuel','Huaman','Pacheco','Masculino','987541254','20','Jr. Arequipa
345 - Cercado de Lima')
Insert Into Alumnos Values (2,
'José','Gonzales','Rivera','Masculino','964587124','21','Av. José Leal
741 - Lince')
Insert Into Alumnos Values (3,
'María','Gutierrez','Landeo','Femenino','974965258','19','Calle Santa
Paula 279 - Pueblo Libre')
/* Listar Alumnos */
Select * From Alumnos

- Se observará los alumnos listados en la Base de Datos:

- Desarrollar el siguiente Formulario:

Objeto Propiedad Valor


Form1 Name frmAlumnos
Text Mantenimiento de Alumnos
Label1 Name Label1
Text Código:
Label2 Name Label2
Text Nombre:
Label3 Name Label3
Text Apellido Paterno:
Label4 Name Label4
Text Apellido Materno:
Label5 Name Label5
Text Sexo:
Label6 Name Label6
Text Teléfono:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 57


LENGUAJE DE PROGRAMACIÓN III

Label7 Name Label7


Text Edad:
Label8 Name Label8
Text Dirección:
TextBox1 Name txtCodigo
Enabled False
TextBox2 Name txtNombre
Enabled False
TextBox3 Name txtApePat
Enabled False
TextBox4 Name txtApeMat
Enabled False
TextBox5 Name txtSexo
Enabled False
TextBox6 Name txtTelefono
Enabled False
TextBox7 Name txtEdad
Enabled False
TextBox8 Name txtDireccion
Enabled False
Button1 Name btNuevo
Text Nuevo
Button2 Name btGuardar
Text Guardar
Enabled False
Button3 Name btActualizar
Text Actualizar
Enabled False
Button4 Name btEliminar
Text Eliminar
Enabled False
Button5 Name btCancelar
Text Cancelar
Enabled False
DataGridView1 Name dgvAlumnos

- Crear la Clase Conexión: Clic derecho a la Aplicación – Agregar – Clase.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 58


LENGUAJE DE PROGRAMACIÓN III

- En la Clase “Conexión” se ingresará el código para la conexión y para las


funciones básicas.

Imports System.Data.SqlClient
Imports System.Data

Public Class Conexion


Private cadena As String = "Server=DESKTOP-FRUVH1J\SQLEXPRESS;
DataBase=Instituto; Uid=sa;Password=root"
Public cn As SqlConnection
Private cmb As SqlCommandBuilder
'Función Conectar
Private Sub Conectar()
cn = New SqlConnection(cadena)
End Sub

Private comando As SqlCommand


'Insertar Registros
Public Function Insertar(sql As String) As Boolean
cn.Open()
comando = New SqlCommand(sql, cn)
Dim i As Integer = comando.ExecuteNonQuery()
cn.Close()
If i > 0 Then
Return True
Else
Return False
End If
End Function

'Eliminar Registros
Public Function eliminar(tabla As String, condicion As String) As Boolean
cn.Open()
Dim sql As String = "Delete From " & tabla & " Where " & condicion
comando = New SqlCommand(sql, cn)
Dim i As Integer = comando.ExecuteNonQuery()
cn.Close()
If i > 0 Then
Return True
Else
Return False
End If
End Function

'Actualizar Registros
Public Function Actualizar(tabla As String, campos As String, condicion
As String) As Boolean
cn.Open()
Dim sql As String = "Update " & tabla & " Set " & campos & " Where "
& condicion
comando = New SqlCommand(sql, cn)
Dim i As Integer = comando.ExecuteNonQuery()
If i > 0 Then
Return True
Else
Return False
End If

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 59


LENGUAJE DE PROGRAMACIÓN III

End Function

'Consultar Registros
Public ds As New DataSet()
Public da As SqlDataAdapter

Public Sub Consultar(sql As String, tabla As String)


Conectar()
ds.Clear()
da = New SqlDataAdapter(sql, cn)
cmb = New SqlCommandBuilder(da)
da.Fill(ds, tabla)
End Sub

Public Function Consultar2(tabla As String) As DataTable


Dim sql As String = "Select * From " & tabla
da = New SqlDataAdapter(sql, cn)
Dim dts As New DataSet()
da.Fill(dts, tabla)
Dim dt As New DataTable()
dt = dts.Tables(tabla)
Return dt
End Function
End Class

- El código para el Formulario y los Objetos:

Public Class frmAlumnos


Dim Claseob As New Conexion

Private Sub Activar()


'Función para Activar los Cuadros de Texto
txtCodigo.Enabled = True
txtNombre.Enabled = True
txtApePat.Enabled = True
txtApeMat.Enabled = True
txtSexo.Enabled = True
txtTelefono.Enabled = True
txtEdad.Enabled = True
txtDireccion.Enabled = True
End Sub

Private Sub Desactivar()


'Función para Desactivar los Cuadros de Texto
txtCodigo.Enabled = False
txtNombre.Enabled = False

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 60


LENGUAJE DE PROGRAMACIÓN III

txtApePat.Enabled = False
txtApeMat.Enabled = False
txtSexo.Enabled = False
txtTelefono.Enabled = False
txtEdad.Enabled = False
txtDireccion.Enabled = False
End Sub

Private Sub limpiar()


'Función para Limpiar los Cuadros de Texto
txtCodigo.Text = ""
txtNombre.Text = ""
txtApePat.Text = ""
txtApeMat.Text = ""
txtSexo.Text = ""
txtTelefono.Text = ""
txtEdad.Text = ""
txtDireccion.Text = ""
End Sub
Private Sub frmAlumnos_Load(sender As Object, e As EventArgs) Handles
MyBase.Load
'Rellenamos el DataGridView con los Datos de la Tabla Alumnos
Claseob.Consultar("Select * From Alumnos", "Alumnos")
Me.dgvAlumnos.DataSource = Claseob.ds.Tables("Alumnos")
Me.dgvAlumnos.Refresh()
End Sub

Private Sub btGuardar_Click(sender As Object, e As EventArgs) Handles


btGuardar.Click
'Ejecutamos la Instrucción para Guardar los Datos en la tabla Alumnos
Dim sql As String = "Insert Into
Alumnos(alu_codigo,alu_nombre,alu_apepaterno,alu_apematerno,alu_sexo,alu_tele
fono,alu_edad,alu_direccion) Values ('" + Me.txtCodigo.Text + "','" +
Me.txtNombre.Text + "','" + Me.txtApePat.Text + "','" + Me.txtApeMat.Text +
"','" + Me.txtSexo.Text + "','" + Me.txtTelefono.Text + "','" +
Me.txtEdad.Text + "','" + Me.txtDireccion.Text + "')"
If Claseob.Insertar(sql) Then
MessageBox.Show("Registro Guardado")
'Restauramos la Aplicación
Application.Restart()
Else
MessageBox.Show("Error al Guardar")
End If
End Sub

Private Sub dgvAlumnos_DoubleClick(sender As Object, e As EventArgs)


Handles dgvAlumnos.DoubleClick
'Pasamos los datos seleccionados con doble clic del DataGridView a
los Cuadros de Texto
txtCodigo.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(0).Value
txtNombre.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(1).Value
txtApePat.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(2).Value
txtApeMat.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(3).Value

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 61


LENGUAJE DE PROGRAMACIÓN III

txtSexo.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(4).Value
txtTelefono.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(5).Value
txtEdad.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(6).Value
txtDireccion.Text =
dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(7).Value
btActualizar.Enabled = True
btEliminar.Enabled = True
btNuevo.Enabled = False
Activar()
End Sub

Private Sub btEliminar_Click(sender As Object, e As EventArgs) Handles


btEliminar.Click
'Ejecutamos la Instrucción para Eliminar los Datos en la tabla
Alumnos
If Claseob.eliminar("Alumnos", "alu_codigo ='" +
txtCodigo.Text.ToString() + "'") Then
MessageBox.Show("Registro Eliminado")
'Restauramos la Aplicación
Application.Restart()
Else
MessageBox.Show("Error al Eliminar")
End If
End Sub

Private Sub btActualizar_Click(sender As Object, e As EventArgs) Handles


btActualizar.Click
'Ejecutamos la Instrucción para Actualizar los Datos en la tabla
Alumnos
Dim campos As String = "alu_nombre = '" + txtNombre.Text + "',
alu_apepaterno= '" + txtApePat.Text + "',alu_apematerno= '" + txtApeMat.Text
+ "',alu_sexo= '" + txtSexo.Text + "', alu_telefono= '" + txtTelefono.Text +
"',alu_edad= '" + txtEdad.Text + "',alu_direccion= '" + txtDireccion.Text +
"'"
If Claseob.Actualizar("Alumnos", campos, "alu_codigo='" +
txtCodigo.Text.ToString() + "'") Then
MessageBox.Show("Registro actualizado")
'Restauramos la Aplicación
Application.Restart()
Else
MessageBox.Show("Error al Actualizar")
End If
End Sub

Private Sub btNuevo_Click(sender As Object, e As EventArgs) Handles


btNuevo.Click
'Activamos los Cuadros de Texto y los Botones para su ejecución
Activar()
btGuardar.Enabled = True
btCancelar.Enabled = True
btNuevo.Enabled = False
End Sub

Private Sub btCancelar_Click(sender As Object, e As EventArgs) Handles


btCancelar.Click

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 62


LENGUAJE DE PROGRAMACIÓN III

'Desactivaos los Cuadros de Texto y los Botones


Desactivar()
limpiar()
btEliminar.Enabled = False
btActualizar.Enabled = False
btGuardar.Enabled = False
btNuevo.Enabled = True
btCancelar.Enabled = False
End Sub
End Class

Nota: Ejercicio N° 2 del Capítulo 2 del Manual; nombre aplicación:


“Mantenimiento”

2.2. ACCEDER Y MANIPULAR DATOS UTILIZANDO DATASET.

Como se pudo apreciar anteriormente, un DataSet es un complemento muy


importante para la conexión de datos dentro de Visual Basic .Net. Se puede
utilizar con diferentes motores de Bases de Datos.

Para el fin de poder trabajar con este conector a origen e datos, se debe de
tener una base de datos con todos los privilegios para su manipulación.

Se desarrollará la siguiente aplicación para el entendimiento práctica de este


escenario:

- Crear la Base de Datos en SQL Server.

/* Crear la Base de Datos */


Create DataBase Empresa
/* Abrir la Base de Datos */
Use Empresa
/* Crear la Tabla Clientes */
Create Table Clientes (
cli_codigo Integer Primary Key,
cli_razonsocial Varchar(50),
cli_ruc Varchar(11),
cli_direccion Varchar(50),
cli_telefono Varchar(20),
cli_email Varchar(50)
)
/* Insertar tres Registros a la Tabla Cliente */
Insert Into Clientes Values (1,'Swordfish Group
S.A.C.','20402198767','Jr. Arica 380 - La
Merced','5691942','gerencia@swordfishgroup.com.pe')
Insert Into Clientes Values (2,'Global Supply
S.A.','20398727641','Calle la Coruña 319 - La Perla -
Callao','3198564','ventas@globalsupply.com.pe')
Insert Into Clientes Values (3,'CORSEM S.R.L.','20654387019','Calle
Santa Enma 980 - Cercado de Lima','3760632','core@corsem.com')
/* Visualizar los Datos */
Select * From Clientes

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 63


LENGUAJE DE PROGRAMACIÓN III

- Crear un Nuevo Proyecto en Visual Basic .Net con el nombre “AppDataSet”.

- Menú Ver – Otras Ventanas – Orígenes de Datos.

- Agregar Nuevo Origen de Datos.

- Utilizar el Asistente para la Configuración de Origen de Datos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 64


LENGUAJE DE PROGRAMACIÓN III

- Generar Nueva Conexión, Ingresar el Nombre del Servidor, el cual se


obtiene de darle clic derecho al Servidor en Sql Server y seleccionar la
opción Propiedades: Seleccionar y copiar el nombre.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 65


LENGUAJE DE PROGRAMACIÓN III

- Ingresar el nombre del servidor, Dar la Autenticación de SQL Server y


seleccionar la Base de Datos “Empresa”. Probar Conexión.

- Seleccionar “Si, Incluir Datos Confidenciales en la Cadena de Conexión”.

- Solicita el nombre para Guardar Cadena de Conexión en el archivo de


Config. de la Aplicación:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 66


LENGUAJE DE PROGRAMACIÓN III

- Elegir los objetos de la Base de Datos. En este caso la tabla Clientes. Se


generó el EmpresaDataSet. Finalizar.

- Se ha creado el DataSet para poder acceder a los datos.

- Arrastrar los Elementos del DataSet al Formulario. Se podrá observar que se


ha generado de manera automática el ClientesBindingNavigator y el
ClientesDataGridView mostrando la información de la tabla Clientes.

- Seleccionar el DataSet de la tabla Clientes y dar la opción Detalles.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 67


LENGUAJE DE PROGRAMACIÓN III

- Arrastrar nuevamente el DataSet al Formulario. Ahora se generarán los


cuadros de texto con las etiquetas para cada campo.

- Acomodar los Controles dentro del Formulario y modificar las Etiquetas


(Label) para una visualización correcta.

- Cambiar las Propiedades del DataGridView, clic derecho al control, Editar


Columnas y cambiar los encabezados de columnas

- Cambiar las Propiedades:


o HeaderText: Código.
o AutoSizeMode: ColumnHeader.
o DefaultCellStyle: DataGridViewCellStyle (Seleccionar el estilo de las
columnas, Colores, formatos, estructuras, etc.).

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 68


LENGUAJE DE PROGRAMACIÓN III

- Ejecutar la aplicación. Se podrá visualizar la información de la tabla Clientes


y manipularla desde los controles.

- Ingresar un nuevo registro a la tabla clientes desde la aplicación.

Nota: Ejercicio N° 3 del Capítulo 2 del Manual; nombre de la aplicación:


“AppDataSet

2.3. CONFIGURAR Y UTILIZAR CONTROLES DE DATOS DE VISUAL


BASIC .NET
Existen diferentes controles para el manejo de datos e información, para ello se
desarrollara una aplicación para que la explicación sea más clara y didáctica.
Se utilizaran controles de datos como son: DataGridView, ListView y
ComboBox.

- Crear la Base de Datos en SQL Server

/* Crear Base de Datos */


Create DataBase BDVentas
/* Abrir Base de Datos */
Use BDVentas

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 69


LENGUAJE DE PROGRAMACIÓN III

/* Crear la Tabla Productos */


Create Table Productos (
pro_id integer Identity Primary Key,
pro_descripcion Varchar(50),
pro_categoria Varchar(50),
pro_precio Decimal,
pro_stock Integer
)
/* Ingresar Registros */
Insert Into Productos Values('Televisor LG
42"','Televisores',2200,100)
Insert Into Productos Values('Blue Ray Panasonic
G345','Reproductores',650,100)
Insert Into Productos Values('AquaMatic Samsung OP098','Linea
Blanca',860,100)
/* Listar los Productos */
Select * From Productos

- Crear Nuevo Proyecto “ControlesdeDatos” y agregar los siguientes


Controles:

Objeto Propiedad Valor


Form1 Name frmBuscarProducto
Text Buscar Producto
Label1 Text Ingrese Producto
TextBox1 Name txtBuscar
DatagridView1 Name DataGridView1
Button1 Name btBuscar
Text Buscar
Button2 Name btListado
Text Listar

- Ingresar el siguiente código para el formulario frmBuscarProducto

Option Explicit On
Option Strict On

Imports System.Data
Imports System.Data.SqlClient

Public Class frmBuscarProducto

'ConnectionString para SQL server EXPRESS


Private Const cs As String = "Server=DESKTOP-FRUVH1J\SQLEXPRESS;
Database=BDVentas; uid=sa; password=root"

'Declarar un BindingSource

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 70


LENGUAJE DE PROGRAMACIÓN III

Private BindingSource1 As Windows.Forms.BindingSource = New BindingSource

Private Sub Form1_FormClosed( _


ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
BindingSource1.Dispose()
End Sub

Private Sub Form1_Load( _


ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

btBuscar.Text = "Buscar fila"

Try
'Declarar la conexión y abrir
Using cn As SqlConnection = New SqlConnection(cs)
cn.Open()

'Crear un DataAdapter y pasarle el comando para traer los registros


Dim da As New SqlDataAdapter("SELECT * FROM Productos", cn)
'DataTable
Dim dt As New DataTable

'llenar el DataTable
da.Fill(dt)

'enlazar el DataTable al BindingSource


BindingSource1.DataSource = dt

'propiedades para el DataGridview


With DataGridView1
'opcional: Sin selección múltiple
.MultiSelect = False
'seleccionar fila completa al hacer clic en un registro
.SelectionMode = DataGridViewSelectionMode.FullRowSelect

'enlazar los controles


.DataSource = BindingSource1.DataSource
End With

End Using
'errores
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub

'Función que retorna el índice de la fila


Function Buscar( _
ByVal Columna As String, _
ByVal texto As String, _
ByVal BindingSource As BindingSource) As Integer

Try
'si está vacío salir y no retornar nada
If BindingSource1.DataSource Is Nothing Then
Return -1

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 71


LENGUAJE DE PROGRAMACIÓN III

End If

'Ejecutar el método Find pasándole los datos


Dim fila As Integer = BindingSource.Find(Columna.Trim, texto)

'Mover el cursor a la fila obtenida


BindingSource.Position = fila

'retornar el valor
Return fila

'errores
Catch ex As Exception
MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
End Try
'no retornar nada
Return -1

End Function

'Botón para buscar en el DataGridView


Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btBuscar.Click
'Pasar el nombre del campo por el cual buscar,
'el dato, y el BindingSource enlazado al DataGridView
Dim ret As Integer = Buscar( _
"pro_descripcion", _
txtBuscar.Text.Trim, _
BindingSource1)

'si no se encontró
If ret = -1 Then
'mostrar un mensaje
MsgBox("No se encontró la fila", MsgBoxStyle.Critical)
Else
With DataGridView1
'volver a enlazar
.DataSource = BindingSource1
'Pasarle el índice para Visualizar la fila al comienzo de la grilla
.FirstDisplayedScrollingRowIndex = ret
End With
End If

End Sub

Private Sub btListado_Click(sender As Object, e As EventArgs) Handles


btListado.Click
frmListar.Show()
Me.Hide()
End Sub

Private Sub txtBuscar_TextChanged(sender As Object, e As EventArgs)


Handles txtBuscar.TextChanged

End Sub
End Class

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 72


LENGUAJE DE PROGRAMACIÓN III

- Ingresar un Windows Forms y agregar los siguientes controles:

Objeto Propiedad Valor


Form2 Name frmListar
Text Listar
Label1 Text Seleccione el Producto
ComboBox1 Name cbProducto
ListBox1 Name lstDatos
Button1 Name btRetornar
Text Retornar

- Ingresar el siguiente código para el formulario frmListar

Imports System.Data.SqlClient

Public Class frmListar

Private Sub frmListar_Load(sender As Object, e As EventArgs) Handles


MyBase.Load
Using cnn As New SqlConnection( _
"Server=DESKTOP-FRUVH1J\SQLEXPRESS; Database=BDVentas; uid=sa;
password=root")
Dim sql As String = "SELECT * FROM Productos"
Dim da As New SqlDataAdapter(sql, cnn)
Dim dt As New DataTable("Productos")
da.Fill(dt)

'Enlazamos el control ComboBox


With cbProducto
.DataSource = dt
.DisplayMember = "pro_descripcion"
.ValueMember = "pro_id"
End With

End Using

End Sub

Private Sub ComboBox1_SelectedValueChanged(sender As Object, e As EventArgs)


Handles cbProducto.SelectedValueChanged
'Si el tipo de valor no es Integer, abandonamos el procedimiento.
If Not TypeOf cbProducto.SelectedValue Is Integer Then Return

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 73


LENGUAJE DE PROGRAMACIÓN III

'Referenciamos el objeto DataTable


Dim dt As DataTable = DirectCast(cbProducto.DataSource, DataTable)

'Tipo de Código / Dato


Dim codigo As Integer = CInt(cbProducto.SelectedValue)
Dim row() As DataRow = dt.Select("pro_id = " & codigo)

'Datos a Mostrar
Dim p1 As Integer = CInt(row(0).Item("pro_precio"))
Dim p2 As Integer = CInt(row(0).Item("pro_stock"))

'Limpiamos el control ListBox


lstDatos.Items.Clear()

'Añadimos los Datos al ListBox


lstDatos.Items.Add("Precio= S/." & p1)
lstDatos.Items.Add("Stock= " & p2)

End Sub

Private Sub btRetornar_Click(sender As Object, e As EventArgs) Handles


btRetornar.Click
frmBuscarProducto.Show()
Me.Hide()
End Sub
End Class

- Ejecutar la Aplicación. En el primer Formulario (frmBuscarProducto) ingresar


el nombre o descripción de un Producto y presionar el botón Buscar, se
mostrara seleccionado en el DataGrid el registro ingresado. Luego Ingresar
al siguiente Formulario (frmListar) y seleccionar el producto en el combobox
y se mostrara los datos del precio y el stock en el ListBox.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 74


LENGUAJE DE PROGRAMACIÓN III

Formulario 1 – frmBuscarProducto

Formulario 2 - frmListar

Nota: Ejercicio N° 4 del Capítulo 2 del Manual; nombre de la aplicación:


“AppDataSet

2.4. DESARROLLAR CASOS PRÁCTICOS DE CONTROLES CON ACCESO


A DATOS.
Para un correcto control del Acceso a Datos se debe de manejar los programas
de Bases de Datos de manera práctica, para ello, se trabajara en Ms-SQL
Server con las funciones básicas junto con los Procedimientos Almacenados
para luego ser utilizados desde una aplicación Visual Basic.
SQL es el lenguaje estándar para interactuar con Bases de Datos relacionales
y es soportado prácticamente por todos los sistemas administradores de Bases
de Datos en la actualidad. Las unidades básicas son las Tablas, Campos y
Registros. Una Tabla representa una forma simple de relacionar los datos entre
sí. Un Campo o columna representa un dato de la tabla. Un Registro o fila
representa un conjunto de datos con relación entre sí en una tabla.

Se debe de conocer como parte fundamental de la estructura de bases de


datos para aplicaciones, las Instrucciones SQL básicas:

- Crear Base de Datos:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 75


LENGUAJE DE PROGRAMACIÓN III

Se utiliza la sentencia CREATE DATABASE. Sintaxis:


Create DataBase <NombreBasedeDatos>

Ejemplo:
Create DataBase DBSenati

- Eliminar Base de Datos:

Se utiliza la sentencia DROP DATABASE. Sintaxis:


Drop DataBase <NombreBasedeDatos>

Ejemplo:
Drop DataBase DBSenati

- Abrir Base de Datos:

Se utiliza la sentencia USE. Sintaxis:


Use <NombreBasedeDatos>

Ejemplo:
Use DBSenati

- Crear Tabla de Datos:

Se utiliza la sentencia CREATE TABLE. Sintaxis:


Create Table <NombreTabla> ( <Columna 1>, <Columna 2>, <Columna 3>,…)
Donde la <Columna 1> se compone por:
<Columna 1 <TipodeDato> [Default <expresión>]

Tipo de Datos (Principales):

Tipo Dato SQL Access


Integer SqlInt32 Numero Entero Largo
Real SqlSingle Numero Simple
Float SqlDouble Numero Doble
Long SqlLong
Decimal SqlDecimal
Char SqlString Texto
Varchar SqlString Texto
Binary SqlBinary Binario
Date SqlDateTime Fecha/Hora

La cláusula DEFAULT permite especificar un valor por omisión para la columna


y para indicar la forma de cada columna, se puede utilizar las constantes NOT
NULL, IDENTITY, UNIQUE o PRIMARY KEY.

NOT NULL, no permite valores nulos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 76


LENGUAJE DE PROGRAMACIÓN III

IDENTITY, el valor del campo se irá incrementando, por defecto se incrementa


de uno en uno.
PRIMARY KEY, Clave Principal, esto supone que no puede contener valores
nulos ni duplicados. Solo se puede utilizar una restricción Primary Key en una
tabla.
UNIQUE, indica que la columna no permite valores duplicados, una tabla puede
contener varias restricciones Unique.

Ejemplo:
Create Table Alumnos (
alu_codigo Integer Identity Primary Key,
alu_nombres Varchar(50) Not Null,
alu_apellidos Varchar(50) Not Null,
alu_dni Varchar(8) Unique,
alu_edad char(2),
alu_direccion Varchar(50)
)

- Agregar Registros en Tablas:

Se utiliza la sentencia INSERT INTO. Sintaxis:


Insert Into <Tabla> Values (columna 1, columna 2, …., columna n)

Ejemplo:
Insert Into Alumnos Values ('Manuel','Huaman','40219856','20','Av.
Arequipa 2010')

- Modificar Datos de una Tabla:

Se utiliza la sentencia UPDATE. Sintaxis:


Update <Tabla>
SET (columna 1 = <expresión>)
Columna 2 = <expresión>
WHERE <condición>

Ejemplo:
Update Alumnos
Set alu_direccion = 'Av. Areuipa 2510'
Where alu_codigo = 1

- Borrar Registros de las Tablas:

Se utiliza la sentencia DELETE. Sintaxis:


DELETE FROM <Tabla>

WHERE <condición>

Ejemplo:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 77


LENGUAJE DE PROGRAMACIÓN III

Delete From Alumnos


Where alu_codigo=1

- Seleccionar Datos de una Tabla:

Se utiliza la sentencia SELECT. Sintaxis:


SELECT [ALL / DISTINCT] <Lista de Selección>
FROM <Tabla>
WHERE <condición>
ORDER BY <columna> ASC / DESC

Ejemplo:
/* Seleccionar Todos los Registros */
Select * From Alumnos
/* Seleccionar Todos los Registros con el Nombre Raúl */
Select * From Alumnos Where alu_nombres='Raúl'
/* Seleccionar Todos los Registros que empiecen con las letras Ra */
Select * From Alumnos Where alu_nombres Like 'Ra%'
/* Seleccionar Todos los Registros Ordenados por el campo Apellido de
manera Ascendente*/
Select * From Alumnos Order By alu_apellidos Asc
/* Seleccionar Todos los Registros Ordenados por el campo Apellido de
manera Descendente*/
Select * From Alumnos Order By alu_apellidos Desc
/* Seleccionar Todos los Registros que tengan edad de 18 a 20 años*/
Select * From Alumnos Where alu_edad between 18 And 20

- Procedimientos Almacenados:
Conjunto de instrucciones SQL que se almacenan en la misma Base de Datos.
Pueden aceptar funciones, datos y devolver otros datos, así mismo pueden
llamar a otros procedimientos.

Sintaxis:
CREATE PROCEDURE <Nombre Procedimiento> (
<Variable>
<Variable> )
AS
<Instrucción SQL>

Ejemplo:
/* Procedimiento para Listar Datos */
Create Procedure PA_ListarDatos (
@alu_codigo integer
)
As
Select * From Alumnos
Where alu_codigo = @alu_codigo

Aplicación para Acceder a Datos – Caso Practico 1 – Login. Utilizando


Procedimientos Almacenados.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 78


LENGUAJE DE PROGRAMACIÓN III

- Crear la Base de Datos, Tablas y Procedimientos en SQL Server.

/* Crear la Base de Datos */


Create DataBase Registros
/* Abrir la Base de Datos */
Use Registros
/* Crear la Tabla Users */
Create Table Usuarios (
id Varchar(10) Not Null,
nom Varchar(30) Not Null,
email Varchar(50) Not Null,
pass Varchar(20) Not Null,
Constraint pk_Usuarios Primary Key(id)
)
/* Insertar un Registro */
Insert Into Usuarios
Values('U001','Eduardo','eduardo@hotmail.com','1234')
/* Listar el Registro */
Select * From Usuarios
/* Crear Los Procedimientos Almacenados */
/* Procedimiento Almacenado para Ingresar Usuarios */
Create Procedure alta_usuarios (
@id Varchar(20),
@nom Varchar(30),
@email Varchar(50),
@pass Varchar(20)
)
As
Insert Into Usuarios
Values (@id,@nom,@email,@pass)
Go
/* Procedimiento Almacenado para Visualizar Usuarios */
Create Procedure ver_usuarios (
@id Varchar(20)
)
As
Select * From Usuarios
Where id=@id
Go

- Crear una nueva aplicación Windows Forms “Login”. En el Formulario 1,


agregar los controles y sus propiedades:

Objeto Propiedad Valor


Form1 Name frmLogin
Text :::::: Login ::::::
Label1 Text Usuario :
Label2 Text Password :
Label3 Name lblIngresarId
Text Ingresar Id
ForeColor Red
Label4 Name lblIngresarPassword
Text Ingresar Password
ForeColor Red
TextBox1 Name txtId

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 79


LENGUAJE DE PROGRAMACIÓN III

ForeColor Blue
TextBox2 Name txtPass
PasswordChar *
Button1 Name btIngresar
Text Ingresar
Button2 Name btRegistrar
Text Registrar

- Agregar el Formulario 2 y agregar los siguientes controles y propiedades:

Objeto Propiedad Valor


Form2 Name frmRegistrar
Text :::::: Registro de Usuarios ::::::
Label1 Text Usuario :
Label2 Text Nombre :
Label3 Text E-mail :
Label4 Text Password :
Label5 Name m1
Text Obligatorio
Label6 Name m2
Text Obligatorio
Label7 Name m3
Text Obligatorio
Label8 Name m4
Text Obligatorio
TextBox1 Name txtId
ForeColor Blue
TextBox2 Name txtNombre
ForeColor Blue
TextBox3 Name txtEmail
ForeColor Blue
TextBox4 Name txtPassword
ForeColor Blue
Button1 Name btCancelar
Text Cancelar
Button2 Name btGrabar
Text Grabar

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 80


LENGUAJE DE PROGRAMACIÓN III

- Agregar el Formulario 3 y agregar los siguientes controles y propiedades:

Objeto Propiedad Valor


Form3 Name frmSistema
Text :::::: Sistema ::::::
Label1 Text Bienvenido :
Size 18
Label2 Text lblusuarionombre
Text Usuario - Nombre
Size 18
Label3 Name lblusuarioemail
Text Usuario - Email
Size 18
Button1 Name btSalir
Text Salir

- Ingresar el Código para el Formulario 1 “frmLogin”.

Public Class frmLogin

Public conexion As SqlClient.SqlConnection


Dim accion As String, id As String, sql As String
Dim res As Integer, nom, email, pass As String
Dim com As SqlClient.SqlCommand, dr As SqlClient.SqlDataReader
Dim da As SqlClient.SqlDataAdapter, cb As SqlClient.SqlCommandBuilder
Dim ds As DataSet

Public Sub conectar()


'Conectar a la Base de Datos

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 81


LENGUAJE DE PROGRAMACIÓN III

conexion = New SqlClient.SqlConnection


conexion.ConnectionString = ("server=DESKTOP-FRUVH1J\SQLEXPRESS;
database=Registros; uid=sa; password=root")
conexion.Open()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles


btRegistrar.Click
Me.Hide()
frmRegistrar.Show()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


btIngresar.Click
Call Me.verificar()
End Sub
Private Sub verificar()
id = Txtid.Text
pass = Txtpass.Text
If id = "" Then
lblIngresarPassword.Visible = True
Else
lblIngresarPassword.Visible = False
End If
If pass = "" Then
lblingresarId.Visible = True
Else
lblingresarId.Visible = False
End If
If id <> "" And pass <> "" Then
'Llamar al Procedimiento Almacenado ver_usuarios
sql = "exec ver_usuarios'" + id + "'"
conectar()
com = New SqlClient.SqlCommand(sql, conexion)
dr = com.ExecuteReader
If dr.Read Then
If id = dr(0) And pass = dr(3) Then
frmSistema.lblusuarionombre.Text = dr(1)
frmSistema.lblusuarioemail.Text = dr(2)
frmSistema.Show()
UseWaitCursor = True
Me.Hide()
Else
MsgBox("Contraseña Incorrecta", MsgBoxStyle.Exclamation, "Acceso Denegado")
End If
End If
End If
End Sub

End Class

- Ingresar el Código para el Formulario 2 “frmRegistrar”.

Public Class frmRegistrar

Public conexion As SqlClient.SqlConnection


Dim accion As String, id As String, sql As String

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 82


LENGUAJE DE PROGRAMACIÓN III

Dim res As Integer, nom, email, pass As String


Dim com As SqlClient.SqlCommand, dr As SqlClient.SqlDataReader
Dim da As SqlClient.SqlDataAdapter, cb As SqlClient.SqlCommandBuilder
Dim ds As DataSet

Public Sub conectar()


conexion = New SqlClient.SqlConnection
conexion.ConnectionString = ("server=DESKTOP-FRUVH1J\SQLEXPRESS;
database=Registros; uid=sa; password=root")
conexion.Open()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


btCancelar.Click
Me.Close()
frmLogin.Show()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles


btGrabar.Click
Call Me.verificar1()
End Sub
Private Sub verificar1()
If txtId.Text = "" Then
m1.Visible = True
Else
m1.Visible = False
End If
If txtNombre.Text = "" Then
m2.Visible = True
Else
m2.Visible = False
End If
If txtEmail.Text = "" Then
m3.Visible = True
Else
m3.Visible = False
End If
If txtPassword.Text = "" Then
m4.Visible = True
Else
m4.Visible = False
End If
If txtId.Text <> "" And txtNombre.Text <> "" And txtEmail.Text <> ""
And txtPassword.Text <> "" Then
Call Me.registrar()
Me.Hide()
frmLogin.Show()
End If
End Sub

Private Sub registrar()


id = txtId.Text
nom = txtNombre.Text
email = txtEmail.Text
pass = txtPassword.Text
sql = "exec ver_usuarios'" + id + "'"
conectar()

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 83


LENGUAJE DE PROGRAMACIÓN III

com = New SqlClient.SqlCommand(sql, conexion)


dr = com.ExecuteReader
If dr.Read Then
MsgBox("El id ya existe", "Usuarios")
dr.Close()
conexion.Close()
Else
sql = "exec alta_usuarios" + "'" + id + "','" + nom + "','" + email + "','" +
pass + "'"
conectar()
com = New SqlClient.SqlCommand(sql, conexion)
res = com.ExecuteNonQuery
conexion.Close()
MsgBox("Felicidades ya puede Logearse", MsgBoxStyle.Information, "Datos
Ingresados")
End If

End Sub

Private Sub frmRegistrar_Load(sender As Object, e As EventArgs) Handles


MyBase.Load

End Sub
End Class

- Ingresar el Código para el Formulario 3 “frmSistema”.

Public Class frmSistema

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


btSalir.Click
Me.Close()
End Sub
End Class

- Ejecutar la Aplicación e intentar Logearse con el usuario ingresado en la


base de datos:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 84


LENGUAJE DE PROGRAMACIÓN III

- Ejecutar la aplicación nuevamente y Registrarse para ingresar un nuevo


usuario para posteriormente Logearse.

Nota: Ejercicio N° 5 del Capítulo 2 del Manual; nombre de la aplicación: “Login”

Módulo para Saber si una Tabla existe en una Base de Datos:

- Crear una Clase o una Biblioteca de Clases.

- Ingresar el siguiente código para la Función:

Imports System.Data
Imports System.Data.Common
Imports System.Data.Odbc
Imports System.Data.OleDb

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 85


LENGUAJE DE PROGRAMACIÓN III

Imports System.Data.SqlClient

Public Class Class1


'Espacios de nombres a importar

Public Function TableExists(ByVal connection As DbConnection, _


ByVal tableName As String) As Boolean

'La función comprobará si existe o no la tabla


'especificada en la base de datos.
'Si no se han pasado valores válidos, abandonamos la función.

If (connection Is Nothing) OrElse _


(tableName = String.Empty) Then Return False

Try
Dim sql As String = "SELECT * FROM [" & tableName & "]"
Dim da As DbDataAdapter = Nothing

If TypeOf connection Is OdbcConnection Then


da = New OdbcDataAdapter(sql, DirectCast(connection, OdbcConnection))

ElseIf TypeOf connection Is OleDbConnection Then


da = New OleDbDataAdapter(sql, DirectCast(connection, OleDbConnection))

Else
da = New SqlDataAdapter(sql, DirectCast(connection, SqlConnection))

End If

'Relleno el objeto DataTable con el esquema de


'la tabla de la base de datos especificada.

Dim ds As New DataSet


da.FillSchema(ds, SchemaType.Mapped, tableName)

'Devolvemos el resultado, dependiendo de si el objeto


'DataSet tiene (True) o no (False) un objeto DataTable.
Return (ds.Tables.Count = 1)

Catch ex As Exception
'Los proveedores Odbc y SqlClient provocan una excepción
'si la tabla especificada no existe.
Return False

Finally
connection = Nothing
End Try

End Function

'Construimos la cadena de conexión.


Dim connString As String = _
"Data Source=SQLEXPRESS;" & _
"Initial Catalog=NombreBaseDatos;" & _
"Integrated Security=SSPI"

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 86


LENGUAJE DE PROGRAMACIÓN III

'Creamos el objeto Connection adecuado (no es necesario abrir la conexión).


Dim cnn As New SqlConnection(connString)

'Comprobamos si existe la tabla.


Dim bln As Boolean = TableExists(cnn, "NombreTabla")

MessageBox.Show("¿Existe la tabla?: " & bln.ToString)

End Class

Nota: Ejercicio N° 6 del Capítulo 2 del Manual; nombre de la aplicación:


“Modulo1”.

Módulo para Crear una Nueva Base de Datos SQL:

- Crear una Clase o una Biblioteca de Clases.Ingresar el siguiente código para


la Función:

Imports System.Data.SqlClient
Public Class Class1

'<summary>
'Crea una nueva base de datos SQL Server, eliminándola del servidor si ya
existe.
'</summary>
'<author>Enrique Martínez Montejo - 2006</author>
'<param name="databaseName">Nombre de la base de datos.</param>
'<param name="fileName">Ruta completa del archivo físico.</param>
'<param name="instanceName">Nombre de la instancia de SQL Server
'donde se creará la base de datos.</param>
'<param name="userInstance">Especifica si se va a utilizar instancias de
usuario.</param>
'<param name="userId">Cuenta de usuario.</param>
'<param name="userPassword">Contraseña del usuario</param>
'<param name="overWrite"> Indica si se confirma la eliminación de la base,
'en el supuesto de que ya exista la misma.</param>
'<returns></returns>
'<remarks></remarks>
Public Function CreateDatabaseSQLServer(ByVal databaseName As String, _
ByVal fileName As String, _
ByVal instanceName As String, _
ByVal userInstance As Boolean, _
ByVal userId As String, _
ByVal userPassword As String, _
ByVal overWrite As Boolean) As
Boolean

'Si no se ha pasado el nombre y la ruta de la base de datos,


'o el nombre de la instancia de SQL Server, abandono la función.

If ((databaseName = String.Empty) OrElse _


(fileName = String.Empty) OrElse _
(instanceName = String.Empty)) Then Return False

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 87


LENGUAJE DE PROGRAMACIÓN III

'Construyo la cadena de conexión.

Dim csb As New SqlConnectionStringBuilder()

csb.DataSource = instanceName
csb.Add("Initial Catalog", "master")
csb.UserInstance = userInstance

If (userId = String.Empty) Then


'Si no se ha especificado una cuenta de usuario,
'utilizo la seguridad integrada de Windows NT.

csb.Add("Integrated Security", True)

Else
'Utilizo la autenticación de SQL Server.

csb.Add("User Id", userId)


csb.Add("Password", userPassword)
End If

Try
Using cnn As New SqlConnection(csb.ConnectionString)
Dim cmd As SqlCommand = cnn.CreateCommand()
cnn.Open()

'Compruebo si existe la base de datos en el servidor.


cmd.CommandText = String.Format("SELECT Name FROM sysdatabases " & _
"WHERE name = N'{0}'", databaseName)

Dim dr As SqlDataReader = cmd.ExecuteReader()

Dim existsDatabase As Boolean = dr.HasRows

dr.Close()
dr = Nothing

If ((existsDatabase) AndAlso (Not (overWrite))) Then


'Si existe la base de datos, pedimos confirmación para eliminarla.

If (MessageBox.Show("Ya existe un archivo de base de datos " & _


"con el nombre '" & databaseName & _
"'. ¿Desea reemplazarlo?", "Crear base de datos", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question) = DialogResult.No) Then
Return False
End If
End If

If (existsDatabase) Then
'Primero hay que eliminar la base de datos de la instancia de SQL Server.

cmd.CommandText = "DROP DATABASE " & databaseName


cmd.ExecuteNonQuery()
End If

'Por defecto, el tamaño inicial de la base de datos será de 5 MB.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 88


LENGUAJE DE PROGRAMACIÓN III

cmd.CommandText = _
"CREATE DATABASE " & databaseName & _
" ON (Name = " & databaseName & "_dat," & _
"FILENAME =N'" & fileName & "', SIZE=5)"
cmd.ExecuteNonQuery()
Return True
End Using

Catch ex As Exception
'Devolvemos la excepción al procedimiento llamador

Throw
End Try
End Function
End Class

Nota: Ejercicio N° 7 del Capítulo 2 del Manual; nombre de la aplicación:


“Modulo2”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 89


LENGUAJE DE PROGRAMACIÓN III

III. CONFIGURAR LAS IMPRESIONES Y REPORTES EN APLICACIONES


WINDOWS FORM.

OPERACIONES:

- Imprimir desde una Aplicación Windows Forms.


- Configurar los Diálogos de Impresión y Configuración de Página.
- Elaborar Reportes con Crystal Report.

EQUIPOS Y MATERIALES:

 Computadora con microprocesadores Core 2 Duo o de mayor capacidad.


 Sistema operativo Windows.
 Acceso a internet.
 Software visual Studio 2012, Block de Notas.

ORDEN DE EJECUCIÓN:

 Reconocer El Entorno para la Impresión de Informes.


 Manipular herramientas para Generar Impresiones.
 Desarrollar Casos Prácticos de Impresión con Report.

3.1. IMPRIMIR DESDE UNA APLICACIÓN WINDOWS FORMS.


Una de las partes fundamentales de un sistema informático son las
impresiones o Reportes que este pueda generar con la información de una
base de datos, para ello Visual .Net nos brinda diferentes herramientas para
este fin, desde herramientas básicas de impresión, como herramientas
complejas internas y externas para realizar estas acciones; entre ellas tenemos
ReportView, CrystalReport y ReportManager, como herramientas sencillas y
prácticas que se pueden utilizar.

- PRINTFORM:
Este componente permite imprimir en tiempo de ejecución un formulario como
si fuera una imagen, puede ser útil cuando se necesita capturar la pantalla de
un sistema para enviarla a impresión de manera directa. Según la necesidad se
utiliza parámetros o una sentencia simple.

Sintaxis:

Básica sin Parámetros: Print()


Compleja y con Parámetros: Print(printForm As Form, printFormOption As
PrintOption)

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 90


LENGUAJE DE PROGRAMACIÓN III

Los parámetros a utilizar dependerán de lo que se requiera imprimir, en el caso


de PrintOption, permite indicar si se mostrara una vista previa de la impresión o
se guardara en un archivo, la cual se podría utilizar con PrintFileName.

Los Eventos a utilizar más comunes, BeginPrint que se utiliza antes de imprimir
la primera página del documento, EndPrint que se produce cuando se imprime
la última página y QueryPageSettings que se produce antes que se imprima
cada página.

Ejemplo:
'Visual Basic.
Dim pf As New PrintForm
pf.Form = Me
pf.PrintAction = PrintToPrinter
pf.Print()

Ejercicio:
Generar una Aplicación llamada “FormularioImpresión”, en la cual permitirá
imprimir los controles visibles del formulario.

- Agregar los siguientes controles al Formulario:

Objeto Propiedad Valor


Form1 Name frmImpresion
Text Impresión
Label1 Text Ejemplo de Impresión PrintForm
Size 12
PictureBox1 Image Logo.png
SizeMode Zoom
Button1 Name BtImprimir
Text Imprimir
PrintForm1

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 91


LENGUAJE DE PROGRAMACIÓN III

- Ingresar el siguiente código creando la función para la Impresión.

Public Class frmImpresion


'Función para Imprimir
Private Sub Imprimir()
Try
'Forma del Cursor
Cursor.Current = Cursors.WaitCursor
With Me.Printform1
.PrintAction = Printing.PrintAction.PrintToPreview
.printersettings.defaultpagesettings.Landscape = True
.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.ClientAreaOnly)
End With
Cursor.Current = Cursors.Default
'Capturar el Error
Catch ex As Exception
Cursor.Current = Cursors.Default

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 92


LENGUAJE DE PROGRAMACIÓN III

MsgBox(ex.ToString, MsgBoxStyle.Critical, "Error al Imprimir")


End Try
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles
MyBase.Load

End Sub

Private Sub btImprimir_Click(sender As Object, e As EventArgs) Handles


btImprimir.Click
'Llamar a la Función Imprimir
Call Imprimir()
End Sub
End Class

- Ejecutar la aplicación y dar clic en el botón Imprimir.

- Se podrá imprimir el documento o guardarlo según sea necesario:

Nota: Ejercicio N° 1 del Capítulo 3 del Manual; nombre de la aplicación:


“Modulo2”

3.2. CONFIGURAR LOS DIÁLOGOS DE IMPRESIÓN Y CONFIGURACIÓN


DE PÁGINA.

- ReportViewer:
Una solución sencilla para poder imprimir reportes y/o informes es utilizar el
control ReportViewer. La ventaja de este control es que proporciona un
diseñador de informes utilizando como referencia cualquier objeto de datos
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 93
LENGUAJE DE PROGRAMACIÓN III

ADO .Net. El enlace de datos a tablas se puede trabajar con instancias


DataTable. Este control en tiempo de ejecución permite la Impresión,
Búsquedas de datos y formatos de exportación como pueden ser .PDF.

Pasos para utilizar un ReportViewer:

• Arrastrar el control ReportViewer de la ficha Generación de Informes de la


Barra de Herramientas hacia el formulario.
• Clic derecho a la aplicación y elegir Agregar Nuevo Elemento.
• Agregar Informe y dar clic al botón Agregar.
• Se abrirá el diseñador de informes donde se podrá agregar elementos,
también se podría agregar elementos desde un origen de datos.

Para aplicar el ReportViewer, se desarrollara la siguiente aplicación


interactuando con una base de datos SQL Server:

- Crear la Base de Datos y sus componentes. Crear un Diagrama entre las


tablas.
/* Crear la Base de Datos para un Isntituto */
Create DataBase InstitutoBase

/* Abrir la Base de Datos */


Use InstitutoBase

/* Crear la Tabla Alumnos */


Create Table Alumnos(
Alu_codigo Integer Identity Primary Key,
Alu_nombre Varchar(40),
Alu_apellidopat Varchar(40),
Alu_apellidomat Varchar(40),
Alu_dni Varchar(8),
Alu_edad Char(2),
Alu_direccion Varchar(50),
Dis_codigo Integer
)

/* Crear la Tabla Distritos */


Create Table Distritos (
Dis_codigo Integer Identity Primary Key,
Dis_nombre Varchar(50)
)

/* Agregar Registros a la Tabla Distritos */


Insert Into Distritos Values('Lince')
Insert Into Distritos Values('San Miguel')
Insert Into Distritos Values('Cercado')
Insert Into Distritos Values('Miraflores')
Insert Into Distritos Values('San Isidro')
Insert Into Distritos Values('Magdalena')
Insert Into Distritos Values('Santa Beatriz')

/* Agregar Registros a la Tabla Alumnos */

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 94


LENGUAJE DE PROGRAMACIÓN III

Insert Into Alumnos


Values('José','Gonzales','Huayta','40219954','20','Jr. Soledad 345',1)
Insert Into Alumnos
Values('Angélica','Ramirez','Zurita','44542398','19','Calle Riva
Agüero 123',2)
Insert Into Alumnos
Values('María','Gutierrez','Rivas','44329877','18','Calle Santa Paula
279',3)
Insert Into Alumnos
Values('Raúl','Okada','Febres','44232156','19','Calle Shell 232',4)
Insert Into Alumnos
Values('Miguel','Morales','Villanueva','43322987','20','Calle Libertad
323',5)
Insert Into Alumnos
Values('Marcia','Garcia','Cabrejos','44769834','20','Av. José Porras
498',6)
Insert Into Alumnos
Values('Guillermo','Rosales','Tam','44329856','18','Av. Arequipa
754',7)
Insert Into Alumnos
Values('Sandra','Guzman','Robles','44538790','19','Av. José Leal
543',1)
Insert Into Alumnos Values('Manuel','Oré','Huaman','46327653','18','Av
La Paz 234',2)
Insert Into Alumnos
Values('Paola','Celle','Rodriguez','40452954','20','Calle Santa Enma
309',3)
Insert Into Alumnos
Values('Marcos','Cherre','Matias','44879909','19','Calle Juan Fanning
353',4)
Insert Into Alumnos
Values('Jhon','Moran','Cabrera','44700098','18','Av. El Ejercito
567',5)
Insert Into Alumnos
Values('Proscila','Egg','Davila','44329112','20','Av. Brasil 2345',6)
Insert Into Alumnos
Values('David','Macalopu','Cubas','44762334','19','Av. Parque de la
Reserva 434',7)

/* Visualizar los Registros en las Tablas Alumnos y Distritos */


Select * From Alumnos
Select * From Distritos

- Diagrama de las Tablas:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 95


LENGUAJE DE PROGRAMACIÓN III

- Generar un nuevo proyecto con el nombre “ReportesdeDatos”.

- Crear un Origen de Datos apuntando a la Base de Datos “InstitutoBase”.

- Realizar la conexión y mostrar la cadena generada.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 96


LENGUAJE DE PROGRAMACIÓN III

- Seleccionar todas las tablas de la Base.

- Ingresar un DataGridView al Formulario arrastrándolo desde las


Herramientas de Datos. Conectarlo con Alumnos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 97


LENGUAJE DE PROGRAMACIÓN III

- Insertar un Botón “Imprimir” el cual llamara a un segundo Formulario que se


agregara al proyecto.

- En el Formulario 2 Agregar el control ReportViewer de la Ficha Generación


de Informes:

- Clic derecho al Proyecto, Agregar – Nuevo Elemento. Agregar Informe


“InfAlumnos.rdlc”

- Se mostrará el diseñador de Informes:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 98


LENGUAJE DE PROGRAMACIÓN III

- Dentro de los controles en “Datos del Informe” dar clic a Nuevo – Conjunto
de Datos.

- Escoger el Origen de Datos y el Conjunto de Datos Disponible:

- Agregar Imagen, Nuevo – Imagen, Seleccionar Logo.png. Clic derecho al


Informe y añadir Encabezado y Pie de Página.

- Insertar la imagen “Logo.png” en el encabezado del Informe.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 99


LENGUAJE DE PROGRAMACIÓN III

- Agregar los Datos del DataSet y armar el diseño.

- Insertar un control Tabla en el Informe y editarlo para mostrar la información.

- En el Form2, en el objeto ReportViewer, seleccionar el Informe creado.

- Ingresar el Código al Botón Imprimir del Form1.

Private Sub btImprimir_Click(sender As Object, e As EventArgs) Handles


btImprimir.Click

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 100


LENGUAJE DE PROGRAMACIÓN III

Form2.Show()
Me.Hide()
End Sub

- Ejecutar la Aplicación. Dar clic al botón Imprimir y observar que se muestra


el Informe

Nota: Ejercicio N° 2 del Capítulo 3 del Manual; nombre de la aplicación:


“ReportesdeDatos”.

3.3. REPORTES CON REPORT MANAGER.

El Report Manager es un reportador utilizado como herramienta externa a


Visual Basic, pero muy popular entre los programadores actuales por su
versatilidad y uso, así mismo trabaja con sentencias SQL Server que permite
realizar consultas simples y con parámetros establecidos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 101


LENGUAJE DE PROGRAMACIÓN III

Report Manager en sus diferentes versiones, ofrece gran cantidad de


conexiones para varios tipos de motores de conexión a Bases de Datos, como
Oracle, Motores Jet, Motores ODBC, etc.
Para este fin se instalará el Report Manager en su versión 2.8; su peso es
reducido, además de ofrecer internamente el archivo .OCX para sus
controladores, muestra gran adaptación con la mayoría de impresoras
matriciales o fiscales, así mismo su configuración y conexión con las
aplicaciones es sencilla y se incluye en la creación de proyectos de instalación.

Pasos para Instalar el Report Manager:

1. Ejecutar el instalador: Ubicado en la carpeta de Capítulos del CD del


Manual.

2. Autorizar la Instalación, preferible trabajar en modo Administrador.

3. Seleccionar el idioma a instalar.

4. En esta ventana se indicará la versión a instalar y la presentación del Report


Manager. Siguiente

5. Muestra la Licencia, es importante leer las licencias a la hora de la


Instalación. Marcar “Acepto los Términos del Acuerdo”. Siguiente.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 102


LENGUAJE DE PROGRAMACIÓN III

6. Indicar la Carpeta donde se instalará el Report Manager, por defecto


muestra: “c:\Program Files (x86)\Report Manager”. Siguiente:

7. Seleccionar los entornos que manejará el Report Manager, se deberá dejar


en Instalación Completa. Siguiente:

8. Indica que se creará una carpeta de instalación donde se ubicarán los


archivos internos del programa. Siguiente:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 103


LENGUAJE DE PROGRAMACIÓN III

9. Indicar que se cree un Icono en el Escritorio para su fácil ubicación.


Siguiente:

10. Indica que se instalará el programa con todas las especificaciones


marcadas anteriormente. Instalar:

11. Comienza la instalación, indicando el avance:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 104


LENGUAJE DE PROGRAMACIÓN III

12. Finalmente muestra la pantalla de la instalación. Terminar:

13. Se han generado dos iconos en el Escritorio, el de diseño de reportes y el


de Cliente del Report Manager para la configuración del Servidor.

AGREGAR REPORT MANAGER A VISUAL BASIC.

En cualquier aplicación de Visual Basic, para poder agregar el Report Manager


se deberá de realizar los siguientes pasos:
1. En la aplicación de Visual Basic, Menú Proyecto – Agregar Referencia.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 105


LENGUAJE DE PROGRAMACIÓN III

2. Seleccionar COM en el Administrador de Referencias, Luego buscar el


Report Manager ActiveX Library. Aceptar.

3. En el cuadro de Herramientas, Dar clic derecho dentro y seleccionar.

4. Aparece la ventana de Elegir Elementos del Cuadro de Herramientas,


Seleccionar la ficha de Componentes COM y seleccionar ReportManX
Control, luego Aceptar.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 106


LENGUAJE DE PROGRAMACIÓN III

5. Se habrá añadido el control al cuadro de herramientas para poder utilizarlo.

EJERCICIO DE REPORTE SIMPLE CON REPORT MANAGER Y VISUAL


BASIC:

- Crear la Base de Datos para el ejercicio:


/* Crear la Base de Datos Senati6 */
Create DataBase Senati6

/* Abrir la Base de Datos */


Use Senati6

/* Crear la Tabla Alumnos */


Create Table Alumnos (
alu_codigo Integer Identity Primary Key,
alu_nombre Varchar(50),
alu_apellidopat Varchar(50),
alu_apeliidomat Varchar(50),
alu_docident Varchar(8),
alu_edad Char(2),
alu_fechanac Date,
alu_direccion Varchar(50),
dis_codigo Integer,
alu_email Varchar(50)
)

/* Crear la Tabla Distritos */


Create Table Distritos (
dis_codigo Integer Identity Primary Key,
dis_descripcion Varchar(50)
)

/* Insertar Datos en la Tabla Distritos */

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 107


LENGUAJE DE PROGRAMACIÓN III

Insert Into Distritos Values ('Cercado de Lima')


Insert Into Distritos Values ('Miraflores')
Insert Into Distritos Values ('San Isidro')
Insert Into Distritos Values ('Magdalena')
Insert Into Distritos Values ('San Miguel')
Insert Into Distritos Values ('San Martin')
Insert Into Distritos Values ('Los Olivos')
Insert Into Distritos Values ('Lince')
Insert Into Distritos Values ('Santa Beatriz')
Insert Into Distritos Values ('San Juan de Lurigancho')

/* Configurar la Fecha para el Servidor SQL SERVER */


/* Para dar el Formato de Fecha Dia/Mes/Año */
Set DateFormat DMY

/* Insertar Datos en la Tabla Alumnos */


Insert Into Alumnos Values
('María','Rojas','Rivas','44287690','20','05/01/1995','Santa Paula #
279 Urb. Pando',1,'mrojas@hotmail.com')
Insert Into Alumnos Values
('Raúl','Okada','Febres','40372432','19','07/05/1996','Calle Shell #
343',2,'rokada@hotmail.com')
Insert Into Alumnos Values
('David','Cubas','Rosas','43659087','20','10/06/1995','Av. José
Bustamante # 123',2,'dcubas@hotmail.com')
Insert Into Alumnos Values
('Rosa','Corrales','Ortiz','49362865','18','05/01/1997','Calle
Amazonas # 169',3,'rcorrales@hotmail.com')
Insert Into Alumnos Values
('Manuel','Huaman','Pacheco','44328909','20','12/11/1995','Av. Riva
Agüero # 189',5,'mhuaman@hotmail.com')
Insert Into Alumnos Values
('Sara','Cabrera','Gonzales','44536721','19','09/07/1996','Calle Los
Pinos # 287',6,'scabrera@hotmail.com')
Insert Into Alumnos Values
('Christian','Moran','Sans','44376098','20','10/03/1995','Calle Los
Jazmines # 564 ',7,'cmoran@hotmail.com')
Insert Into Alumnos Values
('Saul','Poma','Ramirez','40984375','18','05/01/1997','Av. José Leal #
342',8,'spoma@hotmail.com')
Insert Into Alumnos Values
('Angie','Rosas','Vasquez','44560914','19','23/06/1996','Av. Parque de
la Reserva # 590',9,'arosas@hotmail.com')
Insert Into Alumnos Values
('José','Pariona','García','40348798','20','20/10/1995','Calle Los
Girasoles # 154',10,'jpariona@hotmail.com')
Insert Into Alumnos Values
('Erick','Camones','Paucar','44300098','20','27/11/1995','Calle Santa
Enma # 163',1,'ecamones@hotmail.com')
Insert Into Alumnos Values
('Magally','Parra','Egg','44334856','19','15/10/1996','Av. Camino Real
# 1034',3,'mparra@hotmail.com')
Insert Into Alumnos Values
('Ciro','Rodriguez','Guzman','44388876','20','12/08/1995','Av. Sucre #
232',4,'crodriguez@hotmail.com')

/* Crear una Vista con las Tablas Alumnos y Distritos */


Create View vw_AlumnosDistrito
As

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 108


LENGUAJE DE PROGRAMACIÓN III

Select
Alumnos.alu_codigo,Alumnos.alu_nombre,Alumnos.alu_apellidopat,Alumnos.
alu_apeliidomat,Alumnos.alu_docident,Alumnos.alu_edad,Alumnos.alu_fech
anac,Alumnos.alu_direccion,Distritos.dis_descripcion,Alumnos.alu_email
From Alumnos Inner Join Distritos on
Alumnos.dis_codigo=Distritos.dis_codigo

/* Visualizar la Vista vwAlumnosDistrito */


Select * From vw_AlumnosDistrito

- Crear una nueva Aplicación Visual Basic con el nombre


“ReportesReportManager”.

- Agregar un origen de datos a la Base de Datos “Senati6”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 109


LENGUAJE DE PROGRAMACIÓN III

- Seleccionar Conjunto de Datos, Realizar la conexión a la Base de Datos


mostrando la Cadena de Conexión. Siguiente.

- Dejar el nombre por Defecto, y en la siguiente ventana seleccionar las


Tablas y Vistas de la Base de Datos. Finalizar

- En el Origen de Datos seleccionar Detalles para la Vista.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 110


LENGUAJE DE PROGRAMACIÓN III

- Arrastrar el conjunto de Datos de la Vista hacia el Formulario.

- Cambiar la Propiedad Text de las Etiquetas para una mejor visualización de


la aplicación. Agregar un Button que de nombre se le pondrá “btImprimir” y
en la propiedad Text poner “Imprimir”.

- Ahora se debe de desarrollar el reporte en Report Manager.

- Abrir el Icono del Diseñador Report Manager.

- En el entorno del Report Manager seleccionar “Crea un Nuevo Informe”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 111


LENGUAJE DE PROGRAMACIÓN III

- Aparecerá el nuevo informe, en la cual se puede apreciar que el informe esta


medido en centímetros y los objetos que se pueden incrustar en el informe,
tanto así como las propiedades a utilizar.

- Seleccionar “Modificar la Configuración de Acceso a Datos”.


- En la ventana que aparece se puede apreciar los diferentes tipos de
conexión a bases de datos, en las cuales se seleccionara “Microsoft DAO”,
que es el que se utilizara para bases de datos Access y SQL Server
básicamente.

- Dar clic en la opción Nuevo para generar la nueva conexión a la base de


datos.

- Ingresar el nombre a la nueva conexión, en este caso será “Conexión”.


Aceptar.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 112


LENGUAJE DE PROGRAMACIÓN III

- Buscar la base de datos a conectar.

- Seleccionar el Proveedor de Base de Datos, en este caso como la base es


en SQL Server, se deberá de seleccionar “Microsoft OLE DB Provider for
SQL Server”. Siguiente.

- Realizar la Conexión indicando el nombre del Servidor, Asignando la


Autenticación de SQL Server, Marcar “Permitir Guardar Contraseña” (muy
importante), Luego seleccionar la Base de Datos “Senati6”. Probar la
Conexión para verificar. Aceptar.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 113


LENGUAJE DE PROGRAMACIÓN III

- Dar clic en el Botón “Conectar”. Aceptar.

- Dar clic a la Ficha “Conjunto de Datos del Informe”.

- Clic a Nuevo e ingresar el nombre para el conjunto de Datos


“VistaAlumnosDistrito”. Aceptar.

- Se deberá de ingresar la Sentencia SQL en la cual se seleccionara todos los


registros de la Vista anteriormente creada en SQL Server.
Select * From vw_AlumnosDistrito

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 114


LENGUAJE DE PROGRAMACIÓN III

- Verificar la sentencia con el Botón “Mostrar Datos” y navegar entre ellos.


Aceptar.

- Seleccionar en propiedades del informe Con. D. Principal =


“VISTAALUMNOSDISTRITO”.

- Agregar en el Informe “Cabecera y Pie de Grupo” y poner de nombre


“VistaAlumnosDistrito”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 115


LENGUAJE DE PROGRAMACIÓN III

- Se podrá apreciar en el informe que ya está listo para insertar los objetos,
variables y campos de datos necesarios.

- En la Cabecera del informe agregar el título, la Imagen del Instituto y la


Fecha actual, utilizando los controles.

- Insertar un Texto Estático, cambiar sus propiedades Texto e ingresar


“REPORTE DE ALUMNOS”, así mismo cambiar el Estilo de Fuente en la
Ventana Propiedades.
- Insertar un Cuadro de Imagen y en la Propiedad Imagen buscar el Logo a
mostrar, en este caso la Imagen de Senati.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 116


LENGUAJE DE PROGRAMACIÓN III

- Insertar la Variable TODAY de la ventana de Variables y Datos y cambiarle


el en la ventana de propiedades el formato por “dd 'de' mmmm 'del' yyyy”.
- Insertar un dibujo simple y cambiar en la ventana de propiedades la opción
Dibujo y seleccionar Línea Horizontal.

- Finalmente en el Encabezado Ingresar las etiquetas para los campos a


insertar, cambiándole las propiedades de estilo de Fuente.

- Configurar la orientación de la Página.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 117


LENGUAJE DE PROGRAMACIÓN III

- Dar como orientación de la Página “Horizontal”, desde esta ventana se


puede configurar el tamaño de la página y características de impresión.

- El informe iría quedando de esta manera:

- Arrastrar los campos del origen de datos al Detalle del Reporte y reducir el
tamaño del detalle para que los registros se muestren en un sólo reporte.

- Agrandar el Pie del Grupo e insertar las Variables Numero de Página y una
línea.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 118


LENGUAJE DE PROGRAMACIÓN III

- Cambiar las Propiedades en Pie de Grupo, Comportamiento Global, Auto


Expandido, Auto Contraer e Inicia Page Num a TRUE.

- Dar Vista Previa del Informe, para verificar su diseño.

- Guardar el Reporte con el Nombre: “rpt_AlumnosDistrito.rep”, para poderlo


utilizar en la aplicación de Visual Basic

- Regresar a Visual Basic verificar que el control ReportManager ActiveX este


incluido en el proyecto.
- Insertar el Control Report Manager al Formulario, Cambiar su Name por
“rep” y su propiedad visible “false”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 119


LENGUAJE DE PROGRAMACIÓN III

- Ingresar el siguiente código en el btImprimir.

Private Sub btImprimir_Click(sender As Object, e As EventArgs) Handles


btImprimir.Click
'Crear una Variable para la Ruta del Reporte
Dim Ruta As String
Ruta = "C:\ReportesManual"
'Visualizar el Reporte como Vista Previa
rep.Preview = True
'Mostrar las Propiedades de Impresión
rep.ShowPrintDialog = True
'Indicar el archivo del Reporte a Mostrar
rep.filename = Ruta & "\rpt_AlumnosDistrito.rep"
'Ejecutar el Reporte
rep.Execute()
End Sub

- Ejecutar la Aplicación y dar clic al Botón Imprimir para mostrar el Reporte.

Se muestra el reporte para su impresión y para poderlo guardar en los


diferentes formatos que nos muestra.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 120


LENGUAJE DE PROGRAMACIÓN III

Nota: Ejercicio N° 3 del Capítulo 3 del Manual; nombre de la aplicación:


“ReportesReportManager”

EJERCICIO DE REPORTE CON PARÁMETROS EN REPORT MANAGER Y


VISUAL BASIC:

En la base de datos anterior “Senati6”, se completara las tablas que faltan y se


creara las relaciones necesarias, para realizar un pago de Matricula del
Alumno, así mismo el Horario del Profesor a dictar los diferentes cursos.

- Completar las tablas en la Base de Datos.

/* Crear la Tabla Profesor */


Create Table Profesor (
pro_codigo Integer Identity Primary Key,
pro_nombre Varchar(50),
pro_apellidos Varchar(50),
pro_dni Varchar(8),
pro_fechanac Date,
pro_direccion Varchar(50),
dis_codigo Integer,
pro_email Varchar(50)
)

/* Crear la Tabla Semestre */


Create Table Semestre (
sem_codigo Integer Identity Primary Key,
sem_descripcion Varchar(50)

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 121


LENGUAJE DE PROGRAMACIÓN III

/* Crear la Tabla Cursos */


Create Table Cursos (
cur_codigo Integer Identity Primary Key,
cur_descripcion Varchar(50),
sem_codigo Integer
)

/* Crear la Tabla Costos */


Create Table Costos (
cos_codigo Integer Identity Primary Key,
sem_codigo Integer,
cos_Importe Integer
)

/* Crear la Tabla Matriculas */


Create Table Matriculas (
mat_codigo Integer Identity Primary Key,
mat_fecha Date,
alu_codigo Integer,
sem_codigo Integer,
sem_pagototal Integer,
sem_observacion Varchar(50)
)

/* Crear la Tabla Notas */


Create Table Notas (
nota_codigo Integer Identity Primary Key,
pro_codigo Integer,
alu_codigo Integer,
cur_codigo Integer,
Sem_codigo Integer,
nota_1 Integer,
nota_2 Integer,
nota_3 Integer,
nota_promedio Decimal
)

/* Insertar Datos en la Tabla Profesor */


Insert Into Profesor Values ('Juan','Perez
Gomez','40219877','06/03/1978','Av. La Coruña
342',1,'jperez@senati.pe')
Insert Into Profesor Values ('Dora','Baca
Revolledo','44732109','12/06/1979','Los Pinos
320',2,'dbaca@senati.pe')
Insert Into Profesor Values ('Marcos','Salas
Durant','44328877','21/10/1978','Calle 7 de
Junio',3,'msalas@senati.pe')
Insert Into Profesor Values ('Susan','Varillas
Ascues','44325643','14/07/1979','Calle los Cipreses
454',4,'svarillas@senati.pe')

/* Insertar Datos en la Tabla Semestre */


Insert Into Semestre Values ('I Semestre')
Insert Into Semestre Values ('II Semestre')
Insert Into Semestre Values ('III Semestre')
Insert Into Semestre Values ('IV Semestre')
Insert Into Semestre Values ('V Semestre')
Insert Into Semestre Values ('VI Semestre')

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 122


LENGUAJE DE PROGRAMACIÓN III

/* Insertar Datos en la Tabla Cursos */


Insert Into Cursos Values ('Lenguaje de Programación I',1)
Insert Into Cursos Values ('Fundamentos de Programación',1)
Insert Into Cursos Values ('Lenguaje de Programación II',2)
Insert Into Cursos Values ('Desarrollo de Software I',2)
Insert Into Cursos Values ('Lenguaje de Programación III',3)
Insert Into Cursos Values ('Analisis de Bases de Datos',3)
Insert Into Cursos Values ('Lenguaje de Programación IV',4)
Insert Into Cursos Values ('Ingenieria de Software I',4)
Insert Into Cursos Values ('Lenguaje de Programación V',5)
Insert Into Cursos Values ('Tecnologías Web',5)
Insert Into Cursos Values ('Lenguaje de Programación VI',6)
Insert Into Cursos Values ('Analisis de Negocios',6)

/* Insertar Datos en la Tabla Costos */


Insert Into Costos Values (1,200)
Insert Into Costos Values (2,240)
Insert Into Costos Values (3,280)
Insert Into Costos Values (4,300)
Insert Into Costos Values (5,320)
Insert Into Costos Values (6,350)

/* Insertar Datos en la Tabla Matriculas */


Insert Into Matriculas Values (GETDATE(),1,1,200,'Matriculado')

/* Insertar Datos en la Tabla Notas */


Insert Into Notas Values (1,1,1,1,14,14,14,14)

/* Crear una Vista con las Tablas Semestre y Costos */


Create View vw_SemestreCosto
As
Select
Semestre.sem_codigo,semestre.sem_descripcion,Costos.cos_codigo,Costos.
cos_importe
From Semestre Inner Join Costos on
Semestre.sem_codigo=Costos.sem_codigo

Crear la Relación entre tablas:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 123


LENGUAJE DE PROGRAMACIÓN III

Procedimientos Almacenados:

/* Crear los Procedimientos Almacenados para Insertar Registros */


/* Alumnos */
Create Procedure alta_Alumnos (
@nombre Varchar(50),
@paterno Varchar(50),
@materno Varchar(50),
@dni Varchar(8),
@edad Char(2),
@fechanac Date,
@direccion Varchar(50),
@discodigo Integer,
@email Varchar(50)
)
As
Insert Into Alumnos
Values
(@nombre,@paterno,@materno,@dni,@edad,@fechanac,@direccion,@discodigo,
@email)
Go

/* Distritos */
Create Procedure alta_Distritos (
@descripcion Varchar(50)
)
As
Insert Into Distritos
Values (@descripcion)
Go

/* Profesor */
Create Procedure alta_Profesor (
@pronombre Varchar(50),
@proapellidos Varchar(50),
@prodni Varchar(8),
@profechanac Date,
@prodireccion Varchar(50),
@prodiscodigo Integer,
@proemail Varchar(50)
)
As
Insert Into Profesor
Values
(@pronombre,@proapellidos,@prodni,@profechanac,@prodireccion,@prodisco
digo,@proemail)
Go

/* Cursos */
Create Procedure alta_Cursos (
@curdescripcion Varchar(50),
@cursemestrecodigo Integer
)
As
Insert Into Cursos
Values (@curdescripcion,@cursemestrecodigo)
Go

/* Matriculas */

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 124


LENGUAJE DE PROGRAMACIÓN III

Create Procedure alta_Matriculas (


@matfecha Date,
@matalucodigo Integer,
@matsemcodigo Integer,
@matpagototal Integer,
@matobservacion Varchar(50)
)
As
Insert Into Matriculas
Values
(@matfecha,@matalucodigo,@matsemcodigo,@matpagototal,@matobservacion)
Go

/* Crear los Procedimientos Almacenados para Mostrar Registros */


/* Alumnos */
Create Procedure ver_Alumnos (
@alucodigo Integer
)
As
Select * From Alumnos
Where alu_codigo=@alucodigo
Go

/* Distritos */
Create Procedure ver_Distritos (
@discodigo Integer
)
As
Select * From Distritos
Where dis_codigo=@discodigo
Go

/* Profesor */
Create Procedure ver_Profesor (
@procodigo Integer
)
As
Select * From Profesor
Where pro_codigo=@procodigo
Go

/* Semestre */
Create Procedure ver_Semestre (
@semcodigo Integer
)
As
Select * From Semestre
Where sem_codigo=@semcodigo
Go

/* Cursos */
Create Procedure ver_Cursos (
@curcodigo Integer
)
As
Select * From Cursos
Where cur_codigo=@curcodigo
Go

/* Costos */

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 125


LENGUAJE DE PROGRAMACIÓN III

Create Procedure ver_Costos (


@coscodigo Integer
)
As
Select * From Costos
Where cos_codigo=@coscodigo
Go

/* Matriculas */
Create Procedure ver_Matriculas (
@matcodigo Integer
)
As
Select * From Matriculas
Where mat_codigo=@matcodigo
Go

/* Notas */
Create Procedure ver_Notas (
@notacodigo Integer
)
As
Select * From Notas
Where nota_codigo=@notacodigo
Go

/* Para Visualizar Vista */


Create Procedure ver_vwSemestreCosto (
@semcodigo integer
)
as
Select * from vw_SemestreCosto
Where sem_codigo=@semcodigo
Go
Select * from Matriculas

/* Código para el Informe */


Select
Matriculas.mat_codigo,Matriculas.mat_fecha,Matriculas.sem_codigo,Matri
culas.sem_observacion,Matriculas.sem_pagototal,
Semestre.sem_descripcion,Alumnos.alu_nombre,Alumnos.alu_apellidopat,Al
umnos.alu_apeliidomat
From Matriculas
Inner join Alumnos on Matriculas.alu_codigo=Alumnos.alu_codigo
Inner join Semestre on Matriculas.sem_codigo=semestre.sem_codigo
where Matriculas.mat_codigo=@parametro
order by Matriculas.alu_codigo

- Crear un Nuevo Proyecto en Visual Basic “ReporteParametros”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 126


LENGUAJE DE PROGRAMACIÓN III

- Crear los siguientes objetos en el proyecto para el Form1.

Objeto Propiedad Valor


Form1 Name frmPagoMatricula
Text Pago de Matricula
StartPosition CenterScreen
Label1 Text N° Matricula :
Label2 Text Fecha :
Label3 Text Alumno :
Label4 Text Semestre :
Label5 Text Costo Semestre :
Label6 Text Observación :
TextBox1 Name txtNumMat
ReadOnly True
Enabled False
TextBox2 Name txtCodAlumno
ReadOnly True
Enabled False
TextBox3 Name txtAlumno
ReadOnly True
Enabled False
ComboBox1 Name cbSemestre
DropDownStyle DropDownList
Enabled False
TextBox4 Name txtCosto
ReadOnly True
Enabled False
TextBox5 Name txtObservacion
Enabled False
DateTimePicker1 Name dtpFecha
Enabled False
Button1 Name btNuevo
Text Nuevo
BackColor SandyBrown
Button2 Name btGuardar
Text Guardar
BackColor SandyBrown
Enabled False

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 127


LENGUAJE DE PROGRAMACIÓN III

Button3 Name btCancelar


Text Cancelar
BackColor SandyBrown
Enabled False
Button4 Name btImprimir
Text Imprimir
BackColor SandyBrown
Enabled False
Button5 Name btSalir
Text Salir
BackColor SandyBrown
AxReportManX1 Name Rep
Visible False

- El Formulario de Pago de Matricula deberá quedar de la siguiente manera:

- Agregar el Control Report Manager a la Aplicación, Instalarlo en el


ordenador, Insertar la Referencia al proyecto, Agregarlo a los Controles para
poder utilizar dicho control.

- Cambiar las propiedades básicas del control Report Manager, el Name y


Visible, este control no se debe de visualizar en el tiempo de ejecución del
proyecto.

- Agregar un nuevo Windows Forms “frmListadoAlumnos” e ingresar los


siguientes controles:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 128


LENGUAJE DE PROGRAMACIÓN III

Objeto Propiedad Valor


Form2 Name frmAlumnos
Text Listado de Alumnos
StartPosition CenterScreen
Label1 Text Seleccione al Alumno :
DataGridView1 Name dgvAlumnos
Button1 Name btRetornar
Text Retornar

- Desactivar las opciones de “Habilitar Acción de Agregar”, “Habilitar Edición”,


“Habilitar Eliminación” y “Habilitar Reordenación de Columnas”, ya que no
modificaremos nada de la vista creada desde la Base de Datos.

- Abrir el Diseñador del Report Manager y crear el informe del Recibo de


Pago.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 129


LENGUAJE DE PROGRAMACIÓN III

- Crear la conexión a Datos en el Informe “PAGOMAT”-

- Realizar la conexión al Servidor y Base de Datos “Senati6”.

- Crear el conjunto de Datos del Informe “MATRICULA”, con una instrucción


SQL que constara de dos Inner Join.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 130


LENGUAJE DE PROGRAMACIÓN III

- Crear el Parámetro para la búsqueda de Registro “MATCOD” con las


siguientes características, se le asignara un valor para visualizar los
registros:

- Probar la conexión y verificar si se visualizan los datos de la tabla Matricula.

- Seleccionar la Condición Principal:

- Ingresar la Cabecera y Pie de Grupo al Informe.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 131


LENGUAJE DE PROGRAMACIÓN III

- Ingresar los Controles y las Propiedades al Informe.

- Guardar el Informe con el nombre “rpt_pagomatricula”.

- La aplicación se manejara con código desde una clase, con procedimientos


almacenados y orientado a eventos, de tal manera que se podrán observar
todos los tipos de manejo que se pueden realizar.

- Crear una Clase en el sistema con el nombre “Conexión.vb”, agregar –


Nuevo Elemento.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 132


LENGUAJE DE PROGRAMACIÓN III

- Ingresar el siguiente código para la clase “Conexión.vb”.

Imports System.Data.SqlClient

Public Class Conexion

'función conectar
Public Function Conectar() As SqlConnection
Dim Cadena As String
Cadena = "Server=DESKTOP-
FRUVH1J\SQLEXPRESS;DataBase=Senati6;Uid=sa;Password=root"
Dim cn As New SqlConnection(Cadena)
Try
cn.Open()
Return cn
Catch ex As Exception
MsgBox(ex.Message)
Return cn
End Try
End Function

'Función para Mostrar Datos


Public Function Mostrar(ByVal Tabla As String) As DataTable
Dim Sql As String = "Select * From " & Tabla
Dim conn As New SqlConnection
conn = Conectar()
Dim cmd As New SqlCommand(Sql, conn)
Dim adp As New SqlDataAdapter(cmd)
Dim t As New DataTable
Try
adp.Fill(t)
Return t
Catch ex As Exception
MsgBox(ex.Message)
Return t
Finally
conn.Close()
End Try
End Function

'Función Mostrar ultimo registro

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 133


LENGUAJE DE PROGRAMACIÓN III

Function MostrarUltimo(ByVal campo1 As String, campo2 As String, ByVal


tabla As String) As DataTable
Dim Sql As String = "Select Top 1" & campo1 & " From " & tabla & "
Order By " & campo2 & " Desc"
Dim conn1 As New SqlConnection
conn1 = Conectar()
Dim cmd As New SqlCommand(Sql, conn1)
Dim adp As New SqlDataAdapter(cmd)
Dim t As New DataTable
Try
adp.Fill(t)
Return t
Catch ex As Exception
MsgBox(ex.Message)
Return t
Finally
conn1.Close()
End Try
End Function

'Función Consultar
Public Function Consultar(Campos As String, tabla As String) As DataTable
'Consultar la Tabla que se encuentra en la base de datos

Dim sql As String = "Select " & Campos & " From " & tabla
Dim con As New SqlConnection
Dim cmd As New SqlCommand
Dim da As New SqlDataAdapter
Dim dt As New DataTable
con = Conectar()
cmd = New SqlCommand(sql, con)
da = New SqlDataAdapter(cmd)
Try
da.Fill(dt)
Return dt
Catch ex As Exception
Return dt
con.Close()
End Try

End Function
End Class

- Ingresar el siguiente código para el Form2 “frmListadoAlumnos”, el cual


mostrará el listado de alumnos y enviara los datos al Form1
“frmPagoMatricula”.

Public Class frmListadoAlumnos


Dim con As New Conexion

Private Sub frmListadoAlumnos_Load(sender As Object, e As EventArgs)


Handles MyBase.Load
Me.dgvAlumnos.DataSource = con.Mostrar("vw_AlumnosDistrito")

'Ingresar los Encabezados a las Columnas


dgvAlumnos.Columns(0).HeaderText = "Código"

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 134


LENGUAJE DE PROGRAMACIÓN III

dgvAlumnos.Columns(1).HeaderText = "Nombre"
dgvAlumnos.Columns(2).HeaderText = "Apellido Paterno"
dgvAlumnos.Columns(3).HeaderText = "Apellido Materno"
dgvAlumnos.Columns(4).HeaderText = "DNI"
dgvAlumnos.Columns(5).HeaderText = "Edad"
dgvAlumnos.Columns(6).HeaderText = "Fecha Nac."
dgvAlumnos.Columns(7).HeaderText = "Dirección"
dgvAlumnos.Columns(8).HeaderText = "Distrito"
dgvAlumnos.Columns(9).HeaderText = "E-mail"

'Estilos para el DatagridView dgvAlumnos


Dim cellStyle As New DataGridViewCellStyle
' Establecemos el tipo de fuente
cellStyle.Font = New Font _
(dgvAlumnos.Font.Name, dgvAlumnos.Font.Size, FontStyle.Bold)

' Le asignamos el estilo de celda al encabezado del control


DataGridView
dgvAlumnos.ColumnHeadersDefaultCellStyle = cellStyle
dgvAlumnos.EnableHeadersVisualStyles = False
dgvAlumnos.ColumnHeadersDefaultCellStyle.BackColor = Color.DarkOrange
dgvAlumnos.ColumnHeadersDefaultCellStyle.ForeColor = Color.DarkRed

'Seleccionar múltiples columnas


dgvAlumnos.MultiSelect = True
End Sub

Private Sub dgvAlumnos_DoubleClick(sender As Object, e As EventArgs)


Handles dgvAlumnos.DoubleClick
frmPagoMatricula.txtCodAlumno.Text =
Me.dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(0).Value
frmPagoMatricula.txtAlumno.Text =
Me.dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(1).Value & _
" " & Me.dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(2).Value
& _
" " & Me.dgvAlumnos.Rows(dgvAlumnos.CurrentRow.Index).Cells(3).Value
frmPagoMatricula.Show()
frmPagoMatricula.cbSemestre.Enabled = True
frmPagoMatricula.cbSemestre.Focus()
Me.Hide()
End Sub

Private Sub btRetornar_Click(sender As Object, e As EventArgs) Handles


btRetornar.Click
frmPagoMatricula.Show()
Me.Hide()
End Sub

End Class

- Ingresar el siguiente código para el Form1 “frmPagoMatricula”.

Imports Microsoft.VisualBasic
Imports System.Data.SqlClient
Imports System.Data

Public Class frmPagoMatricula

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 135


LENGUAJE DE PROGRAMACIÓN III

Dim con As New Conexion


Dim Dt As DataTable
' Dim Cn As New SqlConnection
Dim Da As New SqlDataAdapter
Dim Cmd As New SqlCommand

Private Sub frmPagoMatricula_Load(sender As Object, e As EventArgs)


Handles MyBase.Load
con.Conectar()
With Cmd
.CommandType = CommandType.Text
.CommandText = "Select * From Semestre"
.Connection = con.Conectar
End With
Da.SelectCommand = Cmd
Dt = New DataTable
Da.Fill(Dt)
With cbSemestre
.DataSource = Dt
.DisplayMember = "sem_descripcion"
.ValueMember = "sem_codigo"
End With
End Sub

Private Sub cbSemestre_Click(sender As Object, e As EventArgs) Handles


cbSemestre.Click
txtObservacion.Enabled = True
txtObservacion.Focus()
End Sub

Private Sub cbSemestre_SelectedValueChanged(sender As Object, e As


EventArgs) Handles cbSemestre.SelectedValueChanged
TextBox1.Text = Convert.ToString(cbSemestre.SelectedValue)
Dim com As New SqlCommand
Dim id As Integer
Dim dr As SqlDataReader
Dim sql As String
id = Val(TextBox1.Text)
sql = "Select * from vw_SemestreCosto where sem_codigo= " & id
con.Conectar()
com = New SqlCommand(sql, con.Conectar)
dr = com.ExecuteReader
If dr.Read Then
txtCosto.Text = dr(3)
End If
End Sub

Private Sub btNuevo_Click(sender As Object, e As EventArgs) Handles


btNuevo.Click
Dim com As New SqlCommand
Dim matcodigo As Integer
Dim dr As SqlDataReader
Dim sql As String

sql = "select * from matriculas order by mat_codigo desc"

con.Conectar()
com = New SqlCommand(sql, con.Conectar)

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 136


LENGUAJE DE PROGRAMACIÓN III

dr = com.ExecuteReader
If dr.Read Then
txtNumMat.Text = dr(0)
matcodigo = Val(txtNumMat.Text) + 1
txtNumMat.Text = matcodigo
txtCodAlumno.Enabled = True
txtCodAlumno.Focus()
btNuevo.Enabled = False
End If
End Sub

Private Sub txtCodAlumno_KeyPress(sender As Object, e As


KeyPressEventArgs) Handles txtCodAlumno.KeyPress
If Asc(e.KeyChar) = 13 Then
frmListadoAlumnos.Show()
frmListadoAlumnos.dgvAlumnos.Focus()
Me.Hide()
End If
End Sub

Private Sub btSalir_Click(sender As Object, e As EventArgs) Handles


btSalir.Click
End
End Sub

Private Sub Registrar()


Dim fecha As Date
Dim codigoalum As Integer
Dim codigosem As Integer
Dim pago As Integer
Dim obser As String

Dim Sql As String


Dim com As New SqlCommand
Dim res As Integer
codigoalum = Val(txtCodAlumno.Text)
codigosem = Val(TextBox1.Text)
pago = Val(txtCosto.Text)
obser = txtObservacion.Text
'fecha = Date.Now
fecha = Format(Date.Now.Date, "dd/MM/yyyy")
'Sql = "exec alta_Matriculas " + codigoalum + "','" + codigosem +
"','" + pago + "','" + obser + "'"
Sql = "Insert into
Matriculas(mat_fecha,alu_codigo,sem_codigo,sem_pagototal,sem_observacion)
Values ('" & fecha & "','" & txtCodAlumno.Text & "','" & TextBox1.Text &
"','" & txtCosto.Text & "','" & txtObservacion.Text & "')"
con.Conectar()
com = New SqlCommand(Sql, con.Conectar)
res = com.ExecuteNonQuery
con.Conectar.Close()

End Sub
Private Sub btGuardar_Click(sender As Object, e As EventArgs) Handles
btGuardar.Click
Call Me.Registrar()
MsgBox("Matricula Registrada")
btImprimir.Enabled = True

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 137


LENGUAJE DE PROGRAMACIÓN III

btImprimir.Focus()
btGuardar.Enabled = False
End Sub

Private Sub txtObservacion_KeyPress(sender As Object, e As


KeyPressEventArgs) Handles txtObservacion.KeyPress
If Asc(e.KeyChar) = 13 Then
btGuardar.Enabled = True
btGuardar.Focus()

End If
End Sub

Private Sub btImprimir_Click(sender As Object, e As EventArgs) Handles


btImprimir.Click
Dim Ruta As String
Ruta = "C:\Reportes"
Rep.Preview = True
Rep.ShowPrintDialog = True
Rep.filename = Ruta & "\rpt_pagomatricula.rep"
Rep.SetParamValue("MATCOD", txtNumMat.Text)
Rep.Execute()
End Sub
End Class

- Ejecutar la aplicación, y dar clic a botón “Nuevo”.

- Dar Enter donde se ubica el cursor (txtCodAlumno).

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 138


LENGUAJE DE PROGRAMACIÓN III

- Seleccionar un alumno, para el ejemplo Alumno: Código:1, Rosa Corrales


Ortiz. Esto se puede realizar desde cualquier parte del DataGridView, ya que
tiene la propiedad MultiSelect.

- Seleccionar un Semestre del combobox, automáticamente se mostrará el


Costo del Semestre, Ingresar una Observación, y presionar Enter para
activar el Botón Guardar.

- Mostrará un mensaje indicando que la Matricula se guardó y se activara el


botón Imprimir, al cual se le dará clic para mostrar el reporte.

- Visualizar el Reporte y enviar a la Impresora, también permite guardar con el


formato PDF

Nota: Ejercicio N° 4 del Capítulo 3 del Manual; nombre de la aplicación:


“ReportesParametros”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 139


LENGUAJE DE PROGRAMACIÓN III

IV. ACCEDER AL SISTEMA DE ARCHIVOS.

OPERACIONES:

- Trabajar con Unidades de Disco, Carpetas y Archivos.


- Obtener las Propiedades de una Carpeta o Archivo.
- Comprimir o Descomprimir Archivos.

EQUIPOS Y MATERIALES:

- Computadora con microprocesadores Core 2 Duo o de mayor capacidad.


- Sistema operativo Windows.
- Acceso a internet.
- Software visual Studio 2012, Block de Notas.

ORDEN DE EJECUCIÓN:

- Reconocer la Estructura de Discos, Carpetas y Archivos V.B.


- Reconocer el Manejo de Propiedades y Atributos.
- Desarrollar Entornos de Trabajo para Compresión y Descompresión.

4.1. TRABAJAR CON UNIDADES DE DISCO, CARPETAS Y ARCHIVOS:

Trabajar con Unidades de disco, Carpetas y Archivos puede ser de mucha


utilidad, ya que permite mostrar información al usuario de manera física, para
generar copias de seguridad, o manipular elementos externos al sistema y asi
poderlos manejar y modificar según la necesidad del usuario final del software
desarrollado.

Unidades de Disco:
Se puede determinar qué letras de unidad están en uso en un equipo local
mediante las aplicaciones API de Win32 GetLogicalDriveStrings. Esta lista de
letras de unidad será las letras de unidad de todas las unidades activas en el
equipo local, incluidas las unidades de disquete, discos duros, unidades
asignadas y otras unidades que se asignan a una letra de unidad.

La función GetLogicalDriveStrings API permite devolver una cadena que va a


contener una lista de todas las letras de unidad activa en el equipo local. El
formato de la cadena es una lista separada de null de letras de unidad con un
carácter null al final de la cadena. Por ejemplo, un equipo con una sola unidad
de disquete (A:) y una sola unidad de disco duro (C:) tendría una cadena del
siguiente formato devuelto por GetLogicalDriveStrings:
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 140
LENGUAJE DE PROGRAMACIÓN III

A:\<null>C:\<null><null>

• AvailabreFreeSpace: Entero largo que indica espacio disponible en la


unidad en bytes. Para obtener los MB o GB deberemos realizar las
operaciones oportunas con este dato.

• DriveFormat: Cadena que indica el sistema de archivos en el que está


formateada la unidad.

• DriveType: Indica el tipo de unidad, entre los que se tiene:


o IO.DriveType.CDRom: unidad de CD.
o IO.DriveType.Fixed: disco fijo.
o IO.DriveType.Network: unidad de red.
o IO.DriveType.NoRootDirectory: unidad sin directorio raíz.
o IO.DriveType.Ram: disco ram.
o IO.DriveType.Removable: extraíble.
o IO.DriveType.Unknown: unidad de tipo desconocido.

• IsReady: valor booleano que indica si la unidad está lista. Ten en cuenta
que no podrá acceder a la mayoría de los datos, como el sistema de
archivos o el espacio libre si la unidad no está montada.

• Name: Cadena con el nombre por el que conoce Windows a la unidad. El


famoso A: C: etc.

• RootDirectory: Cadena que devuelve el directorio raíz de la unidad.

• TotalFreeSpace: Aún no he encontrado la diferencia con


AvailableFreeSpace.

• TotalSize: Entero largo que nos devuelve el tamaño total de la unidad en


bytes.

• VolumeLabel: Devuelve una cadena con el nombre que le hemos asignado


a la unidad, lo que se conoce como etiqueta del volumen.

Ejercicio 1; para mostrar en cuadros de mensajes las unidades existentes en


el equipo de trabajo:

- Crear nuevo Proyecto “UnidadesDisco”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 141


LENGUAJE DE PROGRAMACIÓN III

- En el Form1 agregar los siguientes controles y características:

Objeto Propiedad Valor


Form1 Name frmListarUnidades
Text Listar Unidades
StartPosition CenterScreen
Label1 Text Dar Clic Para Mostrar las Unidades
Button1 Name btUnidades
Text Unidades

- Ingresar el siguiente código para la aplicación:

Public Class frmListarUnidades

Private Sub frmListarUnidades_Load(sender As Object, e As EventArgs)


Handles MyBase.Load
'Titulo del Formulario
Me.Text = My.Application.Info.AssemblyName

'Se mostrara el Texto del Botón según el lenguaje del Equipo


If My.Computer.Info.InstalledUICulture.TwoLetterISOLanguageName =
"fr" Then
btUnidades.Text = "Afficher les lecteurs"
ElseIf My.Computer.Info.InstalledUICulture.TwoLetterISOLanguageName =
"es" Then
btUnidades.Text = "mostrar Disk"
ElseIf My.Computer.Info.InstalledUICulture.TwoLetterISOLanguageName =
"de" Then
btUnidades.Text = "Tonen autorijden"
Else
btUnidades.Text = "Display Drive Letter"

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 142


LENGUAJE DE PROGRAMACIÓN III

End If
End Sub

Private Sub btUnidades_Click(sender As Object, e As EventArgs) Handles


btUnidades.Click
For Each drive As System.IO.DriveInfo In
System.IO.DriveInfo.GetDrives
MessageBox.Show(drive.Name.ToString)
Next
End Sub
End Class

- Ejecutar la Aplicación, se puede cambiar el lenguaje del sistema para


observar que los títulos van cambiando según el idioma.

Nota: Ejercicio N° 1 del Capítulo 4 del Manual; nombre de la aplicación:


“UnidadesDisco”.

Carpetas:
Ejercicio 2; para mostrar Carpetas y sub carpetas, de una unidad o ruta
indicada. Así mismo no carga todas las carpetas y subcarpetas al principio,
sino que usa el evento "AfterExpand" del TreeView para cargar las subcarpetas
del nodo desplegado. De esta forma la carga es muy rápida y eficiente:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 143


LENGUAJE DE PROGRAMACIÓN III

- En el Form1 agregar los siguientes controles y características:

Objeto Propiedad Valor


Form1 Name frmCarpetas
Text Explorador de Carpetas
StartPosition CenterScreen
Label1 Text Escriba la Unidad: (C:\ - D:\)
TextBox1 Name txtCarpeta
Button1 Name btCargarCarpetas
Text Cargar Carpetas
TreeView1 Name tvDirectorios

- Ingresar el siguiente código a la aplicación

Public Class frmCarpetas


'Crear Función para cargar las carpetas
Public Sub cargarSubcarpetas(ByVal rutaRaiz As String,
ByVal nodoTree As Windows.Forms.TreeNode)
On Error Resume Next
Dim carpetaActual As String
Dim indice As Integer

If nodoTree.Nodes.Count = 0 Then
For Each carpetaActual In
My.Computer.FileSystem.GetDirectories(rutaRaiz)
indice =
carpetaActual.LastIndexOf(System.IO.Path.PathSeparator)
nodoTree.Nodes.Add(carpetaActual.Substring(indice + 1,
carpetaActual.Length - indice - 1))
nodoTree.LastNode.Tag = carpetaActual
nodoTree.LastNode.ImageIndex = 0
Next
End If
End Sub

' Función para cargar carpetas con un directory


Public Sub cargarCarpetas(ByVal rutaRaiz As String)
Dim nodoBase As System.Windows.Forms.TreeNode

If IO.Directory.Exists(rutaRaiz) Then

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 144


LENGUAJE DE PROGRAMACIÓN III

If rutaRaiz.Length <= 3 Then


nodoBase = tvDirectorios.Nodes.Add(rutaRaiz)
Else
nodoBase = tvDirectorios.Nodes.Add(
My.Computer.FileSystem.GetName(rutaRaiz))
End If
nodoBase.Tag = rutaRaiz
cargarSubcarpetas(rutaRaiz, nodoBase)
Else
Throw New System.IO.DirectoryNotFoundException()
End If
End Sub
Private Sub btCargarCarpetas_Click(sender As Object, e As EventArgs)
Handles btCargarCarpetas.Click
cargarCarpetas(txtCarpeta.Text)
End Sub

Private Sub tvDirectorios_AfterExpand(sender As Object, e As


TreeViewEventArgs) Handles tvDirectorios.AfterExpand
'Mostrar la Función Cargar en el TreeView
Dim n As System.Windows.Forms.TreeNode
For Each n In e.Node.Nodes
cargarSubcarpetas(n.Tag, n)
Next
End Sub

End Class

- Al ejecutar la aplicación se puede ingresar una unidad “C:\” y dar clic en el


botón Cargar.
- Se mostrará todo el árbol de directorios de la unidad indicada.
- Servirá como visualizador de directorios, para cualquier utilidad que se
pueda requerir.
- Ejecutar la aplicación.

Nota: Ejercicio N° 2 del Capítulo 4 del Manual; nombre de la aplicación:


“ExploradorCarpetas”.

Archivos:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 145


LENGUAJE DE PROGRAMACIÓN III

Ejercicio 3; copiar archivos desde una aplicación hecha en Visual Basic. Se


utilizara un OpenFileDialog para buscar el archivo y un FolderBrowserDialog
para elegir la carpeta de destino.

- Agregar un nuevo Proyecto “CopiarArchivos”.

- En el Form1 agregar los siguientes controles y características:


Objeto Propiedad Valor
Form1 Name frmCopiarArchivos
Text Copiar Archivos
BackColor Black
StartPosition CenterScreen
Label1 BackColor Transparent
ForeColor White
Text Archivo a Copiar
Label2 BackColor Transparent
ForeColor White
Text Ruta de Destino
PictureBox1 BackColor Transparent
BackGroundImage Lupa.png
BackGroundImageLayout Stretch
PictureBox2 BackColor Transparent
BackGroundImage Carpeta.png
BackGroundImageLayout Stretch
Button1 Name btAceptar
Text Aceptar
BackColor Gold
Button2 Name btSalir
Text Salir
BackColor Gold
OpenFileDialog1 FileName ““
Title Elige un Archivo a Copiar
Filter “Archivos (.mp3)|*.mp3|Archivos
(.txt)|*.txt|Archivos (.avi)|*.avi”
FolderBrowserDialog1 Description Elige una Carpeta de Destino – Se puede Crear
una Nueva
TextBox1 Name txtArchivoCopiar
TextBox2 Name txtCarpetaDestino

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 146


LENGUAJE DE PROGRAMACIÓN III

- Los BackGroundImage de los PictureBox.

- El Formulario de la Aplicación, quedará de la siguiente manera:

- Ingresar el siguiente código para la Aplicación.

Public Class frmCopiarArchivos

Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles


PictureBox1.Click
'Directorio Inicial
OpenFileDialog1.InitialDirectory = "C:\"
'restaurar el Directorio antes de Cerrarlo
OpenFileDialog1.RestoreDirectory = True
'Si se muestra el OpenFileDialog y la opción del usuario es Cancelar
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel
Then
Return
Else
'Cuadro de texto cogerá la ruta
txtArchivoCopiar.Text = OpenFileDialog1.FileName
End If
End Sub

Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles


PictureBox2.Click
'Si se muestra el FolderBrowserDialog y la opción del usuario es
Cancelar
If FolderBrowserDialog1.ShowDialog =
Windows.Forms.DialogResult.Cancel Then
Return
Else
'Nos mostrara la ruta de la carpeta de destino

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 147


LENGUAJE DE PROGRAMACIÓN III

txtCarpetaDestino.Text = FolderBrowserDialog1.SelectedPath + "\"


+ CStr(OpenFileDialog1.SafeFileName)
End If
End Sub

Private Sub btAceptar_Click(sender As Object, e As EventArgs) Handles


btAceptar.Click
'Verificar si hay un Archivo Seleccionado
If txtArchivoCopiar.Text = "" Then
MsgBox("Se debe de Elegir un Archivo para Copiar",
MsgBoxStyle.Information, "Sistema")
Else
'Verificar se escogió una ruta
If txtCarpetaDestino.Text = "" Then
MsgBox("Se debe de Elegir una Carpeta de Destino",
MsgBoxStyle.Information, "Sistema")
Else
'Copiar el archivo del txtArchivoCopiar a la ruta
txtCarpetaDestino
My.Computer.FileSystem.CopyFile(txtArchivoCopiar.Text,
txtCarpetaDestino.Text)
MsgBox("El Archivo se Copió Correctamente",
MsgBoxStyle.Information, "Sistema")
End If
End If
End Sub

Private Sub btSalir_Click(sender As Object, e As EventArgs) Handles btSalir.Click


Me.Close()
End Sub

End Class

- Ejecutar la Aplicación.

- Seleccionar el archivo a copiar, soló se podrán mostrar los archivos con


formatos ingresados en la propiedad Filter.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 148


LENGUAJE DE PROGRAMACIÓN III

- Seleccionar la carpeta de destino, la cual nos mostrara el cuadro de dialogo


para seleccionarla, incluye unidades de disco duro o unidades extraíbles
conectadas al equipo.

- Dar clic al Botón Aceptar de la aplicación y mostrara el mensaje de la copia


realizada, se puede verificar en la carpeta destino que ya está copiado el
archivo seleccionado.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 149


LENGUAJE DE PROGRAMACIÓN III

Nota: Ejercicio N° 3 del Capítulo 4 del Manual; nombre de la aplicación:


“CopiarArchivos”

Ejercicio 4; Abrir aplicaciones desde un proyecto Visual Basic, independiente


del programa que sea, se puede utilizar como ayuda, por ejemplo la
calculadora o como complemento, diseñador de informes, Documentos de
Word o Hojas de cálculo Excel.

- Crear Nuevo Proyecto Estándar “Programas”.

- Agregar un Menú – MenuStrip.

- Ingresar las siguientes opciones para el Menú

Listado de Programas
Office
Ms-Word
Ms-Excel
Ms-PowerPoint

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 150


LENGUAJE DE PROGRAMACIÓN III

Aplicaciones
Block de Notas
Calculadora
Paint
Reportes
Rpt-Factura
Rpt-Alumnos

- Ingresar el siguiente código para llamar a las aplicaciones en tiempo de


ejecución.

Public Class Form1

Private Sub BlockDeNotasToolStripMenuItem_Click(sender As Object, e As


EventArgs) Handles BlockDeNotasToolStripMenuItem.Click
Shell("explorer.exe root=C:\Windows\System32\NotePad.exe",
vbNormalFocus)

End Sub

Private Sub MsWordToolStripMenuItem1_Click(sender As Object, e As


EventArgs) Handles MsWordToolStripMenuItem1.Click
Shell("explorer.exe root=C:\Program Files (x86)\Microsoft
Office\Office15\winword.exe", vbNormalFocus)

End Sub

Private Sub MsExcelToolStripMenuItem_Click(sender As Object, e As


EventArgs) Handles MsExcelToolStripMenuItem.Click
Shell("explorer.exe root=C:\Program Files (x86)\Microsoft
Office\Office15\excel.exe", vbNormalFocus)

End Sub

Private Sub MsPowerPointToolStripMenuItem_Click(sender As Object, e As


EventArgs) Handles MsPowerPointToolStripMenuItem.Click
Shell("explorer.exe root=C:\Program Files (x86)\Microsoft
Office\Office15\powerpnt.exe", vbNormalFocus)

End Sub

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 151


LENGUAJE DE PROGRAMACIÓN III

Private Sub CalculadoraToolStripMenuItem_Click(sender As Object, e As


EventArgs) Handles CalculadoraToolStripMenuItem.Click
Shell("explorer.exe root=C:\Windows\System32\calc.exe",
vbNormalFocus)

End Sub

Private Sub PointToolStripMenuItem_Click(sender As Object, e As


EventArgs) Handles PointToolStripMenuItem.Click
Shell("explorer.exe root=C:\Windows\System32\mspaint.exe",
vbNormalFocus)

End Sub

Private Sub RptFacturaToolStripMenuItem_Click(sender As Object, e As


EventArgs) Handles RptFacturaToolStripMenuItem.Click
Shell("explorer.exe root=C:\ReportesManual\rpt_pagomatricula.rep",
vbNormalFocus)

End Sub

Private Sub RptAlumnosToolStripMenuItem_Click(sender As Object, e As


EventArgs) Handles RptAlumnosToolStripMenuItem.Click
Shell("explorer.exe root=C:\ReportesManual\rpt_alumnosdistrito.rep",
vbNormalFocus)

End Sub

End Class
- Ejecutar la aplicación y dar clic a los menús para mostrar y activar las
aplicaciones. Por ejemplo M-Word.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 152


LENGUAJE DE PROGRAMACIÓN III

Nota: Ejercicio N° 4 del Capítulo 4 del Manual; nombre de la aplicación:


“Programas”

Ejercicio 5; Manipular Archivos desde Visual Basic .Net para eliminación,


copiado, apertura, etc.

- Nuevo Proyecto Estándar en Visual Basic “TrabajoArchivos”.

- Ingresar los siguientes controles al formulario:

- Ingresar el siguiente código para los Button:

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


Button1.Click
'copia los archivos en el directorio
For Each foundFile As String In My.Computer.FileSystem.GetFiles( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
FileIO.SearchOption.SearchTopLevelOnly, "*.txt")

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 153


LENGUAJE DE PROGRAMACIÓN III

My.Computer.FileSystem.CopyFile(foundFile, "C:\TestFolder1\" &


foundFile)
Next
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles


Button2.Click
'Para crear una copia de un archivo en la misma carpeta
My.Computer.FileSystem.CopyFile("C:\TestFolder1\test.txt", _
"C:\TestFolder1\test2.txt",
Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs,
FileIO.UICancelOption.DoNothing)
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles


Button3.Click
'Para crear una copia de un archivo en la misma carpeta,
sobrescribiendo archivos existentes
My.Computer.FileSystem.CopyFile("C:\TestFolder1\test.txt", _
"C:\TestFolder1\test2.txt", True)
End Sub

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles


Button4.Click
'crea un archivo de texto vacío en la ruta de acceso especificada
utilizando el método Create de la clase File.
Dim file As System.IO.FileStream
file = System.IO.File.Create("c:\test.txt")
End Sub

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles


Button5.Click
'Para eliminar un archivo de texto
My.Computer.FileSystem.DeleteFile("C:\test.txt")
End Sub

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles


Button6.Click
'Para eliminar un archivo de texto y pedirle al usuario que confirme
que se debe eliminar el archivo
My.Computer.FileSystem.DeleteFile("C:\test.txt", _
FileIO.UIOption.AllDialogs, FileIO.RecycleOption.DeletePermanently,
FileIO.UICancelOption.DoNothing)
End Sub

Private Sub Button7_Click(sender As Object, e As EventArgs) Handles


Button7.Click
'Para eliminar todos los archivos de una carpeta
For Each foundFile As String In My.Computer.FileSystem.GetFiles( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
FileIO.SearchOption.SearchAllSubDirectories, "*.*")
My.Computer.FileSystem.DeleteFile(foundFile, _
FileIO.UIOption.AllDialogs, _
FileIO.RecycleOption.DeletePermanently)
Next
End Sub

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 154


LENGUAJE DE PROGRAMACIÓN III

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles


Button8.Click
'Para buscar archivos con un modelo especificado
For Each foundFile As String In My.Computer.FileSystem.GetFiles( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
FileIO.SearchOption.SearchAllSubDirectories, "*.txt")
ListBox1.Items.Add(foundFile)
Next
End Sub

Private Sub Button9_Click(sender As Object, e As EventArgs) Handles


Button9.Click
'Para mover un archivo
My.Computer.FileSystem.MoveFile("C:\TestDir1\test.txt", _
"C:\TestDir2\test.txt")
End Sub

Private Sub Button10_Click(sender As Object, e As EventArgs) Handles


Button10.Click
'Para mover un archivo y cambiarle el nombre
My.Computer.FileSystem.MoveFile("C:\TestDir1\test.txt", _
"C:\TestDir2\nexttest.txt", _
FileIO.UIOption.AllDialogs, _
FileIO.UICancelOption.ThrowException)
End Sub

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles


Button11.Click
'Para mover una colección de archivos de un directorio a otro
For Each foundFile As String In My.Computer.FileSystem.GetFiles( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
FileIO.SearchOption.SearchAllSubDirectories, "*.*")
Dim foundFileInfo As New System.IO.FileInfo(foundFile)
My.Computer.FileSystem.MoveFile(foundFile, "C:\StorageDir\" &
foundFileInfo.Name)
Next
End Sub

Private Sub Button12_Click(sender As Object, e As EventArgs) Handles


Button12.Click
'Para cambiar el nombre de un archivo
My.Computer.FileSystem.RenameFile("C:\Test.txt", "SecondTest.txt")
End Sub

Private Sub Button13_Click(sender As Object, e As EventArgs) Handles


Button13.Click
'Para cambiar el nombre de un directorio
My.Computer.FileSystem.RenameDirectory("C:MyDocuments\Test", _
"SecondTest")
End Sub

Private Sub Button14_Click(sender As Object, e As EventArgs) Handles


Button14.Click
'Para copiar un directorio en otro directorio
My.Computer.FileSystem.CopyDirectory("C:\TestDirectory1",
"C:\TestDirectory2", True)
End Sub

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 155


LENGUAJE DE PROGRAMACIÓN III

Private Sub Button15_Click(sender As Object, e As EventArgs) Handles


Button15.Click
'Para crear un directorio
My.Computer.FileSystem.CreateDirectory _
("C:\Documents and Settings\All Users\Documents\NewDirectory")
End Sub

Private Sub Button16_Click(sender As Object, e As EventArgs) Handles


Button16.Click
'Para eliminar un directorio sólo si está vacío
My.Computer.FileSystem.DeleteDirectory("C:\OldDirectory", _
FileIO.DeleteDirectoryOption.ThrowIfDirectoryNonEmpty)
End Sub

Private Sub Button17_Click(sender As Object, e As EventArgs) Handles


Button17.Click
'Para eliminar un directorio y enviarlo a la Papelera de reciclaje
My.Computer.FileSystem.DeleteDirectory("C:\OldDirectory",
FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
End Sub

Private Sub Button18_Click(sender As Object, e As EventArgs) Handles


Button18.Click
'Para buscar subdirectorios con un modelo concreto
For Each foundDirectory As String In _
My.Computer.FileSystem.GetDirectories( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, True, _
"*Logs*")
ListBox1.Items.Add(foundDirectory)
Next
End Sub
Private Sub Button19_Click(sender As Object, e As EventArgs) Handles
Button19.Click
'Para mostrar una lista de los archivos existentes en un directorio
For Each foundFile As String In My.Computer.FileSystem.GetFiles _
(My.Computer.FileSystem.SpecialDirectories.MyDocuments)
ListBox1.Items.Add(foundFile)
Next
End Sub

Private Sub Button20_Click(sender As Object, e As EventArgs) Handles


Button20.Click
'Para determinar el número de archivos contenidos en un directorio
Dim counter As _
System.Collections.ObjectModel.ReadOnlyCollection(Of String)
counter = My.Computer.FileSystem.GetFiles("C:\TestDir")
MsgBox("number of files is " & CStr(counter.Count))
End Sub

Private Sub Button21_Click(sender As Object, e As EventArgs) Handles


Button21.Click
'Para mover un directorio
My.Computer.FileSystem.MoveDirectory("C:\Dir1", "C:\Dir2")
End Sub

Private Sub Button22_Click(sender As Object, e As EventArgs) Handles


Button22.Click
'Para mover un directorio y sobrescribir los directorios existentes

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 156


LENGUAJE DE PROGRAMACIÓN III

My.Computer.FileSystem.MoveDirectory("C:\Dir1", "C:\Dir2", True)


End Sub

Private Sub Button23_Click(sender As Object, e As EventArgs) Handles


Button23.Click
'Para mover el contenido de un directorio
For Each foundFile As String In My.Computer.FileSystem.GetFiles( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
FileIO.SearchOption.SearchAllSubDirectories, "*.*")

My.Computer.FileSystem.MoveFile(foundFile, "C:\StorageDir")
Next
End Sub

Private Sub Button24_Click(sender As Object, e As EventArgs) Handles


Button24.Click
'Para leer de la carpeta Mis documentos
Dim path As String
Dim patients As String
path = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\" &
"Patients.txt"
patients = My.Computer.FileSystem.ReadAllText(path)
End Sub

Private Sub Button25_Click(sender As Object, e As EventArgs) Handles


Button25.Click
'Para determinar el nombre y la ruta de acceso de un archivo
Dim testFile As System.IO.FileInfo
testFile =
My.Computer.FileSystem.GetFileInfo("C:\TestFolder1\test1.txt")
Dim folderPath As String = testFile.DirectoryName
MsgBox(folderPath)
Dim fileName As String = testFile.Name
MsgBox(fileName)
End Sub

Private Sub Button26_Click(sender As Object, e As EventArgs) Handles


Button26.Click
'Para combinar el nombre y el directorio de un archivo y crear la
ruta de acceso completa
Dim testFile As System.IO.FileInfo
testFile =
My.Computer.FileSystem.GetFileInfo("C:\TestFolder1\test1.txt")
Dim folderPath As String = testFile.DirectoryName
MsgBox(folderPath)
Dim fileName As String = testFile.Name
MsgBox(fileName)
Dim fullPath As String
fullPath = My.Computer.FileSystem.CombinePath(folderPath, fileName)
MsgBox(fullPath)
End Sub

End Class

- Los códigos presentados se pueden utilizar dependiendo de la necesidad de


la aplicación o del programador para tareas específicas; por ejemplo se
pueden trabajar con archivos dd Backup de la base de datos, o manipulación

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 157


LENGUAJE DE PROGRAMACIÓN III

de los archivos de reportes e informes del sistema. Así mismo se pueden


manejar los directorios de temporales que podrían ocasionar el sistema
instalado en el equipo.

- Ejecutar la Aplicación. Crear los directorios y archivos necesarios para el


buen funcionamiento del ejercicio

Nota: Ejercicio N° 5 del Capítulo 4 del Manual; nombre de la aplicación:


“TrabajoArchivos”.

4.2. OBTENER LAS PROPIEDADES DE UNA CARPETA O ARCHIVO.

Dependiendo de la aplicación que se esté desarrollando, puede ser necesario


conocer los atributos y características de los ficheros y directorios de un
espacio específico o del sistema operativo, para ello se realizara un Ejercicio
con las opciones posibles para verificar lo antes mencionado.

Ejercicio 6; Crear una aplicación que nos mostrara las características de los
ficheros y directorios determinados o del sistema.

- Nuevo Proyecto Estándar en Visual Basic “PropiedadesArchivos”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 158


LENGUAJE DE PROGRAMACIÓN III

- Agregar los Controles Button al formulario.

- Ingresar el siguiente código para cada Button:


Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


Button1.Click
Dim information As System.IO.FileInfo
information = My.Computer.FileSystem.GetFileInfo("C:\MyLogFile.log")
MsgBox("El Nombre Completo del Archivo es " & information.FullName &
".")
MsgBox("La Hora del Ultimo Acceso es " & information.LastAccessTime &
".")
MsgBox("La Longitud es " & information.Length & ".")
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles


Button2.Click
Dim getInfo As System.IO.FileInfo
getInfo =
My.Computer.FileSystem.GetFileInfo("C:\TestFolder1\test.txt")
MsgBox(getInfo.FullName)

End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles


Button3.Click
For Each foundFile As String In _
My.Computer.FileSystem.GetFiles("C:\TestFolder1")
Dim check As String = _
System.IO.Path.GetExtension(foundFile)
MsgBox("La Extensión del Archivo es " & check)
Next
End Sub

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles


Button4.Click
Dim infoReader As System.IO.FileInfo
infoReader = My.Computer.FileSystem.GetFileInfo("C:\test.txt")
MsgBox("El Acceso al Archivo Fue " & infoReader.LastAccessTime)

End Sub

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 159


LENGUAJE DE PROGRAMACIÓN III

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles


Button5.Click
Dim infoReader As System.IO.FileInfo
infoReader = My.Computer.FileSystem.GetFileInfo("C:\test.txt")
MsgBox("La Modificación Fue " & infoReader.LastWriteTime)
End Sub

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles


Button6.Click
Dim infoReader As System.IO.FileInfo
infoReader = My.Computer.FileSystem.GetFileInfo("C:\test.txt")
MsgBox("El Archivo es " & infoReader.Length & " bytes.")
End Sub

Private Sub Button7_Click(sender As Object, e As EventArgs) Handles


Button7.Click
Dim infoReader As System.IO.FileInfo
infoReader = My.Computer.FileSystem.GetFileInfo("C:\test.txt")
MsgBox("El Archivo fue creado en " & infoReader.CreationTime)
End Sub

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles


Button8.Click
Dim infoReader As System.IO.FileInfo
infoReader = My.Computer.FileSystem.GetFileInfo("C:\test.txt")
Dim attributeReader As System.IO.FileAttributes
attributeReader = infoReader.Attributes
If (attributeReader And System.IO.FileAttributes.Hidden) > 0 Then
MsgBox("El Archivo está Oculto!")
Else
MsgBox("El Archivo no está Oculto!")
End If
End Sub

Private Sub Button9_Click(sender As Object, e As EventArgs) Handles


Button9.Click
Dim infoReader As System.IO.FileInfo
infoReader = My.Computer.FileSystem.GetFileInfo("C:\test.txt")
If infoReader.IsReadOnly = True Then
MsgBox("El Archivo es de Solo Lectura!")
End If
End Sub

Private Sub Button10_Click(sender As Object, e As EventArgs) Handles


Button10.Click
Dim infoReader As System.IO.FileInfo
infoReader = My.Computer.FileSystem.GetFileInfo("C:\test.txt")
Dim attributeReader As System.IO.FileAttributes
attributeReader = infoReader.Attributes
If (attributeReader And System.IO.FileAttributes.Encrypted) > 0 Then
MsgBox("El Archivo está Encriptado!")
Else
MsgBox("El Archivo no está Encriptado!")
End If
End Sub

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles


Button11.Click

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 160


LENGUAJE DE PROGRAMACIÓN III

Dim getInfo As System.IO.DirectoryInfo


getInfo = My.Computer.FileSystem.GetDirectoryInfo _
("C:\Documents and Settings")
MsgBox("El Directorio fue Creado " & getInfo.CreationTime)
End Sub

Private Sub Button12_Click(sender As Object, e As EventArgs) Handles


Button12.Click
Dim reader As System.IO.DirectoryInfo
reader = My.Computer.FileSystem.GetDirectoryInfo("C:\testFolder1")
If (reader.Attributes And System.IO.FileAttributes.ReadOnly) > 0 Then
MsgBox("El Directorio es de Solo Lectura!")
End If
End Sub

Private Sub Button13_Click(sender As Object, e As EventArgs) Handles


Button13.Click
Dim checkFile As System.IO.DirectoryInfo
checkFile = My.Computer.FileSystem.GetDirectoryInfo("C:\TestFolder1")
Dim attributeReader As System.IO.FileAttributes
attributeReader = checkFile.Attributes

If (attributeReader And System.IO.FileAttributes.Hidden) > 0 Then


MsgBox("El Directorio está Oculto")
End If
End Sub

Private Sub Button14_Click(sender As Object, e As EventArgs) Handles


Button14.Click
If My.Computer.FileSystem.FileExists("c://Check.txt") Then
MsgBox("Archivo Encontrado")
Else
MsgBox("Archivo no Encontrado")
End If
End Sub

Private Sub Button15_Click(sender As Object, e As EventArgs) Handles


Button15.Click
Dim logDirectoryProperties As System.IO.DirectoryInfo
If My.Computer.FileSystem.DirectoryExists("C:\backup\logs") Then
logDirectoryProperties =
My.Computer.FileSystem.GetDirectoryInfo("C:\backup\logs")
End If
End Sub

Private Sub Button16_Click(sender As Object, e As EventArgs) Handles


Button16.Click
Dim cdrive As System.IO.DriveInfo
cdrive = My.Computer.FileSystem.GetDriveInfo("C:\")
MsgBox(cdrive.VolumeLabel)
End Sub

Private Sub Button17_Click(sender As Object, e As EventArgs) Handles


Button17.Click
Dim cdrive As System.IO.DriveInfo
cdrive = My.Computer.FileSystem.GetDriveInfo("C:\")
MsgBox(cdrive.DriveFormat)
End Sub

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 161


LENGUAJE DE PROGRAMACIÓN III

Private Sub Button18_Click(sender As Object, e As EventArgs) Handles


Button18.Click
Dim cdrive As System.IO.DriveInfo
cdrive = My.Computer.FileSystem.GetDriveInfo("C:\")
MsgBox(cdrive.DriveType.ToString)
End Sub

Private Sub Button19_Click(sender As Object, e As EventArgs) Handles


Button19.Click
Dim cdrive As System.IO.DriveInfo
cdrive = My.Computer.FileSystem.GetDriveInfo("C:\")
MsgBox(cdrive.TotalSize)
End Sub

Private Sub Button20_Click(sender As Object, e As EventArgs) Handles


Button20.Click
Dim cdrive As System.IO.DriveInfo
cdrive = My.Computer.FileSystem.GetDriveInfo("C:\")
MsgBox("Total de Espacio Libre: " & CStr(cdrive.TotalFreeSpace))
End Sub

Private Sub Button21_Click(sender As Object, e As EventArgs) Handles


Button21.Click
Dim cdrive As System.IO.DriveInfo
cdrive = My.Computer.FileSystem.GetDriveInfo("C:\")
MsgBox(cdrive.RootDirectory)
End Sub

Private Sub Button22_Click(sender As Object, e As EventArgs) Handles


Button22.Click
Dim systemDirectory As String
systemDirectory = System.Environment.SystemDirectory
End Sub

End Class

- Ejecutar la Aplicación y verificar cada botón creado, Es importante crear en


la unidad c: un directorio llamado “TestFolder1” y un Archivo “Text.txt”, para
que el ejemplo funcione.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 162


LENGUAJE DE PROGRAMACIÓN III

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 163


LENGUAJE DE PROGRAMACIÓN III

Nota: Ejercicio N° 6 del Capítulo 4 del Manual; nombre de la aplicación:


“PropiedadesArchivos”.

4.3. COMPRIMIR Y DESCOMPRIMIR ARCHIVOS CON VISUAL BASIC


.NET:

Muchas veces se tiene la necesidad de comprimir o descomprimir varios


archivos dentro de la aplicación o de manera externa a la misma, para luego
almacenarse en una unidad de disco local o extraíble, así como poder enviarse
por correo electrónico.

Para este fin existe la clase de dominio público, con lo que solo se tiene que
descargar y referenciar la clase en el proyecto. La solución a esto se encuentra
en la clase que ofrece la librería Dotnetzip. Gracias a esta librería, se puede
comprimir y descomprimir archivos con una sintaxis muy fácil de entender.

Una vez descomprimido el paquete (se ubica en la carpeta de Ejercicio 7 del


Capítulo 4 del Manual o en la ruta siguiente:
http://dotnetzip.codeplex.com/releases/view/68268) aparecerán varias
carpetas. En las cuales solamente se necesita referenciar al proyecto la librería
que está dentro de la siguiente ruta: “DotNetZipLib v1.9 –> zip-v1.9 –> Debug“.
La librería a referenciar es la “Ionic.Zip.dll”

Una vez localizado el archivo, se debe de referenciar el archivo desde el


proyecto. Menú Proyecto – Agregar Referencia – Examinar y Seleccionar la
Librería “Ionic.Zip.dll”

Variables a Utilizar:

• ZipAExtraer: Variable de tipo “String” y que servirá para poner la ruta para
el archivo a extraer.
• DirectorioExtraccion: Variable de tipo “String” y que servirá para poner la
ruta donde irá el archivo extraído.
• zip1: Variable de tipo “ZipFile” (está incluido en la librería ionic.zip.dll que
hemos referenciado) que le dirá al procedimiento que archivo tiene que leer
y cuál es el contenido a extraer.

Ejercicio 7; Crear una aplicación que nos mostrara la manera sencilla de


Comprimir y Descomprimir Archivos desde Visual Basic .Net

- Nuevo Proyecto Estándar en Visual Basic “ComprimirDescomprimir”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 164


LENGUAJE DE PROGRAMACIÓN III

- Agregar la Referencia a la Librería “Ionic.Zip.dll”, utilizando la siguiente ruta


en examinar: “DotNetZipLib v1.9 \ zip-v1.9 \ Debug“

- Examinar la Referencia y buscar la Librería:

- En el Form1 agregar los siguientes controles y características:

Objeto Propiedad Valor


Form1 Name frmComprimirDescomprimir
Text Comprimir - Descomprimir Ficheros

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 165


LENGUAJE DE PROGRAMACIÓN III

StartPosition CenterScreen
Label1 Text Nombre de Archivo
Label2 Text Ruta del Archivo
TextBox1 Name txtNombreArchivo
TextBox2 Name txtRuta
Button1 Name btDescomprimir
Text Descomprimir
BackColor Silver
ForeColor Maroon
Button2 Name btComprimir
Text Comprimir
BackColor Silver
ForeColor Maroon

- Ingresar el Siguiente Código a la Aplicación, creando las clases y


llamándolas desde los controles Button.

Imports Ionic.Zip
Public Class frmComprimirDescomprimir
'Función para Extraer Archivos
Private Sub Extraer()
Dim ZipExtraer As String = txtNombreArchivo.Text
Dim DirectorioExtracción As String = txtRuta.Text
Using Zip1 As ZipFile = ZipFile.Read(ZipExtraer)
Dim e As ZipEntry
For Each e In Zip1
e.Extract(DirectorioExtracción,
ExtractExistingFileAction.OverwriteSilently)
Next
End Using
End Sub
'Función para Comprimir Archivos
Private Sub Comprimir()
Using zip As ZipFile = New ZipFile()
zip.AddFile(txtNombreArchivo.Text)
zip.AddFile("Archivo2")
zip.AddFile("Archivo3")
zip.Save("NombreArchivo.Zip")
End Using
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


btDescomprimir.Click
'Llamada a la Función Extraer

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 166


LENGUAJE DE PROGRAMACIÓN III

Extraer()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles
btComprimir.Click
'Llamada a la Función Comprimir
Comprimir()
End Sub
End Class

- Ejecutar la Aplicación Ingresando un Nombre de Archivo y Ruta para


descomprimir y Comprimir los archivos. También se podría utilizar un
“OpenFileDialog” para seleccionar los archivos a comprimir y un
“ProgressBar” (Barra de progreso) para mostrar el progreso de
compresión/descompresión.

Nota: Ejercicio N° 7 del Capítulo 4 del Manual; nombre de la aplicación:


“ComprimirDescomprimir”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 167


LENGUAJE DE PROGRAMACIÓN III

V. ELABORAR PRUEBAS Y DEPURACIÓN DE ERRORES.

OPERACIONES:

- Depurar Paso a Paso los Procedimientos.


- Establecer Puntos de Ruptura.
- Manejar las Excepciones con Try… Catch.
- Capturar Errores para Realizar el Análisis Respectivo.
- Elaborar Ejercicios Prácticos de Casos con Visual Basic .Net

EQUIPOS Y MATERIALES:

- Computadora con microprocesadores Core 2 Duo o de mayor capacidad.


- Sistema operativo Windows.
- Acceso a internet.
- Software visual Studio 2012, Block de Notas.

ORDEN DE EJECUCIÓN:

- Reconocer la Estructura de Procedimientos en VB.


- Reconocer el Funcionamiento de las Excepciones.
- Desarrollar Ejercicios de Excepciones.

5.1. DEPURAR PASO A PASO LOS PROCEDIMIENTOS.

Uno de los procedimientos de depuración más utilizados en la programación es


la ejecución paso a paso, o también conocida como línea a línea del código.
Esta opción de depuración contiene tres comandos para poder avanzar paso a
paso por el código:
- Paso a paso por instrucciones.
- Paso a paso por procedimientos.
- Paso a paso para salir.

La opción de Paso a paso por instrucciones y Paso a paso por procedimientos


se diferencia básicamente en la forma en que tratan las llamadas a funciones.
Las dos opciones indican al depurador que ejecute la siguiente línea de código.
Si la línea contiene una llamada a una función, se debe ejecutar sólo la llamada
en sí y, a continuación, se detiene en la primera línea de código incluida en la
función. Paso a paso por procedimientos, se ejecuta toda la función para luego
detenerse en la primera línea que está fuera de ella.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 168


LENGUAJE DE PROGRAMACIÓN III

Utilizar Ir a instrucciones, si lo que se desea es examinar el interior de la


llamada a la función. Utilizar Paso a paso por procedimientos si lo que se
desea es evitar la ejecución paso a paso de las instrucciones incluidas en las
funciones.

Si se va a revisar una llamada a una función anidada, se debe seleccionar Ir a


instrucciones para que llegue hasta la función más interna. Si se utiliza Ir a
instrucciones en una llamada como Función 1(Función 2), el depurador
ejecutara paso a paso las instrucciones de la función Función 2. Si lo que se
desea es seleccionar la función anidada que debe ejecutarse paso a paso, se
debe de utilizar el comando Ir a específico que brinda el menú contextual.

Utilizar Paso a paso es básicamente para salir cuando se esté dentro de una
llamada a una función y se desee volver a la función de llamada. Paso a paso
para salir permite reanudar la ejecución del código hasta poder regresar a la
función, a continuación, se interrumpe en el punto devuelto de la función de
llamada.

Para ejecutar paso a paso las instrucciones de un programa que aún no se


está ejecutando, se debe de realizar lo siguiente:

- En el menú Depurar, elija Ir a instrucciones.

Para ejecutar paso a paso un programa durante la depuración.

- El depurador debe hallarse en modo de interrupción.


- En el menú Depurar, deberá de seleccionar Ir a instrucciones (F8), Paso a
paso para salir o Paso a paso por procedimientos (Mayús + F8).

- La ventana de código mostrara las instrucciones para su depuración:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 169


LENGUAJE DE PROGRAMACIÓN III

- Muestra el indicador por instrucción:

- Se ira avanzando por instrucción y revisando lo que devuelve cada línea, se


puede avanzar presionando F8 o dando clic en el botón Depurador.

- Para iniciar la Depuración por Procedimiento, se dará clic en el Menú


Depurar y seleccionar “Paso a Paso por Procedimientos” (Mayús + F8).

- Se puede ir avanzando por procedimiento utilizando la combinación de


teclas Mayús + F8 o utilizando el depurador.

5.2. ESTABLECER PUNTOS DE RUPTURA.


Interrupción de código mediante Puntos de Interrupción:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 170


LENGUAJE DE PROGRAMACIÓN III

Cuando se depura una aplicación con el depurador de VS, la aplicación se está


ejecutando o está en modo de interrupción.

El depurador interrumpe la ejecución de la aplicación cuando llega a un punto


de interrupción o cuando se produce una excepción. También puede
interrumpir manualmente la ejecución en cualquier momento.

Un punto de interrupción es una señal que indica al depurador que debe


suspender temporalmente la ejecución de la aplicación en un punto
determinado. Cuando la ejecución se suspende en un punto de interrupción, se
dice que el programa se encuentra en modo de interrupción. Entrar en el modo
de interrupción no detiene ni finaliza la ejecución del programa, cuya ejecución
se puede reanudar en cualquier momento.

La mayoría de las características del depurador, como la presentación de los


valores de las variables en la ventana Variables locales o la evaluación de las
expresiones en la ventana Inspección, solo están disponibles en el modo de
interrupción. Todos los elementos de la aplicación permanecen en la memoria
(por ejemplo, las funciones, variables y objetos), pero se suspenden sus
movimientos y actividades. Durante el modo de interrupción, puede examinar
las posiciones de los elementos y estados para buscar infracciones o errores.
También puede realizar ajustes en la aplicación mientras está en modo de
interrupción. Se puede configurar puntos de interrupción para suspender la
ejecución en función de una serie de condiciones.
Establecer puntos de interrupción en el código.

Para poder establecer un punto de interrupción simple en el código, se debe de


abrir el archivo de código fuente en el editor de Visual Basic .Net. Se debe de
establecer el cursor en la línea de código en la que se desea interrumpir y
elegir un Punto de interrupción, Insertar un punto de interrupción en el menú
contextual (F9). El depurador interrumpe la ejecución inmediatamente antes de
que se ejecute la línea.

Interrumpir el código Manualmente.

Para interrumpir en la siguiente línea de código disponible de una aplicación en


ejecución, se debe de elegir Depurar, Interrumpir todos (Ctrl+Alt+Break).

Si está depurando con la opción Solo mi código habilitada, se interrumpe en la


siguiente línea de código del proyecto. Si se va a depurar varios programas, un
punto de interrupción o el comando Interrumpir todos afecta de forma
predeterminada a todos los programas que se están depurando.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 171


LENGUAJE DE PROGRAMACIÓN III

El código será interrumpido mientras se está ejecutando sin los archivos de


código fuente o de símbolos correspondientes, el depurador muestra una
página con el mensaje No se encontraron archivos de código fuente o No se
encontraron símbolos que le permitirá encontrar los archivos adecuados.

Ejecutar una Ubicación o Función Determinada.


Si lo que se desea es ejecutar el código hasta un punto determinado y después
detener la ejecución, si se ha establecido un punto de interrupción en la
ubicación en la que se desea interrumpir; se debe de elegir Depurar, Iniciar
depuración si no ha iniciado la depuración, o Depurar, Continuar (F5). El
depurador se detiene en el punto de interrupción siguiente en la ejecución del
código. Seleccionar Depurar, Continuar hasta que llegue al punto de
interrupción que desea. También se puede ejecutar hasta el punto donde haya
colocado el cursor en el editor de código o hasta una función específica.

Ejecutar un proceso hasta la ubicación del cursor.


Para ejecutar un proceso hasta la ubicación del cursor, se debe de colocar el
cursor en una línea de código ejecutable de una ventana de código fuente. En
el menú contextual del editor, Seleccionar Ejecutar hasta el cursor.

Ejecutar un proceso hasta una función de la pila de llamadas.


Para este fin, en la ventana Pila de llamadas, seleccionar la función y elegir
Ejecutar hasta el cursor en el menú contextual.

Ejecutar un proceso hasta una función especificada por nombre.


Se puede indicar al depurador que se ejecute la aplicación hasta que llegue a
una función especificada. Se puede especificar la función por su nombre o
elegirla en la pila de llamadas. Para poder especificar una función por su
nombre, seleccione Depurar, Nuevo punto de interrupción, Interrumpir en
función e ingresar el nombre de la función y otra información de identificación.

Se ingresa el nombre de la Función y Aceptar, se ingresara la Función


“Conectar()”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 172


LENGUAJE DE PROGRAMACIÓN III

Informe de Rendimiento de una Aplicación:

5.3. MANEJAR LAS EXCEPCIONES CON TRY… CATCH.

El objeto Exception se encuentra definido en .NET Framework y su nombre


completo es System.Exception. En este marco de trabajo se definen otras dos
clases genéricas: System.SystemException y System.ApplicationException.
Casi todos los objetos de Exception definidos en .NET Framework heredan de
SystemException, mientras que los objetos de excepción personalizados y
específicos de cada aplicación heredan de ApplicationException. Estas dos
clases no agregan ninguna propiedad o método a la clase base Exception.
Nombre Excepción
ArgumentNullException,
ArgumentOutOfRangeException,
DivideByZeroException,
System
IndexOutOfRangeException, NullReference-
Exception, OverflowException,
StackOverflowException
DirectoryNotFoundException,
EndOfStreamException,
System.IO
FileNotFoundException, PathTooLongException,
FileLoadException, DriveNotFoundException
DuplicateNameException,
InvalidConstraintException,
System.Data InvalidExpressionException,
MissingPrimaryKeyException,
NoNullAllowedException, ReadOnlyException
InvalidComObjectException,
System.Runtime.InteropServices
InvalidOleVariantTypeException, SEHException

Instrucción Try...Catch...End Try o Finally.

Siempre que se añada código fuente que pueda iniciar una excepción será
conveniente introducirlo en un bloque Try...Catch...End. El código que quede
entre Try y Catch estará protegido contra excepciones y si se iniciara una

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 173


LENGUAJE DE PROGRAMACIÓN III

excepción, Visual Basic pasaría el control al primer bloque Catch (filtro de


excepciones). En el bloque de código Catch se podrán examinar las
propiedades del objeto Exception y decidir cómo reaccionar al error.

Ejercicio 1; Generar una Excepción para valores que se ingresan y muestran


un resultado numérico

- Crear un proyecto estándar en VB .Net “Excepcion1”.

- En el Form1 ingresar los controles y sus propiedades:

Objeto Propiedad Valor


Form1 Name frmExcepcion
Text Excepción
StartPosition CenterScreen
Label1 Text Generar Excepción
Button1 Name btExcepcion
Text Excepción

- Ingresar el siguiente código al botón Excepción.


Public Class frmExcepcion

Private Sub btExcepcion_Click(sender As Object, e As EventArgs) Handles


btExcepcion.Click
Dim x, y As Integer

Try
y = CInt(InputBox("Introduzca Y", "Control de excepciones", 0))
x = x 'y

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 174


LENGUAJE DE PROGRAMACIÓN III

'Si "y" = 0, la siguiente instrucción no se ejecutará


y = CInt(10 ^ x)
MsgBox("El valor de Y es: " + CStr(y))
Catch ex As Exception
If ex.Message = "Intento de dividir por cero." Then
MsgBox("Error al intentar dividir por cero.", _
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
Else
MsgBox("Se ha producido el siguiente error: " + ex.Message, _
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
End If
End Try
End Sub
End Class

- Ejecutar la Aplicación e ingresar los valores que van pidiendo los cuadros de
diálogo.

Nota: Ejercicio N° 1 del Capítulo 5 del Manual; nombre de la aplicación:


“Excepciones1”

Ejercicio 2; Generar una Excepción para valores que se ingresan y muestran


un resultado numérico.

- Crear un proyecto estándar en VB .Net “Excepciones2”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 175


LENGUAJE DE PROGRAMACIÓN III

- En el Form1 ingresar los controles y sus propiedades:

Objeto Propiedad Valor


Form1 Name frmExcepcion2
Text Excepción
StartPosition CenterScreen
Label1 Text Generar Excepción
Button1 Name btExcepcion
Text Excepción

- Ingresar el siguiente código al botón Excepción.


Public Class frmExcepcion2

Private Sub btExcepcion_Click(sender As Object, e As EventArgs) Handles


btExcepcion.Click
Dim x, y As Integer

Try
y = CInt(InputBox("Introduzca Y", "Control de excepciones", 0))
x = x 'y
'Si "y" = 0, la siguiente instrucción no se ejecutará
y = CInt(10 ^ x)
MsgBox("El valor de Y es: " + CStr(y))
Catch ex As DivideByZeroException
MsgBox("Error al intentar dividir por cero.", _
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
Catch ex As OverflowException
MsgBox("Error de desbordamiento, número muy grande.", _
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
Catch ex As Exception
MsgBox("Se ha producido el siguiente error: " + ex.Message, _
MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
End Try
End Sub
End Class

- Ejecutar la Aplicación e ingresar los valores que van pidiendo los cuadros de
diálogo.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 176


LENGUAJE DE PROGRAMACIÓN III

- Si no se ingresan Valores se activará el Try… Catch con la excepción, o


cuando se ingresa una valor muy grande.

Nota: Ejercicio N° 2 del Capítulo 5 del Manual; nombre de la aplicación:


“Excepciones2”.
When

Dentro de la cláusula Catch se podrá utilizar una expresión When opcional que
le permitirá especificar una condición adicional que el bloque Catch deberá
evaluar como True para que sea seleccionada. Esta característica permitirá
definir filtros de excepciones más específicos.
Finally

En determinadas ocasiones es necesario ejecutar un código de limpieza


cuando se produce una excepción. Por ejemplo para cerrar un fichero abierto
en el caso en que se produzca un error, o para cerrar la conexión con una base
de datos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 177


LENGUAJE DE PROGRAMACIÓN III

5.4. CAPTURAR ERRORES PARA REALIZAR EL ANALISIS RESPECTIVO.


El éxito de un software, depende mucho del análisis, de la estructura de una
base de datos sólida, el desarrollo de un software adecuado al análisis y la
depuración correcta del mismo. Siempre un sistema debe de tener un plan de
contingencia por si presenta fallas en su estructura, para ello es importante
mantener un registro de errores, que permitirá almacenar datos para la solución
de estos.
La posibilidad que nos brinda VB .Net es con funciones básicas como On Error
y el ya mencionado Try Catch
On Error: Esta anotación tiene distintas variaciones, con las cuales se podrá
capturar el error de una instrucción o aplicación:
Private Sub Ejemplo()
On Error GoTo Errores
Salida:
Exit Sub
Errores:
Select Case Err.Number
Case Codigo_Error
Resume
Case Codigo_Error
Resume Salida
Case Codigo_Error
Resume Next
Case Else
Procedimiento_Salida_Error_Imprevisto()
End Select
End Sub

Esta función funcionara y será activada hasta que se detecte un error en el


sistema, pudiéndose utilizar las siguientes variantes:

- Resume, Retorna a donde se produce el Error.


- Resume Next, Retorna a la siguiente instrucción que provocó el Error.
- Resume Etiqueta, Retorna la ejecución a la etiqueta indicada

La sintaxis de estas variantes se utilizara de acuerdo a la necesidad:


Salida:
Exit Sub

El contar con una etiqueta “Salida”, facilitara la opción de desviar la ejecución


por tratamiento de error a la salida del procedimiento. El objeto Err dispone de
métodos para facilitar una descripción del error y de su código de cara al
usuario.
Resume Salida

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 178


LENGUAJE DE PROGRAMACIÓN III

Try Catch: Es un sistema estructurado, permite prever que tipos de error se


pueden producir en el sistema para poder dar una salida a cada uno de ellos, la
sintaxis es la siguiente: (modo consola).
Private Sub Ejemplo()
Dim A, b, c As Integer
Try
' el programa
A = b / c
Catch Ex As OverflowException ' tratamiento de error
Console.WriteLine("Error overflow del tipo {0}", Ex.Message)
Catch Ex As ArithmeticException ' tratamiento de error
Console.WriteLine("Error aritmético del tipo {0}", Ex.Message)
Finally ' siempre se ejecutará
Console.WriteLine("Siempre se ejecutará")
End Try
End Sub

Código de ejecución:
Try
' el programa
A=b/c
Catch Ex As OverflowException ' tratamiento de error

Guarda el código a proteger:


Catch Ex As OverflowException ' tratamiento de error
Console.WriteLine("Error overflow del tipo {0}", Ex.Message)

El tratamiento del error previsto, esta definido por As OverFlowException.


Finally ' siempre se ejecutará
Console.WriteLine("Siempre se ejecutará")

Lo que se ingrese entre Finally y End Try siempre se ejecutara, excepto un


aborto de ejecución del programa. Con el desvió de excepciones se obtienen
varias ventajas y algunos inconvenientes, como por ejemplo, reducir el volumen
del código, por lo que se hace más sencillo su revisión, también de que se crea
código para terceros, utilizando la forma o la interface de los mensajes de error,
esto es una buena alternativa, ya que el código queda completamente
integrado en el programa donde se incrusta la clase.

Ejercicio 3; Generar una Aplicación básica de cálculo, en la cual se sumaran


dos valores y mostraran el resultado; dentro del Try se ubicara el código de la
operación y en el Catch se ubicara el mensaje que se desea mostrar si existe
un error en la aplicación. Para la ejecución se ingresaran dos valores enteros
para que se muestre el resultado la suma de ambos, pero para mostrar el erro

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 179


LENGUAJE DE PROGRAMACIÓN III

en uno de los valores se ingresara un carácter para que se desencadene un


error y muestre un mensaje.

- Crear un proyecto estándar en VB .Net “Excepciones2”.

- En el Form1 ingresar los controles y sus propiedades:

Objeto Propiedad Valor


Form1 Name frmCalculos
Text Cálculos
StartPosition CenterScreen
Label1 Text Valor 1 :
Label2 Text Valor 2 :
Label3 Text Resultado :
TextBox1 Name txtValor1
TextBox2 Name txtValor2
TextBox3 Name txtResultado
Button1 Name btCalcular
Text Calcular
Button2 Name btSalir
Text Salir

- Ingresar el siguiente código para la aplicación:

Public Class frmCalculos

Private Sub btCalcular_Click(sender As Object, e As EventArgs) Handles


btCalcular.Click
Try

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 180


LENGUAJE DE PROGRAMACIÓN III

'Variables de valor Integer


Dim v1, v2, re As Integer
v1 = txtValor1.Text
v2 = txtValor2.Text
'Operación matemática para el resultado
re = v1 + v2
txtResultado.Text = re
Catch ex As Exception
'Mostrar el mensaje de error si ocurre un mal ingreso de datos
MessageBox.Show(ex.Message)
End Try
End Sub

Private Sub btSalir_Click(sender As Object, e As EventArgs) Handles


btSalir.Click
End
End Sub

End Class

- Ejecutar la Aplicación e ingresar los valores, si ambos son valores numéricos


Integer, mostrará el resultado numérico de la suma de ambos valores, pero
adrede ingresar en el segundo valor un carácter para mostrar el mensaje de
error proporcionado por la instrucción Try… Catch.

Nota: Ejercicio N° 3 del Capítulo 5 del Manual; nombre de la aplicación:


“CapturaErrores”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 181


LENGUAJE DE PROGRAMACIÓN III

5.5. ELABORAR EJERCICIOS PRACTICOS DE CASOS CON VB.NET

Se desarrollará una aplicación en VB .Net distribuido en Capas, una forma de


programación muy utilizada hoy en día, con los cual se podrán identificar de
una manera práctica las instancias tanto de Datos, Negocio y Presentación.
Desarrollo en Capas:
Se crearán la Capa Datos, Capa Negocio y la Capa Presentación.

- Crear la Base de Datos en SQL Server.

/* Crear la Base de Datos */


CREATE DATABASE DemoTIC
/* Abrir la Base de Datos */
Use DemoTIC
/* Crear la Tabla Articulos */
CREATE TABLE Articulos(
IDProducto int IDENTITY(1,1) Primary Key NOT NULL,
Producto nvarchar(255) NOT NULL,
Marca nvarchar(100) NOT NULL,
Costo decimal(18, 3) NOT NULL,
PorcentajeGanancia decimal(18, 2) NOT NULL,
FechaAlta date NOT NULL
)
/* Modificar la Tabla para Ingresar Valor 0 en el campo Costo */
ALTER TABLE [dbo].[Articulos] ADD CONSTRAINT [DF_Articulos_Costo]
DEFAULT ((0)) FOR [Costo]
GO
/* Modificar la Tabla para Ingresar Valor 0 en el campo
PorcentajeGanancia */
ALTER TABLE [dbo].[Articulos] ADD CONSTRAINT
[DF_Articulos_PorcentajeGanancia] DEFAULT ((0)) FOR
[PorcentajeGanancia]
GO
/* Modificar la Tabla para Ingresar Valor GetDate en el campo
FechaAlta*/
ALTER TABLE [dbo].[Articulos] ADD CONSTRAINT [DF_Articulos_FechaAlta]
DEFAULT (getdate()) FOR [FechaAlta]
GO

- Generar un Nuevo Proyecto. Otros Tipos de Proyecto – Soluciones de Visual


Studio – Solución en Blanco “DemoTIC”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 182


LENGUAJE DE PROGRAMACIÓN III

- Crear 3 Carpetas en la Solución para cada una de las capas que se


utilizarán en el proyecto.

- La estructura quedaría de la siguiente manera.

Capa Datos:
En esta capa se determinará la conexión a una Base de Datos, creando las
interfaces y clases para dicha conexión. La base de datos estará estructurada
en un Motor de Base de Datos como por ejemplo SQL Server.

- Agregar Nuevo Proyecto – Windows – Biblioteca de Clases – “Datos”.


Eliminar la clase por defecto.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 183


LENGUAJE DE PROGRAMACIÓN III

- Agregar componente – Clic derecho al Proyecto Datos – Agregar – Nuevo


Elemento – Datos – Conjunto de Datos – Asignar el nombre “ArticulosDS”.

- Agregar la Tabla en el DataSet: Clic derecho en ArticulosDS – Agregar –


TablaAdapter. Generar la Conexión a la Base de Datos “DemoTIC”.

- Se observará la cadena de Conexión, mostrando la información necesaria,


se ha generado una nueva conexión. Dejar el nombre por defecto de la
conexión a la Base de Datos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 184


LENGUAJE DE PROGRAMACIÓN III

- Activar “Usar Instrucciones SQL”, para que permita Mostrar, Insertar,


Actualizar y Eliminar registros de la tabla. Siguiente.

- Dar cli en Opciones Avanzadas. En la ventana emergente dejar marcadas la


Primera opción “Generar Instrucciones Insert, Update y Delete” y la tercera
opción “Actualizar la Tabla de Datos”.

- Dar clic al botón Generador de Consultas. Agregar la tabla Artículos. Marcar


“Todas las Columnas”. En el campo Producto determinar que se ordene de
manera Ascendente.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 185


LENGUAJE DE PROGRAMACIÓN III

- Se muestra la Instrucción SQL. Siguiente.

SELECT Articulos.*
FROM Articulos
ORDER BY Producto
- En la ventana que se muestra, desactivar “Devolver un DataTable” y en la
opción “Rellenar un DataTable”. Nombre del Método “ObtenerArticulos”.
Finalizar.

- En la tabla generada, seleccionar los siguientes campos y cambiar sus


propiedades: Guardar Modelo.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 186


LENGUAJE DE PROGRAMACIÓN III

Campo Propiedad Valor


IDProducto AutoIncrementSeed 0
AutoIncrementStep 1
Producto NullValue Empty
Marca NullValue Empty

- En Datos, Mostrar todos los Archivos. Seleccionar


“ArticulosDS.Designer.vb”.

- Verificar la Clase que se creó por defecto.

- Generar la validación, para ello, Clic derecho en Datos – Agregar – Nuevo


Elemento – Código – Archivo de Código – Ingresar el nombre
“ArticulosDsExtend.vb”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 187


LENGUAJE DE PROGRAMACIÓN III

- Seleccionar “ArticulosDS” y marcar Artículos DataTable (Eventos).


Seleccionar en declaraciones “ColumnChanging”.

- Ingresar el siguiente código para la declaración:

Partial Class ArticulosDS


Partial Class ArticulosDataTable

Private Sub ArticulosDataTable_ColumnChanging(sender As Object, e As


DataColumnChangeEventArgs) Handles Me.ColumnChanging
e.Row.SetColumnError(e.Column.ColumnName, "")
Select Case e.Column.ColumnName
Case ProductoColumn.ColumnName
If String.IsNullOrEmpty(e.ProposedValue) Then
e.Row.SetColumnError(e.Column.ColumnName, "Ingrese un Nombre Correcto")
Throw New DataException(e.Row.GetColumnError(e.Column))
Else
e.ProposedValue = e.ProposedValue.ToString.Trim.ToUpper
End If
Case MarcaColumn.ColumnName
If String.IsNullOrEmpty(e.ProposedValue) Then
e.Row.SetColumnError(e.Column.ColumnName, "Ingrese la Marca Correcta")
Throw New DataException(e.Row.GetColumnError(e.Column))
Else
e.ProposedValue = e.ProposedValue.ToString.Trim.ToUpper
End If
Case PorcentajeGananciaColumn.ColumnName
If CType(e.ProposedValue, Decimal) >= 0 And CType(e.ProposedValue, Decimal)
<= 100 Then
Else
e.Row.SetColumnError(e.Column.ColumnName, "Ingrese Porcentaje Correcto")

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 188


LENGUAJE DE PROGRAMACIÓN III

Throw New DataException(e.Row.GetColumnError(e.Column))


End If
End Select
End Sub
End Class
End Class

Capa Negocios.
Esta Capa Negocios contiene los procesos a realizar con la información
recibida desde la Capa Presentación, las peticiones que el usuario ha
realizado, y responsabilizándose de que se le envíen las respuestas adecuadas
a la capa de presentación. Se puede ver como una capa intermedia, a medio
camino entre la Capa Presentación y la Capa de Datos, puesto que se
relaciona con ambas y por supuesto, procesa también la información devuelta
por la Capa de Datos

- En la carpeta Negocios dar clic derecho – Agregar – Nuevo Proyecto –


Windows – Biblioteca de Clases “Negocios.vb

- Eliminar la Clase por Defecto y Agregar una Clase “ArticulosCN”. Clic


derecho – Agregar – Nuevo Elemento – Clase.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 189


LENGUAJE DE PROGRAMACIÓN III

- Conectar la Capa Datos con la Capa Negocios a través de las Referencias.


Clic derecho a la Capa Negocios – Agregar Referencia – Solución -
Seleccionar Datos.

- En la Clase “ArticulosCN” en la opción General Ingresar la referencia a


Datos, e ingresar el siguiente código:
'Referencia a Capa Datos
Imports Datos

Public Class ArticulosCN


'Devolver un Esquema de Datos
Public Shared Function ObtenerArticulos() As ArticulosDS
Dim ds As New ArticulosDS
Dim ta As New ArticulosDSTableAdapters.ArticulosTableAdapter
Try
ta.ObtenerArticulos(ds.Articulos)
Return ds
Catch ex As Exception
Throw New ArgumentException(ex.Message)
End Try
End Function

'crear un Sub para no devolver un Resultado con una Referencia a ArticulosDS


Public Shared Sub ActualizarArticulos(ByRef ds As ArticulosDS)
Dim ta As New ArticulosDSTableAdapters.ArticulosTableAdapter
Try
'Determinar cual es el registro que se ha Actualizado o agregado
'Recorrer una Variable r
For Each r As ArticulosDS.ArticulosRow In ds.Articulos.Rows
Select Case r.RowState
Case DataRowState.Added
r.FechaAlta = Date.Now
r.Costo = r.Costo - 0.5
Case DataRowState.Modified
r.Costo = r.Costo - 0.5
End Select
Next
ta.Update(ds.Articulos)
ds.AcceptChanges()
Catch ex As Exception

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 190


LENGUAJE DE PROGRAMACIÓN III

Throw
End Try
End Sub
End Class

- Se debe de incluir un Modificador Shared en las Funciones que convierte un


método en un método compartido, que nos permite acceder a las funciones
sin tener que instanciar la Clase ArticulosCN.

Public Shared Function ObtenerArticulos() As ArticulosDS


Public Shared Sub ActualizarArticulos(ByRef ds As ArticulosDS)

Capa Presentación.
Esta capa se encarga de proveer una interfaz entre el sistema y el usuario.
Básicamente, se responsabiliza de que se le comunique información al usuario
por parte del sistema y viceversa, manteniendo una comunicación exclusiva
con la Capa de Negocios.

- En la Capa Presentación, Agregar – Nuevo Proyecto – Windows – Aplicación


de WindowsForms “PresentacionTIC”

- Eliminar el Form1 por defecto.


- En “PresentacionTIC” dar clic derecho – Agregar – Nuevo Elemento –
Windows Forms – Windows Forms: “Demo”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 191


LENGUAJE DE PROGRAMACIÓN III

- Clic derecho a “PresentacionTIC” – Establecer Como Proyecto de Inicio.

- Doble clic a “My Project” del Proyecto PresentacionTIC, e indicar que el


formulario de inicio será “Demo”.

- Interface Gráfica del Formulario: Se agregará un Contenedor SplitContainer,


que cuenta con dos Panel ajustables.

Objeto Propiedad Valor


Form1 Name Demo
Text Demo
Font Arial-Semicomprimido-10 tamaño
ForeColor DarkGreen
WindowState Maximized
SplitContainer BackColor DarkSecGreen
BorderStyle Fixed3D

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 192


LENGUAJE DE PROGRAMACIÓN III

- Agregar las Referencias para las Capas Datos y Negocios. Clic derecho a
PresentacionTIC – Agregar Referencia – Seleccionar Datos y Negocios –
Aceptar

- Generar el Proyecto, para ello, Clic derecho a “PresentacionTIC” – Generar.

- Crear el Origen de Datos. Menú Ver – Otras Ventanas – Orígenes de Datos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 193


LENGUAJE DE PROGRAMACIÓN III

- En la ventana de orígenes de datos, crear un Nuevo Origen de datos.


Agregar Nuevo Origen de Datos – seleccionar Objeto. Siguiente.

- Seleccionar “Datos” – { } Datos – ArticulosDS. Finalizar.

- En el Origen de Datos, muestra la tabla Artículos, pudiendo seleccionar entre


Vista de Grid o Detalles, para el ejemplo Seleccionar Vista Detalles.

- En el campo IDProducto, dar la característica de Label para que no se


modificable. A Marca se le asignará como ComboBox y en FechaAlta, darle
MasketTextBox.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 194


LENGUAJE DE PROGRAMACIÓN III

- Arrastrar la vista en tipo detalle al Panel1 del formulario Demo.

- En FechaAlta, establecer la Máscara de entrada. Seleccionar “Fecha –


26/10/2005 – DateTime”. Aceptar.

- En el Navegador, se seleccionará el botón Guardar. En la ventana de


Propiedades, seleccionar Enabled = True.
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 195
LENGUAJE DE PROGRAMACIÓN III

- Seleccionar el ComboBox Marca, y en la ventana de Propiedades,


seleccionar DropDownStyle = DropDownList, para que este control solo
muestre información y no se pueda editar. En la propiedad Items agregar 4
marcas.

- Seleccionar el control de FechaAlta y seleccionar la propiedad ReadOnly =


True, para que sea de sólo lectura.

- Seleccionar el Navegador para ubicarlo en el panel1, Seleccionar la


Propiedad Dock = None, moverlo y luego nuevamente Dock = Top.

- En Origen de Datos, En Artículos seleccionar DataGridView.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 196


LENGUAJE DE PROGRAMACIÓN III

- Arrastrar el DataGrid del Origen de Datos al Panel2. Desactivar “Habilitar


Agregar”, “Habilitar Edición”, “Habilitar Eliminación”. En las Propiedades
BachGroundColor = Khaki, BorderStyle = None.

- Al Label de IDProducto, Seleccionar Propiedades Text = “ ”, BorderStyle


Fixed3D.

- Ingresar el Código para el Formulario Demo: Llamar a la Referencia Datos.

En Demo (Eventos) en Load:

'Referencia Negocios
Imports Negocios
Public Class Demo

Private Sub Demo_Load(ByVal sender As Object, ByVal e As EventArgs)


Handles Me.Load
Me.ArticulosDS = ArticulosCN.ObtenerArticulos()
ArticulosBindingSource.DataSource = Me.ArticulosDS
End Sub

- Para “Validar”, agregar desde el cuadro de herramientas: Componentes –


ErrorProvider. Arrastrar.

- En ErrorProvider1, en sus Propiedades DataSource =


ArticulosBindingSource.

- Seleccionar todos los Controles Editables ProductoTextBox,


MarcaComboBox, CostoTextBox, PorcentajeGananciaTextBox,
FechaAltaMaskedTextBox.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 197


LENGUAJE DE PROGRAMACIÓN III

- En Propiedades – Eventos. Validating = ValidarControles

- Ingresar el Código para ValidarControles:

Private Sub ValidarControl(ByVal sender As Object, ByVal e As


System.ComponentModel.CancelEventArgs) Handles ProductoTextBox.Validating,
PorcentajeGananciaTextBox.Validating, MarcaComboBox.Validating,
FechaAltaMaskedTextBox.Validating, CostoTextBox.Validating
Try
ArticulosBindingSource.EndEdit()
Catch ex As Exception
End Try
End Sub

- Al querer pasar al otro control sin ingresar el valor, mostrara un icono de


error.

- Permitir que aunque no se valide en control pase al siguiente control. En el


Formulario Propiedades, AutoValidate = EnableAllowFocusChange.

- Al ejecutar se observará que se puede pasar de control aunque se deje


vacío el Producto, e ingresar un porcentaje de ganancia mayor a lo permitido
(100), aun así se puede pasar al siguiente control.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 198


LENGUAJE DE PROGRAMACIÓN III

- Programar el Botón Guardar del Navegador:

Private Sub ArticulosBindingNavigatorSaveItem_Click(sender As Object, e As


EventArgs) Handles ArticulosBindingNavigatorSaveItem.Click,
ErrorProvider1.RightToLeftChanged
Try
If ValidateChildren() Then
ArticulosBindingSource.EndEdit()
ArticulosCN.ActualizarArticulos(Me.ArticulosDS)
MsgBox("Actualización Correcta", MsgBoxStyle.Information)
Else
MsgBox("Corrija los Datos Incorrectos",
MsgBoxStyle.Exclamation)
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)

End Try
End Sub

- Ahora ya se puede agregar el Primer Registro a la Tabla desde el Formulario


Demo:

- Mostrará un error en el campo FechaAlta, ya que no permite valores nulos,


para corregir ello, se realizara lo siguiente.

En la Capa Datos, seleccionar ArticulosDS, y en la tabla seleccionar FechaAlta.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 199


LENGUAJE DE PROGRAMACIÓN III

- En la propiedad DefaultValue se ingresará una fecha por defecto


“01/01/1980”, no existirá ningún problema ya que en la base de datos se
agregar la fecha actual.

- Ejecutar la Aplicación: Se puede observar que muestra en FechaAlta la


fecha ingresada por defecto, pero a la hora de guardar se ingresa de manera
automática la fecha actual.

- Ahora se pueden ingresar más registros, Modificarlos y Eliminarlos.

Nota: Ejercicio N° 4 del Capítulo 5 del Manual; nombre de la aplicación:


“DemoTIC”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 200


LENGUAJE DE PROGRAMACIÓN III

VI. DISTRIBUIR LAS APLICACIONES WINDOWS ELABORADAS CON


VISUAL BASIC .NET

OPERACIONES:

- Crear un Proyecto de Instalación Utilizando el Asistente para Proyectos de


Instalación.
- Crear Accesos Directos en el Escritorio y Menú del Usuario Activo.
- Desarrollar Aplicaciones con conexión Remota.

EQUIPOS Y MATERIALES:

- Computadora con microprocesadores Core 2 Duo o de mayor capacidad.


- Sistema operativo Windows.
- Acceso a internet.
- Software visual Studio 2012, Block de Notas.

ORDEN DE EJECUCIÓN:

- Reconocer la Estructura de un Instalador para Proyectos.


- Reconocer el Funcionamiento y uso de Accesos Directos a Proyectos.
- Desarrollar Entornos de Trabajo para Conexiones Remotas.

6.1. CREAR UN PROYECTO DE INSTALACIÓN UTILIZANDO EL


ASISTENTE.

Utilizando la Base de Datos “Senati6”, agregar la tabla Users y el


Procedimiento Almacenado para Visualización de Usuarios, con los siguientes
campos:
/* Crear la Tabla Usser */
Create Table Users (
id Varchar(10) Primary Key Not Null,
nom Varchar(50),
Pass Varchar(20),
)

/* Ingresar un Registro a la Tabla Users */


Insert Into Users Values ('Admin','Administrador','1234')

/* Crear Procedimiento de Ver Usuarios */


Create Procedure ver_users (
@id Varchar(10)
)
As
Select * From Users

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 201


LENGUAJE DE PROGRAMACIÓN III

Where id=@id
Go

- Crear el Formulario Login para el proyecto:

Objeto Propiedad Valor


Form1 Name frmLogin
Text Login
StartPosition CenterScreen
Label1 Text Usuario :
Label2 Text Password :
TextBox1 Name txtUsuario
TextBox2 Name txtPassword
PasswordChar *
Button1 Name btIngresar
Text Ingresar
Button2 Name btSalir
Text Salir

- Ingresar el siguiente código para el Formulario frmLogin.


Imports System.Data.SqlClient
Public Class frmLogin
Public conexion As SqlConnection
Dim id As String
Dim pass As String
Dim sql As String
Dim com As SqlCommand
Dim dr As SqlDataReader
Public Sub conectar()
conexion = New SqlConnection
conexion.ConnectionString = ("server=DESKTOP-FRUVH1J\SQLEXPRESS;
DataBase=Senati6; Uid=sa;Password=root")
conexion.Open()
End Sub
Private Sub Verificar()
id = txtUsuario.Text
pass = txtPassword.Text
If id <> "" And pass <> "" Then
sql = "exec ver_users'" + id + "'"
conectar()
com = New SqlCommand(sql, conexion)
dr = com.ExecuteReader
If dr.Read Then

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 202


LENGUAJE DE PROGRAMACIÓN III

If id = dr(0) And pass = dr(2) Then


frmPagoMatricula.Show()
UseWaitCursor = True
Else
MsgBox("Usuario o Password Incorrectos",
MsgBoxStyle.Exclamation, "Acceso Denegado")
End If
End If
End If
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles


Button2.Click
End
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles


Button1.Click
Call Me.Verificar()
End Sub
End Class

- Se complementará con el Proyecto del Ejercicio 4 del Capítulo 2, Se deberá


de utilizar el Formulario frmLogin como formulario inicial del Proyecto. Una
vez ya completo el proyecto, se generara el instalador para la aplicación.

- Menú Archivo – Nuevo Proyecto.

- Seleccionar Otros Tipos de Proyectos – Instalación e Implementación. Si no


se encuentra instalado el InstallShield, seleccionar “Habilitar IntallShield
Limited Edition. Nombre Setup.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 203


LENGUAJE DE PROGRAMACIÓN III

- Se abrirá el navegador para descargar e instalar el InstallShield.

- Descargar el Instalador, e instalarlo en el ordenador (Ejercicios del Manual –


Capitulo 6 – Ejercicio 1).

- Muestra los requerimientos, Install.

- Seleccionar el tipo de instalación, reiniciar si el sistema lo pide. Siguiente:

- Aceptar la Licencia y Contrato de instalación. Siguiente.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 204


LENGUAJE DE PROGRAMACIÓN III

- Seleccionar el Directorio donde se instalará. Install – Finalizar.

- Retomar el Proyecto y agregar el proyecto de Instalación. Seleccionar


“InstallShield Limited Edition Project”, Nombre Setup1. Aceptar.

- Continuar con la Copia de Evaluación para el proyecto.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 205


LENGUAJE DE PROGRAMACIÓN III

- Se mostrará el Asistente del InstallShield en la cual se realizara los pasos


para la creación del proyecto de instalación.

- Seleccionar Application Information, en la cual solicita la información de la


empresa, el nombre de la Aplicación, Indicar la Versión y la Página Web de
la empresa, También se puede indicar el Icono del instalador. Siguiente.

- Indicar la compatibilidad con los diferentes sistemas operativos. Indicar si


requiere otras aplicaciones instaladas en el ordenador. Siguiente.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 206


LENGUAJE DE PROGRAMACIÓN III

- Indicar si tiene alguna estructura de instalación. Siguiente.

- En la siguiente ventana agregar los componentes o archivos que deberán de


participar en la instalación. Agregar la Carpeta del Proyecto. Siguiente.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 207


LENGUAJE DE PROGRAMACIÓN III

- Seleccionar si existirá un Acceso directo al sistema en la barra de menú y en


el escritorio. Renombrar los Archivos y Agregar un Unistall “Create an
Uninstallation Shortcut”.

- Agregar la referencia a registros si fuera necesario:

- Indicar si existirá un archivo de texto para la instalación, y cuál será el


executable a instalarse como principal. Activar la última opción “Do You want
to give users the option to launch your application when the installation
completes”. Rutear el archivo:

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 208


LENGUAJE DE PROGRAMACIÓN III

- Menú compilar – Generar Setup1.

- Una vez generado el Setup1, se muestra en la carpeta del proyecto:

- Ejecutar el Setup1. Que se ubicará en la carpeta setup1 del proyecto


“C:\Users\el_ed\OneDrive\Documentos\Visual Studio
2012\Projects\ReportesReportManager\Setup1\Setup1\Express\DVD-
5\DiskImages\DISK1”

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 209


LENGUAJE DE PROGRAMACIÓN III

- Instalar la Aplicación, se agregará un acceso directo en el Menú Inicio y en el


Escritorio, ahora ya se puede ejecutar directamente el proyecto sin
necesidad de tener instalado el Visual Basic .Net

6.2. CREAR ACCESOS DIRECTOS EN EL ESCRITORIO Y MENÚ DEL


USUARIO ACTIVO.

Se pueden desarrollar varios tipos de proyecto en Visual Basic .Net, como por
ejemplo aplicaciones que llaman a otras dentro de una estructura, creando
accesos directos y ubicación en el Menú Inicio
- Crear un nuevo proyecto – Plantillas – Windows – Aplicación de Windows
Forms. Ingresar el Nombre “MyNotePad”.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 210


LENGUAJE DE PROGRAMACIÓN III

- Seleccione la ficha Todos los formularios Windows Forms en el Cuadro de


herramientas y arrastre un control Button al formulario

6.3. DESARROLLAR APLICACIONES CON CONEXIÓN REMOTA.

En este post voy a explicar cómo realizar una conexión entre cliente y servidor
con vb.net con el sistema de comunicación del espacio de nombres
System.Runtime.Remoting.Channels, este contiene clases que admiten y
controlan los canales y los receptores de canales, que se utilizan como el
medio de transporte cuando un cliente llama a un método en un objeto remoto.

Este sistema nos será especialmente útil si queremos realizar aplicaciones


entre cliente y servidor en que queramos que el servidor realice las tareas de
control y acceso a la base de datos, es decir el cliente en este caso
simplemente realiza las peticiones al programa servidor, y el programa servidor
recibe las peticiones y realiza las gestiones correspondientes a la base de
datos.

Para realizar una conexión entre cliente y servidor con vb.net, debemos de
crear 3 proyectos con vb.net, El cliente, el servidor y la dll que contiene todos
los objetos y las llamadas del programa.
Primer programa, generación de la dll:

El primer programa es el encargado de generar la dll que utilizara tanto el


programa cliente como el programa servidor, aquí debemos de programar las
clases de identidad, las clases de acceso a la base de datos y especialmente
las clases de recepción de peticiones (el cliente llama a un método en un objeto
remoto)

Ejemplo de clase de recepción de peticiones:


Public Class loginAction
Inherits MarshalByRefObject
Public Function validaUsuari(ByVal nomUsuari As String, ByVal contrasenya
As String) As usuari
Try
Dim gestorUsuari As GestorUsuari = New GestorUsuari
Dim usuari As usuari = gestorUsuari.validarUsuari(nomUsuari,
contrasenya)
Dim dataentrada As Date = Date.Today
Dim horaentrada As TimeSpan = Date.Now.TimeOfDay
Dim logEntrada As logEntrada = New logEntrada(0,
usuari.getIdUsuari, _
usuari.getNomCognoms, dataentrada, horaentrada)
Me.altaLogEntrada(logEntrada)
Return usuari
Catch EXc As AccioExcepcio
Throw New AccioExcepcio(EXc.Message)

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 211


LENGUAJE DE PROGRAMACIÓN III

End Try
End Function
End Class

Donde “loginAction” es la clase en este caso encargada de comprobar la


validación de un usuario y su contraseña, vemos como debemos de heredar de
la clase “MarshalByRefObject”, el método que utilizara el programa cliente para
realizar la validación se llama “validaUsuari” y este devolverá un objeto “usuari”
si la conexión tiene éxito. Podemos realizar más de un método por clase y otras
clases para recibir peticiones remotas dentro de nuestro programa.
Segundo programa, Programa servidor.

El programa servidor y que se ejecutará en el ordenador servidor, será el


encargado de recibir las llamadas de los clientes y devolver la información que
el cliente solicite.

En primer lugar el programa servidor debe de incorporar una referencia de la dll


del primer programa que hemos creado, por tanto en el apartado de referencias
elegimos la dll correspondiente.

El programa servidor puede ser un sencillo “form” con algunas particularidades,


primeramente creamos un archivo xml con los servicios que o clases que
hemos creado en el primer programa o dll, este archivo lo llamaremos
“Listener.exe.config”
<Configuration>
<System.Runtime.Remoting>
<customErrors
AudioPlayMode = "off"
/>
<application>
<service>
<wellknown
AudioPlayMode = "singleton"
Type = "servidorJNSport.loginAction, ServidorJNSport"
objecturi = "RemoteLogin.rem"
/>
</service>
<Chanels>
<Channel ref="http" port="8085" />
</channels>
</application>
</system.runtime.remoting>
</configuration>

Donde el servicio “loginAction” es efectivamente la clase que habíamos creado


en el primer programa, podemos ver que el puerto utilizado por defecto es el
8085.

Luego en el programa servidor debemos de importar las referencias del


espacio de nombres System.Runtime.Remoting.Channels

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 212


LENGUAJE DE PROGRAMACIÓN III

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp

Luego, dentro del programa creamos las siguientes conexiones:


Public Sub activar()
Try
Dim aPath As String
Dim aName As String
aName = _
System.Reflection.Assembly.GetExecutingAssembly. _
GetModules()(0).FullyQualifiedName
aPath = System.IO.Path.GetDirectoryName(aName)
RemotingConfiguration.Configure(aPath & "\Listener.exe.config",
False)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Aquí podemos ver como cargamos la conexión del fichero “listener.exe.config”,


une vez realizada la configuración y activada la conexión el servidor queda
preparado para recibir las peticiones del cliente.

Tercer programa, Programa cliente.

El programa cliente es el encargado de realizar las peticiones al servidor,


invocando a los métodos remotos, igualmente que hemos hecho con el
programa servidor debemos de añadir una referencia a la dll creada en el
primer programa, por tanto en el apartado de referencias elegimos la dll
correspondiente.

Aquí también debemos de crear un xml con los servicios o clases que hemos
creado en el primer programa o dll, este archivo lo llamaremos
“Client.exe.config”, destacar aquí que debemos de especificar la dirección IP
del servidor, en este ejemplo es la de localhost porque cliente y servidor están
en el mismo ordenador.
<Configuration>
<System.Runtime.Remoting>
<application>
<Client>
<wellknown Type = "servidorJNSport.loginAction, ServidorJNSport"
url="http://localhost:8085/RemoteLogin.rem"/>

</Client>
</application>
</system.runtime.remoting>
</configuration>

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 213


LENGUAJE DE PROGRAMACIÓN III

Luego en el programa cliente igualmente que habíamos hecho en el servidor


debemos de importar las referencias del espacio de nombres
System.Runtime.Remoting.Channels.
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels

Luego debemos de abrir la conexión antes de realizar la llamada a un objeto


remoto, para abrir la conexión de una manera parecida como lo hacía el
servidor.
RemotingConfiguration.Configure(aPath & "\Client.exe.config", False)

Ahora sí que podemos realizar la llamada al objeto remoto desde la aplicación


cliente, en el ejemplo utilizamos el método que habíamos creado en el primer
programa dll.
Private Sub acceptar()
Dim loginAction As New loginAction
usuari = loginAction.validaUsuari(UseTextBox.Text, PassTextBox.Text)
End Sub

A partir de este ejemplo se pueden crear todos los métodos remotos que
queramos, siempre respetando el orden, primero en el programa dll, y luego en
el servidor.

Es una manera sencilla de separar el cliente del servidor y que los programas
cliente no tengan que realizar tareas directamente con la base de datos, de
esta manera el tráfico de datos también es menor ya que muchas operaciones
se pueden realizar en el programa servidor.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 214


LENGUAJE DE PROGRAMACIÓN III

VII. ELABORAR APLICACIONES WEB CON CONEXIÓN A BASE DE


DATOS CON PHP.

OPERACIONES:

- Configurar el servidor Apache de PHP.


- Reconocer el lenguaje PHP.
- Programar las instrucciones básicas condicionales y repetitivas de PHP.
- Crear formularios que proceden datos con PHP.
- Elaborar un CRUD a la base de datos.

EQUIPOS Y MATERIALES:

- Computadora con microprocesadores Core 2 Duo o de mayor capacidad.


- Sistema operativo Windows.
- Acceso a internet.
- Software visual Studio 2012, Block de Notas.

ORDEN DE EJECUCIÓN:

- Reconocer el Entorno de un Servidor Apache.


- Reconocer el Funcionamiento de Instrucciones básicas de PHP
- Manejo de Formularios en PHP.

7.1. CONFIGURAR EL SERVIDOR APACHE DE PHP

Se debe distinguir dos tipos de Apache, que corresponden con las versiones
1.3.X y 2.0.X de este programa. El motivo de la distinción es que se usan
bastante ambas versiones dependiendo del sistema operativo y la
configuración es ligeramente distinta en ambos. En ambas versiones son
estables en sistemas Windows XP, pero la 2.0.X puede volverse inestable bajo
Windows 98.
Se Deberá descargar el Apache en su versión para Windows. Acceder al URL:
http://httpd.apache.org/download.cgi En cualquier caso, se puede encontrar
cualquier archivo necesario en la carpeta httpd/binaries/win32 del servidor que
se utilizará para la descarga.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 215


LENGUAJE DE PROGRAMACIÓN III

Instalación de Apache 1.3.X


Se buscara la última versión de este tipo. También puede existir el mismo
archivo pero con extensión msi, en este caso se podría bajar si se dispone del
Windows Installer, la ventaja es que ocupa menos.
Una vez descargado, ejecutar el instalador y recorrer las pantallas, pedirá los
datos, en cuyo caso se pondrá:

Network Domain: 127.0.0.1

Server Name: 127.0.0.1

Administrator’s Email Address: el e-mail, no es necesario.

Run when started manually, only for me. Seleccionamos esta opción.

La IP 127.0.0.1 es la dirección IP asociada a la máquina, es decir el host local o


Localhost. Es importante que al probar los scripts en modo local, se puede
poner el IP 127.0.0.1 o localhost. Finalmente, recordar que el Apache se instala
por defecto en la carpeta:

C:\Archivos de programa\Apache Group\Apache\

Instalar el PHP. Asegúrarse de tener cerrado el Apache.

Instalación de Apache 2.0.X


El archivo a descargar es apache_2.0.53-win32-x86-no_ssl.exe También puede
existir el mismo archivo pero con extensión msi, en este caso se podría
descargar si se dispone del Windows Installer, la ventaja es que ocupa menos.
Ingresar los siguientes datos:

Network Domain: 127.0.0.1

Server Name: 127.0.0.1

Administrator’s Email Address: el e-mail no es necesario.

For All Users, on Port 80, as a Service: seleccionar esta opción.

La IP 127.0.0.1 es la dirección IP asociada a la máquina, es decir el host local o


Localhost. Es importante decir que a la hora de probar los scripts en modo
local, se puede utilizar el IP 127.0.0.1 o localhost. Recordar que el Apache se
instala por defecto en la carpeta:

C:\Archivos de programa\Apache Group\Apache\

Instalar el PHP. Tener cerrado el Apache.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 216


LENGUAJE DE PROGRAMACIÓN III

Instalación de PHP:
Descargar el PHP para Windows. El archivo está localizado en la sección
Downloads, apartado Windows Binaries, y es el Zip Package. Para la versión
4.3.10, es: PHP 4.3.10 zip package [7,405Kb].
Una vez descargado todo el ZIP, crear una carpeta en el sitio donde se quiera
instalar los archivos del servidor (PHP, MySQL…), por ejemplo crear una
carpeta en la raíz del disco duro C:\Servidor\, extraer los archivos del ZIP de
PHP dentro de esa carpeta. En este caso se crea la carpeta C:\Servidor\php-
4.3.10-Win32\, se podría renombrarla a C:\Servidor\PHP\

Ejecutar el php4ts.dll (localizado en C:\Servidor\PHP\php4ts.dll) y copiarlo al


directorio System (en Windows 9x) o System32 (NT, 2000, XP, 2003) de la
carpeta del Windows. Si hay otro archivo en System o System32 se tendrá que
sobrescribir. Igualmente tomar los archivos que están en la carpeta
C:\Servidor\PHP\dlls\ y copiarlos a la carpeta System o System32.

Configuración del archivo php.ini:


El siguiente paso es configurar el php.ini. Renombrar o copiar el archivo
C:\Servidor\PHP\php.ini-dist y poner php.ini Editarlo con el mismo block de
notas. Si se necesita, editar la línea register_globals = Off y la colocar el valor:
register_globals = On
Activar esta directiva, permite asumir que las variables son globales y pueden
llegar por cualquier método (POST, GET, COOKIE, SERVER, etc.). Así, por
ejemplo, si se utiliza una variable global de sesión o cookie se puede suplantar
fácilmente mediante una variable por url, con lo cual el script no es seguro. Lo
recomendable seria tener la directiva en OFF y usar los arrays globales
($HTTP_X_VARS) o los superglobales $_POST, $_GET, etc., que están
disponibles a partir de la versión 4.1.X de PHP. Por temas de seguridad en los
script y acostumbrarse a no manejar variables globales ya que en un futuro el
PHP tendrá la opción en OFF por defecto y no se podrá cambiar. Sin embargo,
por temas de compatibilidad con script antiguos o que hagan uso de variables
globales, podría convenir activar esta característica.

A continuación se debe indicar a PHP dónde se guardan las extensiones.


Dentro del php.ini se buscara la extension_dir y se ingresara la carpeta que
contiene los archivos php_xxx.dll, que por defecto es la carpeta extensions
dentro de PHP. Se debe de utilizar esta barra "/" y no está "\", además de
ponerlo entre comillas:

;Directory in which the loadable extensions (modules) reside. extension_dir =


"C:/Servidor/PHP/extensions/"

Además se puede activar las extensiones que se necesiten, para lo cual se


buscara Windows Extensions y para cargar las extensiones se le deberá quitar
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 217
LENGUAJE DE PROGRAMACIÓN III

el ; de adelante. Por ejemplo, si se quisiera cargar la extensión gd2.dll (para


manejar las funciones PHP relativas a imágenes) se deberá cambiar;
extension=php_gd2.dll por extension=php_gd2.dll

Realizar las pruebas con upload de archivos vía HTTP, se debe de indicar el
directorio donde los archivos se almacenarán temporalmente. Para ello buscar
upload_tmp_dir y dar el valor de una carpeta que exista. Por ejemplo, el
directorio C:\Servidor\PHP\ crear una carpeta uploads, por lo que quedará algo
así:

; Temporary directory for HTTP uploaded files (will use system default if not;
specified).

upload_tmp_dir = "C:/Servidor/PHP/uploads/"

La librería php_mysql.dll es la que permite manejar las funciones relacionadas


con MySQL, y por defecto en PHP5 viene desactivada, por tanto se debe de
activar de la forma que indicamos antes: buscar ;extension=php_mysql.dll y
quitar el ; de delante.

Instalación de MySQL:
Existen dos tipos de archivo descargable, en ZIP y en EXE. El instalador EXE
lleva un setup, que por defecto se instala en C:\MySQL\, se puede elegir otra
ruta de instalación, por ejemplo: C:\Servidor\MySQL\, para tener el PHP y
MySQL en la misma carpeta. Una vez finalizada la instalación, solo hay que
llamar al winmysqladmin.exe que estaría en C:\Servidor\MySQL\bin\ y la
primera vez que se ejecute, pedirá un nombre de usuario y contraseña, que se
deberá de introducir. Por ejemplo se puede ingresar el usuario "Admin" y la
contraseña "1234". Ahora al lado del reloj saldrá un semáforo. Si el semáforo
se pone en verde, quiere decir que el programa ya está activo.
Por defecto, MySQL crea un usuario de nombre root y sin contraseña, y éste es
el usuario que se usara en los script o en las aplicaciones que lo requieran
(foros, PHP Nuke, etc.).

Instalación de phpMyAdmin:
PhpMyAdmin es una utilidad que sirve para interactuar con una base de datos
de forma muy sencilla y desde una interfaz web. Sirve para crear bases de
datos, tablas, borrar o modificar dados, añadir registros, hacer copias de
seguridad, etc. Es una aplicación tan útil que casi todos los hosting con MySQL
disponen de ella. La instalación es relativamente sencilla: extraer todo el ZIP en
la carpeta raíz de la web a utilizar, por ejemplo: C:\Servidor\WEB\ y no dentro
de la carpeta del PHP o similares. Se puede renombrar a phpmyadmin, de
forma que quedaría algo así: C:\Servidor\WEB\phpmyadmin\

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 218


LENGUAJE DE PROGRAMACIÓN III

Hacer una pequeña configuración del phpMyAdmin. Para ello se debe editar el
archivo config.inc.php:

$cfg[‘PmaAbsoluteUri’] = ”;

Dar una ruta absoluta donde se tendrá el phpMyAdmin, sería así:

$cfg[‘PmaAbsoluteUri’] = ‘http://localhost/phpmyadmin/’;

Se puede ingresar el localhost o 127.0.0.1, Ahora buscar la siguiente línea:

$cfg[‘blowfish_secret’] = ”;

Ingresar una cadena de caracteres cualquiera, que servirá de semilla para la


encriptación de contraseñas al usar la autentificación con cookies:

$cfg[‘blowfish_secret’] = ‘aquí se puede poner lo que se desee’;

Guardar el archivo, pero no cerrarlo. Se puede probar phpMyAdmin para ver si


funciona, http://localhost/phpmyadmin/

Configurando los usuarios del servidor MySQL:


El usuario de MySQL es root sin password. Con esto ya se podría hacer
pruebas utilizando MySQL en el host local. Sin embargo, en este paso se
eliminara el usuario "por defecto" y crear un usuario propio con contraseña, ya
que así se evitara la brecha de seguridad que produce el tener el usuario root.
Esto se hará mediante la utilidad phpMyAdmin.
Ahora ingresar a phpMyAdmin mediante la dirección

http://localhost/phpmyadmin/index.php (tener MySQL y Apache activos para


que phpMyAdmin funcione). Realizar:

Crear un usuario.

Borrar usuarios no deseados (ej. el usuario root).

Aplicar los cambios realizados.

Configurar phpMyAdmin y los script para el nuevo usuario.

Creación de nuestro usuario para MySQL:


Desde la portada de phpMyAdmin se puede seleccionar el idioma castellano. A
continuación, dar clic en el link Privilegios y en la siguiente pantalla seleccionar
Agregar nuevo usuario. Ahora agregar el usuario y contraseña, que será el que
se usara luego en los script locales que hagan uso de MySQL. Por ejemplo, se
puede poner el mismo usuario y contraseña que se tiene en el Hosting.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 219


LENGUAJE DE PROGRAMACIÓN III

Introducir el nombre de usuario y contraseña, dar acceso a "Cualquier servidor"


(para que se pueda acceder a MySQL desde cualquier IP, incluidas las
externas a la PC) o a "Local" (si sólo se desea que se acceda desde la PC
donde se ha instalado MySQL) se le dara todos los permisos y privilegios
(marcando todas las casillas que aparecen).

Configurar los script para el nuevo usuario:


Una vez borrado el usuario root y recargados los privilegios, phpMyAdmin deja
de funcionar. Ya que venía configurado para usuario root sin password, y éste
ha sido eliminado. Ahora se tendrá que cambiar dicha configuración de
phpMyAdmin para que funcione con el nuevo usuario.
Volver al config.inc.php del phpMyAdmin, que no se había cerrado y localizar la
primera aparición de estas variables:

$cfg['Servers'][$i]['auth_type']
$cfg['Servers'][$i]['user']
$cfg['Servers'][$i]['password']
Cambiar su valor. En la primera poner config para que no pida contraseña al
entrar (útil si se es el único usuario que va a disponer de este phpMyAdmin).

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = 'Pepe';
$cfg['Servers'][$i]['password'] = 'hola';

7.2. RECONOCER EL LENGUAJE PHP.

PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de


código abierto muy popular especialmente adecuado para el desarrollo web y
que puede ser incrustado en HTML.
Ejemplo #1 Un ejemplo introductorio.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ejemplo</title>
</head>
<body>

<?php
echo "¡Hola, soy un script de PHP!";
?>

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 220


LENGUAJE DE PROGRAMACIÓN III

</body>
</html>

En lugar de usar muchos comandos para mostrar HTML (como en C o en Perl),


las páginas de PHP contienen HTML con código incrustado que hace "algo" (en
este caso, mostrar "¡Hola, soy un script de PHP!). El código de PHP está
encerrado entre las etiquetas especiales de comienzo y final <?php y ?> que
permiten entrar y salir del "modo PHP".

Lo que distingue a PHP de algo del lado del cliente como Javascript es que el
código es ejecutado en el servidor, generando HTML y enviándolo al cliente. El
cliente recibirá el resultado de ejecutar el script, aunque no se sabrá el código
subyacente que era. El servidor web puede ser configurado incluso para que
procese todos los ficheros HTML con PHP.

7.3. PROGRAMAR LAS INSTRUCCIONES BÁSICAS CONDICIONALES Y


REPETITIVAS DE PHP.

Las estructuras de control, permiten controlar el flujo del programa: Poder


tomar decisiones, realizar acciones repetitivas, entre otras, dependiendo de
unas condiciones que el programador establecerá. Al realizar un script que
permita saludar cada día de la semana de una manera diferente. O por ejemplo
hacer un script que pida la contraseña una y otra vez hasta que se ingrese la
opción correcta.
INSTRUCCIONES IF - ELSE:
If (condicion) {
// instrucciones que se ejecutan si la condición es verdadera
} else {
// Instrucciones que se ejecutan si la condición es falsa
}

Ejemplo: En un formulario que pregunte al usuario como se llama, pasara las


variables a la página “saludar.php”. En saludar.php mostrara un saludo
diferente en función de si el usuario es uno u otro.
Código en el Formulario:
<html>
<head>
<title> Ejemplo básico de If </title>
</head>
<body>
<form action="saludos.php" method="get">
¿Quién eres?<br />
<input type="text" name="nombre" />
<input type="submit" name="reset" value=" Enviar " />
</form>
</body>
</html>

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 221


LENGUAJE DE PROGRAMACIÓN III

Código en el Archivo saludar.php:


<html>
<head>
<title> Ejemplo básico de If </title>
</head>
<body>
<h1> Página de bienvenida</h1>
<?php // Empieza el código php
if ($nombre=="Luis") { // Si el nombre es Luis
echo(" Hombre $nombre! De paso por aquí otra vez!"); // saludo
especial
}else {
echo("Hola, $nombre, gracias por visitarnos"); // saludo para los
demás
}
?>
</body>
</html>

La cláusula else (la parte del if-else que indica lo que hay que hacer si la
condición es falsa) es opcional. No es necesario ponerla. Por ejemplo se puede
querer un script que sólo salude a un usuario especial. En este caso, se
cambiaría saludar.php de la siguiente manera:
<html>
<head>
<title> Ejemplo básico de If </title>
</head>
<body>
<h1> Página de bienvenida</h1>
<?php // empieza el código php
if ($nombre=="Luis") { // Si el nombre es Luis
echo(" Hombre $nombre! De paso por aquí otra vez!"); // Saludo para
Luis
}
?>
</body>
</html>

El operador ==; Se debe de utilizar el doble signo “=”. Si se utiliza sólo “=”, se
estaría indicando el operador de asignación, es decir estableciendo que
$nombre es igual a Luis con lo que la condición siempre sería cierta. Las
condiciones pueden complicarse mucho más, Podría suponerse que se dejara
ingresar sólo sí además de llamarse Luis, sabe la contraseña, que en este caso
es “1234”:

Código en el Formulario:

<html>
<head>

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 222


LENGUAJE DE PROGRAMACIÓN III

<title> Ejemplo básico de If </title>


</head>
<body>
<form action="saludar.php" method="get">

¿Quién eres?<br />


<input type="text" name="nombre" /><br />
¿Y tu Contraseña?<br />
<input type="text" name="pass" />
<input type="submit" name="reset" value=" Enviar " />
</form>
</body>
</html>

Código en el Archivo saludar.php:


<html>
<head>
<title> Ejemplo básico de If </title>
</head>
<body>
<h1> Página de bienvenida</h1>
<?php // Empieza el código php
if ($nombre=="Luis" and $pass =="foros") {
// Si el nombre es Luis y la contraseña foros
echo(" Hombre $nombre! Ya estás cotilleando por aquí otra vez!"); //
saludo especial
}else {
echo("ahhhhhhhhhhh como no te sabes el nombre y la contraseña, no
puedes pasar"); // saludo para los demás
}
?>
</body>
</html>

Además se tiene la instrucción elseif, que como su nombre indica, es una


combinación de if y else. Añade una nueva condición en el caso de que la
primera fuera falsa y sólo ejecuta las instrucciones si esta nueva condición es
verdadera.
Ejemplo:

if ($a > $b) {


// Ejecuta esto si a es Mayor que b
echo("a es mayor que b");
} elseif ($a == $b) {
// si a no es mayor que be, comprueba si a es igual a b
echo("a es igual que b");
} else {

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 223


LENGUAJE DE PROGRAMACIÓN III

// si no se cumplen las anteriores condiciones ejecuta ésta


echo ("a es menor que b");
}

BUCLES: WHILE
If else permitía decidir si se quería ejecutar o no una instrucción en función de
una condición, los bucles permiten utilizar una condición para determinar
cuántas veces se quiere ejecutar una instrucción:

While (condicion) {
// Instrucciones a ejecutar una y otra
//vez mientras la condición sea cierta
}

El funcionamiento es muy parecido al del if-else, la diferencia consiste en que si


la condición es cierta y se ejecuta la orden, la condición vuelve a comprobarse
una y otra vez mientras siga siendo cierta. En if-else sólo se comprueba la
condición una vez, si es cierta se ejecuta la instrucción y se sigue con el
programa.
Ejemplo:
$cantidad = 1;
while ($cantidad < 10) {
echo ("$cantidad ");
$cantidad++;
}

El script pasó a paso,


$Cantidad es igual a 1
1 es menor que 10
Escribir 1 en pantalla
$cantidad = 2 (1+1)
2 es menor que 10
Escribo 2 en pantalla
$cantidad = 3 (2+1)…
Al ejecutar este Script, en pantalla se verá 1 2 3 4 5 6 7 8 9

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 224


LENGUAJE DE PROGRAMACIÓN III

BUCLES: DO WHILE

Los bucles do while, son muy parecidos a los bucles while, sólo que se
comprueba si la condición es cierta al final del bucle en lugar de al principio. Así
las instrucciones se ejecutan siempre al menos una vez, lo que no ocurre en
las condiciones while si la condición es falsa.
$cantidad = 1;
do {
echo ($cantidad);
} while ($cantidad<1);

BUCLES: FOR

Los bucles for funcionan exactamente igual que en C. Con una sola instrucción
se controla todo el bucle.

For (valor inicial; condicion; ejecutar en cada bucle) {


// Instrucciones a ejecutar mientras la condición sea cierta
}

Ejemplo:
For ($cantidad = 1; $cantidad <10; $i++) {
echo("$cantidad");
}

SWICH/CASE:

Permite ejecutar un bloque de código u otro dependiendo del valor de una


variable. Ejemplo: Primero para asignar un valor a la variable, generar un
formulario:
<html>
<head>
<title> Ejemplo de switch </title>
</head>
<body>
<form action="switch.php" method="get">
¿Quién eres?<br />
<input type="radio" name="quien" value="cgus" /> cgus<br />
<input type="radio" name="quien" value="xela" /> xela<br />
<input type="radio" name="quien" value="adanedhel" /> adanedhel<br />
<input type="radio" name="quien" value="jorgito" /> jorgito<br />
<input type="submit" name="reset" value=" Enviar " />
</form>
</body>
</html>

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 225


LENGUAJE DE PROGRAMACIÓN III

Código en Archivo Switch.php


<html>
<head>
<title>Ejemplo de Swich</title>
</head>
<?php
switch($quien) {
case "cgus": // Primera posibilidad
echo (" $quien es todo un leader ");
break;
case "adanedhel": // segunda posibilidad
echo ("$quien es un elfo");
break;
case "xela": // tercera posibilidad
echo ("$quien es normal");
break;
default: // Posiblidad si no es ninguna de las anteriores
echo ("$quien es un desconocido");
}
?>
</body>
</html>

SINTAXIS ALTERNATIVA.
PHP ofrece una sintaxis alternativa para alguna de sus estructuras de control:
if, while, for, y switch. Puede hace el código más legible en algunos casos,
especialmente en las páginas multiuso.
If con construcción alternativa.
<?php if ($a==5): ?>
A es igual a 5
<?php endif; ?>

if con elseif y else en el formato alternativo:


if ($a == 5):
print "a es igual a 5";
print "...";
elseif ($a == 6):
print "a es igual a 6";
print "!!!";
else:
print “a no es ni 5 ni 6”;
endif;

While utilizando la construcción alternativa.


$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 226


LENGUAJE DE PROGRAMACIÓN III

For con la construcción alternativa.


for (expr1; expr2; expr3): sentencia; ...; endfor;

Páginas Multiuso.
Las Páginas multiuso son aquellas que pueden mostrar un contenido
completamente diferente dependiendo de alguna condición. De esta forma, se
puede hacer varias cosas en un solo documento.
La estructura habitual de una página multiuso es:
<html>
<head>
<title> Página Multiusos </title>
</head>
<body>
<php?
If (condición) { ?>
<!-- HTML que se mostará si la condición es cierta -->
<?php }else{ ?>
<!-- html que se mostratará si la condición es falsa -->
<?php } ?>
</body>
</html>
O utilizando la sintaxis alternativa que acabamos de ver:
<html>
<head>
<title> Página Multiusos </title>
</head>
<body>
<php?
if (condición): ?>
<!-- HTML que se mostará si la condición es cierta -->
<?php else: ?>
<!-- html que se mostratará si la condición es falsa -->
<?php endif; ?>
</body>
</html>

Ejemplo:
Utilizar el ejemplo de switch y utilizar una sola página (multiuso.php) para el
formulario y las respuestas.
<html>
<head>
<title> Página Multiusos </title>
</head>
<body>
<?php
if (!isset($quien)): ?>
<html>
<head>
<title> Ejemplo de switch </title>
</head>
<body>

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 227


LENGUAJE DE PROGRAMACIÓN III

<form action="multiuso1.php" method="get">


¿Quién eres?<br />
<input type="radio" name="quien" value="cgus" /> cgus<br />
<input type="radio" name="quien" value="xela" /> xela<br />
<input type="radio" name="quien" value="adanedhel" /> adanedhel<br />
<input type="radio" name="quien" value="jorgito" /> jorgito<br />
<input type="submit" name="reset" value=" Enviar " />
</form>
</body>
</html>
<?php else:
switch($quien) {
case "cgus": // Primera posibilidad
echo (" $quien es todo un leader ");
break;
case "adanedhel": // segunda posibilidad
echo ("$quien es un elfo");
break;
case "xela": // tercera posibilidad
echo ("$quien es un normal");
break;
default: // Posiblidad si no es ninguna de las anteriores
echo ("$quien es un desconocido");
}
endif;
?>
</body>
</html>

7.4. CREAR FORMULARIOS QUE PROCEDEN DATOS CON PHP.

Para este fin se creara un ejercicio, en la cual se creara una tabla llamada
prueba con 3 campos: un campo identificador, que servirá para identificar
unívocamente una fila con el valor de dicho campo, otro campo con el nombre
de una persona y por último un campo con el apellido de la persona. Para crear
la tabla se puede utilizar la herramienta de administración de MySQL del
servidor web o se puede escribir un fichero de texto con el contenido de la
sentencia SQL equivalente y luego decirle al motor de base de datos que la
ejecute con la siguiente instrucción:
mysql -u root base_datos <prueba.sql

prueba.sql:

CREATE TABLE prueba (


ID_Prueba int(11) DEFAULT '0' NOT NULL auto_increment,
Nombre varchar(100),
Apellidos varchar(100),
PRIMARY KEY (ID_Prueba),
UNIQUE ID_Prueba (ID_Prueba)
);

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 228


LENGUAJE DE PROGRAMACIÓN III

Conexión a la base de datos.


Cuando ya está creada la base de datos en el servidor, el siguiente paso es
conectarse a la misma desde una página PHP. Para ello PHP proporciona una
serie de instrucciones para acceder a bases de datos MySQL.
<!-- Senati -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
function Conectarse()
{
if (!($link=mysql_connect("localhost","usuario","Password")))
{
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db("base_datos",$link))
{
echo "Error seleccionando la base de datos.";
exit();
}
return $link;
}$link=Conectarse();
echo "Conexión con la base de datos conseguida.<br>";
mysql_close($link); //cierra la conexion
?></body>
</html>

Al ejecutar la instrucción mysql_connect, se creara un vínculo entre la base de


datos y la pagina PHP, este vínculo será usado posteriormente en las consultas
que se realicen a la base de datos. Finalmente, una vez que se ha terminado
de usar el vínculo con la base de datos, se liberara con la instrucción
mysql_close para que la conexión no quede ocupada.

Consultas a la base de datos.


Una vez que se ha conectado con el servidor de bases de datos, ya se puede
realizar consultas a las tablas de la base de datos.
<!-- Senati -->
<?php
function Conectarse()
{
if (!($link=mysql_connect("localhost","usuario","Password")))

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 229


LENGUAJE DE PROGRAMACIÓN III

{
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db("base_datos",$link))
{
echo "Error seleccionando la base de datos.";
exit();
}
return $link;
}
?>
<!-- Senati -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1>
<?php
include("conex.phtml");
$link=Conectarse();
$result=mysql_query("select * from prueba",$link);
?>
<TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1>
<TR><TD> Nombre</TD><TD> Apellidos </TD></TR>
<?php while($row = mysql_fetch_array($result)) {
printf("<tr><td> %s</td><td> %s </td></tr>",
$row["Nombre"],$row["Apellidos"]);
}
mysql_free_result($result);
mysql_close($link);
?></table>
</body>
</html>

Insertar registros.
Para ello se usara un formulario y en el ACTION del FORM <FORM
ACTION=”programaPHP”> indicar que se debe procesar una página PHP, esta
página lo que hará será introducir los datos del formulario en la base de datos.
<!-- Senati -->
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 230


LENGUAJE DE PROGRAMACIÓN III

<H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1>


<FORM ACTION="procesar.phtml">
<TABLE>
<TR>
<TD>Nombre:</TD>
<TD><INPUT TYPE="text" NAME="nombre" SIZE="20" MAXLENGTH="30"></TD>
</TR>
<TR>
<TD>Apellidos:</TD>
<TD><INPUT TYPE="text" NAME="apellidos" SIZE="20" MAXLENGTH="30"></TD>
</TR>
</TABLE>
<INPUT TYPE="submit" NAME="accion" VALUE="Grabar">
</FORM>
<hr>
<?php
include("conex.phtml");
$link=Conectarse();
$result=mysql_query("select * from prueba",$link);
?>
<TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1>
<TR><TD> <B>Nombre</B></TD> <TD> <B>Apellidos</B> </TD></TR>
<?php
printf("<tr><td> %s</td> <td> %s </td></tr>", $row["Nombre"],
$row["Apellidos"]);
}
mysql_free_result($result);
mysql_close($link);
?></table>
</body>
</html>

<?php
include("conex.phtml");
$link=Conectarse();
$nombre=$_GET['nombre'];
$apellidos=$_GET['apellidos'];
mysql_query("insert into prueba (Nombre,Apellidos) values
('$nombre','$apellidos')",$link);

header("Location: ejem07d.phtml");
?>

Borrar registros.
Para indicar que elemento se va a borrar se debe de pasar el ID_Prueba de
cada registro, de esta manera la página borra.phtml sabe que elemento de la
tabla ha de borrar.
ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 231
LENGUAJE DE PROGRAMACIÓN III

<!-- Senati -->


<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1> <?php
include("conex.phtml");
$link=Conectarse();
$result=mysql_query("select * from prueba",$link);
?>
<TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1>
<TR><TD> <B>Nombre</B></TD> <TD> <B>Apellidos</B> </TD>
<TD> <B>Borrar</B> </TD></TR>
<?php
printf("<tr><td> %s</td><td> %s </td><td><a
xhref=\"borra.phtml?id=%d\">Borra</a></td></tr>",
$row["Nombre"],$row["Apellidos"],$row["ID_Prueba"]);
}
mysql_free_result($result);
mysql_close($link);
?></table>
</body>
</html>

Formulario de Datos:
Algo muy común en un panel de administración Web es la capacidad de
insertar contenidos en un formulario y pasarlos directamente a la base de datos
para su posterior uso en la base de datos. El formulario no debe cumplir ningún
requisito especial, únicamente el atributo action debe apuntar al script que
procesará la información.
<form name="webtaller" action="insertar_datos.php" method="post">
Título: <input type="text" name="titulo"><br>
Contenido: <textarea name="contenido"></textarea><br>
<input type="enviar" value="Enviar">
</form>

Ahora en el archivo "insertar_datos.php" deberemos recoger estos datos e


insertarlos en nuestra base de datos. Suponemos que tenemos una tabla en la
base de datos, llamada "noticias" que tiene los campos "titulo" y "contenido".
Miraremos si realmente han enviado datos y si es así, insertaremos los valores
en la base de datos.
<?php
// Primero comprobamos que ningún campo esté vacío y que todos los campos
existan.
if(isset($_POST['titulo']) && !empty($_POST['titulo']) &&
isset($_POST['contenido']) && !empty($_POST['contenido'])) {
// Si entramos es que todo se ha realizado correctamente

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 232


LENGUAJE DE PROGRAMACIÓN III

$link = mysql_connect("localhost","usuario","contraseña");
mysql_select_db("webdb",$link);
// Con esta sentencia SQL insertaremos los datos en la base de datos
mysql_query("INSERT INTO noticias (titulo,contenido)
VALUES ('{$_POST['titulo']}','{$_POST['contenido']}')",$link);
// Ahora comprobaremos que todo ha ido correctamente
$my_error = mysql_error($link);
if(!empty($my_error) {
echo "Ha habido un error al insertar los valores. $my_error";
} else {
echo "Los datos han sido introducidos satisfactoriamente";
}
} else {
echo "Error, no ha introducido todos los datos";
}
?>

Crear formulario de registro con PHP y MySQL.

Para lograr esto se necesitarán 5 archivos.

index.html: Es el archivo que contiene el formulario en sí. Debe llamarse index


para que cuando se coloque en un servidor web y sea accedido por medio de
un navegador de internet, este sea el primer archivo en cargarse. A partir de
este se redirige hacia cualquier otro formulario.

Success.html: Este archivo contiene la pantalla que se muestra si el registro del


formulario ha sido exitoso.

Fail.html: muestra un mensaje de error, en caso de que no se pueda completar


la inscripción en la base d datos.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 233


LENGUAJE DE PROGRAMACIÓN III

estilos.css: contiene las instrucciones para el estilo de la interfaz gráfica. Los


colores, degradados, tamaño de texto, justificación, etc, se establecen en este
fichero.

registro.php: contiene la programación que captura los datos y los envía a la


base de datos MySQL.
index
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Formulario de Registro SCIII</title>
<link href="estilos.css" rel="stylesheet" type="text/css">
</head>

<body>
<div class="group">
<form action="registro.php" method="POST">
<h2><em>Formulario de Registro</em></h2>

<label for="nombre">Nombre <span><em>(requerido)</em></span></label>


<input type="text" name="nombre" class="form-input" required/>

<label for="apellido">Apellido
<span><em>(requerido)</em></span></label>
<input type="text" name="apellido" class="form-input"
required/>

<label for="email">Email <span><em>(requerido)</em></span></label>


<input type="email" name="email" class="form-input" />
<center> <input class="form-btn" name="submit" type="submit"
value="Suscribirse" /></center>
</p>
</form>
</div>
</body>
</html>

registro
<?php
$db_host="localhost";
$db_user="nombre_de_usuario";
$db_password="contraseña";
$db_name="nombre_de_base_de_datos";
$db_table_name="nombre_de_tabla";
$db_connection = mysql_connect($db_host, $db_user, $db_password);

if (!$db_connection) {
die('No se ha podido conectar a la base de datos');
}
$subs_name = utf8_decode($_POST['nombre']);
$subs_last = utf8_decode($_POST['apellido']);
$subs_email = utf8_decode($_POST['email']);

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 234


LENGUAJE DE PROGRAMACIÓN III

$resultado=mysql_query("SELECT * FROM ".$db_table_name." WHERE Email =


'".$subs_email."'", $db_connection);
if (mysql_num_rows($resultado)>0)
{
header('Location: Fail.html');
} else {
$insert_value = 'INSERT INTO `' . $db_name . '`.`'.$db_table_name.'`
(`Nombre` , `Apellido` , `Email`) VALUES ("' . $subs_name . '", "' .
$subs_last . '", "' . $subs_email . '")';

mysql_select_db($db_name, $db_connection);
$retry_value = mysql_query($insert_value, $db_connection);

if (!$retry_value) {
die('Error: ' . mysql_error());
}

header('Location: Success.html');
}
mysql_close($db_connection);

?>

7.5. ELABORAR UN CRUD A LA BASE DE DATOS.

CRUD, método de programación que posibilita las acciones de crear, leer,


actualizar y borrar elementos u objetos, que podrían representar tablas en una
base de datos por ejemplo.
PHP, lenguaje de programación orientado principalmente para entornos web.
MySQL, sistema de gestión de bases de datos relacional, multihilo y
multiusuario con más de seis millones de instalaciones…
PDO, extensión que posibilita realizar conexiones y modificaciones en las
bases de datos de manera segura.

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 235

Você também pode gostar