405021

98
Universidad Nacional Abierta y a Distancia Escuela de Ciencias Básicas Tecnología e ingeniería 1 UNIVESIDAD NACIONAL ABIERTA Y A DISTANCIA Escuela de Ciencia Básicas Tecnología e Ingeniería Programa de Ingeniería de sistemas VISUAL AVANZADO VISUAL BASIC. NET MARIA CONSUELO RODRÍGUEZ NINO TUNJA 2008

Transcript of 405021

Page 1: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

1

UNIVESIDAD NACIONAL ABIERTA Y A DISTANCIA

Escuela de Ciencia Básicas Tecnología e Ingeniería

Programa de Ingeniería de sistemas

VISUAL AVANZADO VISUAL BASIC. NET

MARIA CONSUELO RODRÍGUEZ NINO

TUNJA 2008

Page 2: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

2

TABLA DE CONTENIDO 1. PRIMERA UNIDAD: Características Generales

1.1 Introducción a la plataforma .NET 1.1.1 Qué es la plataforma .NET 1.1.2 Que es Framework, 1.1.3 El ambiente de programación

1.2 Fases en el desarrollo de un programa 1.2.1 Realizar un programa 1.2.2 Compilar y ejecutar el programa 1.2.3 Biblioteca de clases

1.3 Utilización de Visual Basic. Net 1.3.1 Declaración de Variables 1.3.2 Expresiones matemáticas, 1.3.3 Instrucciones Básicas, condicionales y ciclos 1.3.4 Uso y manejo de formularios 1.3.5 Uso y manejo de controles

2. SEGUNDA UNIDAD :Fundamentos de Visual Basic.Net 2.1 Programación Orientada a objetos en Visual Basic.Net

2.1.1 Definición de P. O.O. , herencia, polimorfismo, encapsulamiento. 2.1.2 Definición de clases

2.2 Elementos de un Programa 2.2.1 Caracteres, Tipos ,Literales, identificadores, 2.2.2 Palabras Clave, Operadores 2.2.3 Espacios de nombres, Protección de una clase, 2.2.4 Sentencia Option , Sentencia Imports, definiciones y declaraciones,

Sentencia simple, Definición de un Procedimiento 2.2.5 Crear objetos de una clase 2.2.6 Clases comparados con módulos

2.3 Estructuras de programación 2.3.1 Vectores, Matrices y estructuras 2.3.2 Funciones y Procedimientos 2.3.3 Paso de argumentos a los métodos

3 TERCERA UNIDAD :Acceso a bases de datos e implementación del proyecto 3.1 Conceptualizacion Definiciones de Base de datos, SQL, 3.2 ADO.NET 3.3 Vincular controles a datos 3.4 Manipulación De Datos 3.5 Objetos connection, Dataadapter, Dataset, Datagrid, Dataform, Datareader, 3.6 Implementación de la aplicación Elementos básicos para la implementación 3.7 Crear el proyecto de instalación 3.8 Propiedades del proyecto 3.9 Generar la aplicación 3.10 Actualización de Vb 6 a .Net

Page 3: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

3

2. INTRODUCCIÓN

El desarrollo de este curso académico denominado Visual Basic Avanzado, proyecta proporcionar al estudiante, las herramientas necesarias para el buen desempeño en el momento de la elaboración de aplicaciones con características profesionales. El curso tiene un carácter teórico práctico, y corresponde a 3 créditos académicos, los cuales se manejan aplicando modelos de aprendizaje autónomo, y autogestión del conocimiento En la realización del curso se propende por el desarrollo de hábitos de autoaprendizaje para la construcción del propio conocimiento en el uso de componentes de Visual Basic. Net, en la conexión con bases de datos, y herramientas adicionales que permitan desarrollar aplicaciones fácilmente y de lata calidad. Para la ejecución del curso se aplicara la metodología a Distancia, tomando en cuenta que por ser de carácter Electivo se profundizara sobre el área de programación proporcionando herramientas mediante las cuales pueda agilizar y mejorar el rendimiento del desarrollo de las aplicaciones. Para un mejor desempeño el estudiante implementara las técnicas de estudio independiente, y acompañamiento tutorial, distribuido en tutoría en grupo de curso, grupo colaborativo, y tutoría individual. La temática a tratar requiere de antemano el dominio en la lógica de programación, modelación de bases de datos, y manejo de ambientes gráficos. Actualmente el paradigma de programación se ha enfocado a nuevas necesidades de modernos y globales sistemas de información basados en redes y mas aun en la red global de internet, actualmente es mas importante poder concebir y construir sistemas de información con estas nuevas tecnologias de programación. Visual Basic NET es un lenguaje de programación desarrollado por Microsoft muy apropiado para construir sistemas de información basados en red o mejor aun en internet. El curso del Visual Basic Avanzado esta compuesto por 3 unidades didácticas en las cuales se reforzara los conceptos básicos y se profundizara en elementos que permitan el desarrollo de aplicaciones completas de la siguiente manera: Unidad 1: Características Generales Unidad 2: Programación Orientada a Objetos en .Net Unidad 3: Acceso a Bases de datos e implementación de un proyecto El curso está compuesto por tres unidades didácticas de la siguiente forma

Unidad 1; Características Generales: Introducción a la plataforma .NET, Fases en el desarrollo de un programa, Utilización de Visual Basic. Net

Page 4: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

4

Unidad 2. Fundamentos de Visual Basic.Net: Programación Orientada a objetos en Visual Basic.Net, Estructura de un Programa, Estructuras de programación Unidad 3. Acceso a bases de datos e implementación de un proyecto: Aquí se muestran los elementos para el manejo de bases de datos, Conceptualizacion, Manipulación De Datos, Implementación de la aplicación y actualizacion de versiones anteriores a Plataforma .Net En el desarrollo del curso se plantea una metodología en la cual se involucre las prácticas de laboratorio y conlleve a la ejecución de los procesos de investigación y aplicación de conceptos en el entorno social. En el proceso de evaluación ser presentan herramientas que le permitan al estudiante hacer el seguimiento de su aprendizaje, y evaluar el progreso en cada momento del desarrollo del curso. Esta evaluación propende el desarrollo de los procesos prácticos en los cuales se reafirman valores como la responsabilidad, honestidad y la disciplina los cuales son importantes para fomentar en los estudiantes el aprendizaje autónomo.

3. JUSTIFICACIÓN

El manejo de la información y la aplicación del conocimiento son elementos básicos para el desarrollo de una sociedad que pueda alcanzar los retos del nuevo mileno, para ello se requiere de mejorar los proceso de uso y administración de la información, ya que el potencial de las naciones se enfoca no a la cantidad de dinero que posea sino a la cantidad y flujo de información que se manipule, se sistematicé y el conocimiento que se genere, de allí la necesidad de elaborar sistemas de información eficaces que sean ajustados a las necesidades especificas del entorno. Los nuevos sistemas de información son costosos en tiempos y recursos, la solución moderna de sistemas de información exigen herramientas y metodologías que resuelvan rápida, económica, eficiente y de manera global, problemas de información y conocimiento planteados por las organizaciones Estos sistemas de información, tienden a ser cada vez de mayor alcance y complejidad sobre todo cuando se toman en cuenta la nuevas necesidades de información y conocimiento que demandan las nuevas organizaciones. Para el desarrollo de estos sistemas de información existen muchas herramientas y una de ellas es Visual Basic . Net en la cual su programación es totalmente de tipo administrativo, esta nueva tecnología desarrollada y ofrecida por Microsoft

Page 5: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

5

permitirá hacer más fácil la construcción y desarrollo de programas y aplicaciones para Internet. Dado que las tendencias en el desarrollo de aplicaciones informáticas se enfoca en facilitar tanto al analista como al programador sus actividades, se encamina en permitir elaborar aplicación graficas de buena calidad con interfaces agradables y cada vez más amigables al usuario. A partir de lo anterior, es importante que los estudiantes manejen herramientas que afiancen su lógica y les permitan resolver en forma fácil y rápida problemas de su entorno mediante aplicaciones de alto nivel.

4. INTENCIONALIDADES FORMATIVAS

4.1 PROPÓSITOS

• Retomar los elementos básicos de programación e integrarlos en una

aplicación con el uso de nuevos componentes sobre tecnologías .Net, mediante la interacción con las diferentes estrategias didácticas que garantizar el completo desarrollo y comprensión de la temática planteada.

• Guiar a los estudiantes en los procesos de diseño de interfaces y manipulación de la información almacenada en una base de datos cumpliendo estándares de desarrollo de software.

• Inducir al estudiante en el desarrollo de aplicaciones en ambiente web,

• Involucrar al estudiante en el desarrollo de procesos investigativos y de proyección social aplicados a la solución de problemas de su región y su entorno

4.2 OBJETIVOS

• Que el estudiante manipule el entorno de programación .NET mediante la aplicación de las estructuras de programación

• Que el estudiante desarrolle modelos de solución de problemas a través de la

programación orientada objetos, interactuando con motores de bases de datos.

Page 6: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

6

• Que el estudiante conozca los fundamentos de la implementación de una

aplicación con contenido dinámico mediante de Microsoft Visual Basic .NET

• Que el estudiante desarrolle aplicaciones mas robustas que en el pasado con una base sólida orientada a objetos. solucionando un problema real del entorno con las herramientas que ofrece Visual Basic. Net

4.3 COMPETENCIAS

• El estudiante manipula y conoce el entorno de programación .NET mediante la aplicación de las estructuras de programación y los elementos básicos para el desarrollo de aplicaciones puntuales.

• El estudiante desarrolla modelos de solución de problemas a través de la programación orientada objetos, realizando interacción con motores de bases de datos.

• El estudiante conoce los fundamentos para la implementación de una aplicación Web con contenido dinámico mediante de Microsoft Visual Basic .NET.

4.4 METAS

• El estudiante manipulara el entorno de programación .NET mediante la aplicación de las estructuras de programación generando aplicaciones específicas que reflejen el empleo de los componentes básicos del ambiente de desarrollo.

• El estudiante plasmara un modelo para la solución de problemas a través de la programación orientada objetos, seleccionando un motor de bases de datos y realizando los procesos de ingreso, consulta, edición y eliminación de datos.

• El estudiante realizara diseñara e implementación de una aplicación Web con contenido dinámico mediante de Microsoft Visual Basic .NET,

Page 7: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

7

UNIDAD 1

Características Generales

1.1 Introducción a la plataforma .NET

Para el usos de una arquitectura básica de la plataforma .Net se requieres describir que es Framework y sus principales componentes: Lenguajes, biblioteca de clases y CLR, lo cual nos permite tener una visión mas clara de las potencialidades de esta plataforma La nueva tecnología de Microsoft ofrece soluciones a los problemas de programación actuales, como son la administración de código o la programación para Internet. Para aprovechar al máximo las características de .Net es necesario entender la arquitectura básica en la que esta implementada esta tecnología y así beneficiarse de todas las características que ofrece esta nueva plataforma.

1.1.1 Qué es la plataforma .NET

Se trata de un entorno de desarrollo multilenguaje diseñado por Microsoft para simplificar la construcción, distribución y ejecución de aplicaciones para Internet.

1.1.2 El Framework de .Net

Es una infraestructura sobre la que se reúne todo un conjunto de lenguajes y servicios que simplifican enormemente el desarrollo de aplicaciones. Mediante esta herramienta se ofrece un entorno de ejecución altamente distribuido, que permite crear aplicaciones robustas y escalables. Los principales componentes de este entorno son:

Lenguajes de compilación Biblioteca de clases de .Net CLR (Common Language Runtime)

Page 8: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

8

1.1.3 El ambiente de programación

Actualmente, el Framework de .Net es una plataforma no incluida en los diferentes sistemas operativos distribuidos por Microsoft, por lo que es necesaria su instalación previa a la ejecución de programas creados mediante .Net. El Framework se puede descargar gratuitamente desde la web oficial de Microsoft.

.Net Framework soporta múltiples lenguajes de programación y aunque cada lenguaje tiene sus características propias, es posible desarrollar cualquier tipo de aplicación con cualquiera de estos lenguajes. Existen más de 30 lenguajes adaptados a .Net, desde los más conocidos como C# (C Sharp), Visual Basic o C++ hasta otros lenguajes menos conocidos como Perl o Cobol. Common Language Runtime (CLR)

El CLR es el verdadero núcleo del Framework de .Net, ya que es el entorno de ejecución en el que se cargan las aplicaciones desarrolladas en los distintos lenguajes, ampliando el conjunto de servicios que ofrece el sistema operativo estándar Win32.

La herramienta de desarrollo compila el código fuente de cualquiera de los lenguajes soportados por .Net en un mismo código, denominado código intermedio (MSIL, Microsoft Intermediate Lenguaje). Para generar dicho código el compilador se basa en el Common Language Specification (CLS) que determina las reglas necesarias para crear código MSIL compatible con el CLR.

De esta forma, indistintamente de la herramienta de desarrollo utilizada y del lenguaje elegido, el código generado es siempre el mismo, ya que el MSIL es el

Page 9: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

9

único lenguaje que entiende directamente el CLR. Este código es transparente al desarrollo de la aplicación ya que lo genera automáticamente el compilador.

Sin embargo, el código generado en MSIL no es código máquina y por tanto no puede ejecutarse directamente. Se necesita un segundo paso en el que una herramienta denominada compilador JIT (Just-In-Time) genera el código máquina real que se ejecuta en la plataforma que tenga la computadora.

De esta forma se consigue con .Net cierta independencia de la plataforma, ya que cada plataforma puede tener su compilador JIT y crear su propio código máquina a partir del código MSIL.

La compilación JIT la realiza el CLR a medida que se invocan los métodos en el programa y, el código ejecutable obtenido, se almacena en la memoria caché de la computadora, siendo recompilado sólo cuando se produce algún cambio en el código fuente.

Biblioteca de clases de .Net

Cuando se está programando una aplicación muchas veces se necesitan realizar acciones como manipulación de archivos, acceso a datos, conocer el estado del sistema, implementar seguridad, etc. El Framework organiza toda la funcionalidad del sistema operativo en un espacio de nombres jerárquico de forma que a la hora de programar resulta bastante sencillo encontrar lo que se necesita. Para ello, el Framework posee un sistema de tipos universal, denominado Common Type System (CTS). Este sistema permite que el programador pueda interactuar los tipos que se incluyen en el propio Framework (biblioteca de clases de .Net) con los creados por él mismo (clases). De esta forma se aprovechan las ventajas propias de la programación orientada a objetos, como la herencia de clases predefinidas para crear nuevas clases, o el polimorfismo de clases para modificar o ampliar funcionalidades de clases ya existentes.

Page 10: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

10

La biblioteca de clases de .Net Framework incluye, entre otros, tres componentes clave:

ASP.NET para construir aplicaciones y servicios Web. Windows Forms para desarrollar interfaces de usuario. ADO.NET para conectar las aplicaciones a bases de datos.

La forma de organizar la biblioteca de clases de .Net dentro del código es a través de los espacios de nombres (namespaces), donde cada clase está organizada en espacios de nombres según su funcionalidad. Por ejemplo, para manejar ficheros se utiliza el espacio de nombres System.IO y si lo que se quiere es obtener información de una fuente de datos se utilizará el espacio de nombres System.Data. La principal ventaja de los espacios de nombres de .Net es que de esta forma se tiene toda la bliblioteca de clases de .Net centralizada bajo el mismo espacio de nombres (System). Además, desde cualquier lenguaje se usa la misma sintaxis de invocación, ya que a todos los lenguajes se aplica la misma biblioteca de clases. Ensamblados Uno de los mayores problemas de las aplicaciones actuales es que en muchos casos tienen que tratar con diferentes archivos binarios (DLL´s), elementos de registro, conectividad abierta a bases de datos (ODBC), etc. Para solucionarlo el Framework de .Net maneja un nuevo concepto denominado ensamblado. Los ensamblados son ficheros con forma de EXE o DLL que contienen toda la funcionalidad de la aplicación de forma encapsulada. Por tanto la

Page 11: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

11

solución al problema puede ser tan fácil como copiar todos los ensamblados en el directorio de la aplicación. Con los ensamblados ya no es necesario registrar los componentes de la aplicación. Esto se debe a que los ensamblados almacenan dentro de si mismos toda la información necesaria en lo que se denomina el manifiesto del ensamblado. El manifiesto recoge todos los métodos y propiedades en forma de meta-datos junto con otra información descriptiva, como permisos, dependencias, etc. Para gestionar el uso que hacen la aplicaciones de los ensamblados .Net utiliza la llamada caché global de ensamblados (GAC, Global Assembly Cache). Así, .Net Framework puede albergar en el GAC los ensamblados que puedan ser usados por varias aplicaciones e incluso distintas versiones de un mismo ensamblado, algo que no era posible con el anterior modelo COM.1

1.2 Fases en el desarrollo de un programa

1.2.1 Realizar un programa

Para poder escribir un programa se necesita un entorno de desarrollo Visual Basic .Net Microsoft , el cual proporciona uno de forma gratuita .Net Frameworrk SDK que se puede descargar de la siguiente dirección : http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=9B3A2CA6-3647-4070-9F41-A333C6B9181D Luego de descargar el software se requiere instalarlo en el equipo de computo de manera que aparece en el menú principal para poder ser activado. Luego de este proceso nos hace falta el editor de código fuente Visual Basic . Es suficiente con un editor de texto sin formato por ejemplo el bloc de notas de windows. No obstante todo el trabajo de edición, compilación, ejecución, y depuración se hará mucho mas fácil si se utiliza un entorno de desarrollo con interfaz grafica de usuario que integre las herramientas mencionadas, en lugar de tener que utilizar la interfaz de línea de ordenes SDK. Entornos de desarrollo integrado para Visual Basic .Net hay varios, pero encima de todos se destaca Microsoft Visual Studio .Net, el cual puede ser utilizado para el desarrollo de los ejercicios. Como crear un programa: Comencemos con la creación de un simple programa y con ejemplo clásico demostrar un saludo de bienvenida Este ejemplo lo desarrollaremos utilizando la interfaz de ordenes del SDK,

