SlideShare una empresa de Scribd logo
1 de 23
Descargar para leer sin conexión
ESCUELA POLITÉCNICA NACIONAL

                             PROYECTO F INAL
Realizado por: Poogramers

1.- Análisis
OBJETIVOS:

   1. Desarrollar un programa para una minitienda, el cual permita el ingreso de
      clientes, productos y sus respectivas compras, mediante una interfaz gráfica.
   2. Implementar el uso de base de datos al código java.
   3. Realizar las validaciones necesarias, con el uso de expresiones regulares.
   4. Aplicar los conceptos básicos de la Programación Orientada a Objetos, como son:
      Polimorfismo, herencia, etc.

ESPECIFICACIONES

   Ø El programa que se ha implementado se lo ha realizado en la plataforma
     NetBeans, lo cual se debe tener en cuenta al momento de compilarlo y/ó
     ejecutarlo.
   Ø Debido a que el programa necesita de una interacción con Base de Datos,
     recurrimos al servidor web phpmyadmin.
   Ø Para la generación de la base de datos se usó My Sql

MARCO TEÓRICO

Programación Orientada a Objetos con Java

Como es sabido hay muchos lenguajes de programación orientada a objetos POO que
tienen muchas similitudes entre si, pero puntualmente nos enfocaremos en Java,
utilizaremos para tal efecto un modelo de fábrica de objetos, para introducir los términos
clase, objeto, método, propiedad, estático, dinámico, donde la fábrica de objetos será el
entorno de ejecución o JRE.
Clases en Java

Las clases son el centro de la Programación Orientada a Objetos.

Algunos conceptos importantes de la POO son los siguientes:

   ·   Encapsulación. Las clases pueden ser declaradas como públicas (public) y como
       package(accesibles sólo para otras clases del package). Las variables miembro y
       los métodos pueden ser public, private, protected y package. De esta forma se
       puede controlar el acceso y evitar un uso inadecuado.
   ·   Herencia. Una clase puede derivar de otra (extends), y en ese caso hereda todas
       sus variables y métodos. Una clase derivada puede añadir nuevas variables y
       métodos y/o redefinir las variables y métodos heredados.
   ·   Polimorfismo. Los objetos de distintas clases pertenecientes a una misma
       jerarquía o que implementan una misma interface pueden tratarse de una forma
       general e individualizada, al mismo tiempo.

       El polimorfismo tiene que ver con la relación que se establece entre la llamada a
       un método y el código que efectivamente se asocia con dicha llamada. A esta
       relación se llama vinculación (binding). La vinculación puede ser temprana (en
       tiempo de compilación) o tardía (en tiempo de ejecución). Con funciones
       normales o sobrecargadas se utiliza vinculación temprana (es posible y es lo más
       eficiente). Con funciones redefinidas en Java se utiliza siempre vinculación
       tardía, excepto si el método es final.

       El polimorfismo es la opción por defecto en Java.

Herencia soportada por Java

Java no soporta herencia múltiple, es decir no podemos fabricar un objeto más complejo
con dos diferentes más simples, sino que sólo podremos heredar objetos nuevos de un
sólo objeto padre, que proveerá los métodos y propiedades básicas que serán extendidas
y/o ampliadas por el nuevo objeto. Es decir no podríamos tener un objeto Lámpara Reloj
que derive del objeto Lámpara y del objeto Reloj, sino que tendríamos que usar otros
mecanismos para proporcionar esa funcionalidad, interfaces y alojamiento de objetos.

Esto podría comprenderse como:

• Interfaces: Permiten que sean implementadas por objetos para adquirir comportamiento,
pero el comportamiento no es provisto por la interfaz, sino que el programador debe
proporcionar una manera eficaz de construir los métodos definidos en dicha interfaz uno
por uno. Pueden implementarse varias interfaces al mismo tiempo, en todos los casos es
necesario codificar funciones o métodos.
• Alojamiento: Podemos pensar que al objeto Lámpara le insertamos en su interior un
objeto Reloj entonces podemos llamar a los métodos del Reloj que está en la Lámpara,
esto lo veremos más adelante en algunos ejemplos. Ya no sería la Lámpara Reloj, pero
sería una Lámpara con Reloj.

• Herencia: Nos permite crear un objeto nuevo en base a uno existente, es una nueva clase
de objeto, puede utilizar el alojamiento de otros objetos como propiedades para adquirir
funcionalidad.

Arreglos o Vectores.

Los arreglos son como un vector, con varias componentes incluso en programación un
arreglo puede representar una matriz de varias dimensiones. Por ejemplo si tenemos 10
frases que enseñaremos según un número del 1 al 10, podemos utilizar un vector de una
sola dimensión, donde indicaremos con un subíndice a los elementos que este mismo
almacene.

En Java un arreglo se representa por un objeto que tiene un límite de elementos al ser
definido, o en alguna parte de nuestro programa le asignaremos un objeto arreglo de
cierto tipo. Los elementos que pondremos en nuestro arreglo de datos deben estar
definidos en cantidad, no en valor, si creemos que podemos necesitar más o menos 10+/-
3 elementos asignaremos 13 por más que a veces usemos 7. Los arreglos tienen una
cantidad de elementos, pero el subíndice que usaremos para acceder al contenido de cada
elemento irá del 0 a ELEMENTOS

Expresiones regulares

Una expresión regular, a menudo llamada también patrón, es una expresión que
describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo
formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón
"H(a|ä|ae)ndel".

En el área de la programación las expresiones regulares son un método por medio del
cual se pueden realizar búsquedas dentro de cadenas de caracteres. Sin importar si la
búsqueda requerida es de dos caracteres en una cadena de 10 o si es necesario encontrar
todas las apariciones de un patrón definido de caracteres en un archivo de millones de
caracteres, las expresiones regulares proporcionan una solución para el problema.

Adicionalmente, un uso derivado de la búsqueda de patrones es la validación de un
formato específico en una cadena de caracteres dada, como por ejemplo fechas o
identificadores.
Patrones para expresiones regulares


    Oper.                  Descripción                          Oper.                     Descripción                       Oper.                      Descripción

            Car acter c no especial. Casa consigo
                                                                        Car acter especial c (: carácter de escape).               Comenzar con X.
