DESARROLLO DE SOFTWARE -...

235
SERVICIO NACIONAL DE ADIESTRAMIENTO EN TRABAJO INDUSTRIAL MANUAL DE APRENDIZAJE CÓDIGO: 89001709 Profesional Técnico LENGUAJE DE PROGRAMACIÓN III DESARROLLO DE SOFTWARE

Transcript of DESARROLLO DE SOFTWARE -...

SERVICIO NACIONAL DE ADIESTRAMIENTO EN TRABAJO INDUSTRIAL

MANUAL DE APRENDIZAJE

CÓDIGO: 89001709

Profesional Técnico

LENGUAJE DE PROGRAMACIÓN III

DESARROLLO DE SOFTWARE

LENGUAJE DE PROGRAMACIÓN III

ÍNDICE

TAREA N° CONTENIDO N° PÁG.

I. ESTABLECER LO SFUNDAMENTOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS (POO). 6

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

III. CONFIGURAR LAS IMPRESIONES Y REPORTES EN APLICACIONES WINDOWS FORM. 90

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

VII ELABORAR APLICACIONES WEB CON CONEXIÓN A BASE DE DATOS CON PHP. 215

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 PHP. 221

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.

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.

Capa de

Aplicación

Capa de la Lógica de

Conjunto de Datos

Adaptador Conexión

Capa de

Origen de

Origen de

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 12

LENGUAJE DE PROGRAMACIÓN III 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:

Formularios Windows ASP.Net y Formularios Web

System.Data

Conjunto de Datos

Proveedor de Acceso a Datos

Bases de Datos

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 13

LENGUAJE DE PROGRAMACIÓN III 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.

DataSet

DataTableCollection

DataTable

DataRowCollection DataRow

DataColumnCollection DataColumn

ConstraintCollection Constraint

DataRelationCollection DataRelation

ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 14

LENGUAJE DE PROGRAMACIÓN III

.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.

Proveedor de Datos .Net

Connection

Transaction

Command

Parameters

DataReader

DataAdapter

SelectComman

InsertCommand

UpdateComman

DeleteComman

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.

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

DataReader Command

Connection Origen de Datos

Aplicación

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:

Dato

Dato

Conjunto de

Aplicación

DataAdapter

SelectCommand

InsertComman

DeleteComman

UpdateComman

Connection

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

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”.

Aplicación

DataSet

Proveedor de Acceso a Datos

DataReader

Command DataAdapte

Connection

Base de Datos

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. • 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.

Aplicación CTelefono

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.

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

Elemento

Propiedad

Objeto de Enlace

Sincronización

Objeto

Propiedad

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_telefono,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','[email protected]') Insert Into Clientes Values (2,'Global Supply S.A.','20398727641','Calle la Coruña 319 - La Perla - Callao','3198564','[email protected]') Insert Into Clientes Values (3,'CORSEM S.R.L.','20654387019','Calle Santa Enma 980 - Cercado de Lima','3760632','[email protected]') /* 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','[email protected]','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,'[email protected]') Insert Into Alumnos Values ('Raúl','Okada','Febres','40372432','19','07/05/1996','Calle Shell # 343',2,'[email protected]') Insert Into Alumnos Values ('David','Cubas','Rosas','43659087','20','10/06/1995','Av. José Bustamante # 123',2,'[email protected]') Insert Into Alumnos Values ('Rosa','Corrales','Ortiz','49362865','18','05/01/1997','Calle Amazonas # 169',3,'[email protected]') Insert Into Alumnos Values ('Manuel','Huaman','Pacheco','44328909','20','12/11/1995','Av. Riva Agüero # 189',5,'[email protected]') Insert Into Alumnos Values ('Sara','Cabrera','Gonzales','44536721','19','09/07/1996','Calle Los Pinos # 287',6,'[email protected]') Insert Into Alumnos Values ('Christian','Moran','Sans','44376098','20','10/03/1995','Calle Los Jazmines # 564 ',7,'[email protected]') Insert Into Alumnos Values ('Saul','Poma','Ramirez','40984375','18','05/01/1997','Av. José Leal # 342',8,'[email protected]') Insert Into Alumnos Values ('Angie','Rosas','Vasquez','44560914','19','23/06/1996','Av. Parque de la Reserva # 590',9,'[email protected]') Insert Into Alumnos Values ('José','Pariona','García','40348798','20','20/10/1995','Calle Los Girasoles # 154',10,'[email protected]') Insert Into Alumnos Values ('Erick','Camones','Paucar','44300098','20','27/11/1995','Calle Santa Enma # 163',1,'[email protected]') Insert Into Alumnos Values ('Magally','Parra','Egg','44334856','19','15/10/1996','Av. Camino Real # 1034',3,'[email protected]') Insert Into Alumnos Values ('Ciro','Rodriguez','Guzman','44388876','20','12/08/1995','Av. Sucre # 232',4,'[email protected]') /* 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_fechanac,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,'[email protected]') Insert Into Profesor Values ('Dora','Baca Revolledo','44732109','12/06/1979','Los Pinos 320',2,'[email protected]') Insert Into Profesor Values ('Marcos','Salas Durant','44328877','21/10/1978','Calle 7 de Junio',3,'[email protected]') Insert Into Profesor Values ('Susan','Varillas Ascues','44325643','14/07/1979','Calle los Cipreses 454',4,'[email protected]') /* 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,@prodiscodigo,@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,Matriculas.sem_observacion,Matriculas.sem_pagototal, Semestre.sem_descripcion,Alumnos.alu_nombre,Alumnos.alu_apellidopat,Alumnos.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

System

ArgumentNullException, ArgumentOutOfRangeException, DivideByZeroException, IndexOutOfRangeException, NullReference-Exception, OverflowException, StackOverflowException

System.IO

DirectoryNotFoundException, EndOfStreamException, FileNotFoundException, PathTooLongException, FileLoadException, DriveNotFoundException

System.Data

DuplicateNameException, InvalidConstraintException, InvalidExpressionException, MissingPrimaryKeyException, NoNullAllowedException, ReadOnlyException

System.Runtime.InteropServices InvalidComObjectException, 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