1 http://www.desarrolloweb.com/articulos/1328.php

Page 12: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

12

Paso 1: Empecemos por abrir nuestro editor de texto, puede ser el bloc de notas como se mencionaba anteriormente, una vez abierto escribiremos el texto correspondiente al programa fuente como se presenta a continuación: Module HolaMundo ` `Punto de entrada al programa ` Sub Main() System.Console.WriteLine(―Hola Mundo!!!‖) End Sub End Module Describamos un poco que hace este programa. La primera línea declara el modulo HolaMundo, porque el esqueleto de cualquier programa de consola de Visual Basic .Net se basa en la definición del modulo encerrado entre las palabras claves Module y End Module. Ambas líneas definen el bloque de código en el que se describen las acciones a llevar a cabo por el programa Visual Basic .Net. La siguientes líneas comienzan por ` (comilla sencilla) son simplemente comentarios, estos no son tenidos en cuenta por el compilador pero ayudan a entender un programa cuando se lee. La siguiente línea describe el procedimiento principal Main el cual se distingue por el modificado () que aparece después del nombre y el bloque de codigo que corresponde al mismo, entre Sub y Endsub define las acciones que tiene que ejecutar dicho procedimiento. Cuando se compila un programa se espera que haya un procedimiento Main el cual define la entrada y salida del programa. En el ejemplo se observa que el procedimiento Main llama para su ejecución al método WriteLine de la clase Console del espacio de nombres System de la biblioteca . Net que escribe como resultado la expresión que aparece especificada entre comillas. Una secuencia de caracteres entre comillas se denomina cadena de caracteres. Paso 2: El programa editado esta ahora en la memoria. Para que este trabajo pueda tener continuidad se debe grabar en el disco utilizando la orden correspondiente del editor.

1.2.2 Compilar y ejecutar

A continuación se debe compilar el programa, esto es traducir el programa fuente a código intermedio (MSIL) para poderlo ejecutar. Como se menciono el SDK

Page 13: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

13