c           mis mo.                                        c                                                           ^X


            Finalizar con X.                                            X cero o más veces.                                         Un caracter indivudual cualquiera.
X$                                                         X*                                                           .


            Conjunto de caracter es. Casa si c1 o c2 o                                                                              Rango de caracteres. Casa con cualquier
                                                                        Casa con caracteres distintos de c1, c2 o c3.
[c1c2c3]    c3.                                            [^c1c2c3]                                                    [c1-c2]     caracter entre c1 y c2.



            Casa con caracteres no comprendidos
                                                                        Concatenación. Casa si X va seguido de Y.                   X una o más veces.
[^c1-c2]    entre c1 y c2.                                 XY                                                           X+



                                                                        Agrupa X. (Además, en JavaScript, graba en
            X cero o una vez.                                                                                                       Alternativa. Casa X o Y.
X?                                                         (X)          RegExp.$1...).                                  X|Y



            X exactamente n veces.                                      X al menos n veces.                                         X de m a nveces.
X{n}                                                       X{n,}                                                        X{m,n}


            Literal. Ignora los caracteres especiales de
                                                                        Casa X pero no lo captura.                                  Casa X s i va seguido de Y.
"cad"       cad. (No se puede utilizar en JavaScript)      (?:X)                                                        X(?=Y)
Casa X s i no va seguido de Y.                      X al final de una palabra.                          X no está al final de una palabra.
X(?!=Y)                                                Xb                                                 XB


          Car ácter de control Ctrl+tec.                      Car ácter numérico. Equivale a [0-9].               Car ácter no numérico. Equivale a [^0-9].
ctec                                                  d                                                  D


          Es pacio en blanco (separador). Equivale a          Es pacio no blanco (separador). Equivale a
                                                                                                                  Car ácter alfanumér ico. Equivale a [A-Za-z0-9_].
s        [fnrtv].                                S     [^fnrtv].                               w



          Car ácter no alfanumérico. Equivale a [^A-          Referenc ia atr as a subcadenas capturadas
                                                                                                                  Car ácter cuyo código en hexadecimal es hh.
W        Za-z0-9_].                                   num   (num entero).                                xhh
NetBeans

La plataforma NetBeans permite que las aplicaciones sean desarrolladas a partir de un
conjunto de componentes de software llamados módulos. Un módulo es un archivo Java
que contiene clases de java escritas para interactuar con las APIs de NetBeans y un
archivo especial (manifest file) que lo identifica como módulo. Las aplicaciones
construidas a partir de módulos pueden ser extendidas agregándole nuevos módulos.
Debido a que los módulos pueden ser desarrollados independientemente, las aplicaciones
basadas en la plataforma NetBeans pueden ser extendidas fácilmente por otros
desarrolladores de software.

La Plataforma NetBeans

Durante el desarrollo del NetBeans IDE ocurrió una cosa interesante. La gente empezó a
construir aplicaciones usando el NetBeans core runtime con sus propios plug- ins, de
hecho, esto se convirtió en un mercado bastante grande.

La Plataforma NetBeans es una base modular y extensible usada como una estructura de
integración para crear aplicaciones de escritorio grandes. Empresas independientes
asociadas, especializadas en desarrollo de software, proporcionan extensiones adicionales
que se integran fácilmente en la plataforma y que pueden también utilizarse para
desarrollar sus propias herramientas y soluciones.

La plataforma ofrece servicios comunes a las aplicaciones de escritorio, permitiéndole al
desarrollador enfocarse en la lógica específica de su aplicación. Entre las características
de la plataforma están:

   ·   Administración de las interfaces de usuario (ej. menús y barras de herramientas)
   ·   Administración de las configuraciones del usuario
   ·   Administración del almacenamiento (guardando y cargando cualquier tipo de
       dato)
   ·   Administración de ventanas
   ·   Framework basado en asistentes (diálogos paso a paso)

JDBC(Java Data Base Conection)

Introducción a JDBC

JDBC es un API de Java para ejecutar sentencias SQL. Está formado por un conjunto de
clases e interfaces programadas con el propio Java. Permite interactuar con bases de
datos, de forma transparente al tipo de la misma. Es decir, es una forma única de
programar el acceso a bases de datos desde Java, independiente del tipo de la base de
datos. JDBC realiza llamadas directas a SQL.

Existen cuatro categorías de drivers que soportan la conectividad JDBC3, por ejemplo:
puente JDBC-ODBC, drivers de red, drivers nativos .
En la práctica utilizaremos un driver específico que permite la comunicación directa de
JDBC con MySQL. Su nombre es MySQL Connector/J 5.0 y es un driver nativo que
convierte llamadas JDBC al protocolo de red utilizado por la base de datos MySQL.

Este driver es necesario tenerlo instalado en el cliente y cambiar la variable
CLASSPATH para que contenga la ruta del fichero .jar o de las carpetas org y com del
driver. Para utilizarlo desde un entorno como el Eclipse, es necesario cambiar las
propiedades del proyecto y añadir el .jar del driver como un jar externo. Una vez
seleccionado el driver el resto del código es independiente del SGBD




Paquete java.sql

Las clases que conforman el API JDBC4 se encuentran agrupadas en el paquete java.sql.
Este paquete contiene clases para cargar los drivers, realizar las conexiones a las bases de
datos, consultar los datos y manejar un conjunto de registros. También posee las clases
para el manejo de excepciones que se produzcan en el acceso a bases de datos. A
continuación mostramos un esquema en el cual se encuentran las interfaces y clases
fundamentales del paquete java.sql.
La interface Driver es la interface que todos los drivers deben implementar. Cada driver
que quiera ser utilizado para conectarse a una base de datos desde Java debe suministrar
una clase que implemente la interface Driver.

La clase Drive rManager proporciona el servicio básico para manejar un conjunto de
drivers JDBC.

La interface Connection representa una conexión o sesión con una base de datos
específica.

La clase Types define las constantes que se utilizarán para identificar tipos genéricos
SQL, estas constantes son llamadas tipos JDBC.

Las clases Date y Time se utilizan para representar los valores de fecha y hora desde el
código de Java permitiendo a JDBC identificarlos como SQL DATE y SQL TIME.

