DESARROLLO DE SOFTWARE
|
|
|
- Juan Quintana Moreno
- hace 8 años
- Vistas:
Transcripción
1 SERVICIO NACIONAL DE ADIESTRAMIENTO EN TRABAJO INDUSTRIAL DESARROLLO DE SOFTWARE MANUAL DE APRENDIZAJE LENGUAJE DE PROGRAMACIÓN III CÓDIGO: Profesional Técnico
2
3
4
5 ÍNDICE TAREA N CONTENIDO N PÁG. I. ESTABLECER LO SFUNDAMENTOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS (POO) Definir el concepto de POO Configurar objetos ADO.NET en una aplicación Windows Forms Diseñar bibliotecas de clases con Visual BASIC.NET 24 II. ACCEDER A BASES DEDATOS UTUILIZANDO VISUAL BASIC.NET Acceder a bases de datos utilizando VISUAL BASIC.NET Acceder y manipular datos utilizando DATASET Configurar y utilizar controles de datos de VISUALBASIC.NET Desarrollar casos prácticos de controles con acceso a datos. 75 III. CONFIGURAR LAS IMPRESIONES Y REPORTES EN APLICACIONES WINDOWS FORM Imprimir desde una aplicación Windows Form Configurar los diálogos de impresión y configuración de página Reportes con Report Manager. 101 IV. ACCEDER AL SISTEMA DE ARCHIVOS Trabajar con unidades de disco, carpetas y archivos Obtener las propiedades de una carpeta o archivo Comprimir y descomprimir archivos con VisualBasic.NET (VBN). 164 V. ELABORAR PRUEBAS Y DEPURCIÓN DE ERRORES 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 VBN. 182 VI. DISTRIBUIIR LAS APLICACIONES WINDOWS ELABORADAS CON VBN Crear un proyecto de instalación utilizando el asistente Crear accesos directos en el escritorio y menú del usuario activo Desarrollar aplicaciones con conexión remota. 211 VII ELABORAR APLICACIONES WEB CON CONEXIÓN A BASE DE DATOS CON PHP 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. 235 ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 5
6 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 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
7 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
8 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
9 - 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
10 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
11 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 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
12 requiera se volverá a establecer la conexión y se actualizara el conjunto de datos de la memoria. El formato de transferencia es XML, esta representación no utiliza información binaria, si no que se basa en texto, lo que permite ser enviada mediante cualquier protocolo HTTP. Componentes de ADO.Net: ADO.Net es un conjunto de clases que pertenecen al espacio System.Data para acceso a los datos de un Origen de Datos, es decir ADO.Net proporciona un conjunto de componentes para crear aplicaciones distribuidas de uso compartido de datos. Estos componentes se encuentran diseñados para separar el acceso a los datos de la manipulación de los mismos. Estos componentes son los siguientes: - DataSet (Net Framework), que es un conjunto de componentes, dentro de los que destacan son Connection para la conexión, Command para las ordenes o comandos, DataReader para la lectura de los datos y DataAdapter para el adaptador de datos. Capa de Capa de la Lógica de Conjunto de Datos Capa de Origen de Aplicación Adaptador Conexión Origen de Se puede decir que el trabajo de conexión con la base de datos o la ejecución de una sentencia SQL determinada para recuperar datos de la base de datos, lo realizara el proveedor de acceso a datos; en cambio el hecho de recuperar esos datos para manipularlos, tratarlos o volcarlos a un determinado control o dispositivo es una acción ejecutada por una capa superior formada por un conjunto de datos agrupados en tablas. ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 12
13 Formularios Windows ASP.Net y Formularios Web System.Data Conjunto de Datos Proveedor de Acceso a Datos Bases de Datos Manejo de Capas: Conjunto de Datos: Un Formulario WindowsForm, para acceder a los datos de un origen de datos, lo que realiza es utilizar un adaptador de datos para leer la información de la base de datos y poder almacenarla en un conjunto de datos. También se puede interactuar directamente con la base de datos utilizando un objeto de órdenes para acceso a los datos, que incluya una sentencia SQL o una referencia a un procedimiento almacenado. Un conjunto de datos puede incluir una o más tablas que se basan en el origen de datos, así mismo guarda información sobre las relaciones entre ellas y las restricciones. Estas partes se muestran al programador mediante propiedades y colecciones. El componente principal para la arquitectura sin conexión es la clase de objetos DataSet (Conjunto de Datos) que pertenece al espacio System.Data que se podrá utilizar con diferentes orígenes de datos. DataSet incluye la colección DataTableCollection de objetos DataTable (Filas de las Tablas), a la cual se podrá tener acceso a través de la propiedad Tables del DataSet y la colección DataRelationColletion del objeto DataRelation (Relaciones entre tablas). Así mismo la clase DataTable incluye la colección DataRowCollection de objetos DataRow (Filas de las Tablas), la colección DataColumnCollection de objetos DataColumn (Columna de Datos) y la colección ConstraintCollection de objetos Constraint (Restricciones). La representación de un DataSet seria de la siguiente manera: ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 13
14 DataSet DataTableCollection DataTable DataRowCollection DataRow DataColumnCollection DataColumn ConstraintCollection Constraint DataRelationCollection DataRelation La Clase DataRow incluye la propiedad RowState, que permitirá si la fila cambio y de qué manera, desde que la tabla de datos se cargó por primera vez. Los valores que puede tomar esta propiedad son Added, Deleted, Modified y Unchanged. Proveedor de Datos: Teniendo en cuenta el.net Framework, un proveedor de datos es utilizado como puente entre una aplicación y un origen de datos, que se podrá utilizar para recuperar datos desde el origen de datos para poder actualizarlos. Los componentes principales de un proveedor de datos.net son: - Conexión con el Origen de Datos, esto se realiza con el objeto Connection la cual establecerá una conexión a un origen de datos seleccionado. - Orden para el acceso a los datos, esto se realiza con el objeto Command el cual permite ejecutar una orden SQL o un Procedimiento Almacenado para el origen de datos. - Lector de Datos, esto se realiza mediante el objeto DataReader, el cual permite de una forma rápida el acceder a los datos recuperados después de una consulta a la base de datos. Este acceso es solo de lectura. - Adaptador de Datos, esto se realiza mediante el objeto DataAdapter, el cual permite llenar un DataSet y realizar las actualizaciones necesarias en el origen de datos. ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 14
15 Proveedor de Datos.Net Connection Transaction Command Parameters DataAdapter SelectComman InsertCommand UpdateComman DataReader DeleteComman.Net incluye los proveedores de datos ODBC, OLE DB, Oracle y SQL Server, que se utilizan mediante los espacios System.Data.Odbc, System.Data.OleDb, System.Data.OracleClient y System.Data.SqlClient. Cada tipo de datos tiene sus propias clases Connection, Command, DataReader y DataAdapter para cada sistema de gestión de datos SGBD; por ejemplo si se necesita crear una conexión SQL se utilizara SqlConnection. El proveedor Odbc permite conectar a diferentes orígenes de datos utilizando los orígenes ODBC, el proveedor OleDb permite conectar a orígenes a través de OLE DB, el proveedor OracleClient es un proveedor de acceso a datos nativo especialmente diseñado para bases de datos Oracle, y por último el proveedor SqlClient es un proveedor de acceso a datos nativo, que permite conectarnos con orígenes de datos Ms SQL Server. También hay otros motores de bases de datos como son PostgresSQL, MySQL, AS/400, etc. Para ello se deberá de trabajar con System.Data.Common que proporciona clases para la creación de objetos DbProviderFactory para trabajar con orígenes de datos específicos. ADO.Net ofrece diferentes modelos para la conexión a los orígenes de datos, pero a pesar de los diferentes proveedores de datos, todos ellos se han estandarizado de la misma manera. Cada proveedor se basa en el mismo conjunto de interfaces y clases base. Cada objeto Connection implementa la interfaz IDbConnection, que define los métodos básicos, tales como Open y Close. Objeto Conexión: Cuando se establece una conexión a un origen de datos ADO.Net se utiliza el objeto Connection. Para establecer una conexión Ms SQL Server se utilizara SqlConnection y para conectarse a un origen de datos OLE DB se utiliza OleDbConnection y para conectarse a un origen de datos Oracle se utilizara el objeto OracleConnection. ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 15
16 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
17 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
18 'SQL Server Dim lector As SqlDataReader = ordensql.executereader() Objeto Lector de Datos: Cuando se necesite leer datos y no manipularlos, no será necesario almacenarlos en un conjunto de datos, solo se necesita utilizar un objeto lector de datos. Este objeto lector obtiene los datos del origen de datos y los pasa de manera directa a la aplicación, un adaptador de datos utiliza un objeto lector de datos para llenar un conjunto de datos. El objeto lector en.net para SQL Server es SqlDataReader y para OLE DB es OleDbDataReader. Aplicación DataReader Command Origen de Datos Connection Ejemplo de cómo utilizar un lector de datos proporcionado por la orden SQL SELECT: 'OLEDB Conexion.Open() Dim lector As OleDbDataReader = ordensql.executereader() While (lector.read()) Console.WriteLine(lector.GetString(0) + ", " + _ lector.getstring(1)) End While lector.close() conexion.close() 'SQL Server Conexion.Open() Dim lector As SqlDataReader = ordensql.executereader() While (lector.read()) Console.WriteLine(lector.GetString(0) + ", " + _ lector.getstring(1)) End While lector.close() conexion.close() El método Read desplaza el cursor del DataReader, de sólo lectura y avance hacia delante, hasta el siguiente registro. La posición inicial es antes del primer registro, por lo tanto, se debe llamar a Read para iniciar el acceso a los datos. Una vez finalizada la lectura se debe llamar al método Close para liberar el DataReader de la conexión, objeto Connection. Para poder recuperar las columnas de la fila actual del conjunto de datos proporcionado por el DataReader, se puede utilizar la funcionalidad ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 18
19 proporcionada por este objeto. GetValue obtiene el valor de la columna especificada en su formato nativo, GetValues rellena la matriz de objetos pasada como un argumento con los valores de la fila actual, GetString obtiene el valor de la columna especificada como cadena, GetInt32 obtiene el valor de la columna especificada como un entero de 32 bits con signo, etc. Adaptador de Datos: Es un conjunto de objetos utilizado para intercambiar datos entre un origen de datos y un conjunto de datos que viene a ser un DataSet. Esto quiere decir que una aplicación leerá los datos de una base de datos para un conjunto de datos para poder manipularlos. En algunas oportunidades se volverá a escribir en la base de datos los datos modificados del conjunto de datos. Para base de datos OLE DB, se utilizara OleDataAdapter junto con sus objetos OleDbCommand y OleDbConnection de manera conjunta. Para bases de datos ODBC se utilizara OdbcDataAdapter junto con los objetos OdbcCommand y OdbcConnection. Para bases de datos Ms SQL Server se utilizara SqlDataAdapter con sus objetos SqlCommand y SqlConnection. Para bases de datos Oracle se utilizara OracleDataAdapter con sus objetos OracleCommand y OracleConnection; del espacio de nombres System.Data.OleDb, System.Data.Odbc, System.Data.SqlClient y System.Data.OracleClient. Cada adaptador de datos intercambia datos entre una sola tabla de un origen de datos y un solo objeto DataTable (tabla de datos) del conjunto de datos. Lo que se entiende es que se deberá de utilizar el objeto DataTable tantas veces como tablas se tengan en el conjunto de datos. De esta manera cada tabla del conjunto de datos tendrá su correspondiente tabla en el origen de datos. Llenado de un DataSet: Conjunto de DataAdapter Dato SelectCommand InsertComman Connection Dato DeleteComman UpdateComman Aplicación Origen de Datos ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 19
20 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
21 Aplicación DataSet Proveedor de Acceso a Datos DataReader Command DataAdapte Connection Base de Datos En algunos casos es bueno trabajar estando la aplicación conectada a la base de datos. Para ello se utiliza el objeto DataReader, pero este objeto tiene algunas particularidades que son: - El objeto DataReader recupera un conjunto de valores llenando un pequeño búfer de datos. - Si los registros del búfer se terminan, el DataReader regresa a la base de datos para recuperar más registros. Si el servicio de SQL Server estuviera detenido en ese momento, o el origen de datos estuviera en la misma condición, la aplicación generaría un error a la hora de leer el siguiente registro. El DataReader es un objeto conectado, pero que trabaja en segundo plano con un conjunto de datos. PROBANDO UNA CONEXIÓN: Cuando ya se ha creado la Base de Datos y se ha definido la cadena de conexión, se deberá de crear el objeto Conexión y utilizar los métodos Open y Close para abrir y cerrar dicha Conexión. Para este fin se desarrollara el siguiente ejemplo el cual contendrá un botón de comando que permitirá abrir y cerrar la Conexión a la base de datos, y mostrando el estado en la misma ventana, así mismo mostrara la versión del SQL Server utilizado. Crear un Nuevo Proyecto en Visual Basic, del tipo Windows, Aplicación de Windows Forms. ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 21
22 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
23 'Crear la Conexión Dim Conexion As String = "Data Source=DESKTOP-FRUVH1J\SQLEXPRESS;" & "Initial Catalog=InstitutoSenati; Uid=sa; Password=root" con = New SqlConnection(Conexion) 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 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
24 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
25 Los datos que se mostrarán en el formulario procederán de un objeto de una clase CTelefono y deberán de estar sincronizados. Aplicación CTelefono Crear una carpeta Clases en el Proyecto: Dentro de la carpeta Clases se deberá generar la Clase CTelefono que va a representar los datos que muestra el formulario. ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 25
26 Public Class CTelefono Private _nombre As String = "Un nombre" Private _telefono As String = " " 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
27 txtnombre.text = objtfno.nombre txttelefono.text = objtfno.telefono ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). 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 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 = " " txtnombre.text = objtfno.nombre txttelefono.text = objtfno.telefono 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
28 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 Private Sub txttelefono_textchanged(sender As Object, e As EventArgs) Handles txttelefono.textchanged objtfno.telefono = txttelefono.text 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
29 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 = " " Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged Private Sub NotificarCambio(nombreProp As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(nombreProp)) 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
30 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 = " " 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(). 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 Class ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 30
31 Nota: Ejercicio N 3 del Capítulo 1 del Manual; nombre aplicación: EnlaceDatos2 Enlace de Datos con las Clases de Visual.Net Se puede decir que el enlace de datos es un mecanismo que establece una conexión entre la interfaz gráfica del usuario (Formulario) y los datos que pueden proporcionar las Bases de Datos de diferentes proveedores. Este mecanismo permite que los elementos que están enlazados a los objetos de datos muestren los cambios de manera automática cuando estos cambian su valor y a su vez cuando los elementos de la interfaz cambian su valor. La base para este mecanismo es vincular o enlazar pares de propiedades y proveer un mecanismo de notificación de cambios; Visual.Net sigue el mismo mecanismo pero deja todo el proceso de sincronización y conversión de los datos para el objeto de enlace, el proceso de enlace es proporcionado por la clase Binding. Elemento Propiedad Objeto de Enlace Sincronización Objeto Propiedad Los componentes de los enlaces son los siguientes: - Un objeto destino del Enlace. El Elemento. - Propiedad de Destino. Propiedad del Elemento. - Objeto origen del Enlace. El Objeto. - Ruta de Acceso, al valor que se va a utilizar del objeto origen del enlace. Propiedad del Objeto. En una aplicación la ruta podría ser determinada por una variable o en un cuadro de texto. En el ejemplo anterior el enlace es una caja de texto, la ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 31
32 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
33 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
34 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
35 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
36 Public Class CTelefono Private _nombre As String = "Un nombre" Private _telefono As String = " " 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")) Private Sub btdatos_click(sender As Object, ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 36
37 e As EventArgs) Handles btdatos.click Dim sdatos As String = objtfno.nombre & vblf & objtfno.telefono MessageBox.Show(sDatos) Private Sub btmodificar_click(sender As Object, e As EventArgs) Handles btmodificar.click objtfno.nombre = "José Gonzales" objtfno.telefono = " " 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
38 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 = Si lo que se desea es que el número de teléfono que está almacenado en Decimal, se muestre con el formato , 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 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
39 Catch ex As Exception MessageBox.Show("Introducir el Teléfono sin Espacios") End Try End If 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("# ") End If 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
40 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 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
41 - 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
42 - 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( , ))) Next Return _telefonos End Function ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 42
43 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") 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 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() 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 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 ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 43
44 Nota: Ejercicio N 5 del Capítulo 1 del Manual; nombre aplicación: Binding_Source ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 44
45 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 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 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
46 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
47 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
48 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 Public Overrides Function ToString() As String Return NomAlumno ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 48
49 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)) 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 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
50 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 Public Overrides Function ToString() As String Return NomAsignatura End Function Public Sub New() Me.New(-1, "", -1) Public Sub New(id As Integer, nomasig As String, nt As Single) IdAsignatura = id NomAsignatura = nomasig Nota = nt 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
51 _listaasignaturas = value End Set End Property Public Sub New() Tipo = "" ListaAsignaturas = New BindingList(Of Asignatura)() ListaAsignaturas.Add(New Asignatura(-1, " Asignatura?", 0.0F)) Public Sub New(tipo 1 As String, lista As BindingList(Of Asignatura)) Tipo = tipo 1 ListaAsignaturas = lista End Class - Clase bbdd.vb Imports System.Collections.ObjectModel Imports System.ComponentModel Imports System.Windows.Forms Public Class bbdd Shared Sub New() ObtenerAlumnos() 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 * , 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 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
52 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 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
53 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
54 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
55 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
56 Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load ListAlumnosBindingSource.DataSource = bbdd.alumnos 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
57 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',' ','20','Jr. Arequipa Cercado de Lima') Insert Into Alumnos Values (2, 'José','Gonzales','Rivera','Masculino',' ','21','Av. José Leal Lince') Insert Into Alumnos Values (3, 'María','Gutierrez','Landeo','Femenino',' ','19','Calle Santa Paula 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
58 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
59 - 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) 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
60 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) 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 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
61 txtapepat.enabled = False txtapemat.enabled = False txtsexo.enabled = False txttelefono.enabled = False txtedad.enabled = False txtdireccion.enabled = False 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 = "" 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() Private Sub btguardar_click(sender As Object, e As EventArgs) Handles btguardar.click 'Ejecutamos la Instrucción para Guardar los Datos en la tabla Alumnos Dim sql As String = "Insert Into Alumnos(alu_codigo,alu_nombre,alu_apepaterno,alu_apematerno,alu_sexo,alu_tele fono,alu_edad,alu_direccion) Values ('" + Me.txtCodigo.Text + "','" + Me.txtNombre.Text + "','" + Me.txtApePat.Text + "','" + Me.txtApeMat.Text + "','" + Me.txtSexo.Text + "','" + Me.txtTelefono.Text + "','" + Me.txtEdad.Text + "','" + Me.txtDireccion.Text + "')" If Claseob.Insertar(sql) Then MessageBox.Show("Registro Guardado") 'Restauramos la Aplicación Application.Restart() Else MessageBox.Show("Error al Guardar") End If 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
62 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() 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 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 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 Private Sub btcancelar_click(sender As Object, e As EventArgs) Handles btcancelar.click ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 62
63 '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 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_ Varchar(50) ) /* Insertar tres Registros a la Tabla Cliente */ Insert Into Clientes Values (1,'Swordfish Group S.A.C.',' ','Jr. Arica La Merced',' ','[email protected]') Insert Into Clientes Values (2,'Global Supply S.A.',' ','Calle la Coruña La Perla - Callao',' ','[email protected]') Insert Into Clientes Values (3,'CORSEM S.R.L.',' ','Calle Santa Enma Cercado de Lima',' ','[email protected]') /* Visualizar los Datos */ Select * From Clientes ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 63
64 - 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
65 - 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
66 - 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
67 - 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
68 - 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
69 - 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
70 /* 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
71 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() 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 '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
72 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 Private Sub btlistado_click(sender As Object, e As EventArgs) Handles btlistado.click frmlistar.show() Me.Hide() Private Sub txtbuscar_textchanged(sender As Object, e As EventArgs) Handles txtbuscar.textchanged End Class ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 72
73 - 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 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
74 '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) Private Sub btretornar_click(sender As Object, e As EventArgs) Handles btretornar.click frmbuscarproducto.show() Me.Hide() 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
75 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
76 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
77 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',' ','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
78 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 integer ) As Select * From Alumnos Where alu_codigo Aplicación para Acceder a Datos Caso Practico 1 Login. Utilizando Procedimientos Almacenados. ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 78
79 - 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, 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 Varchar(20) ) As Insert Into Usuarios Values (@id,@nom,@ ,@pass) Go /* Procedimiento Almacenado para Visualizar Usuarios */ Create Procedure ver_usuarios 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
80 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 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 txt 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
81 - 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 lblusuario Text Usuario - 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, , 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
82 conexion = New SqlClient.SqlConnection conexion.connectionstring = ("server=desktop-fruvh1j\sqlexpress; database=registros; uid=sa; password=root") conexion.open() Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btregistrar.click Me.Hide() frmregistrar.show() Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btingresar.click Call Me.verificar() 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.lblusuario .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 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
83 Dim res As Integer, nom, , 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() Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btcancelar.click Me.Close() frmlogin.show() Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btgrabar.click Call Me.verificar1() 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 txt .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 txt .text <> "" And txtpassword.text <> "" Then Call Me.registrar() Me.Hide() frmlogin.show() End If Private Sub registrar() id = txtid.text nom = txtnombre.text = txt .text pass = txtpassword.text sql = "exec ver_usuarios'" + id + "'" conectar() ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 83
84 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 + "','" + + "','" + pass + "'" conectar() com = New SqlClient.SqlCommand(sql, conexion) res = com.executenonquery conexion.close() MsgBox("Felicidades ya puede Logearse", MsgBoxStyle.Information, "Datos Ingresados") End If Private Sub frmregistrar_load(sender As Object, e As EventArgs) Handles MyBase.Load 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 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
85 - 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
86 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
87 '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 </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
88 '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
89 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
90 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 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
91 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
92 - 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
93 MsgBox(ex.ToString, MsgBoxStyle.Critical, "Error al Imprimir") End Try Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Private Sub btimprimir_click(sender As Object, e As EventArgs) Handles btimprimir.click 'Llamar a la Función Imprimir Call Imprimir() 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: Modulo 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
94 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
95 Insert Into Alumnos Values('José','Gonzales','Huayta',' ','20','Jr. Soledad 345',1) Insert Into Alumnos Values('Angélica','Ramirez','Zurita',' ','19','Calle Riva Agüero 123',2) Insert Into Alumnos Values('María','Gutierrez','Rivas',' ','18','Calle Santa Paula 279',3) Insert Into Alumnos Values('Raúl','Okada','Febres',' ','19','Calle Shell 232',4) Insert Into Alumnos Values('Miguel','Morales','Villanueva',' ','20','Calle Libertad 323',5) Insert Into Alumnos Values('Marcia','Garcia','Cabrejos',' ','20','Av. José Porras 498',6) Insert Into Alumnos Values('Guillermo','Rosales','Tam',' ','18','Av. Arequipa 754',7) Insert Into Alumnos Values('Sandra','Guzman','Robles',' ','19','Av. José Leal 543',1) Insert Into Alumnos Values('Manuel','Oré','Huaman',' ','18','Av La Paz 234',2) Insert Into Alumnos Values('Paola','Celle','Rodriguez',' ','20','Calle Santa Enma 309',3) Insert Into Alumnos Values('Marcos','Cherre','Matias',' ','19','Calle Juan Fanning 353',4) Insert Into Alumnos Values('Jhon','Moran','Cabrera',' ','18','Av. El Ejercito 567',5) Insert Into Alumnos Values('Proscila','Egg','Davila',' ','20','Av. Brasil 2345',6) Insert Into Alumnos Values('David','Macalopu','Cubas',' ','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
96 - 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
97 - 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
98 - 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
99 - 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
100 - 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
101 Form2.Show() Me.Hide() - 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 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
102 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
103 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
104 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
105 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
106 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
107 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_ 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
108 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',' ','20','05/01/1995','Santa Paula # 279 Urb. Pando',1,'[email protected]') Insert Into Alumnos Values ('Raúl','Okada','Febres',' ','19','07/05/1996','Calle Shell # 343',2,'[email protected]') Insert Into Alumnos Values ('David','Cubas','Rosas',' ','20','10/06/1995','Av. José Bustamante # 123',2,'[email protected]') Insert Into Alumnos Values ('Rosa','Corrales','Ortiz',' ','18','05/01/1997','Calle Amazonas # 169',3,'[email protected]') Insert Into Alumnos Values ('Manuel','Huaman','Pacheco',' ','20','12/11/1995','Av. Riva Agüero # 189',5,'[email protected]') Insert Into Alumnos Values ('Sara','Cabrera','Gonzales',' ','19','09/07/1996','Calle Los Pinos # 287',6,'[email protected]') Insert Into Alumnos Values ('Christian','Moran','Sans',' ','20','10/03/1995','Calle Los Jazmines # 564 ',7,'[email protected]') Insert Into Alumnos Values ('Saul','Poma','Ramirez',' ','18','05/01/1997','Av. José Leal # 342',8,'[email protected]') Insert Into Alumnos Values ('Angie','Rosas','Vasquez',' ','19','23/06/1996','Av. Parque de la Reserva # 590',9,'[email protected]') Insert Into Alumnos Values ('José','Pariona','García',' ','20','20/10/1995','Calle Los Girasoles # 154',10,'[email protected]') Insert Into Alumnos Values ('Erick','Camones','Paucar',' ','20','27/11/1995','Calle Santa Enma # 163',1,'[email protected]') Insert Into Alumnos Values ('Magally','Parra','Egg',' ','19','15/10/1996','Av. Camino Real # 1034',3,'[email protected]') Insert Into Alumnos Values ('Ciro','Rodriguez','Guzman',' ','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
109 Select Alumnos.alu_codigo,Alumnos.alu_nombre,Alumnos.alu_apellidopat,Alumnos. alu_apeliidomat,alumnos.alu_docident,alumnos.alu_edad,alumnos.alu_fech anac,alumnos.alu_direccion,distritos.dis_descripcion,alumnos.alu_ 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
110 - 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
111 - 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
112 - 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
113 - 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
114 - 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
115 - 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
116 - 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
117 - 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
118 - 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
119 - 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
120 - 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() - 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
121 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_ 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
122 ) /* 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',' ','06/03/1978','Av. La Coruña 342',1,'[email protected]') Insert Into Profesor Values ('Dora','Baca Revolledo',' ','12/06/1979','Los Pinos 320',2,'[email protected]') Insert Into Profesor Values ('Marcos','Salas Durant',' ','21/10/1978','Calle 7 de Junio',3,'[email protected]') Insert Into Profesor Values ('Susan','Varillas Ascues',' ','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
123 /* 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
124 Procedimientos Almacenados: /* Crear los Procedimientos Almacenados para Insertar Registros */ /* Alumnos */ Create Procedure alta_alumnos Varchar(50) ) As Insert Into Alumnos Values Go /* Distritos */ Create Procedure alta_distritos Varchar(50) ) As Insert Into Distritos Values (@descripcion) Go /* Profesor */ Create Procedure alta_profesor Varchar(50) ) As Insert Into Profesor Values (@pronombre,@proapellidos,@prodni,@profechanac,@prodireccion,@prodisco digo,@pro ) Go /* Cursos */ Create Procedure alta_cursos Integer ) As Insert Into Cursos Values (@curdescripcion,@cursemestrecodigo) Go /* Matriculas */ ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 124
125 Create Procedure alta_matriculas 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 Integer ) As Select * From Alumnos Where alu_codigo=@alucodigo Go /* Distritos */ Create Procedure ver_distritos Integer ) As Select * From Distritos Where dis_codigo=@discodigo Go /* Profesor */ Create Procedure ver_profesor Integer ) As Select * From Profesor Where pro_codigo=@procodigo Go /* Semestre */ Create Procedure ver_semestre Integer ) As Select * From Semestre Where sem_codigo=@semcodigo Go /* Cursos */ Create Procedure ver_cursos Integer ) As Select * From Cursos Where cur_codigo=@curcodigo Go /* Costos */ ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 125
126 Create Procedure ver_costos Integer ) As Select * From Costos Where cos_codigo=@coscodigo Go /* Matriculas */ Create Procedure ver_matriculas Integer ) As Select * From Matriculas Where mat_codigo=@matcodigo Go /* Notas */ Create Procedure ver_notas Integer ) As Select * From Notas Where nota_codigo=@notacodigo Go /* Para Visualizar Vista */ Create Procedure ver_vwsemestrecosto integer ) as Select * from vw_semestrecosto Where sem_codigo=@semcodigo Go Select * from Matriculas /* Código para el Informe */ Select Matriculas.mat_codigo,Matriculas.mat_fecha,Matriculas.sem_codigo,Matri culas.sem_observacion,matriculas.sem_pagototal, Semestre.sem_descripcion,Alumnos.alu_nombre,Alumnos.alu_apellidopat,Al umnos.alu_apeliidomat From Matriculas Inner join Alumnos on Matriculas.alu_codigo=Alumnos.alu_codigo Inner join Semestre on Matriculas.sem_codigo=semestre.sem_codigo where Matriculas.mat_codigo=@parametro order by Matriculas.alu_codigo - Crear un Nuevo Proyecto en Visual Basic ReporteParametros. ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 126
127 - 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
128 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
129 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
130 - 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
131 - 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
132 - 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
133 - 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
134 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
135 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 = " " '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 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() Private Sub btretornar_click(sender As Object, e As EventArgs) Handles btretornar.click frmpagomatricula.show() Me.Hide() 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
136 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 Private Sub cbsemestre_click(sender As Object, e As EventArgs) Handles cbsemestre.click txtobservacion.enabled = True txtobservacion.focus() 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 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
137 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 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 Private Sub btsalir_click(sender As Object, e As EventArgs) Handles btsalir.click End 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() 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
138 btimprimir.focus() btguardar.enabled = False 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 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 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
139 - 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
140 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 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
141 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
142 - 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
143 End If 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 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
144 - 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 ' 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
145 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 Private Sub btcargarcarpetas_click(sender As Object, e As EventArgs) Handles btcargarcarpetas.click cargarcarpetas(txtcarpeta.text) 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 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
146 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
147 - 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 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
148 txtcarpetadestino.text = FolderBrowserDialog1.SelectedPath + "\" + CStr(OpenFileDialog1.SafeFileName) End If 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 Private Sub btsalir_click(sender As Object, e As EventArgs) Handles btsalir.click Me.Close() 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
149 - 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
150 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
151 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) 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) 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) 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) ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 151
152 Private Sub CalculadoraToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CalculadoraToolStripMenuItem.Click Shell("explorer.exe root=c:\windows\system32\calc.exe", vbnormalfocus) Private Sub PointToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PointToolStripMenuItem.Click Shell("explorer.exe root=c:\windows\system32\mspaint.exe", vbnormalfocus) Private Sub RptFacturaToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RptFacturaToolStripMenuItem.Click Shell("explorer.exe root=c:\reportesmanual\rpt_pagomatricula.rep", vbnormalfocus) Private Sub RptAlumnosToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RptAlumnosToolStripMenuItem.Click Shell("explorer.exe root=c:\reportesmanual\rpt_alumnosdistrito.rep", vbnormalfocus) 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
153 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
154 My.Computer.FileSystem.CopyFile(foundFile, "C:\TestFolder1\" & foundfile) Next 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) 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) 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") 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") 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) 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 ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 154
155 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 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") 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) 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 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") 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") 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) ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 155
156 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") 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) 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) 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 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 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)) 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") 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
157 My.Computer.FileSystem.MoveDirectory("C:\Dir1", "C:\Dir2", True) 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 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) 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) 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 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
158 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 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
159 - 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 & ".") 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) 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 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) ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 159
160 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) 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.") 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) 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 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 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 Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 160
161 Dim getinfo As System.IO.DirectoryInfo getinfo = My.Computer.FileSystem.GetDirectoryInfo _ ("C:\Documents and Settings") MsgBox("El Directorio fue Creado " & getinfo.creationtime) 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 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 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 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 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) 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) ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 161
162 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) 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) 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)) 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) Private Sub Button22_Click(sender As Object, e As EventArgs) Handles Button22.Click Dim systemdirectory As String systemdirectory = System.Environment.SystemDirectory 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
163 ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 163
164 Nota: Ejercicio N 6 del Capítulo 4 del Manual; nombre de la aplicación: PropiedadesArchivos 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: 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
165 - 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
166 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 '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 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
167 Extraer() Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btcomprimir.click 'Llamada a la Función Comprimir Comprimir() 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
168 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 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
169 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
170 - 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 ESTABLECER PUNTOS DE RUPTURA. Interrupción de código mediante Puntos de Interrupción: ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 170
171 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
172 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
173 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 System System.IO System.Data System.Runtime.InteropServices Excepción ArgumentNullException, ArgumentOutOfRangeException, DivideByZeroException, IndexOutOfRangeException, NullReference- Exception, OverflowException, StackOverflowException DirectoryNotFoundException, EndOfStreamException, FileNotFoundException, PathTooLongException, FileLoadException, DriveNotFoundException DuplicateNameException, InvalidConstraintException, InvalidExpressionException, MissingPrimaryKeyException, NoNullAllowedException, ReadOnlyException 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
174 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
175 '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 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
176 - 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 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
177 - 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
178 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 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
179 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 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
180 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
181 '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 Private Sub btsalir_click(sender As Object, e As EventArgs) Handles btsalir.click End 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
182 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
183 - 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
184 - 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
185 - 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
186 - Se muestra la Instrucción SQL. Siguiente. SELECT FROM Articulos.* 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
187 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
188 - 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
189 Throw New DataException(e.Row.GetColumnError(e.Column)) End If End Select 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
190 - 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 Case DataRowState.Modified r.costo = r.costo End Select Next ta.update(ds.articulos) ds.acceptchanges() Catch ex As Exception ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 190
191 Throw End Try 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
192 - 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
193 - 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
194 - 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
195 - 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
196 - 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
197 - 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 - 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
198 - 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 - 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
199 - 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 - 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
200 - 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
201 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 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 Varchar(10) ) As Select * From Users ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 201
202 Where 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() 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
203 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 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click End Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call Me.Verificar() 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
204 - 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
205 - 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
206 - 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
207 - 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
208 - 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
209 - 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
210 - 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
211 - 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
212 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 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
213 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 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=" </Client> </application> </system.runtime.remoting> </configuration> ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 213
214 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) 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
215 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 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: 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
216 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: Server Name: Administrator s Address: el , no es necesario. Run when started manually, only for me. Seleccionamos esta opción. La IP 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 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_ 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: Server Name: Administrator s Address: el no es necesario. For All Users, on Port 80, as a Service: seleccionar esta opción. La IP 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 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
217 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 , es: PHP 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 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
218 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
219 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 ] = ; Se puede ingresar el localhost o , 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, 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 (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
220 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" " <html> <head> <title>ejemplo</title> </head> <body> <?php echo " Hola, soy un script de PHP!";?> ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 220
221 </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 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
222 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
223 <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
224 // 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á ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 224
225 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
226 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
227 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
228 <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
229 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
230 { 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
231 <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
232 <!-- 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
233 $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
234 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=" "> <span><em>(requerido)</em></span></label> <input type=" " name=" " 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_ = utf8_decode($_post[' ']); ESCUELA DE TECNOLOGÍAS DE LA INFORMACIÓN 234
235 $resultado=mysql_query("select * FROM ".$db_table_name." WHERE = '".$subs_ ."'", $db_connection); if (mysql_num_rows($resultado)>0) { header('location: Fail.html'); } else { $insert_value = 'INSERT INTO `'. $db_name. '`.`'.$db_table_name.'` (`Nombre`, `Apellido`, ` `) VALUES ("'. $subs_name. '", "'. $subs_last. '", "'. $subs_ . '")'; 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
Ing Eddy Ruiz Largaespada
Tema 4:Acceso Datos Objetivos: Brindar los conocimientos para poder enlazar aplicaciones Windows a bases de datos, independientemente del proveedor. Diseñar aplicaciones que permitan la manipulación de
INSTITUTO TECNOLÓGICO DE NUEVO LAREDO ING. EN SISTEMAS COMPUTACIONALES
Objetos () OBJETIVO: El estudiante elaborará un programa que muestre datos de una base de datos de MS Access a través de un programa en MATERIAL Y EQUIPO NECESARIO: Microsoft Access Microsoft Visual EJERCICIO:
Utilizar bases de datos en C# Objetivo: Identificar como se utilazan las bases de datos en C#.
Programación III Ing. Héctor Abraham Hernández Guía #13 Fecha: 16/05/2011 Utilizar bases de datos en C# Objetivo: Identificar como se utilazan las bases de datos en C#. QUÉ ES ODBC? ODBC es una abreviatura
ESPECIALISTA EN VISUAL STUDIO.NET
ESPECIALISTA EN VISUAL STUDIO.NET MATERIAS Visual Basic.Net 4 semanas ADO.Net 2 semanas Visual C Sharp 3 semanas ASP.Net 3 semanas Nociones de programación y manejo de bases de datos y Requisitos diseño
Visual Basic.NET : Acceso a Datos
Visual Basic.NET : Acceso a Datos Para el acceso a datos desde Visual Basic se utiliza el nuevo modelo de acceso a datos que proporciona la plataforma.net FrameWork : ADO.NET. Basicamente, se implementarán
Programación de Consultas SQL ADO.Net LDP3501-2011 / DUOC-AV
En esta guía: Programación de Consultas SQL ADO.Net LDP3501-2011 / DUOC-AV Clases de Acceso a datos ADO.Net en System.Data.SqlClient... 1 SqlConnection... 1 SqlCommand... 2 SqlDataAdapter... 3 Controles
I.- Objetivo. II.- Introducción
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA PROGRAMACIÓN VISUAL Profr. Víctor Castillo PRÁCTICA No. 8 Creación de una conexión de datos usando acceso no conectado con ADO.NET ALUMNO: GRUPO: I.- Objetivo
Visual Basic.net Completo
Descripción Visual Basic es hoy en día uno de los lenguajes de programación más populares del mundo. A principios de los años 90 Microsoft revoluciono el desarrollo de aplicaciones para Windows con la
Visual Basic.net Completo
Visual Basic.net Completo Duración: 50.00 horas Descripción Visual Basic es hoy en día uno de los lenguajes de programación más populares del mundo. A principios de los años 90 Microsoft revoluciono el
ADO.NET. Contenido. Transición a ADO.NET. Introducción a ADO.NET. Limites de ADO
ADO.NET Por Jorge Martín Rodríguez Castro y Alfredo Raúl Fenco Paz Actualizado al 19 de agosto de 2006 Contenido Transición a ADO.NET Introducción a ADO.NET Proveedores de Datos.NET Modelo de Objetos ADO.NET
VISUAL BASIC.NET. NIVEL COMPLETO
VISUAL BASIC.NET. NIVEL COMPLETO DESCRIPCIÓN Visual Basic es hoy en día uno de los lenguajes de programación más populares del mundo. A principios de los años 90 Microsoft revoluciono el desarrollo de
CI154 DESARROLLO DE APLICACIONES DE ESCRITORIO Y ACCESO A DATOS CON.NET FRAMEWORK 5 CON C# OBJETIVOS
CI154 DESARROLLO DE APLICACIONES DE ESCRITORIO Y ACCESO A DATOS CON.NET FRAMEWORK 5 CON C# OBJETIVOS Crear aplicaciones con Visual Basic. NET así como el uso de Controles y Formularios para crear el interface
Acceso a Datos con ADO.NET
Acceso a Datos con ADO.NET ADO.NET constituye la interfaz fundamental de las aplicaciones para proporcionar servicios de acceso a datos en la plataforma Microsoft.NET, donde existen, básicamente, dos elementos:
ÁREA: PROGRAMACIÓN PROGRAMACIÓN.NET(II)
ÁREA: PROGRAMACIÓN PROGRAMACIÓN.NET(II) Queda prohibida toda la reproducción de la obra o partes de la misma por cualquier medio sin la autorización previa Área: Programación Curso: Programación.Net(II)
Programación con Visual C#
Programación con Visual C# Duración: 40.00 horas Descripción Visual C# es uno de los lenguajes de programación desarrollados por Microsoft, basado en la programación orientada a objetos. Es imprescindible
PHP 7 Desarrollar un sitio web dinámico e interactivo
Preámbulo 1. Objetivo del libro 11 2. Breve historia de PHP 12 3. Dónde conseguir PHP? 13 4. Convenciones de escritura 14 Introducción a PHP 1. Qué es PHP? 15 2. Estructura básica de una página PHP 17
TEMA 6. ARQUITECTURA DE ADO.NET 6.1. INTRODUCCIÓN A ADO.NET
TEMA 6. ARQUITECTURA DE ADO.NET 6.1. INTRODUCCIÓN A ADO.NET Una vez hecha una pequeña aproximación a las bases de datos y su manejo vamos a centrarnos en el estudio de ADO.NET, que, como se anticipaba
Diplomado C#.NET con Visual Studio
Diplomado C#.NET con Visual Studio Descripción Desde la primera versión aparecida con Visual Studio en 2002, el lenguaje C# siguió una evolución constante hasta esta versión 4.0. Actualmente es el lenguaje
Desarrollo.NET con Sharepoint
BECANET1 Desarrollo.NET con Sharepoint Fabricante: Indra Grupo: Bases de Datos Subgrupo: Visual Studio 2010 Formación: Indra Horas: 196 Personal de INDRA Dirigido a Contenidos Módulo 1 Arquitectura Net
ADO.NET Desconectado.
1 ADO.NET Desconectado. ADO.NET proporciona un conjunto de componentes para crear aplicaciones distribuidas de uso compartido de datos. Dichos componentes están diseñados para separar el acceso a los datos
GALA. ADO Modo Conectado. Modelo de Base de Datos Relacional. m018a Curso Manejo de Datos con Visual Basic 2010, 24 h
Modelo de Base de Datos Relacional Registros, Campos y Claves Comandos SQL, Definición de Datos Create Table Alter Table Drop Table Comandos SQL, Manipulación de Datos Consultas, Select From Where Actualizaciones,
UNIDAD 2: Bases de Datos en Visual Basic
UNIDAD 2: Bases de Datos en Visual Basic 2. Conocer los controles de acceso a datos: Data Manager, textbox, label, dbgrid. Bases de Datos en Visual Basic 6.0 Visual Basic versión 6 puede conectarse a base
ADO.NET. En este artículo vamos a ver el protocolo de acceso a datos en la plataforma.net, ADO.NET y su marco de funcionamiento con ASP.NET.
ADO.NET Mª del Pilar Pavón Rosano DNI: 52.923.715-W INTRODUCCIÓN Este artículo está dirigido a los profesores y profesoras del módulo Diseño y Realización de Servicios de Presentación en Entornos Gráficos
El lenguaje Visual Basic 2008
El lenguaje Visual Basic 2008 Estudia la sintaxis y características específicas del lenguaje de programación Visual Basic 2008, prestando especial interés a su enfoque orientado a objetos. Introducción
ACCESO A DATOS DESDE VB.NET
ACCESO A DATOS DESDE VB.NET 1. INTRODUCION: Las aplicaciones de acceso a datos, forman casi de forma habitual, parte de una aplicación Windows estándar. Sin lugar a dudas, en muchas ocasiones, nos resultará
2389 Programming with Microsoft ADO.NET
2389 Programming with Microsoft ADO.NET Introducción Este curso va a enseñar a desarrolladores a construir aplicaciones centradas en datos y servicios Web con Microsoft ADO.NET, Microsoft SQL Server 2000
Día 2: Utilizando controles de datos en Visual Studio 2008.
Día 2: Utilizando controles de datos en Visual Studio 2008. Requerimientos de este laboratorio: Base de datos creada en el laboratorio 1 en SQL SERVER. Visual Studio 2008 *Nota: Si usted cuenta con el
1. Bases de datos desde VB.Net 1.1 Introducción. Desde Vb Net 2005 se puede acceder a las siguientes bases de datos, utilizando las clases adecuadas.
1. Bases de datos desde VB.Net 1.1 Introducción. Desde Vb Net 2005 se puede acceder a las siguientes bases de datos, utilizando las clases adecuadas. Oracle SQL Server Access Las que se puedan acceder
EXAMEN EXTRAORDINARIO Informática y Computación IV
Nombre del alumno: EXAMEN EXTRAORDINARIO Informática y Computación IV Lee cada una de las preguntas y contesta con una V para verdedero o una F en caso de que sea falso lo que se propone. Una base de datos
Objetivos y Temario CURSO VISUAL BASIC 2010
Objetivos y Temario CURSO VISUAL BASIC 2010 OBJETIVOS Este curso sobre VB.NET se dirige a los desarrolladores, incluso principiantes, que desean dominar Visual Basic.NET. Después de una descripción del
Mecanismos de acceso a datos usando ADO.NET
Mecanismos de acceso a datos usando ADO.NET En esta sesión Veremos conceptos de ADO.NET para acceso a datos, con ejemplos de uso en aplicaciones ASP.NET Agenda Modelo de objetos de ADO.NET Introducción
Sesión No. 10. Contextualización INFORMÁTICA 1. Nombre: Gestor de Base de Datos (Access)
INFORMÁTICA INFORMÁTICA 1 Sesión No. 10 Nombre: Gestor de Base de Datos (Access) Contextualización Microsoft Access es un sistema de gestión de bases de datos, creado para uso personal y de pequeñas organizaciones,
MASTER PROFESIONAL C# 5 Y ASP.NET MVC 5
MASTER PROFESIONAL C# 5 Y ASP.NET MVC 5 TEMARIO MODULO I. EL LENGUAJE C# 5 Introducción al desarrollo de soluciones informáticas. El Framework.NET. o Descripción de la plataforma. o Las especificaciones
ESCUELA DE INFORMÁTICA
TÉCNICO EN SISTEMAS LABORAL SUBMODULO TEMA 1 (Visual Basic for Application) Microsoft VBA (Visual Basic for Applications) es el lenguaje de macros de Microsoft Visual Basic que se utiliza para programar
Programació amb C#.NET
Programació amb C#.NET Tema 5 (g): ADO.NET Jordi Linares i Pellicer Índice! Introducción! Qué es ADO.NET?! Clases y Objetos de ADO.NET! Explorador de Servidores! Orígenes de Datos! Interfaz Conectada a
1
Curso: BORLAN DELPHI 5 Curso de desarrollo de aplicaciones Windows utilizando el entorno de programación Borland Delphi 5. Se estudian las particularidades del lenguaje Delphi, así como su sintaxis; sus
GUÍA DE TRABAJO N 11 LENGUAJE C# Programación de Software Articulación SENA Grado 10 Ing. Néstor Raúl Suarez Perpiñan Página 2 de 11
Página 1 de 11 GUIA N 11 - DESARROLLO DE SOFTWARE A TRES CAPAS Objetivo: Desarrollar una aplicación de software con tres capas (Presentación Lógica Persistencia) donde se establezca una conexión con una
Guía rápida de Instalación Sistemas D3xD Restaurant
Guía rápida de Instalación Software Administrativo Comercial INSTALACION, CONFIGURACION DE SERVIDOR Y ACTIVACION REQUERIMIENTOS MINIMOS Sistema operativo: Microsoft Windows 10 32 /64 Bits Microsoft Windows
I. DATOS INFORMATIVOS. Carrera Especialidad. Curso Código Ciclo. Requisitos Duración Horas Semana : 06 horas Versión : v.0810 II.
I. DATOS INFORMATIVOS Carrera Especialidad Curso Código Ciclo : Tercero Requisitos Duración Horas Semana : 06 horas Versión : v.0810 II. SUMILLA: : COMPUTACIÓN E INFORMATICA : Ingeniería de Software Ingeniería
Prof. Giovanni Francisco Sáenz Araica.
Universidad Nacional de Ingeniería Facultad de Electrotecnia y Computación Ingeniería en Computación Administradores de Bases de Datos Conexión de Bases de Datos: Bases de Datos llevadas a Visual Basic.Net
Guia de Ejericicios Aplicaciones Windows Forms
Programa Desarrollador Cinco Estrellas 2005 Estrella 2 Guia de Ejericicios Aplicaciones Windows Forms Pagina 1 de 17 Índice Requisitos...3 Introducción...4 Aplicaciones Windows...5 Acceso a Datos...5 Formulario
Diseño de página y configurar un documento
Contenido 1. Abrir un nuevo documento y empezar a escribir... 3 1.1 Abrir en blanco:... 3 1.2 Crear a partir de una plantilla... 3 1.3 Guardar y reutilizar plantillas... 3 2. Cambiar los márgenes de página...
Acceso a Datos. Visual Basic.NET 2005
Acceso a Datos Visual Basic.NET 2005 Capítulo I Acceso a datos Lectura de datos Inserción Actualización Eliminación Acceso a datos En este capítulo realizaremos una conexión, lectura, inserción, actualización
Bases de Datos Access y C#. Insert, select, update, delete. 1. Crea una base de Datos en Access
Bases de Datos Access y C#. Insert, select, update, delete 1. Crea una base de Datos en Access 2. Crea un Nuevo proyecto en C# 3. Agrega una nueva clase llamada Database y a continuación escribe el siguiente
Tutorial Java con acceso a datos
Tutorial Java con acceso a datos Jazna Meza Hidalgo Enero 2010 1 OBJETIVOS Utilizar MySQL para manipulación de datos Trabajar con SQL como lenguaje de consulta Construir una aplicación Java capaz de acceder
MS_10962 Advanced Automated Administration with Windows PowerShell
Gold Learning Gold Business Intelligence Silver Data Plataform MS_10962 Advanced Automated Administration with Windows PowerShell www.ked.com.mx Av. Revolución No. 374 Col. San Pedro de los Pinos, C.P.
Creación de una aplicación de acceso a Base de Datos mediante ODBC
Creación de una aplicación de acceso a Base de Datos mediante ODBC Introducción En esta práctica nos proponemos realizar una aplicación que permita la conexión con una Base de Datos mediante ODBC (open
Microsoft Visual Studio está basado en.net framework. Definiciones de.net Framework:
1) CONCEPTO La palabra "Visual" hace referencia al método que se utiliza para crear la interfaz gráfica de usuario (GUI). En lugar de escribir numerosas líneas de código para describir la apariencia y
Creando CRUD en PHP: operaciones básicas para la gestión de bases de datos
Creando CRUD en PHP: operaciones básicas para la gestión de bases de datos Cualquier portal web utiliza algún sistema de base de datos para almacenar la información que luego mostrará en sus páginas. Para
Definición de una base de datos. Un manejador de base de datos es un programa que permite administrar y organizar una serie de datos.
Definición de una base de datos. Un manejador de base de datos es un programa que permite administrar y organizar una serie de datos. Utilidad de una base de datos Ahora bien, en las bases de datos electrónicas
Qué es SGBD? Mencionar 4 tipos de SGBD. SGBD de red. Román Gutiérrez Sosa. SGBD jerárquicos. Modelo de datos relacionales.
Qué es SGBD? Es un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el usuario y las aplicaciones que la utilizan. El propósito general de los sistemas de gestión
Tema: Introducción al IDE de Microsoft Visual C#.
Tema: Introducción al IDE de Microsoft Visual C#. Objetivos: El propósito de este tema es que el alumno se familiarice con el entorno de desarrollo de Visual C# Express mientras crea el formulario más
Bases de Datos. Diseño y Programación Avanzada de Aplicaciones. Curso
Bases de Datos Diseño y Programación Avanzada de Aplicaciones Curso 2002-2003 INDICE Fichero vs. Bases de Datos Relacionales Un fichero constituye la forma más básica de almacenamiento de información.
Formularios y controles
Objetivo Aprender a trabajar con formularios y controles. Contenido Ingreso de datos a una hoja desde un formulario. Trabajando con USERFORMS, LISTBOXS conjuntamente con macros. Trabajando con COMBOBOX
Tema: Conexión a Base de Datos.
Sistemas Expertos e Inteligencia Artificial. Guía 6B 1 Tema: Conexión a Base de Datos. Facultad: Ingeniería Escuela: Computación Asignatura: Sistemas Expertos e Inteligencia Artificial Objetivo Específico
Tema: Herencia en C#.
Programación II. Guía No. 8 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Herencia en C#. Objetivos Crear clases a través de la herencia de clases existentes. Describir
Microsoft Visual Basic.NET
Microsoft Visual Basic.NET Curso de desarrollo de aplicaciones utilizando la tecnología de programación Microsoft.NET. El lenguaje utilizado es Visual Basic.NET, cuyas particularidades se estudian en la
8 ACCESS CURSO PRÁCTICO RA-MA
ÍNDICE INTRODUCCIÓN...15 CAPÍTULO 1. CARACTERÍSTICAS, NOVEDADES Y ENTORNO DE TRABAJO...17 1.1 NOVEDADES EN ACCESS 2010...17 1.1.1 Novedades generales y de interfaz...17 1.1.2 Novedades en herramientas
Base de Datos Oracle 10g: Programación con PL/SQL Código: D Duración: 5 días (40 horas)
Base de Datos Oracle 10g: Programación con PL/SQL Código: D17214 - Duración: 5 días (40 horas) Lo que aprenderá Esta clase es aplicable para los usuarios de Oracle8i, Oracle9i y Oracle Database 10g. Este
Estilos y temas. Contenido TECNOLOGÍA WORD
Contenido 1. Crear un estilo rápido... 2 2. Cambiar un estilo... 2 3. Aplicar un estilo... 3 4. Hacer que un conjunto de estilos rápidos sea el conjunto de estilos predeterminado... 3 4.1 Elegir un conjunto
Sistema Gestor de Bases de Datos. Un SGBD debe permitir: Manipular la base de datos: realizar consultas, actualizarla, generar informes.
Sistema Gestor de Bases de Datos. Un Sistema Gestor de Bases de Datos (SGBD) o DBMA (DataBase Management System) es una colección de programas cuyo objetivo es servir de interfaz entre la base de datos,
El modelo de objetos ADO.NET. (Datos sin conexión) Proveedor de datos.net. Connection. Command Parameter. DataReader
1 ADO.NET La programación de BD en.net utiliza unas cuantas clases en System.Data y sus espacios de nombres hijos, lo que en conjunto se conoce como ADO.NET. Estas clases y sus métodos permiten recuperar
IMPLEMENTACIÓN DE INTEGRACIÓN DE SISTEMAS HEREDADOS UTILIZANDO WEB SERVICES
CAPÍTULO 5 IMPLEMENTACIÓN DE INTEGRACIÓN DE SISTEMAS HEREDADOS UTILIZANDO WEB SERVICES 5.1 Introducción En el capítulo anterior, se dio a conocer la arquitectura propuesta para la implementación de la
UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN
UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN CICLO 02-2013 GUIA DE LABORATORIO #09 Nombre de la Práctica: ADO.NET: Conexión a base de datos. Lugar de ejecución: Centro
1. Lenguaje de Definición de Datos. 2. Lenguaje de Manipulación de. Datos. M. C. Gustavo Alfonso Gutiérrez Carreón
1. Lenguaje de Definición de Datos 2. Lenguaje de Manipulación de Datos M. C. Gustavo Alfonso Gutiérrez Carreón Los 'sistemas de gestión de bases de datos (en inglés database management system, abreviado
Developing ASP.NET MVC 4 Web Applications
Código: S28 Duración: 25 horas En este curso, los estudiantes aprenderán a desarrollar aplicaciones ASP.NET MVC con avanzadas tecnologías y herramientas de.net Framework 4.5. Se centrará en la codificación
Fila: Es un conjunto de varias celdas dispuestas en sentido horizontal.
Que Es Excel? Excel es un programa que permite la manipulación de libros y hojas de calculo. En Excel, un libro es el archivo en que se trabaja y donde se almacenan los datos. Como cada libro puede contener
Acceso a Base de Datos
Acceso a Base de Datos Diseño y Programación Avanzada de Aplicaciones Curso 2002-2003 Indice ADO.Net ADO.Net ofrece dos espacios de nombres de clientes Uno para SQL Server Bases de Datos con interfaz Ole
Tema: Desarrollo de aplicaciones con Visual Studio.net Parte II
Base de datos I. Guía 9 1 Facultad: Ingeniería Escuela: Computación Asignatura: Base de datos I Tema: Desarrollo de aplicaciones con Visual Studio.net Parte II Objetivo Específico Conocer lenguaje de programación
ADO.NET con Base de datos SQL Server
ADO.NET con Base de datos SQL Server 1. Modelo de objetos ADO.NET ADO.NET es un conjunto de librerías orientadas a objetos que permiten inteactuar con el origen de datos (data source). El origen de datos
Desarrollo de aplicaciones I
Desarrollo de aplicaciones I Planeación por competencias (Logros esperados) Contenido 1.- Competencia buscada... 3 2.- Competencia global Tarea integradora (proyecto)... 3 3.- Competencias genéricas (ser)...
12. Acceso a Bases de Datos con VB.NET
12. Acceso a Bases de Datos con VB.NET Una base de datos es un sistema formado por un conjunto de datos relacionados y almacenados en discos que permiten el acceso directo a ellos y una serie de programas
Curso Developing ASP.NET MVC 4 Web Applications (20486)
Curso Developing ASP.NET MVC 4 Web Applications (20486) Programa de Estudio Curso Developing ASP.NET MVC 4 Web Applications (20486) Aprende a desarrollar aplicaciones avanzadas de ASP.NET MVC usando tecnologías
Temario correspondiente al curso de: CURSO VB.NET. (Aplicaciones de Escritorio)
CURSO VB.NET (Aplicaciones de Escritorio) Ecuacursos ofrece a estudiantes, profesionales y público en general cursos especializados en diferentes áreas como son el Diseño Web, Programación, Seguridades,
Objetivos y Temario CURSO VISUAL BASIC 2012
Objetivos y Temario CURSO VISUAL BASIC 2012 OBJETIVOS Este curso sobre VB.NET está dirigido a los desarrolladores, incluso principiantes, que quieran dominar Visual Basic.NET. Después de describir el entorno
PROCESO PARA CAMBIO DE SERVIDOR
PROCESO PARA CAMBIO DE SERVIDOR Versión 2016.1 Fecha 2016-05-13 CONTENIDO PROCESO CAMBIO DE SERVIDOR HGI... 3 1. ARCHIVOS SERVIDOR ANTERIOR... 3 2. ARCHIVOS SERVIDOR NUEVO... 3 3. CONFIGURACION SQL EXPRESS
HERENCIA Y TIPOS. Articulo. Video Audio Altavoces. Amplificador
HERENCIA Y TIPOS. Las clases con propiedades y funciones comunes se agrupan en una superclase. Las clases que se derivan de una superclase son las subclases. Las clases se organizan como jerarquía de clases.
Tipos Recursivos de Datos
1/1 Tipos Recursivos de Datos Josefina Sierra Santibáñez 27 de noviembre de 2016 2/1 Introducción La recursividad no sólo se puede aplicar a la definición de procedimientos (i.e. funciones o acciones),
Programación Delphi con Bases de datos
Creación de la conexión a una base de datos Access. En Delphi podemos establecer la conexión con nuestra base de datos de diferentes formas. A continuación se explican algunas de esas formas. 1) Crear
Desarrollo de Aplicaciones
Desarrollo de Aplicaciones Capítulo 06 Windows Forms 2.0 (WinForms) Agenda Repaso sesión anterior. Windows Forms (winforms) Introducción Componentes de las aplicaciones Windows Controles agrupados por
WorkManager E.D. Manual guía de usuario Diseñador de formularios
WorkManager E.D. Manual guía de usuario Diseñador de formularios En esta sección se crean y diseñan formularios. Para ingresar, clic en el menú Configuración/ Diseñador de formularios. Lista de formularios
Objetivos y Temario CURSO ACCESS NIVEL AVANZADO
Objetivos y Temario CURSO ACCESS 2010. NIVEL AVANZADO OBJETIVOS Access 2010 es la última versión del conocido gestor de bases de datos de Microsoft, un programa que aprenderá a utilizar con este curso
MANUAL DE INSTALACION XD EN MICROSOFT WINDOWS
MANUAL DE INSTALACION XD EN MICROSOFT WINDOWS www.xdsoftware.es Está disponible en la versión 2014.73 para los formatos Rest / Pos / Disco XD, es un nuevo instalador para Microsoft Windows. El instalador
Programación con Visual Basic 2008 (c) Francisco Charte
Programación con Visual Basic 2008 (c) Francisco Charte Agradecimientos Introducción Plataforma y servicios Ediciones de Visual Basic 2008 A quién va dirigido este libro Estructura del libro Tipografía
Manual para configurar un servidor AppServ En una computadora. Y operar el sistema SICAM en intranet. Nucúncu Tecnología
Manual para configurar un servidor AppServ En una computadora. Y operar el sistema SICAM en intranet. Nucúncu Tecnología www.nucuncu.com Nucúncu Tecnología. www.nucuncu.com Manual para configurar un servidor
TAREA 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS.
1 TAREA 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS. 1- Cuáles son las principales funciones de un sistema operativo? Los Sistemas Operativos tienen como objetivos o funciones principales lo siguiente; Comodidad;
20488 Desarrollo de Microsoft SharePoint Server 2013 Core Solutions
20488Be 20488 Desarrollo de Microsoft SharePoint Server 2013 Core Solutions Fabricante: Microsoft Grupo: Desarrollo Subgrupo: Microsoft Sharepoint 2013 Formación: Presencial Horas: 25 Introducción En este
Desarrollo de aplicaciones de acceso a base de datos con JBuilder 7
Desarrollo de aplicaciones de acceso a base de datos con JBuilder 7 Este artículo trata sobre el desarrollo de aplicaciones de acceso a base de datos con la herramienta JBuilder7. Tras una breve introducción,
PRÓLOGO... XVII CAPÍTULO 1. FASES EN EL DESARROLLO DE UN PROGRAMA...
CONTENIDO PRÓLOGO... XVII CAPÍTULO 1. FASES EN EL DESARROLLO DE UN PROGRAMA... 1 QUÉ ES UN PROGRAMA... 1 QUÉ ES Visual Basic.NET... 2 REALIZACIÓN DE UN PROGRAMA EN Visual Basic.NET... 3 Cómo crear un programa...
MS_20483 Programming in C#
Introducción Este curso enseña a los desarrolladores las habilidades de programación que se requieren para crear aplicaciones Windows utilizando el lenguaje C#. Durante sus cinco días en los alumnos del
Administración de la producción. Sesión 4: Procesador de Texto
Administración de la producción Sesión 4: Procesador de Texto Contextualización La semana anterior revisamos los comandos que ofrece Word para el formato del texto, la configuración de la página, la inserción