proporciona un programa ejecutable desde la línea de ordenes, el resultado será un archivo de nombre igual al del archivo fuente y extensión. Exe que almacena el código intermedio obtenido en la traducción, código que puede ser interpretado por la maquina virtual de .Net cuando se requiera ejecutar el programa. Para realizar el proceso de compilación se debe visualizar una ventana que muestre la línea de ordenes ( para ello los usuarios de windows pueden ejecutar cmd o comand desde la ventana Inicio-Ejecutar. Para informar al sistema operativo cual es la ubicación de la utilidad vbc desde la línea de ordenes añadiremos a la variable del entorno path la ruta de la carpeta donde esta almacenada esta utilidad. Set path=%path%; c:\windows\Microsoft.net\framewor\k\vXXX La expresión %path% representa el valor actual de la variable de entorno path. La ruta c:\windows\Microsoft.net\framewor\k\vXXX es donde, estan ubicadas las utilidades Visual Basic .Net, observe que una ruta va separada de la otra por punto y coma. A continuación se utiliza la orden cd para cambiar la carpeta de trabajo donde se ha guardado el archivo que se desea compilar, la orden dir permitira ver el contenido de la carpeta. Finalmente la orden para compilar el archivo HolaMundo.vb es la siguiente: vbc HolaMundo.vb El resultado del procedimiento anterior es el fichero HolaMundo.exe es decir un archivo ejecutable. Al compilar un programa se pueden presentar errores de compilación debido a que el programa escrito no se adapta a la sintaxis y reglas del compilador . Para ejecutar el archivo resultante de la compilación y observar los resultados basta con escribir en la línea de ordenes el nombre del archivo, en el caso HolaMundo y después presionar Enter.

1.2.3 Biblioteca de Clases

Visual Basic. Net carece de instrucciones de E/S, de instrucciones para el manejo de cadenas de caracteres, etc. Con lo que este trabajo queda para la biblioteca de clases provistas con el compilador. Visual Basic no tienen una biblioteca de su propiedad, sino que utiliza la biblioteca . Net. Todos los lenguajes del paquete .Net utilizan esta misma biblioteca.

Page 14: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

14

Por omisión, el compilador vbc solo busca clases predefinidas en el archivo mscorlib.dll de la biblioteca .Net. Mas adelante comenzaremos con el uso de la interfaz grafica que ofrece elementos mas agradables al usuario. 2

1.3 Utilización de Visual Basic. Net

1.3.1 Declaración de variables

Una variable es una espacio reservado en memoria para almacenar un valor de un determinado tipo, valor que puede ser modificado a lo largo de la ejecución del bloque donde la variable es accesible. La declaración de una variable consiste en enunciar le nombre de la misma y asociarle un tipo los cuales se describen a continuación. Tipos de datos: Los tipos de datos soportados por vb.net son Boolean Byte Char Date Decimal Double Integer Long Short Single String Object Ahora se muestra una tabla para indicar los valores que pueden almacenar

Dato Cantidad de memoria

Capacidad

Boolean 2 bytes True o False

Byte 1 byte 1 Byte sin signo comprende un número entre 0 a 255

Char 2 bytes Un carácter Unicode o número sin signo comprendido con un rango de 0 y 65535

Date 8 bytes fechas comprendidas entre el 1 de enero del año 1 y el 31 de diciembre de

2 Visal Basic . Net Francisco Javier Ceballos

Page 15: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

15

9999, y horas desde las 0:00:00 (medianoche) a las 1:59:59.

Decimal 16 bytes El mayor valor posibles es de +/-79.228.162.514.264.337.593.543.950.335. Para números con 28 decimales, el mayor valor posible es de +/- 7,9228162514264337593543950335 mientras que el menor valor posible distinto de cero es +/- ,0000000000000000000000000001 (+/-1E-28).

Double 8 bytes Se almacenan como números IEEE de punto flotante de doble precisión Los valores van desde –1,79769313486231570E+308 a – 4,94065645841246544E-324 para números negativos y de 4,94065645841246544E-324 a 1,79769313486231570E+308 para números positivos.

Integer 4 bytes Valores con signo comprendidos entre –2.147.483.648 y 2.147.483.647.

Long 8 bytes valores con signo comprendidos entre –9.223.372.036.854.775.808 y 9.223.372.036.854.775.807.

Short 2 bytes - 32.768 a 32.768

Single 4 bytes Se almacenan como números IEEE de punto flotante de precisión simple con valores que van de –3,4028235E+38 a –1,401298E-45 para números negativos y de 1,401298E-45 a 3,4028235E+38 para números positivos. Los números de precisión simple almacenan aproximaciones de números reales.

String La longitud de un objeto String puede ir desde cero hasta, aproximadamente, dos mil millones de caracteres. Cada carácter es un valor Unicode de 16 bits.

Object 4 bytes Al declarar una variable como Object, puede utilizarla posteriormente para hacer referencia a cualquier objeto reconocido por la aplicación.

Page 16: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

16

Para asignar a una variable un valor se procede de la siguiente manera

1. se declara la variable y 2. luego se asigna con el operador ―=‖. Se presentan 2 opciones a. Dim va As Integer va=5 b. Dim va As Integer=5

Y las constantes se declaran como Const n as Integer=10 ‗En esta línea no usamos Dim porque es constante precisamente. También se pueden declarar varias variables en una misma línea por ejemplo: Dim a,b,c As Short En la línea anterior a, b y c serán de tipo Short Lo anterior se pudo haber escrito como: Dim a As Short Dim b As Short Dim c As Short O bien Dim a As Short,b As Short,c As Short No es recomendable dejar una variable sin indicar el tipo por ejemplo: Dim i Esto generaría un error después de declarar la Option Strict en On, porque indicaría que no se debe dejar sin declarar el tipo. Algo que no se puede hacer es lo siguiente: Dim i,b As short=5 Porque generaría un error indicando que no se puede inicializar varias variables al tiempo. Lo cual se haría de la siguiente manera

Page 17: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

17

Dim As Short,b As short=5 Aunque solo b tendrá un valor de 5 Igualmente Dim a As Short,b,c As integer,d As Short=3 Sólo d tendrá un valor de 3 Todas las variables numéricas al no inicializarlas tendrán como valor inicial 0, las variables de tipo char tendrán un null o vacía. Ejemplos 1 Module Module1 Sub Main() Dim A As Short = 2, B As Short B = 4 Console.Write("A={0},B={1}", A, B) Console.Read() End Sub End Module Esto da como resultado A=2,B=4

1.3.2. Expresiones Matemáticas

Los operadores se utilizan para realizar operaciones aritméticas con los datos contenidos dentro de las variables. Estos son: * / \ +- *= /= += -= y otros que están mostrados en una tabla más adelante Los paréntesis indican cómo se necesita ejecutar una operación aritmética. Por ejemplo observe el resultado de las dos operaciones siguientes. Dim i As Short=5 Dim j As Short=10 1 i* j+5 2 i* (j+5)

Page 18: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

18

La línea 1 da como resultado 55 La línea 2 da cómo resultado 75 Los operadores += y –= se utilizan para sumar o restar la unidad a una variable por ejemplo Dim i As Short i+=1 i-=1 sin embargos se pueden usar de la manera normal o sea i=i+1 ó i=i-1 Los otros operadores se usan de igual forma El siguiente cuadro resume los operadores de vb.net

Acción Elemento del lenguaje

Aritméticos ^, –, *, /, \, Mod, +, =

Asignación =, ^=, *=, /=, \=, +=, -=¸ &=

Comparación =, <>, <, >, <=, >=, Like, Is

Concatenación &, +

Operadores lógicos/bit a bit

Not, And, Or, Xor, AndAlso, OrElse

Varias operaciones AddressOf, GetType

Por ejemplo si usamos una variable string Dim var1 As String = "10" Dim var2 As String = "3" var1 += var2 ' El valor de var1 ahora es "103". Sería una buena practica de programación si se activa la opción Option Strict o sea que esté en On y no en Off para que obligue a que los tipos de datos que se usen sean del tipo adecuado. Además de Option Explicit en On para que todas las variables sean declaradas Cuando está activa esta opción no se puede realizar la siguiente asignación Dim carácter As Char=‖A‖ Porque generaría un error indicando que no se puede convertir un tipo string a char lo mejor sería definirla como

Page 19: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

19

Dim carácter As Char=‖A‖c Ejemplo 2 Option Strict On Module Module1 Sub Main() Dim A As Char = "E"c, B As Char = "A"c Dim union As String union &= A union &= B Console.Write("union={0}", union) Console.Read() End Sub End Module Esto da como resultado Union=EA

1.3.3 Instrucciones básicas

Las instrucciones básicas de todo lenguaje comprende las condiciones y los ciclos. Entre ellas veremos: If Esta se usa para preguntar por ejemplo Dim i As Short=5 If i > 0 then ‗Haga cualquier cosa End if Como también se puede evaluar la parte negativa If i > 0 then ‗Haga cualquier cosa else ‗Tambien haga cualquier cosa End if

Page 20: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

20

Cómo también se puede evaluar varias alternativas cómo If i =1 0 then ‗Muestre el valor elseif i=2 then ‗Muestre el valor else ‗Tambien haga cualquier otra cosa End if También podemos usar la función IIF, que funciona de la siguiente forma iif(i=1,‖uno‖,‖otro‖) o iif(i>0,‖Positivo‖,‖Negativo‖), si tuviéramos el siguiente caso if B=5 then A=1 Elseif B<=0 then

A=-1 Elseif B>5 then

A=1 Else

A=0 End if Lo llevaríamos a la función iif de la siguiente forma A=iif(B=5,1,iif(B<=0,-1,iif(B>5,1,0))) Sin embargo tenemos otra opción, la función Switch A=Switch(B=5,1,B<=0,-1,B>5,1) Como observará el primer elemento de cada pareja es la expresión a evaluar. También se puede anidar las instrucciones if Por ejemplo If A>0 then If (A mod 2 )=0 then

‗Número par Else

‗Número impar End if

Page 21: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

21

Else ‗Nùmero negativo

End if Select case Esta instrucción permite evaluar múltiples valores por ejemplo: Dim B As Short =30 Select case B Case 5 ‗Si fuera igual a 5 Caso Is < 10 ‗Si fuera menor a 10 Case Is> 20 ‗Si fuera mayor a 20 Case 23 to 25 ‗Si fuera mayor o igual a 23 y menor e igual a 25 Case 1 to 2 ‗Si fuera 1 o 2 Case 26 to 28,31 ‗Si fuera mayor o igual a 26 y menor e igual a 28 o si es 31 Case else ‗Si no es ninguna de las anteriores End select Do While

Este ciclo es mejor mostrarlo con un ejemplo supongo que con eso es suficiente Se ciclo se realiza mientras la condición sea verdadera o para este caso mientras i sea mayor que 0, observe que si i no fuera mayor que cero al ingresar no realizaría el ciclo

Option Strict On Module Module1 Sub Main() Dim i As Integer = 5 Do While i > 0 Console.WriteLine(i) i -= 1 Loop Console.Read() End Sub End Module

Page 22: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

22

Debe generar como resultado 5 4 3 2 1 Do Loop While

Igual que el anterior es mejor mostrarlo con un ejemplo Este ciclo se realiza mientras i sea mayor que 0, observe que si i fuera menor que cero al menos ingresaría una vez al ciclo

Option Strict On Module Module1 Sub Main() Dim i As Integer = 5 Do Console.WriteLine(i) i -= 1 Loop While i > 0 Console.Read() End Sub End Module Debe generar como resultado 5 4 3 2 1 El ciclo for se analizará cuando veamos arreglos

Ejemplo 3 Option Strict On Module Module1 Sub Main() Dim B As Short = 6, A As Short If B = 5 Then

Page 23: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

23

A = 1 ElseIf B <= 0 Then A = -1 ElseIf B > 5 Then A = 1 Else A = 0 End If Console.Write("A={0}", A) Console.Read() End Sub End Module Esto da como resultado A=1 Ejemplo 4 Option Strict On Module Module1 Sub Main() Dim B As Short = 30 Select Case B Case 5 'Si fuera igual a 5 Console.Write("B={0}", B) Case Is < 10 'Si fuera menor a 10 Console.Write("B={0}", B) Case Is > 20 'Si fuera mayor a 20 Console.Write("B={0}", B) Case 23 To 25 'Si fuera mayor o igual a 23 y menor e igual a 25 Console.Write("B={0}", B) Case 1 To 2 'Si fuera 1 o 2 Console.Write("B={0}", B) Case 26 To 28, 31 'Si fuera mayor o igual a 26 y menor e igual a 28 o si es 31 Console.Write("B={0}", B) Case Else 'Si no es ninguna de las anteriores Console.Write("ninguna de las anteriores")

Page 24: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

24

End Select Console.Read() End Sub End Module Esto da como resultado B=30 Ejemplo 5 Option Strict On Module Module1 Sub Main() Dim i As Integer Dim j As Integer Dim c As Char i = Console.Read()‘aqui lee un carácter c = Microsoft.VisualBasic.Chr(i)‘Lo convierte a carácter j = Microsoft.VisualBasic.Val(c)‘Lo convierte a integer j += 5 Console.WriteLine("j: {0}", j)‘Muestra el resultado Console.ReadLine() End Sub End Module Si le digitamos 5 para el valor de i Esto da como resultado J:10

1.3.4 Uso y manejo de formularios

Visual Basic. Net proporciona un ambiente de desarrollo en entorno Windows mediante los cuales se pueden generar aplicaciones con el uso de componentes como formularios y controles que se describen a continuación. Las aplicaciones creadas para Microsoft Windows®. Proporcionan un marco de trabajo que puede utilizarse por toda la aplicación para crear un aspecto coherente. Los formularios de aplicaciones basadas en Windows se utilizan para presentar información al usuario y aceptar la introducción de datos por parte del mismo. Los formularios exponen propiedades que definen su apariencia, métodos que definen su comportamiento, y eventos que definen su interacción con el usuario. Estableciendo las propiedades y escribiendo código para responder a sus eventos, el formulario se personaliza para satisfacer los requerimientos de las aplicaciones.

Page 25: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

25

El formulario es un control derivado de la clase Form, que a su vez deriva de la clase Control. El marco de trabajo también permite heredar de formularios existentes para añadir más funcionalidades o modificar el comportamiento existente. Cuando se añade un formulario a un proyecto, se puede escoger si hereda de la clase Form proporcionada por el .NET Framework, o de un formulario creado con anterioridad. En una aplicación basada en Windows, el formulario es el principal elemento para la interacción con el usuario. Mediante la combinación de controles y nuestras propias acciones, podemos solicitar información al usuario y responder a ella. En Visual Studio .NET, el formulario es una ventana que se utiliza en la aplicación. Cuando creamos un nuevo proyecto de aplicación para Windows, Visual Studio .NET proporciona una vista de Diseño que contiene un formulario. El formulario predeterminado contiene los elementos mínimos utilizados por la mayoría de formularios: una barra de título, un cuadro de control y los botones Minimizar, Maximizar y Cerrar. Inicialmente se debe instalar la aplicación Visual Studio .Net e ingresar a la aplicación de Visual Basic . Net , Inicialmente se crea 8un nuevo proyecto y en este se empiezan a agregar formularios, La mayoría de aplicaciones requieren más de una ventana por lo cual se debe agregar un formulario a su proyecto por cada ventana que requiera su aplicación. Para añadir formularios adicionales a nuestro proyecto:

Page 26: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

26

1. Si el Explorador de soluciones no esta abierto, en el menú Ver, hacer clic en Explorador de soluciones. 2. En el Explorador de soluciones, hacer clic con el botón derecho en el nombre del proyecto, seleccionar Agregar, y hacer clic en Windows Form. 3. En el cuadro de diálogo Agregar nuevo elemento, en el cuadro Nombre, escribir un nombre adecuado para el formulario y, a continuación, hacer clic en Abrir. 3 Cuando se genera el interfaz de usuario de una aplicación basada en Windows, se deben establecer las propiedades de los objetos que se crean.

La siguiente tabla describe algunas de las propiedades más habituales de los formularios que normalmente se establecen en el momento del diseño:

Propiedad Descripción Configuración predeterminada

3 http://www.willydev.net/descargas/Cursos/vbnet/index.html

Page 27: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

27

(Nombre) Establece el nombre del formulario en el proyecto (éste no es el nombre que se muestra al usuario en la barra de título, sino el nombre utilizado en el código para hacer referencia al formulario).

Importante: Si se cambia la propiedad (Name) del formulario, debe establecer el objeto de inicio para su proyecto al nuevo nombre o el proyecto no se iniciará correctamente. Si desea más información sobre cómo cambiar el objeto de inicio, lea el apartado Ciclo de vida del formulario de este módulo.

Form1 (Form2, Form3, etc.)

AcceptButton Establece en qué botón se hace clic cuando el usuario presiona la tecla ENTER.

Nota: El formulario debe disponer de un botón como mínimo con esta propiedad.

Ninguna

CancelButton Establece en qué botón se hace clic cuando el usuario presiona la tecla ESC.

Nota: El formulario debe disponer de un botón como mínimo con esta propiedad.

Ninguna

ControlBox Determina si un formulario muestra un cuadro de control en la barra de título. El cuadro de control puede contener los botones Minimizar, Maximizar, Ayuda y Cerrar.

True

FormBorderStyle Controla el aspecto del borde del formulario. También afecta a cómo aparece la barra de título y qué botones incluye.

Sizable

MaximizeBox Determina si un formulario dispone de un botón Maximizar en la esquina superior derecha de su barra

True

Page 28: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

28

de título.

MinimizeBox Determina si un formulario dispone de un botón Minimizar en la esquina superior derecha de su barra de título.

True

StartPosition Determina la posición de un formulario en la pantalla cuando aparece por primera vez.

WindowsDefaultLocation

Text Establece el texto que se muestra en la barra de título del control.

Form1 (Form2, Form3, etc.)

Después de añadir los formularios necesarios a un proyecto y establecer el formulario de inicio, se debe determinar qué eventos y métodos utilizar. El ciclo de vida completo de un formulario utiliza varios métodos y eventos.

Cuando se invoca el método Show(), los eventos y métodos del formulario normalmente se invocan en el orden siguiente: 1. Load

2. GotFocus

3. Activated

4. Closing

5. Closed

6. Deactivate

7. LostFocus

8. Dispose()

Nombre formul

ario Botón

ordenación Botón

alfabético Panel

descripción

Page 29: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

29

El evento Initialize se utiliza normalmente para preparar una aplicación para su uso. Se asignan variables a sus valores iniciales, y puede cambiarse el tamaño o la posición de los controles para hospedar datos de inicialización. En versiones anteriores de Visual Basic, el evento Initialize se utilizaba para ejecutar código antes de que un formulario se cargara. En .NET, el código de inicialización debe añadirse al constructor del formulario (Sub New()) después de la invocación de InitializeComponent() como se muestra en el siguiente ejemplo: Public Sub New() MyBase.New() ' This call is required by the Windows Forms Designer. InitializeComponent() ' Add your initialization code here

El método Show incluye un Load implícito; esto significa que si el formulario especificado no se ha cargado todavía cuando se invoca el método Show, la aplicación carga automáticamente el formulario en memoria y lo muestra al usuario. El método Show puede mostrar formularios como modales o no modales. FrmSplash.Show() Podemos utilizar el método ShowDialog() para mostrar un formulario como un cuadro de diálogo. El evento Load se utiliza para realizar acciones que deben ocurrir antes de que se muestre el formulario. También se utiliza para asignar valores predeterminados al formulario y sus controles. El evento Load tiene lugar cada vez que un formulario se carga en memoria. El evento Load de un formulario puede ejecutarse múltiples veces durante la vida de una aplicación. Se ejecuta cuando un formulario se inicia como resultado de la instrucción Load, la instrucción Show o cuando se genera una referencia a las propiedades, métodos o controles de un formulario no cargado. Cuando el usuario se mueve entre dos o más formularios, podemos utilizar los eventos Activated y Deactivate para definir el comportamiento de los formularios. El evento Activated tiene lugar cuando el formulario se activa mediante código o por el usuario. Para activar un formulario en tiempo de ejecución mediante código, se invoca el método Activate. Este evento puede utilizarse para tareas como la actualización del contenido del formulario en base a los cambios realizados en los datos del formulario cuando éste no estaba activado. El evento Activated se ejecuta cuando el formulario recibe el foco de otro formulario del mismo proyecto. Este evento únicamente se ejecuta cuando el formulario es visible. Por ejemplo, un formulario cargado utilizando la instrucción Load no es visible a menos que se utilice el método Show, o se establezca la propiedad Visible del formulario como True. El evento Activated se ejecuta antes del evento GotFocus. Utilice el siguiente código para establecer el foco a un formulario: FrmSplash.Focus()

Page 30: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

30

Deactivate se ejecuta cuando el formulario pierde el foco a otro formulario. Este evento se ejecuta después del evento LostFocus. Ambos eventos, Activated y Deactivate, se ejecutan únicamente cuando cambia el foco dentro de la misma aplicación. Si cambiamos a otra aplicación y regresamos al programa, ninguno de los dos eventos se ejecuta.

Si se necesita añadir código que se ejecute cuando el formulario se muestra o cuando el formulario está oculto, añadir el código a los controladores de eventos Activated y Deactivate en lugar de los controladores de eventos GotFocus y LostFocus.

El evento Closing resulta útil cuando se necesita saber cómo el usuario cierra el formulario. El evento Closing ocurre cuando el formulario recibe una solicitud de cierre. La validación de datos tiene lugar en ese momento. En caso de ser necesario mantener abierto el formulario (por ejemplo, si falla la validación de datos), el evento de cierre puede cancelarse.

El evento Closed ocurre cuando el formulario se cierra y antes del evento Dispose. El procedimiento del evento Closed se utiliza para verificar que el formulario debe cerrarse o para especificar acciones que deben tener lugar cuando se cierra el formulario. También se puede incluir código de validación a nivel de formulario para cerrarlo o para guardar datos en un archivo.

El .NET Framework no soporta el evento Terminate. El código de terminación debe ejecutarse dentro del método Dispose, antes de invocar MyBase.Dispose(). Public Overrides Sub Dispose(ByVal Disposing As Boolean) ' Termination code goes here. ' The following code was automatically added by the ‗Dispose method. MyBase.Dispose(Disposing) If Disposing Then If Not components Is Nothing Then Components.Dispose(Disposing) End If End If End Sub El método Dispose es invocado automáticamente para el formulario principal de una aplicación y debe invocarse explícitamente para cualquier otro formulario.

El método Hide elimina un formulario de pantalla pero no de la memoria. El usuario no puede acceder a los controles de un formulario oculto, pero sí están disponibles para la aplicación que se está ejecutando. Cuando un formulario está oculto, el usuario no puede interactuar con la aplicación hasta que finaliza la ejecución de todo el código del procedimiento de evento que ha ocultado el formulario.

Page 31: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

31

Si el formulario no está cargado en memoria cuando se invoca el método Hide, el método Hide carga el formulario pero no lo muestra. frmMyForm.Hide() Un controlador de eventos es un segmento de código que se invoca cuando ocurre un evento correspondiente. Por ejemplo, podemos escribir código en un controlador de eventos para el evento Activated de un formulario y realizar operaciones como actualizar los datos que se muestran en los controles del formulario cuando está activado. El .NET Framework utiliza una convención de nombres estándar para controladores de eventos. La convención consiste en combinar el nombre del objeto que envía el evento, un guión bajo, y el nombre del evento. Por ejemplo, el evento Click de un formulario denominado Form1 se denominaría Form1_Click. Para abrir un controlador de eventos: 1. Abrir el Editor de código del formulario para el que desea añadir un

controlador de eventos.

2. En el cuadro de lista Nombre de clase, hacer clic en (Form 1 Events). La siguiente ilustración muestra el cuadro de lista Nombre de clase con (Form 1 Events) seleccionado.

Hacer clic en la flecha para desplegar la lista del cuadro Nombre de método y ver los eventos disponibles para el formulario. La siguiente ilustración muestra el cuadro de lista Nombre de método con la lista de eventos del formulario y el evento Click seleccionado. Observar que el icono de Evento a la izquierda del nombre indica que es un evento. Hacer clic en el evento para añadir el controlador de eventos.

Cuando creamos un formulario utilizando el Diseñador de Windows Forms, el diseñador genera un bloque de código que deberíamos escribir si estuviésemos creando un formulario por nosotros mismos.

Page 32: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

32

Si miramos el código predeterminado del formulario, encontraremos el siguiente código generado por el diseñador: #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedimiento is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() components = New System.ComponentModel.Container() Me.txt End Sub #End Region InitializeComponent

Este código es utilizado por el entorno de desarrollo para que persistan los valores de propiedades que establezcamos en el Diseñador de Windows Forms. En versiones anteriores de Visual Basic, esta información no se guardaba en forma de código, sino como instrucciones textuales en la parte superior del archivo .frm que siempre quedaban ocultas al desarrollador.

Public Sub New()

Es el constructor de clases. Aunque podemos insertar aquí código de inicialización para el formulario, deberíamos situarlo en el evento Load del formulario (a menos que tenga necesariamente que estar aquí)

1.3.5 Uso y manejo de controles

Page 33: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

33

Los controles son objetos contenidos en los objetos formulario. Botones, cuadros de texto y etiquetas son algunos ejemplos de controles. Existen dos formas de añadir controles a un formulario. La primera permite añadir varios controles rápidamente y, a continuación, establecer su tamaño y posición individualmente. La segunda forma, ofrece mayor control inicial sobre el tamaño y posición de los controles. Para añadir controles a un formulario y, a continuación, establecer su tamaño y posición: 1. Si el Cuadro de herramientas no está abierto, en el menú Ver, hacer clic en

Cuadro de herramientas.

2. En el Cuadro de herramientas, hacer doble clic en el control que desea añadir. Se insertará una instancia del control con el tamaño predeterminado en la esquina superior izquierda del objeto activo. Cuando se añaden varios controles de este modo, se insertan uno encima de otro.

3. Una vez añadidos los controles, podemos cambiar su posición y tamaño:

a. Para cambiar la posición del control, hacer clic sobre el control para seleccionarlo y arrastrarlo a la posición deseada.

b. Para cambiar el tamaño del control, hacer clic sobre el control para seleccionarlo y arrastrar uno de los ocho puntos para modificar el tamaño hasta alcanzar el adecuado.

Para cambiar el tamaño y posición de los controles mientras los añadimos a un formulario: 1. Si el Cuadro de herramientas no está abierto, en el menú Ver, hacer clic en

Cuadro de herramientas.

2. En el Cuadro de herramientas, hacer clic en el control que desea añadir.

3. Mover el cursor del ratón sobre el formulario. El símbolo del cursor cambia a una cruz.

4. Posicionar la cruz donde desee que aparezca la esquina superior izquierda del control.

5. Hacer clic y arrastrar la cruz donde deseemos que se ubique la esquina inferior derecha. Se dibujará en la pantalla un rectángulo que indica el tamaño y ubicación del control.

6. Cuando el control tenga el tamaño adecuado, liberar el botón del ratón. El control aparece en la ubicación correcta en el formulario.

7. Podemos cambiar el tamaño y la posición del control después de liberar el botón del ratón:

a. Para cambiar la posición del control, hacer clic en el control para seleccionarlo y arrastrarlo a la posición adecuada.

Page 34: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

34

b. Para cambiar el tamaño del control, hacer clic en el control para seleccionarlo y arrastrar uno de los ocho tiradores de tamaño hasta conseguir el tamaño deseado.

comandos y herramientas que contiene una aplicación. Una planificación y diseño adecuados de los menús y de las barras de herramientas son esenciales y garantizan a los usuarios una correcta funcionalidad y accesibilidad de la aplicación. Un control de menú tiene numerosas propiedades, como Name, Caption e Index. La propiedad Name identifica el control de menú en código.

La propiedad Index identifica controles que comparten el mismo nombre.

La propiedad Caption es el texto que aparece en la barra de menú en tiempo de ejecución.

Para añadir menús a un formulario: 1. Si el Cuadro de herramientas no está abierto, en el menú Ver, hacer clic en

Cuadro de herramientas.

2. En el Cuadro de herramientas, hacer doble clic en el control MainMenu.

3. En el cuadro Caption del menú recién creado, escribir el texto del título del primer menú. Este título aparecerá en la barra del menú.

4. En el cuadro Nombre, en la ventana Propiedades, escribir el nombre que utilizará para hacer referencia al control de menú en código.

Podemos utilizar el menú Formato o la barra de Presentación del entorno de desarrollo integrado (IDE) de Visual Studio para alinear, disponer en capas y bloquear los controles de un formulario. El menú Formato ofrece numerosas opciones para organizar los controles. Cuando utilicemos las opciones del menú Formato para organizar controles, es conveniente seleccionarlos de forma que el último control seleccionado sea el control primario respecto al cual se alineará el resto. Los cuadros de tamaño alrededor del perímetro del control primario son de color oscuro, mientras que los cuadros de tamaño del resto de controles son de color claro. La siguiente tabla muestra las opciones y sus funciones:

Opción

Descripción

Alinear Alinea todos los controles respecto al control primario

Igualar tamaño Cambia el tamaño de múltiples controles de un formulario

Espaciado horizontal Incrementa el espaciado horizontal entre controles

Espaciado vertical Incrementa el espaciado vertical entre controles

Centrar en el Centra los controles de un formulario

Page 35: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

35

formulario

Ordenar Dispone en capas los controles de un formulario

Bloquear controles Bloquea todos los controles de un formulario

Para alinear varios controles: 1. En el Diseñador de Windows Forms, abrir el formulario que contiene los

controles que desea posicionar.

2. Seleccionar los controles que deseamos alinear de forma que el último control que seleccione sea el control primario respecto del que se alineará el resto.

• En el menú Formato, seleccionar Alinear, y hacer clic en cualquiera de las siete opciones disponibles.

Cuando creemos complejos interfaces de usuario, es posible que desee disponer en capas los controles de un formulario. Para disponer en capas los controles de un formulario: 1. Seleccionar un control.

2. En el menú Formato, seleccionar Ordenar y hacer clic en Traer al frente o Enviar al fondo.

Puede bloquear todos los controles de un formulario. De este modo, se evita mover o cambiar accidentalmente el tamaño de los controles mientras se están estableciendo otras propiedades. Para bloquear todos los controles de un formulario, en el menú Formato, hacer clic en Bloquear controles. UNIDAD 2 FUNDAMENTOS DE VISUAL BASIC .NET

2.1 Programación Orientada a Objetos

2.1.1 La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del resto). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar4

4 http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos

Page 36: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

36

En la programación orientada a objetos, utilizamos la abstracción y la encapsulación para crear clases bien diseñadas. Una clase es una plantilla o una estructura preliminar de un objeto. Esta estructura preliminar define atributos para almacenar datos y define operaciones para manipular esos datos. Una clase también define un conjunto de restricciones para permitir o denegar el acceso a sus atributos y operaciones. Para crear una clase bien diseñada, utilizaremos la abstracción. Al implementar la abstracción, definiremos un concepto utilizando un mínimo conjunto de funcionalidades pensadas cuidadosamente que proporcione el comportamiento fundamental de la clase de un modo fácil de utilizar. Por desgracia, no es fácil crear buenas abstracciones de software. Normalmente, encontrar buenas abstracciones requiere un profundo conocimiento del problema que ha de resolver la clase y su contexto, una gran claridad de ideas y mucha experiencia. El formulario Visual Basic .NET con el que hemos estado trabajando es un buen ejemplo de abstracción. Las propiedades esenciales de un formulario, como el título y color de fondo, se han abstraído en la clase Form. Algunas operaciones esenciales que se han abstraído son abrir, cerrar y minimizar. La abstracción se garantiza mediante la encapsulación. La encapsulación es el empaquetamiento de atributos y funcionalidades para crear un objeto que esencialmente es una ―caja negra‖ (cuya estructura interna permanece privada). Empaquetamos los detalles de la abstracción y proporcionamos acceso sólo a los elementos que necesitan estar accesibles. Otros objetos pueden acceder a los servicios de un objeto encapsulado únicamente mediante mensajes que pasan a través de una interfaz claramente definida. Un ejemplo de encapsulación es un terminal de autoservicio (automatic teller machine, ATM). La interfaz de la ATM es simple para el cliente ATM, y el funcionamiento interno está oculto. Del mismo modo, una clase cuentaBanca encapsularía los métodos, campos y propiedades que describen una cuenta bancaria. Sin la encapsulación, deberíamos declarar procedimientos y variables distintos para almacenar y gestionar información de la cuenta bancaria, y sería difícil trabajar con más de una cuenta bancaria a la vez. La encapsulación permite a los usuarios utilizar los datos y procedimientos de la clase cuentaBanca como una unidad, sin conocer el código concreto encapsulado en la clase.

Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en

Page 37: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