Las interfaces DatabaseMetaData y ResulSetMetaData permitirán obtener información
referente al diseño y estructura de la base de datos y de los ResultSet que se obtengan
respectivamente.

La clase SQLException representa a las excepciones relacionadas con el acceso a base
de datos y proporciona información acerca del error que ha ocurrido.

Pasos para crear una aplicación JDBC

   ·   Cargar el driver JDBC.
   ·   Conectarse a la Base de Datos utilizando la clase Connection.
   ·   Crear sentencias SQL, utilizando objetos de tipo Statement.
   ·   Ejecutar las sentencias SQL a través de los objetos de tipo Statement.
   ·   En caso que sea necesario, procesar el conjunto de registros resultante utilizando
       la clase ResultSet.



Para comunicar Java con un SGBPara comunicar Java con un SGBD

Hay que conocer:

   ·   Fichero físico que contiene el driver (jar/zip) (debe estar incluido en el
       CLASSPATH de la aplicación)
   ·   Nombre de la clase driver de Java (opcional)
   ·   URL de conexión
Algunos driver JDBC

   ·   MySql

       ü Clase Driver : com.mysql.jdbc.Driver
       ü URL de Conexión: jdbc:mysql://<host>/<database>
       ü Fichero .jar/.zip: mysql-connector-java-5.0.4-bin.jar

   ·   SQLServer

       ü Clase Driver : com.microsoft.jdbc.sqlserver.SQLServerDriver
       ü URL de Conexión: jdbc:microsoft:sqlserver://localhost:1433
       ü Fichero .jar/.zip: mssqlserver.jar, msbase.jar, msutil.jar

phpMyadmin

phpMyAdmin es un programa de libre distribución en PHP, creado por una comunidad
sin ánimo de lucro, que sólo trabaja en el proyecto por amor al arte. Es una herramienta
muy completa que permite acceder a todas las funciones típicas de la base de datos
MySQL a través de una interfaz web muy intuitiva.
La aplicación en si no es más que un conjunto de archivos escritos en PHP que podemos
copiar en un directorio de nuestro servidor web, de modo que, cuando accedemos a esos
archivos, nos muestran unas páginas donde podemos encontrar las bases de datos a las
que tenemos acceso en nuestro servidor de bases de datos y todas sus tablas. La
herramienta nos permite crear tablas, insertar datos en las tablas existentes, navegar por
los registros de las tablas, editarlos y borrarlos, borrar tablas y un largo etcétera, incluso
ejecutar sentencias SQL y hacer un backup de la base de datos.

Características

   ·   Interfaz Web intuitiva
   ·   Apoyo a las características más MySQL:
   ·   buscar y borrar bases de datos, tablas, vistas, campos e índices de
   ·   crear, copiar, eliminar y cambiar el nombre de alterar las bases de datos,
       tablas, campos e índices de
   ·   Mantenimiento de servidores, bases de datos y tablas, con propuestas sobre
       la configuración del servidor
   ·   ejecutar, editar y marcar cualquier instrucción SQL-, incluso lote de
       consultas
   ·   gestión de usuarios y privilegios de MySQL
   ·   gestión de procedimientos almacenados y disparadores
   ·   Importar datos de CSV y SQL
   ·   Exportar datos a diferentes formatos: CSV, SQL, XML, PDF, ISO / IEC 26300
       - OpenDocument de texto y hoja de cálculo, Word, Excel, L A T E X y otros
   ·   Administración de múltiples servidores
   ·   La creación de gráficos en PDF de su diseño de base de datos
   ·   La creación de consultas complejas utilizando consulta por ejemplo (QBE)
   ·   Buscando a nivel mundial en una base de datos o un subconjunto de la misma
   ·   La transformación de los datos almacenados en cualquier formato, usando un
       conjunto de funciones predefinidas, como mostrar los datos de BLOB como
       imagen o enlace de descarga
   ·   Y mucho más ...

Interfaces gráficas de usuario

La mayor parte de las aplicaciones que se utilizan hoy en día incluyen interfaces de
usuario más sofisticadas que las de las aplicaciones que se ejecutan en modo consola.
Java incluye, como parte de su biblioteca de clases estándar, un conjunto de componentes
para crear interfaces gráficas de usuario.

Siguiendo la filosofía de su lema (“write once, run anywhere”), estos componentes
permiten crear interfaces portables.
AWT y Swing

Los componentes que se utilizan en Java para crear interfaces gráficas de usuario se
agrupan en dos paquetes (y sus correspondientes subpaquetes):

       ·   java.awt (Abstract Window Toolkit)

Los componentes AWT dependen de las facilidades gráficas ofrecidas por cada sistema
operativo: los programas escritos con AWT tendrán un “look and feel” distinto en
Windows y en UNIX.

       ·   javax.swing

SWING es 100% Java y, por tanto, completamente independiente de la plataforma: los
componentes gráficos se pintan en tiempo de ejecución (por lo que las aplicaciones
SWING suelen ser algo más lentas que las AWT).

En la práctica, las aplicaciones Java con interfaces gráficas de usuariosuelen mezclar
AWT y SWING (porque AWT se encarga de toda la gestión de eventos y SWING ofrece
componentes más sofisticados).


Frames

Los frames (marcos) son ventanas en las que se pueden colocar otros controles de los que
se utilizan para crear las interfaces gráficas de usuario (botones, etiquetas, cajas de texto,
listas desplegables, menús, etcétera).
AWT SWING
2.- Diseño
Para el diseño del programa se utilizaron cierto tipo de expresiones regulares y ciertas
librerías tales como:

   ·   ^                    Comienzo de una línea
   ·   $                    Fin de una línea
   ·   [abc]                a, b, o c
   ·   [^abc]               Cualquier caracter excepto a, b, o c (negación)
   ·                      Representa obligatoriedad
   ·   |                    Representa v/ó
   ·   d{2}                 Número de dígitos para cierta expresión (en este caso 2)
   ·   ostermiller.jar     Es una librería la cual utilizamos para codificar y decodificar
                           el password del administrador.
   ·   MySQL JDBC          JDBC es un API de Java para ejecutar sentencias SQL.
   ·   PhpmyAdmin

Para el diseño también se utilizaron JPanel, JFrame y JTextArea para mostrar los
resultados y lo demás ha sido implementado con cosas ya utilizadas anteriormente.