37

clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple.

Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica.

Encapsulamiento: también llamado "ocultación de la información". Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.5

2.1.2 En Visual Basic Net un objeto puede definirse como cualquier cosa, ente o entidad física o lógica de información.

En este sentido todos los elementos materiales o inmateriales pueden clasificarse como objetos.

En particular cualquier objeto considerado presenta los siguientes tres elementos:

a) Propiedades: Son las características propias de un objeto estas propiedades o atributos son los que permiten diferenciar o individualizar un objeto de otro objeto ya sea de la misma o diferente clase o categoría.

Las propiedades mas generales son forma, color, tamaño, peso, etc., pero ya en particular:

Chamarra → Marca, material, precio, color, tamaño, etc

Alumno → Matricula, nombre, edad, domicilio, etc.

Gato → Raza, nombre, color, edad, etc.

5 http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos

Page 38: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

38

VentanaWindows–>Tamaño, Color, font, etc.

b) Métodos: Son las conductas propias de la naturaleza del objeto.

Así como las propiedades son el ser (que es) del objeto, los métodos son el hacer (que hacer) del objeto.

ejemplo de métodos:

Gato —> Maullar(), comer(), correr(), saltar(), etc.

Alumno—> Estudiar(), comer(), asistir clase(), pintear()

Cuaderno–>Esescrito(), esrayado(), esborrado(), etc.

VentanaWindows–> Abrir(), cerrar(), maximizar(), etc....

c) Eventos: Es la relacion (de varias maneras) que se puede dar entre dos objetos ya sean de la misma o diferente clase.

Un evento se manifiesta como un interaccion entre dos objetos, en general al momento de la relacion al mismo tiempo se dara una reaccion o respuesta por parte de los dos objetos que se manifiestan como una serie, cadena o conjuntos de metodos propios que se activan o disparan, ejemplo:

Evento Relacion Metodos que se activan

gato detecta gata detectar maullar(), correr(), oler()

gato detecta perro detectar bufar(), saltar(), correr()

maestro ensena alumno Ensenar pasar lista(), preguntar(), etc

Raton click Windows click maximizar(), cerrar()

Raton dblclk Windows dblclk minimizar(), etc

Un Programa o un SCRIPT en visual Basic Net se puede considerar como un conjunto de una o mas paginas o formas donde cada una de ellas contiene un conjunto de objetos, componentes o controles.

Un componente o propiamente dicho un control es un objeto que se especializa en una tarea especifica por ejemplo hay controles especializados en desplegar textos o mensajes, otros controles se especializan en desplegar imágenes o videos, otros en manipular directorios o archivos en disco, etc.

Page 39: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

39

Pero en general tanto las formas como los controles no dejan de ser objetos en programación de visual Basic y por tanto tienen sus propiedades, métodos y están sujetos a eventos.

En visual Basic Net cabe recordar además que un conjunto de objetos que comparten o contienen características similares forman la llamada CLASE.

2.2 Elementos de un programa: Tipos de datos como objetos de clase

Los tipos de datos en visual basic.net con objetos de clase, cada vez que se crea un objeto bien sea short, integer o cualquier otro se crea un objeto de clase short, integer o cualquier otro tipo de datos. Las clases numéricas En esta sección veremos la siguiente clase: La clase Integer Esta y las siguientes (Short, byte, double, boolean ,decimal, single,long char, string y objecto), clases comparten todas casi los mismos métodos salvo en algunas que tienen menos métodos y en otras que tienen más de las mostradas. Esta clase almacena un datos de tipo entero. Alguno de sus métodos son: CompareTo Compara esta instancia con un objeto especificado y devuelve una indicación de los valores relativos.

Equals Devuelve un valor que indica si la instancia equivale a un objeto especificado.

GetHashCode Devuelve el código hash de esta instancia.

GetType Obtiene el tipo de objeto de la instancia actual

Parse Convierte la representación en forma de cadena de un número en el entero de 32 bits con signo equivalente.

ToString Convierte el valor numérico de esta instancia en la representación de cadena equivalente.

MinValue Se obtiene el valor mínimo del tipo de dato correspondiente

Page 40: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

40

MaxValue Se obtiene el valor máximo del tipo de dato correspondiente Ahora se realizarán ejemplos para mostrar cada uno de los métodos anteriores CompareTo Este método lo que hace es una comparación con otro objeto o

consigo mismo verificando si es igual en su contenido. Por ejemplo Este ejemplo compara dos objetos de tipo integer verificando el contenido. Hay 3 posibilidades Si el resultado es =0 indica que el contenido en el objeto es igual que el contenido

almacenado en el objeto pasado como parámetro Si el resultado es >0 indica que el contenido en el objeto es mayor que el

contenido almacenado en el objeto pasado como parámetro Si el resultado es >0 indica que el contenido en el objeto es menor que el

contenido almacenado en el objeto pasado como parámetro Module Module1 Sub Main() Dim i As Integer = 5 Dim j As Integer = 4 Dim r As Integer r = i.CompareTo(j) If r > 0 Then Console.Write("i={0} es mayor que j={1}", i, j) ElseIf r < 0 Then Console.Write("j={0} es menor que i={1}", j, i) Else Console.Write("i={0} es igual a j={1}", i, j) End If Console.Read() End Sub End Module Dará como resultado i=5 es mayor que j=4 Equals compara dos objetos del mismo tipo retorno true o false Por ejemplo Module Module1 Sub Main()

Page 41: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

41

Dim i As Integer = 5 Dim j As Integer = 4 Dim r As Boolean r = i.Equals(j) If r = True Then Console.Write("i={0} es igual a j={1}", i, j) Else Console.Write("i={0} es diferente de j={1}", i, j) End If Console.Read() End Sub End Module Dará como resultado I=5 es diferente de j=4 Si j tuviera 5 el resultado sería I=5 es igual a j=4 GetHashCode Devuelve el código hash de esta instancia (Realmente no sé la

utilidad) Ejemplo Module Module1 Sub Main() Dim i As Integer = 5 Console.Write("Código hash para i:{0}={1}", i, i.GetHashCode()) Console.Read() End Sub End Module Dará como resultado i:5=5 GetType indica el tipo de objeto Ejemplo Module Module1 Sub Main() Dim i As Integer = 5 Console.Write("i es un Tipo de dato {0}", i.GetType()) Console.Read() End Sub End Module Dará como resultado

Page 42: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

42

i es un Tipo de dato System.Int32 Se preguntarán porque System.Int32 lo que sucede es que ése es el verdadero nombre que tiene el tipo de dato Integer en la plataforma .net framework y ahora se llama Integer para conservar la compatibilidad con las versiones anteriores, es simplemente el nombre Parse convierte una cadena que representa un número Integer a un número de

tipo Integer Ejemplo Module Module1 Sub Main() Dim i As Integer Dim valor As String valor = 31000 'Primera opción i = Integer.Parse(valor) 'Segunda opción ' se coloca en comentario 'si quiere coloca en comentario la línea de 'la primera opción y quita el comentarió de l 'la segunda 'i = i.Parse(valor) Console.Write("i={0}", i) Console.Read() End Sub End Module ToString Este método convierte a cadena el número especificado Ejemplo Module Module1 Sub Main() Dim i As Integer = 31550 Dim valor As String valor = i.ToString() Console.Write("valor={0}", valor) Console.Read() End Sub End Module MinValue y MaxValue Con este ejemplo creo que es suficiente

Page 43: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

43

Module Module1 Sub Main() Dim i As Integer Console.WriteLine("el valor minimo de este tipo de dato es {0}", i.MinValue) Console.WriteLine("el valor máximo de este tipo de dato es {0}", i.MaxValue) Console.Read() End Sub End Module Sin embargo también se puede realizar de la siguiente manera, donde no es necesario declarar ninguna variable para verificar el mínimo y máximo de un tipo de dato. Module Module1 Sub Main() Console.WriteLine("el valor minimo de este tipo de dato es {0}", Integer.MinValue) Console.WriteLine("el valor máximo de este tipo de dato es {0}", Integer.MaxValue) Console.Read() End Sub End Module Ahora se verán los otros métodos Todos estos métodos son de la clase Decimal sin embargo no son todos. Module Module1 Sub Main() Dim i As Decimal Dim j As Decimal i = 1500 j = 2500 Console.WriteLine("Valor de i={0} , Valor de j={1}", i, j) Console.WriteLine("La suma de estas dos variables es {0}", Decimal.Add(i, j)) Console.WriteLine("La división de estas dos variables es {0}", Decimal.Divide(i, j)) Console.WriteLine("La multiplicación de estas dos variables es {0}", Decimal.Multiply(i, j)) Console.WriteLine("El valor multiplicado por -1 {0}", Decimal.Negate(i)) Console.WriteLine("Resta el primer valor del segundo {0}", Decimal.Subtract(i, j)) Console.Read() End Sub End Module

Page 44: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

44

IsNaN Este método lo usan algunas clases como double, single y otros.

Este método se usa para determinar que el resultado de la variable no corresponde a un

número. Ejemplo Module Module1 Sub Main() Dim i As Double Dim j As Double Dim x As Double i = 0 j = x = i / j If Double.IsNaN(x) = True Then Console.WriteLine("El objeto no almacena un número") End If Console.Read() End Sub End Module De las clases numéricas existen otro métodos como redondear un número, convertir a otros tipos de datos por métodos implícitos La clase char Con el siguiente ejemplo se muestran varios de los métodos pero son muchos

más. Module Module1 Sub Main() Dim ch8 As Char, letra As Char = "n"c ch8 = "8"c Console.WriteLine("ch8={0} y letra={1}", ch8, letra) Console.WriteLine("ch8 es un digito ", Char.IsDigit(ch8)) Console.WriteLine("ch8 es un número", Char.IsNumber(ch8)) Console.WriteLine("ch8 es un carácter alfabético", Char.IsLetter(ch8)) Console.WriteLine("la variable llamada letra tiene una letra minúscula", Char.IsLower(letra)) Console.WriteLine("la variable llamada letra tiene una letra mayúscula", Char.IsUpper(letra)) Console.Read() End Sub End Module

Page 45: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

45

Es importante no olvidar la instrucción Option Strict On y OPTION Explicit On en cada uno de los ejemplos. La clase String Esta clase posee muchos métodos entre ellos tenemos ToUpper Convierte todos los caracteres de una cadena en Mayúsculas. ToLower Convierte todos los caracteres de una cadena en minúsculas. Chars Obtiene el carácter situado en una posición especificada en la

instancia en cuestión. Length Obtiene el número de caracteres de la instancia en cuestión. Clone Crea otra referencia a la misma cadena Concat Concatena dos cadenas Copy Crea un nuevo objeto de tipo string EndsWith Determina si un string termina o no en una cadena dada. IndexOf Retorna la posición de la primera ocurrencia de un carácter o de un

string dado como parámetro. Insert Inserta una instancia especificada de String en una posición de

índice especificada de la instancia.

Join Concatena un objeto String separador especificado entre cada uno de los elementos de una matriz String especificada, generando una sola cadena concatenada.

LastIndexOf Retorna la posición de la última ocurrencia de un carácter o de un String dado como parámetro.

PadLeft Inserta caracteres a la izquierda de una cadena la cantidad

especificada. PadRight Inserta caracteres a la derecha de una cadena la cantidad

especificada Si la cantidad estipulada es menor o igual a la cantidad de caracteres que tiene la cadena original no hará nada

Page 46: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

46

Remove Elimina un número de caracteres especificado de la instancia a partir de una posición especificada.

Replace Reemplaza todas las apariciones de un carácter Unicode o un objeto

String en la instancia por otro carácter Unicode u otro objeto String. Split Toma en un vector de tipo string las cadenas que estén separadas

por un carácter especifico. StartsWith Determina si el principio de la instancia coincide con el objeto String

especificado. Substring Toma n caracteres de una cadena estipulando el inicio y la cantidad

a tomar ToCharArray Copia los caracteres de la instancia en una matriz de

caracteres Unicode. ToLower Devuelve una copia de String en minúsculas. ToString Convierte el valor de la instancia en un objeto String. ToUpper Devuelve una copia de String en mayúsculas. Trim Eliminar los espacios al comienzo y al final de una cadena TrimEnd Elimina los espacios al final de una cadena TrimStart Elimina los espacios al comienzo de una cadena Debido a que son muchos métodos se realizarán algunos ejemplos donde se usen varios de los métodos expuestos, pero antes existen 2 tipos de métodos para la clase String los compartidos y los métodos de instancia, el primero es un método que se deriva de la propia clase String y no necesita una instancia de dicha clase para funcionar. Ejemplo Dim cadena As String cadena = String.Copy("copia esta cadena") Los métodos de instancia se derivan de una instancia concreta de String y deben calificarse con el nombre de la instancia. Por ejemplo: Dim cadena As String cadena = cadena.Copy("copia esta cadena") El siguiente ejemplo usa varios de los métodos antes expuestos

Page 47: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

47

Module Module1 Sub Main() Dim a(2) As String, b As String, c As String, d As String = " un espacio " a(0) = "universidad " a(1) = "dos" a(2) = "tres" 'La siguiente línea es una alternativa b = b.Join(",", a) Console.WriteLine("Valor de a(0)={0}", a(0)) Console.WriteLine("Valor de a(1)={0}", a(1)) Console.WriteLine("Valor de a(2)={0}", a(2)) Console.WriteLine(b) 'La siguiente línea es otra alternativa b = String.Join(",", a) Console.WriteLine(b) c = a(0).Substring(3, 5) Console.WriteLine("Si usamos la siguiente instrucción c = a(0).Substring(3, 5) Obtenemos") Console.WriteLine(c) 'Otra forma es c = Mid(a(0), 3, 5) Console.WriteLine("Si usamos la siguiente instrucción c = Mid(a(0), 3, 5) Obtenemos") Console.WriteLine(c) Console.WriteLine("Observe la diferencia entre las 2 instrucciones anteriores") 'Ahora convertimos a Mayúsculas y minúsculas Console.WriteLine("a(0) en Mayúsculas es {0}", a(0).ToUpper & "Con la instrucción a(0).ToUpper") Console.WriteLine("a(0) en Minúsculas es {0}", a(0).ToLower & "Con la instrucción a(0).ToLower") Dim cadena As String cadena = cadena.Copy("Copia esta cadena") Console.WriteLine(cadena) Console.WriteLine("valor de la variable d=|{0}|", d) Console.WriteLine("Ahora si usamos la siguiente instrucción d.TrimStart |{0}|", d.TrimStart) Console.WriteLine("Elimina los espacios al comienzo de la cadena") Console.WriteLine("Y si usamos la siguiente instrucción d.TrimEnd |{0}|", d.TrimEnd) Console.WriteLine("Elimina los espacios al final de la cadena") Console.WriteLine("Y si usamos finalmente la siguiente instrucción d.Trim |{0}|", d.Trim) Console.WriteLine("Elimina los espacios al comienzo y al final de la cadena")

Page 48: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

48

Console.Read() End Sub End Module Este otro ejemplo muestro otro grupo de métodos de esta clase Option Explicit On Option Strict On Imports System Module Module1 Sub Main() Dim cadena1 As String = "xertfdxfre", cadena2 As String = "kjhyulinghy",

cadena3 As String, cadena4 As String = "ppsdfgxcvpp" Dim cadena5 As String = "Adicional", cadenas6() As String, cadena7 As

String Dim caracter As Char = "p"c Console.WriteLine("Contenido de la variable cadena1 ={0}", cadena1) Console.WriteLine("Contenido de la variable cadena2 ={0}", cadena2) Console.WriteLine("El tercer carácter de la variable cadena1 es {0}",

cadena1.Chars(3)) Console.WriteLine("Cantidad de carácteres de la variable cadena1 {0}",

cadena1.Length()) cadena3 = String.Concat(cadena1, cadena2) Console.WriteLine("Ahora se ha concatenado la cadena1 y la cadena2 en

cadena3") Console.WriteLine("La variable cadena3 ahora tiene la ste información {0}",

cadena3) Console.WriteLine("el carácter t se encuentra en la posición {0} de la variable

cadena1", cadena1.IndexOf("t")) Console.WriteLine("Contenido de la variable cadena4 {0}", cadena4) Console.WriteLine("Ahora se eliminarán las pes del comienzo y del final de la

variable cadena4 {0}", cadena4.Trim("p")) Console.WriteLine("Contenido de la varible cadena5 {0}", cadena5) Console.WriteLine("Ahora a la variable cadena1 se le va a adicionar la

variable cadena5 desde la posición 5") Console.WriteLine("Contenido de la variable cadena1 {0}", cadena1.Insert(5,

cadena5)) cadenas6 = cadena5.Split("c") Console.WriteLine("Contenido de la variable cadenas6 indice 0 {0}",

cadenas6(0)) Console.WriteLine("Contenido de la variable cadenas6 indice 1 {0}",

cadenas6(1)) Console.WriteLine("Ahora se le añadirán pes a la izquierda de la variable5,

cuyo contenido es Adicional {0}", cadena5.PadLeft(15, caracter))

Page 49: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

49

Console.WriteLine("También se le añadirán pes a la derecha de la variable5, cuyo contenido es Adicional {0}", cadena5.PadRight(15, caracter))

Console.Read() End Sub End Module Ahora veremos la conversión entre los tipos de datos, a continuación se muestra una tabla donde indica que tipos de datos se pueden convertir a otros. Conversiones de ampliación La tabla siguiente muestra las conversiones de ampliación estándar.

Tipo de datos Se amplía a los siguientes tipos de datos

Byte Byte, Short, Integer, Long, Decimal, Single, Double

Short Short, Integer, Long, Decimal, Single, Double

Integer Integer, Long, Decimal, Single, Double

Long Long, Decimal, Single, Double

Decimal Decimal, Single, Double

Single Single, Double

Double Double

Cualquier tipo enumerado

Su tipo entero subyacente y cualquier tipo al cual se amplíe

Char Char, String

Cualquier tipo Object

Cualquier tipo derivado

Cualquier tipo básico desde el cual se deriva

Cualquier tipo Cualquier interfaz que implemente

Nothing Cualquier tipo de datos o tipo de objeto

El siguiente cuadro muestra las funciones de conversión de un tipo a otro Conversión entre tipo de datos

Nombre de la función

Tipo de valor devuelto

Intervalo de valores del argumento

Cbool Bolean Cualquier expresión numérica o de cadena (String) válida.

Cbyte Byte 0 a 255; las fracciones se redondean.

Cchar Char Cualquier expresión String válida, valores comprendidos entre 0 y 65535.

Cdate Date Cualquier representación válida de fecha y hora.

Page 50: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

50

CDbl Double -1,79769313486231E+308 a -4,94065645841247E-324 para valores negativos; 4,94065645841247E-324 a 1,79769313486231E+308 para valores positivos.

Cdec Decimal +/-79.228.162.514.264.337.593.543.950.335 para números a partir de cero, es decir, números sin decimales. Para números con 28 decimales, el rango es +/-7.9228162514264337593543950335. El menor número distinto de cero es 0,0000000000000000000000000001.

Cint Integer -2.147.483.648 a 2.147.483.647; las fracciones se redondean.

CLng Long -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807; las fracciones se redondean.

CObj Object Cualquier expresión válida.

Cshort Short -32.768 a 32.767; las fracciones se redondean.

CSng Single De -3,402823E+38 a –1,401298E-45 para valores negativos; de 1,401298E-45 a 3,402823E+38 para valores positivos.

CStr String Los valores devueltos para CStr dependen del argumento expression.

2.2.5 Crear un objeto a partir de una clase

Las clases definen las características y la forma de acceder a los datos que contendrá, pero sólo eso: los define. Para que se pueda asignar información a una clase y poder usar los métodos de la misma, tenemos que crear un objeto basado en esa clase, o lo que es lo mismo: se debe crear una nueva instancia en la memoria de dicha clase. Para ello, realizamos el siguiente proceso:

Definir una variable capaz de contener un objeto del tipo de la clase, esto lo haremos como con cualquier variable:

Dim cli As Cliente

Pero, a diferencia de las variables basadas en los tipos visto hasta ahora, para poder crear un objeto basado en una clase, necesitamos algo más de código que nos permita "crear" ese objeto en la memoria, ya que con el código usado en la línea anterior, simplemente estaríamos definiendo una

Page 51: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

51

variable que es capaz de contener un objeto de ese tipo, pero aún no existe ningún objeto en la memoria, para ello tendremos que usar el siguiente código:

cli = New Cliente()

Con esto se esta diciendo al Visual Basic: crea un nuevo objeto en la memoria del tipo Cliente.

Estos dos pasos los podemos simplificar de la siguiente forma:

Dim cli As New Cliente()

A partir de este momento existirá en la memoria un objeto del tipo Cliente.

Nota: En las versiones anteriores de Visual Basic no era recomendable usar esta forma de instancia un nuevo objeto en la memoria, porque, aunque de forma transparente para nosotros, el compilador añadía código extra cada vez que se utilizaba esa variable, pero en la versión .NET no existe ese problema y por tanto no deteriora el rendimiento de la aplicación.

Acceder a los miembros de una clase

Para acceder a los miembros de una clase (propiedades o métodos) usaremos la variable que apunta al objeto creado a partir de esa clase, seguida de un punto y el miembro al que queremos acceder, por ejemplo, para asignar el nombre al objeto cli, usaremos este código:

cli.Nombre = "Juan"

Es decir, de la misma forma que se haría con cualquier otra variable, pero indicando el objeto al que pertenece dicha variable. Como podrás comprobar, esto ya lo hemos estado usando anteriormente tanto en la clase Console como en las otras clases que hemos usado en entregas anteriores, incluyendo los arrays.

Y para acceder al método Mostrar:

cli.Mostrar()

2.3.1 Vectores, Matrices y Estructuras

Page 52: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

52

Tanto los vectores como las matrices son un conjunto de datos de un mismo tipo, para muchos al escribir sobre matrices se refieren tanto a matrices de 2 dimensiones como de una dimensión. Aunque sea lo mismo prefiero decir que un vector tiene una dimensión y una matriz más de una dimensión. Existen diferentes formas de declarar variables de vector por ejemplo Dim a(4) As String a(0)=‖indice cero‖ a(1)=‖indice uno‖ ó Ahora si lo que queremos es un vector numérico será Dim VectorA() As Short = {6, 7} Y si es de dos dimensiones será Dim Matriz(10,20) as Single Aunque también pueden declararse de las siguientes maneras Vectores Dim BA() As Byte = New Byte() {} Dim BA() As Byte = New Byte() {0,1,2} Dim BA() As Byte = New Byte(2) {0,1,2} Matrices Dim JB()() As Byte = {New Byte() {}, New Byte() {}} Dim JB()() As Byte = {New Byte(1) {}, New Byte(1) {}} Dim JB()() As Byte = {New Byte() {5, 6}, New Byte() {7, 8}} Dim S(,) As Short = New Short(,) {} Dim S(,) As Short = New Short(1, 1) {} Dim S(,) As Short = New Short(,) {{5, 6}, {7, 8}} Ahora se realizara el siguiente ejemplo que lo que se busca es mostrar algunas propiedades de los arrays. Option Explicit On Option Strict On

Page 53: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

53

Module Module1 Sub Main() Dim VectorA() As Integer = {3, 4, 1, 2, 5, 0, 0, 0, 0} Dim VectorB() As Integer = {8, 7, 6, 9}, i, j As Integer Dim ref() As Integer Dim Dimension As Integer If TypeOf (VectorA) Is Array Then Console.WriteLine("______________________________") Console.WriteLine("El primer arreglo es VectorA") For i = 0 To VectorA.GetLength(0) - 1 Console.WriteLine("Indice {0}={1}", i, VectorA(i)) Next Console.WriteLine("El segundo arreglo es VectorB") For i = 0 To VectorB.GetLength(0) - 1 Console.WriteLine("Indice {0}={1}", i, VectorB(i)) Next Console.WriteLine("Tipo del arreglo: {0} Propiedad VectorA.GetType()", VectorA.GetType()) Console.WriteLine("Tiene tamaño fijo? IsFixedSize = {0} Propiedad VectorA.IsFixedSize", VectorA.IsFixedSize) Console.WriteLine("Es de sólo lectura? IsReadOnly = {0} Propiedad VectorA.IsReadOnly", VectorA.IsReadOnly) Console.WriteLine("Tiene {0} dimension propiedad VectorA.Rank", VectorA.Rank) Console.WriteLine("Cantidad de elementos {0}", VectorA.GetLength(0)) VectorB.CopyTo(VectorA, 5) Console.WriteLine("Resultado después de usar la siguiente instrucción VectorB.CopyTo(VectorA, 5) en el primer vector") For i = 0 To VectorA.GetLength(0) - 1 Console.WriteLine("Indice {0}={1}", i, VectorA(i)) Next ref = VectorB Console.WriteLine("Aqui se está referenciando la variable reg que también es un arreglo a VectorB (ref = VectorB)") ref(0) = 3 Console.WriteLine("Resultado después de modificar el valor del indice 0 del segundo vector con la siguiente instrucción (ref(0) = 3)") For i = 0 To VectorB.GetLength(0) - 1 Console.WriteLine("Indice {0}={1}", i, VectorB(i)) Next Console.WriteLine("Ahora si lo que queremos es ordenar el segundo vector") Console.WriteLine("Lo haremos con cualquiera de estas instrucciones (VectorB.Sort(VectorB)) ó (Array.Sort(VectorB))")

Page 54: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

54

VectorB.Sort(VectorB) For i = 0 To VectorB.GetLength(0) - 1 Console.WriteLine("Indice {0}={1}", i, VectorB(i)) Next 'Otra forma de recorrer un vector es Console.WriteLine("Otra forma de recorrer un vector es:") For Each i In VectorB Console.WriteLine(i) Next End If Console.Read() End Sub End Module Otro ejemplo Option Explicit On Option Strict On Module Module1 Sub Main() Dim I, J As Integer Dim MaxDim0, MaxDim1 As Integer Dim S(,) As Short = New Short(,) {{5, 6}, {7, 8}} MaxDim0 = S.GetUpperBound(0) MaxDim1 = S.GetUpperBound(1) For I = 0 To MaxDim0 For J = 0 To MaxDim1 Console.WriteLine("Fila: {0}:Columna: {1}:Valor: {2}", I, J, S(I, J)) Next J Next I Console.Read() End Sub End Module Las matrices regulares se caracterizan por tener el mismo número de elementos en cada una de sus dimensiones. Una matriz bidimensional de 10 elementos tendrá similar número en cada una de sus filas. Basta con saber la cantidad de los mismos de una de ellas para conocer la cantidad de elementos de las demás. Existe un tipo adicional de matrices llamadas irregulares o dentadas las cuales no cumplen la regla anterior. Ellas se caracterizan porque cada fila puede contener u

Page 55: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

55

numero diferente de elementos. Una matriz irregular bidimensional, por ejemplo podría contener 3 elementos en la primera fila, 10 elementos en la segunda y 6 elementos en la tercera, moldeando así una figura irregular, aunque podría se más compleja. Por ejemplo Module Module1 Sub Main() Dim irregular() As Array = {New Integer() {1, 2, 3, 4}, _ New Integer() {5, 6, 7}, _ New Integer() {8, 9}} Dim i, j As Integer For i = 0 To irregular.Length - 1 For j = 0 To irregular(i).Length - 1 Console.WriteLine(irregular(i).GetValue(j).ToString) Next j, i Console.Read() End Sub End Module En el ejemplo anterior la variable i llevará la cuenta de las filas, la variable j mantiene el valor del elemento a leer de la misma, la propiedad length obtendrá la cantidad total de integrantes de la matriz principal o raíz, la cual dará como resultado 3, ya que existen únicamente 3 filas. Sin embargo también se pueden realizar matrices con tipos de datos diferentes Por ejemplo Dim Irregular() As Array = {New Integer() {1, 2, 3, 4}, _ New String() {"Colombia", "Bogotá","Cundinamarca"}, _ New Long() {8, 9}} Ahora veremos las estructuras Las estructuras son parecidas que las enumeraciones pero con muchas ventajas, entre ellas que cada elemento de la estructura puede ser de cualquier tipo integer, double, String o matriz, además, se pueden declaran funciones dentro de la estructura, constructores, ámbito de variables independientes. Etc. Una declaración de estructuras empieza con la instrucción Structure, y finaliza con la instrucción End Structure. Entre estas dos instrucciones debe declararse por lo menos un miembro.

Page 56: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

56

Si desea mantener un nombre de empleado, su extensión telefónica y su salario juntos en una única variable, puede declarar una estructura para esta información de la siguiente manera:

Structure Empleado Public Nombre As String Public Extension As Long Private Salario As Decimal End Structure Observe que las variables pueden tener varios tipos de acceso, en este caso public y private, en el caso de las private solo pueden acceder a ellas desde procedimientos o funciones que sean públicos y estén en la misma estructura. Por ejemplo Option Explicit On Option Strict On Module Module1 Structure Empleado Public Nombre As String Public Extension As Long Private Salario As Decimal Public Sub Monto(ByVal Valor As Decimal) Salario = Valor End Sub Public Sub Mostrar() Console.WriteLine("El nombre es :{0}", Nombre) Console.WriteLine("La extensión es :{0}", Extension) Console.WriteLine("Su salario es :{0}", Salario) End Sub End Structure Sub Main() Dim Carlos As Empleado With Carlos .Nombre = "Alfonso" .Extension = "4598" .Monto(1500000) .Mostrar() End With Console.Read() End Sub End Module

Page 57: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

57

Ahora veremos los constructores para las estructuras, en los constructores podemos inicializar variables como en el siguiente ejemplo, aunque no es que sea el gran ejemplo pero introduce varias cosillas como los constructores, las variables privadas, vectores de tipo estructura, etc. En este ejemplo se crean 2 alumnos cada alumno puede crear cualquier cantidad de materias y cada uno de estas tiene 3 notas Option Explicit On Option Strict On Module Module1 Structure notas Private n1 As Integer Private n2 As Integer Private n3 As Integer Public Sub Asignar(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) n1 = x n2 = y n3 = z End Sub Public Sub MostrarNotas() Console.WriteLine("Nota 1:{0}", n1) Console.WriteLine("Nota 2:{0}", n2) Console.WriteLine("Nota 3:{0}", n3) End Sub End Structure Structure Alumno Private Nombre As String Private apellido As String Private Telefono As String Public Materiaynotas() As notas Public Sub New(ByVal n As String, ByVal a As String, ByVal t As String) Nombre = n apellido = a Telefono = t End Sub Public Sub Mostrar() Console.WriteLine("Nombre:{0}", Nombre) Console.WriteLine("Apellido:{0}", apellido) Console.WriteLine("Teléfono:{0}", Telefono) End Sub End Structure

Page 58: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

58

Sub Main() Dim Alumno1 As Alumno = New Alumno("María", "Perez", "9999999") Dim Alumno2 As Alumno = New Alumno("Diana", "Madrugada", "8888888") ReDim Alumno1.Materiaynotas(4)‘creación de materias With Alumno1 .Materiaynotas(0).Asignar(1, 2, 3)‘Materia uno .Materiaynotas(1).Asignar(1, 2, 4) ‘Materia dos .Materiaynotas(2).Asignar(1, 2, 5) ‘Materia tres .Materiaynotas(3).Asignar(1, 2, 6) ‘Materia cuatro .Materiaynotas(4).Asignar(1, 2, 7) ‘Materia cinco Console.WriteLine("Alumno 1") Console.WriteLine("Materia 1") .Materiaynotas(0).MostrarNotas() Console.WriteLine("Materia 2") .Materiaynotas(1).MostrarNotas() Console.WriteLine("Materia 3") .Materiaynotas(2).MostrarNotas() Console.WriteLine("Materia 4") .Materiaynotas(3).MostrarNotas() Console.WriteLine("Materia 5") .Materiaynotas(4).MostrarNotas() End With ReDim Alumno2.Materiaynotas(0) ‘creación de materia With Alumno2 .Materiaynotas(0).Asignar(3, 3, 3) ‘Materia uno Console.WriteLine("Alumno 2") Console.WriteLine("Materia 1") .Materiaynotas(0).MostrarNotas() End With Console.Read() End Sub End Module

2.3.2 Funciones y procedimientos

La diferencia entre las dos es que las primeras (Sub) no retornan valores y las segundas (Function) si. Ninguna de las dos puede definirse dentro de una misma función o un procedimie. Se pueden definir dentro de un módulo, clase, interfaz o estructura. Ambos métodos son por defecto públicos y los parámetros que se les pasa por defecto son por valor ByVal, que significa que lo que hace una copia de la variable al parámetro. ByRefl para la dirección de la variable.

Page 59: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

59

Veamos como se define un procedimiento Public Sub Mostrar(ByVal a As Short) End Sub Y una funcion Public Function Mostrar(ByVal a As Short) As Integer Return 0 End Function Ahora, de una función se puede salir de las siguiente maneras: Primera forma Function Muestra() as String … Muestra =‖cadena a retornar‖ End Function Segunda forma Function Muestra() as String … Return ‖cadena a retornar‖ End Function El siguiente ejemplo aclarará lo expuesto tanto para las funciones como para los procedimientos Option Strict On OPTION Explicit On Module Module1 Public Sub MOSTRAR(ByVal X As Integer, ByVal Y As Integer) Console.WriteLine("Valor de A después de asignarselo a x={0} al entrar a la función", X + 1) Console.WriteLine("Valor de A después de asignarselo a y={0} al entrar a la función", Y + 1) 'Para salir de la función se puede hacer de dos maneras, 'primera forma, se ha colocado en comentario pero se puede usar cualquiera de las 'dos "Return"

Page 60: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

60

'Return 'segunda forma "Exit Sub" Exit Sub End Sub Public Function ProdMOSTRAR(ByVal X As Integer, ByVal Y As Integer) As Integer Console.WriteLine("Valor de A después de asignarselo a x={0} al entrar a la función", X + 1) Console.WriteLine("Valor de A después de asignarselo a y={0} al entrar a la función", Y + 1) 'Para salir de un procedimiento se puede hacer de dos maneras, 'primera forma, se ha colocado en comentario pero se puede usar cualquiera de las 'dos "Return valor_o_cadena_a_retornar" 'Return X + Y 'segunda forma "MOSTRAR = X + Y" ProdMOSTRAR = X + Y End Function Sub Main() Dim A As Integer = 2, B As Integer = 5, c As Integer Console.WriteLine("Valor inicial de A={0}", A) Console.WriteLine("Valor inicial de B={0}", B) MOSTRAR(A, B) c = ProdMOSTRAR(A, B) Console.WriteLine("Valor final de A={0}", A) Console.WriteLine("Valor final de B={0}", B) Console.WriteLine("Observe que después de salir tanto de la función MOSTRAR(A, B), como del procedimiento c=ProdMOSTRAR(A, B), las variables A y B") Console.WriteLine("conservan los valores iniciales. Quiere decir que los parámetros") Console.WriteLine("son copias de las variables originales y las originales no sufren modificaciones") Console.WriteLine("La razón es por la palabra que vb.net le coloca antes de cada parámetro ByVal (por valor)") Console.WriteLine("Sin embargo la función no retorna valores y el procedimiento si ") Console.WriteLine("Este es el resultado de lo que retorna el procedimento {0}", c)

Page 61: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

61

Console.WriteLine("Después de realizar la siguiente operación ProdMOSTRAR = X + Y") Console.Read() End Sub End Module Ahora veremos un ejemplo cuando los parámetros son por referencia. Option Strict On OPTION Explicit On Module Module1 Public Sub MOSTRAR(ByRef X As Integer, ByVal Y As Integer) X += 1 'Incrementa en 1 el valor de la variable x y X=A Console.WriteLine("Valor de A después de asignarselo a x={0} al entrar a la función", X) Console.WriteLine("Valor de B después de asignarselo a y={0} al entrar a la función", Y) 'Para salir de la función se ´puede hacer de dos maneras, 'primera forma, se ha colocado en comentario pero se puede usar cualquiera de las 'dos "Return" Return 'segunda forma "Exit Sub" 'Exit Sub End Sub Public Function ProdMOSTRAR(ByVal X As Integer, ByRef Y As Integer) As Integer 'Para salir de un procedimiento se puede hacer de dos maneras, 'primera forma, se ha colocado en comentario pero se puede usar cualquiera de las 'dos "Return valor_o_cadena_a_retornar" Y *= 2 Return X + Y 'segunda forma "MOSTRAR = X + Y" 'ProdMOSTRAR = X + Y End Function Sub Main() Dim A As Integer = 2, B As Integer = 5, c As Integer Console.WriteLine("Valor inicial de A={0}", A)

Page 62: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

62

Console.WriteLine("Valor inicial de B={0}", B) MOSTRAR(A, B) Console.WriteLine("Valor final de A después de salir de la función={0}", A) Console.WriteLine("Valor final de B después de salir de la función={0}", B) c = ProdMOSTRAR(A, B) Console.WriteLine("Valor final de A después de salir del procedimiento={0}", A) Console.WriteLine("Valor final de B después de salir del procedimiento={0}", B) Console.WriteLine("Observe que después de salir de la función MOSTRAR(A, B) A cambió de valor") Console.WriteLine(" y después de salir del procedimiento B también cacmbió de valor") Console.WriteLine("realmente lo que se pasa al parámetro es la dirección de memoria") Console.WriteLine("quiere decir que la varible X en la función apunta a A y cualquier modificación que") Console.WriteLine("se haga sobre la varible X en la funcion también se realizará en la variable A") Console.WriteLine("Sucede lo mismo en el caso del procedimiento. Este es el resultado de lo que retorna el procedimento {0}", c) Console.WriteLine("Después de realizar la siguiente operación Y *= 2 y ProdMOSTRAR = X + Y") Console.Read() End Sub End Module Cuyo resultado debe ser como el siguiente:

Si no han entendido, el siguiente ejemplo terminará por aclarar (creo). Option Strict On

Page 63: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

63

OPTION Explicit On Module Module1 Public Function ProdMOSTRAR(ByRef X As Integer) As Integer X -= 1 Console.WriteLine("X={0}", X) Return X End Function Sub Main() Dim A As Integer = 10 Console.WriteLine("Valor inicial de A={0}", A) Do While A > 0 ProdMOSTRAR(A) Loop Console.WriteLine("Valor final de A después de salir del procedimiento={0}", A) Console.Read() End Sub End Module Cuyo resultado debe ser como el siguiente:

O este otro ejemplo Option Strict On OPTION Explicit On Module Module1 Public Function ProdMOSTRAR(ByVal X As Integer) As Integer X -= 1 Console.WriteLine("X={0}", X) Return X

Page 64: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

64

End Function Sub Main() Dim A As Integer = 10, b As Integer = 1 Console.WriteLine("Valor inicial de A={0}", A) Do While A > 0 ProdMOSTRAR(A) 'Observe se ha hecho uso de una variable auxiliar para detener el ciclo 'porque de lo contrario llegará hasta que alcance el máximo 'de la variable integer y ocurrirá un error b += 1 If b = 10 Then Exit Do End If Loop Console.WriteLine("Valor final de A después de salir del procedimiento={0}", A) Console.Read() End Sub End Module Cuyo resultado debe ser como el siguiente:

La palabra clave ParamArray permite a una función aceptar un número variable de argumentos. Un argumento ParamArray debe declararse como un tipo de matriz unidimensional. La declaración no incluye parámetros después del nombre de argumento

Page 65: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

65

Utilice la palabra clave ParamArray para denotar una matriz de parámetros. Se aplican las siguientes reglas:

Un procedimiento sólo puede tener una matriz de parámetros, que debe ser el último argumento de la definición del procedimiento.

La matriz de parámetros debe pasarse por valor. Es un hábito de programación recomendado incluir de manera explícita la palabra clave ByVal en la definición del procedimiento.

El código del procedimiento debe considerar a la matriz de parámetros una matriz unidimensional; el tipo de datos de los elementos de la matriz ha de ser el mismo que el tipo de datos de ParamArray.

La matriz de parámetros es opcional de forma automática. Su valor predeterminado es una matriz unidimensional vacía del tipo de elemento de la matriz de parámetros.

Todos los argumentos que preceden a la matriz de parámetros deben ser obligatorios. La matriz de parámetros debe ser el único argumento opcional.

Cuando uno de los argumentos del procedimiento al que se llame sea una matriz de parámetros, ésta podrá tomar cualquiera de estos valores:

Ninguno, es decir, puede omitirse el argumento ParamArray. En este caso, se pasará una matriz vacía al procedimiento. También puede pasarse la palabra clave Nothing, obteniéndose el mismo efecto.

Una lista con un número de argumentos indeterminado, separados por comas. El tipo de los datos de cada argumento debe poder convertirse implícitamente al tipo de elemento ParamArray.

Una matriz con el mismo tipo de elemento que la matriz de parámetros.

En el siguiente ejemplo se muestra cómo se puede definir un procedimiento con una matriz de parámetros: Option Strict On OPTION Explicit On Module Module1 Public Function Sumatoria(ByVal var As String, ByVal ParamArray Cadena() As Integer) As Integer Dim i As Integer Dim j As Integer For i = 0 To UBound(Cadena) Console.WriteLine(var & " " & i & ": " & Cadena(i)) j = j + Cadena(i) Next i Sumatoria = j End Function Sub Main() Dim a, b, c, d As Integer

Page 66: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

66

a = 4 b = 3 c = 5 d = 9 Console.WriteLine("Resultado: {0}", Sumatoria("Parámetro", a, b, c)) Console.WriteLine("---------------------------------------") Console.WriteLine("Resultado: {0}", Sumatoria("Nuevo Parámetro", a, b, d)) Console.Read() End Sub End Module 2.3.3 Paso de argumentos a métodos. Parámetros opcionales Un argumento de un procedimiento puede ser opcional si así se especifica, es decir, que no es necesario suministrarlo al llamar al procedimiento. Los argumentos opcionales se indican mediante la palabra clave Optional en la definición del procedimiento. Se aplican las siguientes reglas:

Todos los argumentos opcionales de la definición del procedimiento deben especificar un valor predeterminado.

El valor predeterminado de un argumento opcional debe ser una expresión constante.

Todos los argumentos que vayan a continuación de un argumento opcional en la definición del procedimiento también deben ser opcionales.

Un ejemplo sencillo es el siguiente Module Module1 Public Sub FuncionaGeneral(ByVal x As Integer, Optional ByVal var As String = "Prueba", Optional ByVal p As Integer = 0, Optional ByVal y As Integer = 0) If var = "Prueba" Then Console.WriteLine("No se cambio el parámetro var") Else Console.WriteLine("Cambió el parámetro var") End If If p = 0 And y = 0 Then Console.WriteLine("No se asignó ningún parámetro para (p) y (y)") ElseIf p <> 0 Then Console.WriteLine("P ha sido cambiado (p)") ElseIf y <> 0 Then Console.WriteLine("Y ha sido cambiado (y)") End If

Page 67: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

67

End Sub Sub Main() Dim a, b, c, d As Integer a = 4 b = 3 c = 5 d = 9 FuncionaGeneral(a, , b, c) Console.WriteLine("---------------------------------------") FuncionaGeneral(a, "hola a cambiado", b) Console.Read() End Sub End Module Funciones recursivas Un procedimiento recursivo es aquél que se llama a sí mismo. Por ejemplo, el siguiente procedimiento utiliza la recursividad para calcular el factorial de su argumento original: Un ejemplo clásico Function Factorial(ByVal N As Integer) As Integer If N <= 1 Then Return 1 Else Return Factorial(N - 1) * N End If End Function

Nota Si un procedimiento Function se llama a sí mismo de manera recursiva, su nombre debe ir seguido de un paréntesis, aunque no exista una lista de argumentos. De lo contrario, se considerará que el nombre de la función representa al valor devuelto por ésta.

Los programas tienen una cantidad de espacio limitado para las variables. Cada vez que un procedimiento se llama a sí mismo, se utiliza más espacio. Si este proceso continúa indefinidamente, se acaba produciendo un error de espacio de la pila. La causa puede ser menos evidente si dos procedimientos se llaman entre sí indefinidamente, o si nunca se cumple una condición que limita la recursividad.

Page 68: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

68

Debe asegurarse de que los procedimientos recursivos no se llamen a sí mismos indefinidamente, o tantas veces que puedan agotar la memoria. La recursividad normalmente puede sustituirse por bucles.

Pasar vectores con longitud fija a funciones

Un ejemplo aclarara lo anterior

Module Module1 Public Function sumar(ByVal x() As Integer) As Integer Dim i, j As Integer For Each i In x Console.WriteLine("{0}", i) j += i Next sumar = j End Function Sub Main() Dim valor() As Integer = {1, 2, 3, 4, 5} Console.WriteLine("Resultado:{0} ", sumar(valor)) Console.Read() End Sub End Module UNIDAD 3 Acceso a Bases de datos

ADO.NET

Es una evolución del modelo de acceso a datos de ADO que controla directamente los requisitos del usuario para programar aplicaciones escalables. Se diseñó específicamente para el Web, teniendo en cuenta la escalabilidad, la independencia y el estándar XML.

ADO.NET utiliza algunos objetos ADO, como Connection y Command, y también agrega objetos nuevos. Algunos de los nuevos objetos clave de ADO.NET son DataSet, DataReader y DataAdapter.

La diferencia más importante entre esta fase evolucionada de ADO.NET y las arquitecturas de datos anteriores es que existe un objeto, DataSet, que es independiente y diferente de los almacenes de datos. Por ello, DataSet funciona como una entidad independiente. Se puede considerar el objeto DataSet como

Page 69: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

69

un conjunto de registros que siempre está desconectado y que no sabe nada sobre el origen y el destino de los datos que contiene. Dentro de un objeto DataSet, de la misma manera que dentro de una base de datos, hay tablas, columnas, relaciones, restricciones, vistas, etc.

El objeto DataAdapter es el objeto que se conecta a la base de datos para llenar el objeto DataSet. A continuación, se vuelve a conectar a la base de datos para actualizar los datos de dicha base de datos a partir de las operaciones realizadas en los datos contenidos en el objeto DataSet. En el pasado, el procesamiento de datos se basaba principalmente en la conexión. Ahora, con el fin de proporcionar a las aplicaciones multinivel mayor eficacia, se está adoptando para el procesamiento de datos un enfoque basado en mensajes que manipulan fragmentos de información. En el centro de este enfoque se sitúa el objeto DataAdapter, que proporciona un puente entre un objeto DataSet y un almacén de datos de origen para recuperar y guardar datos. Para ello, envía solicitudes a los comandos SQL apropiados que se ejecutan en el almacén de datos.

El objeto DataSet basado en XML proporciona un modelo de programación coherente que funciona con todos los modelos de almacenamiento de datos: sin formato, relacional o jerárquico. Funciona sin tener 'conocimiento' del origen de los datos y representa a los datos que contiene como colecciones y tipos de datos. Independientemente del origen de los datos del objeto DataSet, éstos se manipulan mediante el mismo conjunto de API estándar expuestas a través del objeto DataSet y sus objetos subordinados.

Aunque el objeto DataSet no tiene conocimiento del origen de sus datos, el proveedor administrado tiene información detallada y específica. La función del proveedor administrado es conectar, llenar y almacenar el objeto DataSet desde almacenes de datos (o viceversa). Los proveedores de datos OLE DB y SQL Server de .NET (System.Data.OleDb y System.Data.SqlClient) que forman parte de .Net Framework proporcionan cuatro objetos básicos: Command, Connection, DataReader y DataAdapter. En el resto de las secciones de este documento, se describirá cada parte del objeto DataSet y los proveedores de datos OLE DB y SQL Server de .NET, con el fin de explicar qué son y cómo se pueden utilizar al programar.

En las siguientes secciones se presentarán algunos objetos que han evolucionado desde la tecnología anterior y otros objetos nuevos. Los objetos son los siguientes:

Objetos Connection. Para conectar con una base de datos y administrar las transacciones en una base de datos.

Objetos Command. Para emitir comandos SQL a una base de datos.

Page 70: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

70

Objetos DataReader. Proporcionan una forma de leer una secuencia de registros de datos sólo hacia delante desde un origen de datos SQL Server.

Objetos DataSet. Para almacenar datos sin formato, datos XML y datos relacionales, así como para configurar el acceso remoto y programar sobre datos de este tipo.

Objetos DataAdapter. Para insertar datos en un objeto DataSet y reconciliar datos de la base de datos.

Nota al trabajar con conexiones a una base de datos, hay dos opciones diferentes: un proveedor de datos de SQL Server de .NET (System.Data.SqlClient) y un proveedor de datos OLE DB de .NET (System.Data.OleDb). En estos ejemplos se utilizará el proveedor de datos SQL Server de .NET. Están programados para comunicarse directamente con Microsoft SQL Server. El proveedor de datos OLE DB de .NET se utiliza para comunicarse con cualquier proveedor OLE DB (ya que utiliza OLE DB como tecnología subyacente).

Conexiones Para establecer la comunicación con bases de datos, se utilizan las conexiones y se representan mediante clases específicas de proveedor, como SQLConnection. Los comandos viajan por las conexiones y devuelven conjuntos de resultados en forma de secuencias que puede leer un objeto DataReader o que se pueden insertar en un objeto DataSet. Mas adenlante se muestra la forma de crear un objeto de conexión. Las conexiones se pueden abrir explícitamente mediante llamadas al método Open de la conexión; también se pueden abrir implícitamente al utilizar un objeto DataAdapter

Comandos

Los comandos contienen la información que se envía a una base de datos y se representan mediante clases específicas de un proveedor, como SQLCommand. Un comando podría ser una llamada a un procedimiento almacenado, una instrucción UPDATE o una instrucción que devuelve resultados. También es posible utilizar parámetros de entrada o de resultados y devolver valores como parte de la sintaxis del comando. En el ejemplo siguiente se muestra la forma de ejecutar una instrucción INSERT en la base de datos Northwind.

Objetos DataReader

El objeto DataReader es, en cierto modo, sinónimo de un cursor de sólo lectura y sólo hacia delante para datos. La API de DataReader es compatible con datos sin formato y con datos jerárquicos. Cuando se ejecuta un comando en la base

Page 71: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

71

de datos, se devuelve un objeto DataReader. El formato del objeto DataReader devuelto es distinto de un conjunto de registros. Por ejemplo, podría utilizarse el objeto DataReader para mostrar los resultados de una lista de búsqueda en una página Web.

Objetos DataSet y DataAdapter

Objetos DataSet

El objeto DataSet es similar al objeto Recordset de ADO, pero más eficaz y con una diferencia importante: DataSet siempre está desconectado. El objeto DataSet representa a una memoria caché de datos, con estructuras análogas a las de una base de datos, como tablas, columnas, relaciones y restricciones. Sin embargo, aunque se puede utilizar un objeto DataSet como una base de datos (y su comportamiento es muy similar), es importante recordar que los objetos DataSet no interactúan directamente con bases de datos ni con otros datos de origen. Esto permite al programador trabajar con un modelo de programación que siempre es coherente, independientemente de dónde resida el origen de datos. En los objetos DataSet se pueden colocar datos provenientes de una base de datos, un archivo XML, código o información escrita por el usuario. A continuación, a medida que se realizan cambios en el objeto DataSet, se puede hacer un seguimiento y una comprobación de los cambios antes de actualizar los datos de origen. El método GetChanges del objeto DataSet crea en realidad otro objeto DataSet que sólo contiene los cambios realizados en los datos. Posteriormente, un objeto DataAdapter u otros objetos, utilizan este objeto DataSet para actualizar el origen de datos original.

El objeto DataSet tiene muchas características de XML, incluida la capacidad de producir y consumir datos XML y esquemas XML. Los esquemas XML se pueden utilizar para describir esquemas intercambiables a través de servicios Web. De hecho, un objeto DataSet con un esquema puede compilarse con seguridad de tipos y finalización automática de instrucciones.

Objetos DataAdapter (OLEDB/SQL)

El objeto DataAdapter funciona como un puente entre el objeto DataSet y los datos de origen. El uso del objeto SqlDataAdapter específico del proveedor (junto con los objetos SqlCommand y SqlConnection asociados) permite aumentar el rendimiento global al trabajar con bases de datos de Microsoft SQL Server. Para otras bases de datos compatibles con OLE DB, se debe utilizar el objeto OleDbDataAdapter y los objetos OleDbCommand y OleDbConnection asociados.

El objeto DataAdapter utiliza comandos para actualizar el origen de datos después de hacer modificaciones en el objeto DataSet. Si se utiliza el método Fill del objetoDataAdapter, se llama al comando SELECT; si se utiliza el

Page 72: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

72

método Update se llama al comando INSERT, UPDATE o DELETE para cada fila modificada. Es posible establecer explícitamente estos comandos con el fin de controlar las instrucciones que se utilizan en tiempo de ejecución para resolver cambios, incluido el uso de procedimientos almacenados. En escenarios ad-hoc, un objeto CommandBuilder puede generarlos en tiempo de ejecución a partir de una instrucción de selección. Sin embargo, para generar en tiempo de ejecución hay que hacer un viaje de ida y vuelta adicional al servidor con el fin de recopilar los metadatos necesarios; por tanto, si se proporcionan explícitamente los comandos INSERT, UPDATE y DELETE en tiempo de diseño, el rendimiento en tiempo de ejecución mejorará.

Dim myConnection As SqlConnection = New SqlConnection("server=(local)\VSdotNET;Trusted_Connection=yes;database=northwind") Dim mySqlDataAdapter As SqlDataAdapter = New SqlDataAdapter("select * from customers", myConnection) mySqlDataAdapter.InsertCommand.CommandText = "sp_InsertCustomer" mySqlDataAdapter.InsertCommand.CommandType = CommandType.StoredProcedure mySqlDataAdapter.DeleteCommand.CommandText = "sp_DeleteCustomer" mySqlDataAdapter.DeleteCommand.CommandType = CommandType.StoredProcedure mySqlDataAdapter.UpdateCommand.CommandText = "sp_UpdateCustomers" mySqlDataAdapter.UpdateCommand.CommandType = CommandType.StoredProcedure mySqlDataAdapter.Update(myDataSet) Los registros se asignan a los comandos correspondientes de la forma apropiada. En el ejemplo siguiente se ilustra la carga de un objeto DataAdapter a través de una instrucción SELECT. A continuación, se actualizan, eliminan y agregan algunos registros en el objeto DataSet. Por último, se devuelven las actualizaciones a la base de datos de origen a través del objeto DataAdapter. En la página, se muestran los comandos DeleteCommand, InsertCommand y UpdateCommand creados. También se ilustra el uso de varios objetos DataAdapter para cargar varias tablas (Customers y Orders) en el objeto DataSet

ADO.NET: Ejecutar un comando Los comandos se ejecutan en bases de datos con el fin de realizar acciones en almacenes de datos. Por ejemplo, sería posible ejecutar un comando para insertar o eliminar datos. Los comandos incluyen cualquier comando que se pueda ejecutar en una base de datos y, si se trata de un comando OleDbCommand, puede ser específico del almacén de datos. Por ejemplo, se puede emitir una llamada a un procedimiento almacenado para un comando o, quizás, un comando para "set quoted_identifier on". Independientemente de cuál

Page 73: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

73

sea el comando, se puede utilizar el objeto OleDbCommand o SqlCommand para ejecutar el comando en el almacén de datos del servidor. En la tecnología tradicional de ADO se pueden emitir comandos a través de los objetos Command, Connection y Recordset. En ADO.NET, el único objeto que ejecuta comandos es Command. Para emitir un comando en una base de datos, el objeto Command debe tener dos elementos básicos: un objeto Connection y un objeto CommandText, que se pueden establecer en el constructor. Para ejecutar el comando, es necesario abrir el objeto Connection ,que no debe estar en estado de búsqueda: Dim InsertCmdString As String InsertCmdString = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')" Dim mySqlCommand As SqlCommand = New SqlCommand(InsertCmdString, myConnection)

En este tema se trata la ejecución de comandos que no generan resultados. Para ejecutar un comando que no devuelve resultados, hay que llamar al método ExecuteNonQuery.

mySqlCommand.ExecuteNonQuery()

Los objetos OleDbCommand y SqlCommand tienen colecciones de parámetros que presentan el mismo comportamiento que las colecciones de parámetros de ADO. Se pueden transferir los parámetros en línea:

mySqlCommand.CommandText = "myStoredProc 'CustId'"

O se puede utilizar la colección Parameters:

workParam = mySqlCommand.Parameters.Add("@CustomerID", SQLDataType.NChar, 5) workParam.Value = "NewID"

ADO.NET: Obtener parámetros de resultados de un procedimiento almacenado

Algunos procedimientos almacenados devuelven valores a través de parámetros. Cuando un parámetro de una instrucción SQL o un procedimiento almacenado está declarado como parámetro de resultados ("out"), se devuelve su valor al llamador. El valor se almacena en un parámetro de la colección Parameters de los objetos OleDbCommand o SqlCommand. A diferencia de lo que ocurre en el ejemplo siguiente, cuando no se establecen ni la conexión ni el nombre del comando, se pueden establecer los parámetros,

Page 74: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

74

pero será necesario crear la colección de parámetros y definir los tipos esperados.

workParam = myCommand.Parameters.Add("@CustomerID", SQLDataType.NChar, 5) workParam.Value = "CUSTID"

ADO.NET: Llenar un objeto DataSet a partir de una base de datos El hecho de recuperar datos de una base de datos y manipularlos es más fácil que nunca. Si desea mostrar los resultados de una base de datos como una secuencia de datos de sólo lectura y sólo hacia delante, es posible ejecutar un comando y recuperar los resultados mediante el objeto DataReader. En lo que se refiere a operaciones más interactivas, como enlazar datos, recorrer datos o la configuración remota de los resultados de una consulta de base de datos, es posible colocar los resultados en un objeto DataSet, de la forma mostrada en este ejemplo. El concepto más importante que hay que recordar es que el objeto DataSet es una estructura de datos independiente y distinta de un almacén de datos. Aunque en el ejemplo se obtienen datos desde una base datos, no importa cuál sea su origen porque el objeto DataSet siempre presentará un modelo de programación coherente. Se trata de una colección de datos sencilla, con características de base de datos relacional. No se incluyen métodos Load, Open ni Execute, ya que no se sabe de dónde provienen los datos. En esta sección se describe la forma de utilizar un objeto SqlDataAdapter para cargar en el objeto DataSet datos de una base de datos. Es posible agregar datos al objeto DataSet mediante el método Add, insertar datos directamente con los métodos intrínsecos de XML. Un objeto SqlDataAdapter puede utilizarse para recuperar datos de una base de datos, pero también se puede utilizar para insertar datos en la base de datos. En esta sección se tratará la obtención de datos. El primer paso es crear un objeto SqlDataAdapter. Esto se hace de la misma manera que se crea un objeto SqlCommand.

Dim SelectCmdString As String = "select * from customers" Dim mySqlDataAdapter As SqlDataAdapter = New SqlDataAdapter(SelectCmdString, myConnection) '...or this can also be done as follows: Dim mySelectCommand as SqlCommand = New SqlCommand("select * from customers", myConnection) Dim mySqlDataAdapter as SqlDataAdapter = new SqlDataAdapter(mySelectCommand)

Page 75: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

75

Los objetos SqlDataAdapter y SqlCommand son muy similares, con la diferencia de los métodos Fill y Update. El método Fill llena un objeto DataSet. El método Update recoge los cambios realizados en un objeto DataSet y los aplica en la base de datos. Para ello se utilizan cuatro comandos especificados en el objeto DataAdapter. Estos comandos son: SelectCommand, UpdateCommand, InsertCommand y DeleteCommand. Es posible establecer explícitamente estos comandos para controlar las instrucciones que se utilizan en tiempo de ejecución con el fin de resolver cambios, incluido el uso de procedimientos almacenados. En escenarios ad-hoc, un objeto CommandBuilder puede generarlos en tiempo de ejecución a partir de una instrucción de selección. Sin embargo, para generar en tiempo de ejecución hay que hacer un viaje de ida y vuelta adicional al servidor a fin de recopilar los metadatos necesarios; por tanto, si se proporcionan explícitamente los comandos de inserción, actualización y eliminación en tiempo de diseño, el rendimiento en tiempo de ejecución será mayor.

NOTA: Visual Studio ayuda en gran medida a establecer objetos SqlDataAdapter y DataSet, y crea procedimientos almacenados de forma prácticamente automática. Estudie esta característica mediante los objetos ComponentDesigner y Database.

Cuando se haya establecido el objeto SqlDataAdapter, se le podrá pasar un objeto DataSet para llenarlo:

myDataSet = New DataSet() mySqlDataAdapter.Fill(myDataSet,"Customers")

Ahora el objeto DataSet contiene el resultado de la consulta. De hecho, puede contener los resultados de varias consultas e incluso relacionarlos. Como contiene varios resultados, el objeto DataSet contiene un conjunto de tablas. Hay que tener en cuenta que el método Fill utiliza "Customers" como segundo argumento. Se trata del nombre de la tabla que se va a llenar en el objeto DataSet. Si la tabla no existe, se crea.

Como los datos se almacenan en una colección de filas de la tabla, es posible utilizar fácilmente una instrucción foreach para recorrer las filas:

Dim myDataRow as DataRow For Each myDataRow In myDataSet.Tables("Customers").Rows Console.WriteLine(myDataRow("CustomerId").ToString()) Next

De hecho, también se puede utilizar la misma instrucción foreach para recorrer las columnas.

Page 76: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

76

ADO.NET: Actualizar una base de datos a partir de un objeto DataSet En este tema se ilustra la forma de actualizar datos de una base de datos mediante un objeto DataSet. Es importante recordar que también se puede insertar, actualizar y eliminar datos directamente en una base de datos mediante un objeto SqlCommand. Algunos de los temas que se explican en Llenar un objeto DataSet a partir de una base de datos son la carga de un objeto DataSet a partir de una base de datos y la diferencia e independencia entre un objeto DataSet y una base de datos. Cuando se haya cargado el objeto DataSet, se podrán modificar los datos y el objeto DataSet hará un seguimiento de los cambios. El objeto DataSet se puede considerar una caché en memoria de datos obtenidos a partir de una base de datos. El objeto DataSet contiene un conjunto de tablas, relaciones y restricciones. En este ejemplo se muestra la forma de utilizar el método Add en el objeto DataTable para agregar datos nuevos a un objeto DataSet. El método Add utiliza una matriz de las columnas de datos esperadas o un objeto DataRow. ' Create a new Connection and SqlDataAdapter Dim myConnection as SqlConnection Dim mySqlDataAdapter as SqlDataAdapter myConnection = new SqlConnection("server=(local)\VSdotNET;Trusted_Connection=yes;database=northwind") mySqlDataAdapter = new SqlDataAdapter("Select * from Customers", myConnection) Dim myDataSet as DataSet = new DataSet() Dim myDataRow As DataRow ' Create command builder. This line automatically generates the update commands for you, so you don't ' have to provide or create your own. Dim myDataRowsCommandBuilder as SqlCommandBuilder = new SqlCommandBuilder(mySqlDataAdapter) ' Set the MissingSchemaAction property to AddWithKey because Fill will not cause primary ' key & unique key information to be retrieved unless AddWithKey is specified. mySqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey mySqlDataAdapter.Fill(myDataSet, "Customers") myDataRow = myDataSet.Tables("Customers").NewRow() myDataRow("CustomerId") = "NewID" myDataRow("ContactName") = "New Name"

Page 77: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

77

myDataRow("CompanyName") = "New Company Name" myDataSet.Tables("Customers").Rows.Add(myDataRow)

Hay que tener en cuenta que el objeto DataTable debe devolver un objeto DataRow a través del método NewRow. El método devuelve un objeto DataRow con el esquema apropiado del objeto DataTable. El nuevo objeto DataRow será independiente de la tabla hasta que se agregue a la colección RowsCollection.

Para modificar datos de un objeto DataRow hay que tener acceso al objeto DataRow. Se puede utilizar el índice de la fila en la colección RowsCollection mediante la propiedad Rows:

myDataSet.Tables("Customers").Rows(0)("ContactName")="Peach"

También se puede tener acceso a una fila específica a través del valor de la clave principal:

Dim myDataRow1 As DataRow = myDataSet.Tables("Customers").Rows.Find("ALFKI") myDataRow1("ContactName")="Peach"

donde "ALFKI" corresponde al valor de la clave principal "CustomerID" de la tabla "Customers". Cuando se utiliza el objeto SqlDataAdapter, la clave se establece a partir de la base de datos. También se puede establecer la clave si no se utiliza la base de datos mediante la propiedad PrimaryKey.

Utilice el método Delete para quitar el objeto Row. Hay que tener en cuenta que se produce una eliminación lógica en el objeto DataSet, que sólo será una eliminación definitiva cuando se actualice la base de datos a partir del objeto DataSet. De forma similar, se puede utilizar RejectChanges en el objeto DataSet, en cuyo caso se restaurará el objeto Row.

myDataSet.Tables("Customers").Rows(0).Delete()

Se mantendrán en la fila los valores originales y los valores nuevos. El evento RowChanging permite tener acceso a valores nuevos y valores originales con el fin de decidir si se desea seguir adelante con la modificación. Como se mantienen valores nuevos y valores originales, se pueden establecer escenarios como el bloqueo optimista o cambios de clave.

Page 78: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

78

Antes de devolver los datos enviados a la base de datos, es necesario configurar los comandos InsertCommand, UpdateCommand y DeleteCommand para cotejar los cambios en la base de datos. En escenarios limitados se puede utilizar la clase SqlCommandBuilder para generar automáticamente estos comandos de la forma mostrada en el siguiente ejemplo:

Dim myDataRowsCommandBuilder as SqlCommandBuilder = new SqlCommandBuilder(mySqlDataAdapter)

Para enviar los datos desde el objeto DataSet a la base de datos, hay que utilizar el método Update en el objeto SqlDataAdapter.

mySqlDataAdapter.Update(myDataSet, "Customers")

ADO.NET: Utilizar transacciones de base de datos Las transacciones de base de datos se utilizan para controlar la confirmación de datos en bases de datos. Por ejemplo, en los procedimientos estándar de cuentas, es necesario retirar fondos de una cuenta e ingresarlos a su vez en otra. Como los equipos pueden sufrir interrupciones de funcionamiento (por interrupción del suministro eléctrico, problemas de red, etc.), podría darse el caso de que se actualizara o agregara un registro determinado, pero no el otro. Para evitar estas situaciones, se utilizan transacciones. Las transacciones de ADO.NET se controlan de la misma manera que en ADO, en el nivel de la base de datos y, para ello, la base de datos debe ser compatible con el uso de transacciones. Existen tres comandos básicos para las transacciones: BeginTransaction, Commit y Rollback. BeginTransaction marca el principio de una transacción. Todo lo que ocurra entre la ejecución del comando BeginTransaction y la del siguiente comando (ya sea Rollback o Commit) se considerará como parte de la transacción. El siguiente fragmento de código ilustra el uso de las transacciones. Dim myConnection as SQLConnection = new SQLConnection("server=(local)\VSdotNET;Trusted_Connection=yes;database=northwind") Dim myCommand as SQLCommand = new SqlCommand() Dim myTrans as SqlTransaction ' Open the connection. myConnection.Open() ' Assign the connection property. myCommand.Connection = myConnection ' Begin the transaction. myTrans = myConnection.BeginTransaction()

Page 79: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

79

' Assign transaction object for a pending local transaction myCommand.Transaction = myTrans try ' Restore database to its original condition so sample will work correctly. myCommand.CommandText = "DELETE FROM Region WHERE (RegionID = 100) OR (RegionID = 101)" myCommand.ExecuteNonQuery() ' Insert the first record. myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'MidWestern')" myCommand.ExecuteNonQuery() ' Insert the second record. myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'MidEastern')" myCommand.ExecuteNonQuery() myTrans.Commit() Console.Write("Both Records are written to the database!") catch e as Exception myTrans.Rollback() Console.WriteLine(e.ToString()) Console.Write("Neither record is written to the database!") finally myConnection.Close() end try