3.- Implementación
¿COMO FUNCIONA NUESTRO PROGRAMA?

   ·   Inicialmente el programa nos nuestra una ventana de login donde debemos
       ingresar nombre de usuario y contraseña de administrador, previamente el
       administrador debe estar registrado.
Si los parámetros son ingresados incorrectamente (No consta como administrador) el
programa desplegara una pantalla de error hasta que los datos sean ingresados
correctamente.




   ·   Si los datos del administrador son ingresados correctamente se desplegara un
       Frame con toda la información que nuestro proyecto contiene.




Aquí el usuario podrá interactuar con el programa ya sea añadiendo o eliminando los
campos expuestos en el Frame.

   ·   Si el usuario decide trabajar en la parte de Administradores presentara las
       siguientes opciones:
Ø Insertar Administrador




Se mostrara un nuevo Frame con los campos que describen la información personal del
nuevo administrador, cada uno de estos se encuentra validado mediante expresiones
regulares correspondientes a los mismos. Si alguno de los datos ingresados son
incorrectos aparecerá un mensaje de error indicando cual ha sido el error cometido por el
usuario. Así:




Caso contrario si los datos ingresados por el usuario son correctos, se mostrara lo
siguiente:
Así el nuevo administrador estará listo para acceder en un nuevo login de usuario.

           Ø Eliminar Administrador

Aquí el usuario tiene la libertad de eliminar a cualquier persona de la lista de
administradores excepto el usuario admin que ha sido tomado como root de nuestro
programa.

   ·   Si el usuario decide trabajar en la parte de Productos presentara características
       similares a lo mencionado en la parte de Administradores.
·   Si el usuario decide trabajar en la parte de Clientes presentara características
    similares a lo mencionado en la parte de Administradores.




·   Si el usuario decide trabajar en la parte de Ordenes presentara las siguientes
    características.

       Ø Agregar orden
El usuario deberá insertar la C.I. del cliente en cuestión, el programa detectara si la
identificación existe o no dentro de nuestra base de datos, diviendose así el proceso en
dos partes:

   1. Para un nuevo cliente

Aparecera el siguiente mensaje:




Para nuestro ejemplo hemos insertado la C.I. 4534231213, la misma que no se encuentra
registrada en nuestra base de datos, por tanto el programa permite crear un nuevo registro
del cliente.
Una vez ingresados los datos del cliente se creara la orden de compra.
2. Para un cliente ya existente
Al ingresar la C.I. el programa automáticamente detectara que la identificación ya existe
en nuestra base de datos y así se mostrara instantáneamente la orden de compra con los
datos completos del cliente registrado.

Una vez ingresados los datos completos del cliente a la orden de compra se procederá a
elegir los productos que este necesite adquirir a través del botón agregar ítem
desplegándose la siguiente ventana:




Aquí el cliente elegirá el producto y la cantidad que desea comprar, todos los productos
seleccionados se añadirán a la orden de compra creada a dicho cliente mostrando el valor
total a pagar.
Una vez finalizada la elección de productos se procederá a realizar la compra respectiva
presionando el botón comprar. Apareciendo un mensaje de confirmación y así se creara la
orden en nuestra base de datos con sus respectivos campos.
Como última instancia tenemos la pestana About donde se especifica el objetivo de
nuestro programa y muestra lista de integrantes de grupo (Poogramers).
PRUEBAS

Para constatar que nuestro programa está funcionando adecuadamente, es necesario
verificar que los cambios que se realizan en la interfaz grafica afecten a nuestra base de
datos realizando lo siguiente:

   ü Iniciamos      un     explorador   en    cual    ingresaremos     la    dirección
     http://localhost/phpmyadmin/ para cargar nuestra base de datos.
   ü Una vez localizada la base podemos observar las distintas entidades con sus
     respectivos campos utilizados en el programa.
   ü Dentro de cada una de las entidades se podrán visualizar los cambios efectuados a
     través de la interfaz grafica.

A continuación presentaremos un ejemplo de los cambios realizados en el programa.

                                  TABLA CLIENTES
TABLA ORDEN




TABLA PRODUCTO

Más contenido relacionado

La actualidad más candente

Estructura de Datos: Lista
Estructura de Datos: ListaEstructura de Datos: Lista
Estructura de Datos: ListaEmerson Garay
 
EJERCICIOS DE ALGORITMOS
EJERCICIOS DE ALGORITMOSEJERCICIOS DE ALGORITMOS
EJERCICIOS DE ALGORITMOS1002pc3
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos Kaneki04
 
Metodos de-ordenamiento
Metodos de-ordenamientoMetodos de-ordenamiento
Metodos de-ordenamientodeff000001
 
Presentacion arbol-binario
Presentacion arbol-binarioPresentacion arbol-binario
Presentacion arbol-binarioMariela Cabezas
 
POO Programación Orientada a Objetos
POO Programación Orientada a ObjetosPOO Programación Orientada a Objetos
POO Programación Orientada a ObjetosLuis Berganza
 
UML - Casos de Uso y Diagramas de Clase
UML - Casos de Uso y Diagramas de ClaseUML - Casos de Uso y Diagramas de Clase
UML - Casos de Uso y Diagramas de ClaseGuillermo Díaz
 
Arreglos en PSeInt
Arreglos en PSeIntArreglos en PSeInt
Arreglos en PSeIntJerry
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaAngel Vázquez Patiño
 
Cuadro sinóptico estructuras de datos y su clasificación
Cuadro sinóptico   estructuras de datos y su clasificaciónCuadro sinóptico   estructuras de datos y su clasificación
Cuadro sinóptico estructuras de datos y su clasificaciónAlex Uhu Colli
 
Estructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colasEstructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colasHuascar Génere
 

La actualidad más candente (20)

Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
 
Estructura de Datos: Lista
Estructura de Datos: ListaEstructura de Datos: Lista
Estructura de Datos: Lista
 
EJERCICIOS DE ALGORITMOS
EJERCICIOS DE ALGORITMOSEJERCICIOS DE ALGORITMOS
EJERCICIOS DE ALGORITMOS
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos
 
Metodos de-ordenamiento
Metodos de-ordenamientoMetodos de-ordenamiento
Metodos de-ordenamiento
 