En el ejemplo se muestra que si no se realiza correctamente la inserción, se deshacen las dos operaciones para volver al estado original. Si se realizan las dos correctamente, se confirma la transacción.

Al igual que ocurre en la tecnología ADO tradicional, se pueden controlar transacciones a través del objeto connection. De hecho, el uso de una conexión OleDbConnection se basa en el mismo modelo de transacciones OLE DB subyacente. Por tanto, si era posible confirmar transacciones en la base de datos con la tecnología ADO tradicional, también se podrán confirmar con ADO.NET. En el siguiente fragmento de código se ilustra el uso de SqlConnection y SqlCommand para insertar dos registros en la tabla "Region". Si uno de los dos no se ejecuta correctamente, se deshacen los cambios.

El objeto DataSet también tiene un modelo de confirmaciones (AcceptChanges,RejectChanges), pero no afecta a la base de datos. El modelo de confirmación se utiliza para el almacenamiento de datos en caché,

Page 80: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

80

únicamente en el caso del objeto DataSet. Para enviar los datos desde el objeto DataSet a la base de datos, hay que utilizar el método Update del objeto SqlDataAdapter.

ADO.NET: Trabajar con datos relacionales Un objeto DataSet puede contener tablas no relacionadas o tablas relacionadas. Se puede considerar que un objeto DataSet es un documento de datos. De hecho, los documentos de datos XML son así, con la diferencia de que se basan en un paradigma jerárquico. Como los datos se suelen almacenar en bases de datos relacionales, el objeto DataSet puede controlar relaciones jerárquicas y las relaciones de clave y clave externa. Las relaciones también pueden tener distintos tipos de obligatoriedad. De forma predeterminada, las eliminaciones y actualizaciones se aplican en cascada: si se elimina una fila de Customer, también se eliminarán las filas relacionadas de Orders; si se actualiza la clave de una fila Customer, también se actualizarán los valores de clave externa asociados de la tabla Orders. Un objeto DataSet contiene una colección Relations. Es posible agregar una relación a esta colección mediante la columna (o las columnas, si la clave es de varias columnas) de las tablas relacionadas. En el siguiente ejemplo se crea una relación entre Customers y Orders y se asigna a la relación el nombre CustOrders.