Presentacion arbol-binario
Presentacion arbol-binarioPresentacion arbol-binario
Presentacion arbol-binario
 
POO Programación Orientada a Objetos
POO Programación Orientada a ObjetosPOO Programación Orientada a Objetos
POO Programación Orientada a Objetos
 
UML - Casos de Uso y Diagramas de Clase
UML - Casos de Uso y Diagramas de ClaseUML - Casos de Uso y Diagramas de Clase
UML - Casos de Uso y Diagramas de Clase
 
Estructura datos pilas y colas
Estructura datos pilas y colasEstructura datos pilas y colas
Estructura datos pilas y colas
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
Aplicaciones de los árboles y grafos
Aplicaciones de los árboles y grafosAplicaciones de los árboles y grafos
Aplicaciones de los árboles y grafos
 
Estructuras en c++
Estructuras en c++Estructuras en c++
Estructuras en c++
 
Arreglos en PSeInt
Arreglos en PSeIntArreglos en PSeInt
Arreglos en PSeInt
 
Programación 3: Clases y objetos en Java
Programación 3: Clases y objetos en JavaProgramación 3: Clases y objetos en Java
Programación 3: Clases y objetos en Java
 
Cuadro sinóptico estructuras de datos y su clasificación
Cuadro sinóptico   estructuras de datos y su clasificaciónCuadro sinóptico   estructuras de datos y su clasificación
Cuadro sinóptico estructuras de datos y su clasificación
 
Clases y objetos en Java
Clases y objetos en JavaClases y objetos en Java
Clases y objetos en Java
 
Colas
ColasColas
Colas
 
Clases abstractas
Clases abstractasClases abstractas
Clases abstractas
 
Pilas y colas
Pilas y colasPilas y colas
Pilas y colas
 
Estructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colasEstructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colas
 

Similar a Informe Proyecto Final (20)

RegExp JavaScript Expresiones Regulares
RegExp JavaScript Expresiones RegularesRegExp JavaScript Expresiones Regulares
RegExp JavaScript Expresiones Regulares
 
Ruby 01
Ruby 01Ruby 01
Ruby 01
 
Ruby
Ruby Ruby
Ruby
 
Mod2ud1 2
Mod2ud1 2Mod2ud1 2
Mod2ud1 2
 
Programacion de Cadenas
Programacion de CadenasProgramacion de Cadenas
Programacion de Cadenas
 
Prolog2010
Prolog2010Prolog2010
Prolog2010
 
Certificación java 6 cap 3
Certificación java 6 cap 3Certificación java 6 cap 3
Certificación java 6 cap 3
 
Capitulo 12
Capitulo 12Capitulo 12
Capitulo 12
 
Tipos de datos usados en lenguaje C
Tipos de datos usados en lenguaje CTipos de datos usados en lenguaje C
Tipos de datos usados en lenguaje C
 
Tipos de datos usados en c
Tipos de datos usados en cTipos de datos usados en c
Tipos de datos usados en c
 
Clase de logica posbc
Clase de logica posbcClase de logica posbc
Clase de logica posbc
 
Programacion matlab
Programacion matlabProgramacion matlab
Programacion matlab
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Tema 11 expresiones regulares en java por gio
Tema 11   expresiones regulares en java por gioTema 11   expresiones regulares en java por gio
Tema 11 expresiones regulares en java por gio
 
Funciones
FuncionesFunciones
Funciones
 
Javascript continuación
Javascript   continuaciónJavascript   continuación
Javascript continuación
 
Elementos de la funcion
Elementos de la funcionElementos de la funcion
Elementos de la funcion
 
Elementos de la función
Elementos de la funciónElementos de la función
Elementos de la función
 
Funcion lineal presentacion
Funcion lineal presentacionFuncion lineal presentacion
Funcion lineal presentacion
 
Asignación # 4
Asignación # 4Asignación # 4
Asignación # 4
 