myDataSet.Relations.Add("CustOrders",myDataSet.Tables("Customers").Columns("CustomerID"), _ myDataSet.Tables("Orders").Columns("CustomerID"))

Después de agregar una relación entre la clave CustomerID de la tabla Customers y la clave externa CustomerID de la tabla Orders del objeto DataSet, se pueden recorrer los datos.

Dim myDataRow1 as DataRow for each myDataRow1 in myDataSet.Tables("Customers").Rows Console.WriteLine("Customer: " + myDataRow1("ContactName").ToString()) ' Iterate over orders data Dim myDataRow2 as DataRow for each myDataRow2 in myDataRow1.GetChildRows(myDataSet.Relations("CustOrders")) Console.WriteLine("Order #" + myDataRow2("OrderID").ToString()) next Console.WriteLine() next

Page 81: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

81

ADO.NET: Filtrar datos Existen muchas formas de filtrar datos. Una forma consiste en filtrar datos en el nivel de comandos de base de datos, mediante una cláusula en la consulta. Otra forma consiste en filtrar los datos cuando ya están en el objeto DataSet. En este tema se explica el filtrado en el objeto DataSet. Cuando los datos ya están en un objeto DataSet, se pueden utilizar métodos del objeto DataSet para manipular subconjuntos de datos. Filtrar con el método Select Considere un objeto DataSet con las tablas Customers y Orders. Para filtrar datos de la tabla Customers que tengan Kelly como valor de FirstName, se puede utilizar el método Select, que devuelve una matriz de filas. myRowArray = dsCustomers.Select("ContactName like 'Kelly%'") Observe que las instrucciones son del tipo ANSI-SQL. Dichas instrucciones son básicamente un subconjunto de ANSI-SQL, con esta diferencia: dado que DataSet puede contener múltiples tablas relacionadas, el filtro también puede aplicarse sobre estas tablas relacionadas. En el ejemplo siguiente, utilice la palabra clave Child para filtrar las solicitudes y los clientes. myRowArray = dsCustomers.Select("ContactName like 'Kelly%' AND [child].OrderDate = '7/26/68'") Estas funciones devuelven una matriz de filas. Puede iterar en la matriz utilizando la instrucción foreach. Filtrar y ordenar con objetos DataView