Informe Proyecto Final

  • 1. ESCUELA POLITÉCNICA NACIONAL PROYECTO F INAL Realizado por: Poogramers 1.- Análisis OBJETIVOS: 1. Desarrollar un programa para una minitienda, el cual permita el ingreso de clientes, productos y sus respectivas compras, mediante una interfaz gráfica. 2. Implementar el uso de base de datos al código java. 3. Realizar las validaciones necesarias, con el uso de expresiones regulares. 4. Aplicar los conceptos básicos de la Programación Orientada a Objetos, como son: Polimorfismo, herencia, etc. ESPECIFICACIONES Ø El programa que se ha implementado se lo ha realizado en la plataforma NetBeans, lo cual se debe tener en cuenta al momento de compilarlo y/ó ejecutarlo. Ø Debido a que el programa necesita de una interacción con Base de Datos, recurrimos al servidor web phpmyadmin. Ø Para la generación de la base de datos se usó My Sql MARCO TEÓRICO Programación Orientada a Objetos con Java Como es sabido hay muchos lenguajes de programación orientada a objetos POO que tienen muchas similitudes entre si, pero puntualmente nos enfocaremos en Java, utilizaremos para tal efecto un modelo de fábrica de objetos, para introducir los términos clase, objeto, método, propiedad, estático, dinámico, donde la fábrica de objetos será el entorno de ejecución o JRE.
  • 2. Clases en Java Las clases son el centro de la Programación Orientada a Objetos. Algunos conceptos importantes de la POO son los siguientes: · Encapsulación. Las clases pueden ser declaradas como públicas (public) y como package(accesibles sólo para otras clases del package). Las variables miembro y los métodos pueden ser public, private, protected y package. De esta forma se puede controlar el acceso y evitar un uso inadecuado. · Herencia. Una clase puede derivar de otra (extends), y en ese caso hereda todas sus variables y métodos. Una clase derivada puede añadir nuevas variables y métodos y/o redefinir las variables y métodos heredados. · Polimorfismo. Los objetos de distintas clases pertenecientes a una misma jerarquía o que implementan una misma interface pueden tratarse de una forma general e individualizada, al mismo tiempo. El polimorfismo tiene que ver con la relación que se establece entre la llamada a un método y el código que efectivamente se asocia con dicha llamada. A esta relación se llama vinculación (binding). La vinculación puede ser temprana (en tiempo de compilación) o tardía (en tiempo de ejecución). Con funciones normales o sobrecargadas se utiliza vinculación temprana (es posible y es lo más eficiente). Con funciones redefinidas en Java se utiliza siempre vinculación tardía, excepto si el método es final. El polimorfismo es la opción por defecto en Java. Herencia soportada por Java Java no soporta herencia múltiple, es decir no podemos fabricar un objeto más complejo con dos diferentes más simples, sino que sólo podremos heredar objetos nuevos de un sólo objeto padre, que proveerá los métodos y propiedades básicas que serán extendidas y/o ampliadas por el nuevo objeto. Es decir no podríamos tener un objeto Lámpara Reloj que derive del objeto Lámpara y del objeto Reloj, sino que tendríamos que usar otros mecanismos para proporcionar esa funcionalidad, interfaces y alojamiento de objetos. Esto podría comprenderse como: • Interfaces: Permiten que sean implementadas por objetos para adquirir comportamiento, pero el comportamiento no es provisto por la interfaz, sino que el programador debe proporcionar una manera eficaz de construir los métodos definidos en dicha interfaz uno por uno. Pueden implementarse varias interfaces al mismo tiempo, en todos los casos es necesario codificar funciones o métodos.
  • 3. • Alojamiento: Podemos pensar que al objeto Lámpara le insertamos en su interior un objeto Reloj entonces podemos llamar a los métodos del Reloj que está en la Lámpara, esto lo veremos más adelante en algunos ejemplos. Ya no sería la Lámpara Reloj, pero sería una Lámpara con Reloj. • Herencia: Nos permite crear un objeto nuevo en base a uno existente, es una nueva clase de objeto, puede utilizar el alojamiento de otros objetos como propiedades para adquirir funcionalidad. Arreglos o Vectores. Los arreglos son como un vector, con varias componentes incluso en programación un arreglo puede representar una matriz de varias dimensiones. Por ejemplo si tenemos 10 frases que enseñaremos según un número del 1 al 10, podemos utilizar un vector de una sola dimensión, donde indicaremos con un subíndice a los elementos que este mismo almacene. En Java un arreglo se representa por un objeto que tiene un límite de elementos al ser definido, o en alguna parte de nuestro programa le asignaremos un objeto arreglo de cierto tipo. Los elementos que pondremos en nuestro arreglo de datos deben estar definidos en cantidad, no en valor, si creemos que podemos necesitar más o menos 10+/- 3 elementos asignaremos 13 por más que a veces usemos 7. Los arreglos tienen una cantidad de elementos, pero el subíndice que usaremos para acceder al contenido de cada elemento irá del 0 a ELEMENTOS Expresiones regulares Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón "H(a|ä|ae)ndel". En el área de la programación las expresiones regulares son un método por medio del cual se pueden realizar búsquedas dentro de cadenas de caracteres. Sin importar si la búsqueda requerida es de dos caracteres en una cadena de 10 o si es necesario encontrar todas las apariciones de un patrón definido de caracteres en un archivo de millones de caracteres, las expresiones regulares proporcionan una solución para el problema. Adicionalmente, un uso derivado de la búsqueda de patrones es la validación de un formato específico en una cadena de caracteres dada, como por ejemplo fechas o identificadores.
  • 4. Patrones para expresiones regulares Oper. Descripción Oper. Descripción Oper. Descripción Car acter c no especial. Casa consigo Car acter especial c (: carácter de escape). Comenzar con X. c mis mo. c ^X Finalizar con X. X cero o más veces. Un caracter indivudual cualquiera. X$ X* . Conjunto de caracter es. Casa si c1 o c2 o Rango de caracteres. Casa con cualquier Casa con caracteres distintos de c1, c2 o c3. [c1c2c3] c3. [^c1c2c3] [c1-c2] caracter entre c1 y c2. Casa con caracteres no comprendidos Concatenación. Casa si X va seguido de Y. X una o más veces. [^c1-c2] entre c1 y c2. XY X+ Agrupa X. (Además, en JavaScript, graba en X cero o una vez. Alternativa. Casa X o Y. X? (X) RegExp.$1...). X|Y X exactamente n veces. X al menos n veces. X de m a nveces. X{n} X{n,} X{m,n} Literal. Ignora los caracteres especiales de Casa X pero no lo captura. Casa X s i va seguido de Y. "cad" cad. (No se puede utilizar en JavaScript) (?:X) X(?=Y)
  • 5. Casa X s i no va seguido de Y. X al final de una palabra. X no está al final de una palabra. X(?!=Y) Xb XB Car ácter de control Ctrl+tec. Car ácter numérico. Equivale a [0-9]. Car ácter no numérico. Equivale a [^0-9]. ctec d D Es pacio en blanco (separador). Equivale a Es pacio no blanco (separador). Equivale a Car ácter alfanumér ico. Equivale a [A-Za-z0-9_]. s [fnrtv]. S [^fnrtv]. w Car ácter no alfanumérico. Equivale a [^A- Referenc ia atr as a subcadenas capturadas Car ácter cuyo código en hexadecimal es hh. W Za-z0-9_]. num (num entero). xhh
  • 6. NetBeans La plataforma NetBeans permite que las aplicaciones sean desarrolladas a partir de un conjunto de componentes de software llamados módulos. Un módulo es un archivo Java que contiene clases de java escritas para interactuar con las APIs de NetBeans y un archivo especial (manifest file) que lo identifica como módulo. Las aplicaciones construidas a partir de módulos pueden ser extendidas agregándole nuevos módulos. Debido a que los módulos pueden ser desarrollados independientemente, las aplicaciones basadas en la plataforma NetBeans pueden ser extendidas fácilmente por otros desarrolladores de software. La Plataforma NetBeans Durante el desarrollo del NetBeans IDE ocurrió una cosa interesante. La gente empezó a construir aplicaciones usando el NetBeans core runtime con sus propios plug- ins, de hecho, esto se convirtió en un mercado bastante grande. La Plataforma NetBeans es una base modular y extensible usada como una estructura de integración para crear aplicaciones de escritorio grandes. Empresas independientes asociadas, especializadas en desarrollo de software, proporcionan extensiones adicionales que se integran fácilmente en la plataforma y que pueden también utilizarse para desarrollar sus propias herramientas y soluciones. La plataforma ofrece servicios comunes a las aplicaciones de escritorio, permitiéndole al desarrollador enfocarse en la lógica específica de su aplicación. Entre las características de la plataforma están: · Administración de las interfaces de usuario (ej. menús y barras de herramientas) · Administración de las configuraciones del usuario · Administración del almacenamiento (guardando y cargando cualquier tipo de dato) · Administración de ventanas · Framework basado en asistentes (diálogos paso a paso) JDBC(Java Data Base Conection) Introducción a JDBC JDBC es un API de Java para ejecutar sentencias SQL. Está formado por un conjunto de clases e interfaces programadas con el propio Java. Permite interactuar con bases de datos, de forma transparente al tipo de la misma. Es decir, es una forma única de programar el acceso a bases de datos desde Java, independiente del tipo de la base de datos. JDBC realiza llamadas directas a SQL. Existen cuatro categorías de drivers que soportan la conectividad JDBC3, por ejemplo: puente JDBC-ODBC, drivers de red, drivers nativos .
  • 7. En la práctica utilizaremos un driver específico que permite la comunicación directa de JDBC con MySQL. Su nombre es MySQL Connector/J 5.0 y es un driver nativo que convierte llamadas JDBC al protocolo de red utilizado por la base de datos MySQL. Este driver es necesario tenerlo instalado en el cliente y cambiar la variable CLASSPATH para que contenga la ruta del fichero .jar o de las carpetas org y com del driver. Para utilizarlo desde un entorno como el Eclipse, es necesario cambiar las propiedades del proyecto y añadir el .jar del driver como un jar externo. Una vez seleccionado el driver el resto del código es independiente del SGBD Paquete java.sql Las clases que conforman el API JDBC4 se encuentran agrupadas en el paquete java.sql. Este paquete contiene clases para cargar los drivers, realizar las conexiones a las bases de datos, consultar los datos y manejar un conjunto de registros. También posee las clases para el manejo de excepciones que se produzcan en el acceso a bases de datos. A continuación mostramos un esquema en el cual se encuentran las interfaces y clases fundamentales del paquete java.sql.
  • 8. La interface Driver es la interface que todos los drivers deben implementar. Cada driver que quiera ser utilizado para conectarse a una base de datos desde Java debe suministrar una clase que implemente la interface Driver. La clase Drive rManager proporciona el servicio básico para manejar un conjunto de drivers JDBC. La interface Connection representa una conexión o sesión con una base de datos específica. La clase Types define las constantes que se utilizarán para identificar tipos genéricos SQL, estas constantes son llamadas tipos JDBC. Las clases Date y Time se utilizan para representar los valores de fecha y hora desde el código de Java permitiendo a JDBC identificarlos como SQL DATE y SQL TIME. Las interfaces DatabaseMetaData y ResulSetMetaData permitirán obtener información referente al diseño y estructura de la base de datos y de los ResultSet que se obtengan respectivamente. La clase SQLException representa a las excepciones relacionadas con el acceso a base de datos y proporciona información acerca del error que ha ocurrido. Pasos para crear una aplicación JDBC · Cargar el driver JDBC. · Conectarse a la Base de Datos utilizando la clase Connection. · Crear sentencias SQL, utilizando objetos de tipo Statement. · Ejecutar las sentencias SQL a través de los objetos de tipo Statement. · En caso que sea necesario, procesar el conjunto de registros resultante utilizando la clase ResultSet. Para comunicar Java con un SGBPara comunicar Java con un SGBD Hay que conocer: · Fichero físico que contiene el driver (jar/zip) (debe estar incluido en el CLASSPATH de la aplicación) · Nombre de la clase driver de Java (opcional) · URL de conexión
  • 9. Algunos driver JDBC · MySql ü Clase Driver : com.mysql.jdbc.Driver ü URL de Conexión: jdbc:mysql://<host>/<database> ü Fichero .jar/.zip: mysql-connector-java-5.0.4-bin.jar · SQLServer ü Clase Driver : com.microsoft.jdbc.sqlserver.SQLServerDriver ü URL de Conexión: jdbc:microsoft:sqlserver://localhost:1433 ü Fichero .jar/.zip: mssqlserver.jar, msbase.jar, msutil.jar phpMyadmin phpMyAdmin es un programa de libre distribución en PHP, creado por una comunidad sin ánimo de lucro, que sólo trabaja en el proyecto por amor al arte. Es una herramienta muy completa que permite acceder a todas las funciones típicas de la base de datos MySQL a través de una interfaz web muy intuitiva.
  • 10. La aplicación en si no es más que un conjunto de archivos escritos en PHP que podemos copiar en un directorio de nuestro servidor web, de modo que, cuando accedemos a esos archivos, nos muestran unas páginas donde podemos encontrar las bases de datos a las que tenemos acceso en nuestro servidor de bases de datos y todas sus tablas. La herramienta nos permite crear tablas, insertar datos en las tablas existentes, navegar por los registros de las tablas, editarlos y borrarlos, borrar tablas y un largo etcétera, incluso ejecutar sentencias SQL y hacer un backup de la base de datos. Características · Interfaz Web intuitiva · Apoyo a las características más MySQL: · buscar y borrar bases de datos, tablas, vistas, campos e índices de · crear, copiar, eliminar y cambiar el nombre de alterar las bases de datos, tablas, campos e índices de · Mantenimiento de servidores, bases de datos y tablas, con propuestas sobre la configuración del servidor · ejecutar, editar y marcar cualquier instrucción SQL-, incluso lote de consultas · gestión de usuarios y privilegios de MySQL · gestión de procedimientos almacenados y disparadores · Importar datos de CSV y SQL · Exportar datos a diferentes formatos: CSV, SQL, XML, PDF, ISO / IEC 26300 - OpenDocument de texto y hoja de cálculo, Word, Excel, L A T E X y otros · Administración de múltiples servidores · La creación de gráficos en PDF de su diseño de base de datos · La creación de consultas complejas utilizando consulta por ejemplo (QBE) · Buscando a nivel mundial en una base de datos o un subconjunto de la misma · La transformación de los datos almacenados en cualquier formato, usando un conjunto de funciones predefinidas, como mostrar los datos de BLOB como imagen o enlace de descarga · Y mucho más ... Interfaces gráficas de usuario La mayor parte de las aplicaciones que se utilizan hoy en día incluyen interfaces de usuario más sofisticadas que las de las aplicaciones que se ejecutan en modo consola. Java incluye, como parte de su biblioteca de clases estándar, un conjunto de componentes para crear interfaces gráficas de usuario. Siguiendo la filosofía de su lema (“write once, run anywhere”), estos componentes permiten crear interfaces portables.
  • 11. AWT y Swing Los componentes que se utilizan en Java para crear interfaces gráficas de usuario se agrupan en dos paquetes (y sus correspondientes subpaquetes): · java.awt (Abstract Window Toolkit) Los componentes AWT dependen de las facilidades gráficas ofrecidas por cada sistema operativo: los programas escritos con AWT tendrán un “look and feel” distinto en Windows y en UNIX. · javax.swing SWING es 100% Java y, por tanto, completamente independiente de la plataforma: los componentes gráficos se pintan en tiempo de ejecución (por lo que las aplicaciones SWING suelen ser algo más lentas que las AWT). En la práctica, las aplicaciones Java con interfaces gráficas de usuariosuelen mezclar AWT y SWING (porque AWT se encarga de toda la gestión de eventos y SWING ofrece componentes más sofisticados). Frames Los frames (marcos) son ventanas en las que se pueden colocar otros controles de los que se utilizan para crear las interfaces gráficas de usuario (botones, etiquetas, cajas de texto, listas desplegables, menús, etcétera). AWT SWING
  • 12. 2.- Diseño Para el diseño del programa se utilizaron cierto tipo de expresiones regulares y ciertas librerías tales como: · ^ Comienzo de una línea · $ Fin de una línea · [abc] a, b, o c · [^abc] Cualquier caracter excepto a, b, o c (negación) · Representa obligatoriedad · | Representa v/ó · d{2} Número de dígitos para cierta expresión (en este caso 2) · ostermiller.jar Es una librería la cual utilizamos para codificar y decodificar el password del administrador. · MySQL JDBC JDBC es un API de Java para ejecutar sentencias SQL. · PhpmyAdmin Para el diseño también se utilizaron JPanel, JFrame y JTextArea para mostrar los resultados y lo demás ha sido implementado con cosas ya utilizadas anteriormente. 3.- Implementación ¿COMO FUNCIONA NUESTRO PROGRAMA? · Inicialmente el programa nos nuestra una ventana de login donde debemos ingresar nombre de usuario y contraseña de administrador, previamente el administrador debe estar registrado.
  • 13. Si los parámetros son ingresados incorrectamente (No consta como administrador) el programa desplegara una pantalla de error hasta que los datos sean ingresados correctamente. · Si los datos del administrador son ingresados correctamente se desplegara un Frame con toda la información que nuestro proyecto contiene. Aquí el usuario podrá interactuar con el programa ya sea añadiendo o eliminando los campos expuestos en el Frame. · Si el usuario decide trabajar en la parte de Administradores presentara las siguientes opciones:
  • 14. Ø Insertar Administrador Se mostrara un nuevo Frame con los campos que describen la información personal del nuevo administrador, cada uno de estos se encuentra validado mediante expresiones regulares correspondientes a los mismos. Si alguno de los datos ingresados son incorrectos aparecerá un mensaje de error indicando cual ha sido el error cometido por el usuario. Así: Caso contrario si los datos ingresados por el usuario son correctos, se mostrara lo siguiente:
  • 15. Así el nuevo administrador estará listo para acceder en un nuevo login de usuario. Ø Eliminar Administrador Aquí el usuario tiene la libertad de eliminar a cualquier persona de la lista de administradores excepto el usuario admin que ha sido tomado como root de nuestro programa. · Si el usuario decide trabajar en la parte de Productos presentara características similares a lo mencionado en la parte de Administradores.
  • 16. · Si el usuario decide trabajar en la parte de Clientes presentara características similares a lo mencionado en la parte de Administradores. · Si el usuario decide trabajar en la parte de Ordenes presentara las siguientes características. Ø Agregar orden
  • 17. El usuario deberá insertar la C.I. del cliente en cuestión, el programa detectara si la identificación existe o no dentro de nuestra base de datos, diviendose así el proceso en dos partes: 1. Para un nuevo cliente Aparecera el siguiente mensaje: Para nuestro ejemplo hemos insertado la C.I. 4534231213, la misma que no se encuentra registrada en nuestra base de datos, por tanto el programa permite crear un nuevo registro del cliente.
  • 18. Una vez ingresados los datos del cliente se creara la orden de compra.
  • 19. 2. Para un cliente ya existente Al ingresar la C.I. el programa automáticamente detectara que la identificación ya existe en nuestra base de datos y así se mostrara instantáneamente la orden de compra con los datos completos del cliente registrado. Una vez ingresados los datos completos del cliente a la orden de compra se procederá a elegir los productos que este necesite adquirir a través del botón agregar ítem desplegándose la siguiente ventana: Aquí el cliente elegirá el producto y la cantidad que desea comprar, todos los productos seleccionados se añadirán a la orden de compra creada a dicho cliente mostrando el valor total a pagar.
  • 20. Una vez finalizada la elección de productos se procederá a realizar la compra respectiva presionando el botón comprar. Apareciendo un mensaje de confirmación y así se creara la orden en nuestra base de datos con sus respectivos campos.
  • 21. Como última instancia tenemos la pestana About donde se especifica el objetivo de nuestro programa y muestra lista de integrantes de grupo (Poogramers).
  • 22. PRUEBAS Para constatar que nuestro programa está funcionando adecuadamente, es necesario verificar que los cambios que se realizan en la interfaz grafica afecten a nuestra base de datos realizando lo siguiente: ü Iniciamos un explorador en cual ingresaremos la dirección http://localhost/phpmyadmin/ para cargar nuestra base de datos. ü Una vez localizada la base podemos observar las distintas entidades con sus respectivos campos utilizados en el programa. ü Dentro de cada una de las entidades se podrán visualizar los cambios efectuados a través de la interfaz grafica. A continuación presentaremos un ejemplo de los cambios realizados en el programa. TABLA CLIENTES