Con el objeto DataView, puede colocar múltiples filtros en DataSet, configurar el enlace de datos a ellos, etc. Un objeto DataView se puede filtrar utilizando las mismas reglas de lenguaje que en Select pero, en este caso, el filtro es dinámico. Por tanto, si se agrega una fila a los datos y cumple los criterios del filtro, aparecerá en la vista. Las vistas se pueden ordenar y filtrar. Los filtros pueden ser de datos y de versión (actual, nueva, modificada, eliminada). Para configurar un objeto DataView, constrúyalo de forma que controle a DataTable dentro de DataSet:

Dim myDataView As DataView = New DataView(myDataSet.Tables("Customers"))

Es posible configurar un filtro con la propiedad RowFilter mediante el mismo lenguaje de filtro de consultas que el del ejemplo del método Select anterior. Para configurar una ordenación, utilice una lista delimitada por comas de ordenaciones de columnas, seguida de ASC (configuración predeterminada y opcional) o DESC, con el fin de indicar orden ascendente o descendente.

' Sort the view based on the FirstName column myDataView.Sort = "CustomerID"

Page 82: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

82

' Filter the dataview to only show customers with the CustomerID of ALFKI myDataView.RowFilter = "CustomerID='ALFKI'"

También puede filtrar en función del estado de las filas (eliminadas, nuevas, etc.). A continuación se muestra un ejemplo de filtro en filas eliminadas:

myDataView.RowStateFilter = DataViewRowState.Deleted6 3.7 Crear el proyecto de instalacion Una vez que una aplicación VB.NET ha sido desarrollada, comprobada y compilada, debe ser instalada en las máquinas cliente donde será utilizada en el futuro. En ese proceso el entorno .NET suministra una serie de métodos y herramientas para realizar programas instaladores dependiendo del tipo de aplicación creada y de las características de dicha máquina cliente. El programa instalador debe ocuparse de cargar la aplicación en la máquina cliente así como cualquier otro archivo o recurso que ésta emplee en su funcionamiento, ya sea en el estado actual o en el futuro previsto.

Se distinguen tres tipos de instalaciones:

- instalación XCOPY

- programa instalador de aplicación

- programa instalador de módulo

Instalación XCOPY

Es el método más sencillo de instalación y no precisa el uso de ninguna herramienta de Visual Studio.NET por lo que constituye un método accesible a cualquier desarrollo. Se basa en el proceso de copia de la carpeta de la aplicación en la máquina cliente utilizando para ello el comando XCOPY de MSDOS disponible en cualquier sistema Windows. Para utilizarlo debe accederse a la línea de comandos desde Inicio Þ Todos los Programas Þ Accesorios Þ Símbolo del Sistema y la sintaxis a emplear es

XCOPY ruta_carpeta_origen ruta_carpeta_destino /s

6 http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art53.asp

Page 83: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

83

donde /s indica que debe copiarse la carpetas y sus ficheros, pero también las de todas las subcarpetas independientemente del nivel de anidamiento. Por ejemplo, si la aplicación se encuentra en la carpeta c:\Calculadora y se debe tener en d:\Operaciones la sentencia es

XCOPY c:\calculadora d:\operaciones /s

Este proceso de copia migra todos los archivos necesarios, incluyendo el EXE generado y las DLL relacionadas a la carpeta destino pudiendo ser empleada. Si se desea instalar desde una máquina en otras máquinas de la red la única diferencia es que la ruta de la carpeta destino es la de una carpeta compartida en la máquina cliente y donde se han de tener permisos de escritura por parte del instalador.

Sin embargo, este método de instalación está sujeto a dos requisitos:

- la máquina cliente debe tener instalado .NET Framework ya que, en caso contrario, no puede disponer de las clases y otros recursos que la aplicación puede demandar

- las aplicaciones que se instalen de esta forma no pueden tener dependencias externas salvo el .NET Framework Esto implica que no puede hacer uso de archivos externos como pueden ser bases de datos o componentes compartidos.

Debido a las condiciones anteriores la instalación XCOPY sólo debe emplearse cuando la aplicación .NET no tiene dependencias externas y se puede suponer instalada en .NET Framework en todas las máquinas cliente lo cual reduce el número de aplicaciones que pueden instaladas de esta forma.

Programa instalador de aplicación

Cuando la aplicación no puede instalarse mediante XCOPY deben utilizarse las herramientas de Visual Studio para generar un programa de instalación específico, el cual emplee la aplicación Windows Installer para poder instalar la aplicación en cualquier máquina cliente de una forma sencilla. En ese sentido, se distingue la instalación de una aplicación independiente o de un control o componente desarrollado en VB.NET pero que no está orientado a existir ni a ser ejecutado de forma independiente sino cuyo objetivo es servir como paquete redistribuible para múltiples tipos de proyectos. Sin embargo, la herramienta a emplear en ambos casos es la misma y los pasos necesarios para ello son muy similares.

Page 84: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

84

Para crear un proyecto del tipo indicado se emplea la herramienta de Visual Studio, Asistente de Proyecto Instalador empleando los siguientes pasos:

- Luego de abrir la solución que se desea instalar se accede a Archivo Þ Agregar Proyecto Þ Nuevo proyecto, mostrándose el cuadro de diálogo de creación de proyectos donde, en la lista Tipo de Proyecto se selecciona Proyectos de instalación e implementación y en la lista de Plantillas creadas para guiar al programador en la creación del proyecto se selecciona Asistente de Proyectos de Instalación

Page 85: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

85

Una vez iniciado el Asistente, nos indica que serán precisos cinco pasos para la creación del proyecto instalador

El primer paso determina si el programa instalador se utilizará para una aplicación independiente (en cuyo caso distingue entre una aplicación Windows para ser empleada en máquinas cliente, o una aplicación web para ser empleada en Internet) o un paquete redistribuible que puede contener controles o componentes (en cuyo caso permite crear un módulo de Windows Installer o un archivo Cabinet CAB)

Page 86: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

86

- Por tanto, para un programa instalador de aplicación Windows se selecciona la primera opción y se pulsa Siguiente

- El cuadro siguiente permite indicar qué elementos de la aplicación estarán en el programador instalador

Page 87: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

87

Los elementos que ofrece para ser seleccionados son Resultado principal, Recursos adaptados, Símbolos de depuración, Archivos de contenido y Archivos de código fuente. El elemento principal es el primero porque es el que incluye el archivo ejecutable EXE de la aplicación y las DLL que emplea pero otros elementos, como por ejemplo el último que contiene el código fuente de la aplicación, no suele ser necesario en la instalación en las máquinas cliente.

- El siguiente paso permite añadir al instalador otros ficheros que no pertenecen directamente a la aplicación como pueden ser archivos de tipo Léame o páginas web HTML de ayuda de la aplicación. Sólo sería necesario pulsar el botón Agregar y localizarlos en el sistema de carpetas actual.

Page 88: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

88

- El siguiente cuadro muestra un resumen con las opciones elegidas para el proyecto de instalación. Si alguna no fuera correcta se puede pulsar Atrás y modificarlas. Como se puede apreciar la ruta elegida es, por defecto, un carpeta con el nombre dado al proyecto de instalación dentro de la carpeta de la aplicación.

Page 89: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

89

- Cuando se pulsa Finalizar se modifica el IDE para mostrar los elementos del programa instalador en una ficha nueva con el nombre de dicho programa

Además, también es visible en el Explorador de Soluciones una carpeta nueva con el nombre del proyecto de instalación y los elementos y dependencias pertenecientes a él.

Page 90: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

90

- Como se puede apreciar, uno de los elementos del programa instalador son las dependencias detectadas que indican aquellos elementos considerados imprescindibles en la máquina cliente para el correcto funcionamiento de la aplicación final. Y como se puede ver el primero es siempre el propio .NET Framework.

- El resultado normal de un programa de instalación generado de esta forma es un solo fichero de extensión MSI porque supone que las máquinas cliente en las que será utilizado tienen instalado Windows Installer, una aplicación del sistema operativo que controla la instalación de aplicaciones. Por ejemplo, es la responsable de poder desinstalar aplicaciones en el equipo a través de la herramienta Agregar y quitar programas del Panel de Control.

- Sin embargo, la suposición anterior puede no ser cierta y otros hechos relacionados con la instalación puede necesitar tener más control sobre el resultado y características de los ficheros que constituyen el programa instalador. Para realizar esos cambios debe accederse a las características del programador instalador mediante la selección de la opción Propiedades en su menú contextual en el Explorador de soluciones.

- El primer paso es seleccionar Administrador de configuración y cambiar el valor Debug a Release para el proceso de instalación (Setup1)

Page 91: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

91

-A partir de ese momento se dispone de las propiedades de la versión definitiva del programa instalador

Las principales opciones son

- Nombre del archivo de resultados: indica la localización y nombre del resultado del proyecto instalador en una sintaxis

<configuración>\<nombre_proyecto>.<extensión>

Page 92: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

92

donde <configuración> indica la subcarpeta donde se creará el resultado final, <nombre_proyecto> será el del fichero de instalación y <extensión> será .msi para aplicaciones independientes o .msm para módulos instaladores, ambas dadas por el funcionamiento del Windows Installer.

- Empaquetar archivos: determina cómo se generan los ficheros finales en relación con el proyecto instalador. Son posibles tres opciones:

o En el archivo de instalación: es la opción por defecto e implica que todos los ficheros se incluyen en el archivo principal de instalación .msi. Es la opción en la que se aplica el mayor grado de compresión y la más sencilla porque se genera un único fichero a emplear en las máquinas cliente

o En archivos contenedores CAB: los ficheros Cabinet se emplean en múltiples instalaciones y pueden ser útiles por el hecho de poder elegir el tamaño máximo a emplear (ver cuadro superior). Si se fija en 1440 kb se podría guardar el resultado de la instalación en disquetes y emplear estos para llevar a cabo la instalación en las máquinas cliente

Archivos separados sin comprimir: en esta opción no se aplica compresión y los archivos que constituyen el programa instalador se crean directamente en la misma carpeta que el fichero .msi.

Programa previo (Bootstrapper): se emplea para determinar si el programa de instalación de nuestra aplicación debe encargarse también de instalar previamente en la máquina cliente la aplicación Windows Installer para que ésta controle el proceso de instalación posterior. Existen tres opciones:

Ninguno: no se instalará Windows Installer por lo que se supone existente en las máquinas cliente. Si éstas tienen instalado Windows XP o superior es la opción adecuada ya que Windows Installer está presente en ellas.

Programa previo para Windows Installer: esta opción añade Windows Installer al programa instalador. Cuando éste se inicie instalará primero en las máquinas cliente Windows Installer y luego retomará la instalación de la aplicación final. Esta elección conlleva la creación de cuatro ficheros en el programa instalador

Fichero Significado

Setup.exe Será el punto de entrada de la instalación Chequeará si es precisa la instalación de Windows Installer en la máquina cliente en cuyo caso recurre a InstMsiA.exe o a InstMsiW.exe para hacerlo. Después, reanuda la instalación del programa final

Page 93: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

93

desde el .msi.

InstMsiA.exe Instala Windows Intaller en una máquina con Windows 95 o 98.

InstMsiW.exe Instala Windows Intaller en una máquina con Windows NT o 2000.

Setup.ini Contiene el nombre del fichero .msi que deberá ser ejecutado una vez se haya realizado la instalación de Windows Installer o se haya comprobado su existencia previa.

Programa previo para web: se emplea cuando se debe disponer la instalación desde Internet. Se crean los ficheros InstMsiA.exe y InstMsiW.exe. También se crea Setup.exe para detectar la existencia previa de Windows Installer pero, en este caso, se descargaría el ejecutable de instalación desde la web, en cuyo caso deberá indicarse

la URL de la carpeta de instalación, donde debe estar el programa instalador y los ficheros asociados

la URL para instalar Windows Installer y donde, por tanto, deben estar InstMsiA.exe y InstMsiW.exe. Si no se indica deberá ser la misma que para el programa instalador

- Compresión: permite determinar el tipo de compresión emplear (siempre que las opciones tomadas previamente lo permitan) en tres valores :

o Ninguna: no se aplica compresión

o Optimizada para velocidad: se aplica para generar una instalación rápida pero el tamaño del proyecto instalador puede incrementarse

Page 94: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

94

o Optimizada para tamaño: se comprime al máximo reduciendo el tamaño de los ficheros de instalación pero el proceso de instalación será más lento.

Ejecución del programa instalador

Una vez generado el fichero .msi de instalación se puede hacer doble clic en él una vez que se encuentre en la máquina cliente. Se inicia un asistente que guía al usuario en el proceso de instalación de la aplicación. Los pasos principales son los siguientes:

- El primer paso presenta el Asistente e indica el nombre del proyecto de instalación seleccionado en su creación

- En el segundo paso el usuario debe seleccionar la carpeta del sistema local donde desea instalar la aplicación final. Puede aceptar la ruta que se ofrece por defecto o pulsar el botón Examinar para indicar otra distinta.

Page 95: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

95

- El siguiente requisito es confirmar que se desea instalar la aplicación pulsando el botón Siguiente

Page 96: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

96

- Si todo es correcto, el programa de setup procede a la instalación de la aplicación final, indicando con una barra de progreso el avance del proceso

- Para indicar en el último cuadro la finalización de la instalación.7

7 www.visual\INSTALADORES DE APLICACIONES EN _NET, AUTOR J_ M_ .mht

Page 97: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

97

Page 98: 405021

Universidad Nacional Abierta y a Distancia

Escuela de Ciencias Básicas Tecnología e ingeniería

98

FUENTES DOCUMENTALES

CEBALLOS, F.J : VISUAL BASIC .NET. LENGUAJE Y APLICACIONES. Ed. Ra-ma Chappell, David: Aplique.NET, Pearson, 2003 ISBN: 970-26-0385-4 Charte, Ojeda Francisco VISUAL BASIC .NET Ed. Anaya Multimedia Gómez, Jiménez Enrique : VISUAL BASIC .NET Ed. Anaya Multimedia Halvorson, Michael :Aprenda ya Microsoft Visual Basic .NET, McGraw-Hill, 2002 ISBN: 84-481-3227-0 Mackenzie Duncan, Sharkey Kent Aprendiendo Visual Basic .NET en 21 lecciones avanzadas,Pearson Educación de México, 2003 ISBN: 970-26-0379-X MacDonald, Matthew: ASP.NET : manual de referencia, McGraw-Hill, 2002 ISBN: 84-481-3709-4 Platt, David S: Así es Microsoft .NET McGraw-Hill, 2001,ISBN: 84-481-3251-3 Riordan, Rebecca M :Aprenda ya Microsoft ADO .NET, McGraw-Hill/Interamericana de España, 2002 ISBN: 84-481-3639-X Sharkey, Kent APRENDIENDO VISUAL BASIC .NET Ed. Pearson Educación INFOGRAFIA http://es.wikipedia.org/wiki/Visual_Basic http://es.wikipedia.org/wiki/Visual_Basic.NET http://www.desarrolloweb.com/articulos/1388.php es.wikipedia.org/wiki/Bases_de_Datos http://www.dlsi.ua.es/asignaturas/dpaa/tema1.pdf http://www.ongconcalidad.org/modelacionsistemas.pdf http://www.willydev.net/descargas/Cursos/vbnet/index.html http://www.programatium.com/vbnet.htm www.visual\INSTALADORES DE APLICACIONES EN _NET, AUTOR J_ M_ .mht