Saltar la navegación

7. Todos para el reto

Rétor dice:Ha llegado la hora de poner en práctica todo lo aprendido y resolver nuestro reto. A lo largo de los distintos puntos has ido recorriendo el camino completo de un desarrollo software, desde sus inicios cuando se abre el diálogo con el cliente hasta la puesta en funcionamiento del producto final, de la aplicación software. ¡Todo un orgullo para el equipo!

Hasta ahora has analizado, planificado y diseñado los requerimientos de este reto, a lo largo de los puntos anteriores. Es la hora de la implementación.

Recuerda: En este reto sólo vamos a implementar la gestión de los clientes. La posterior gestión de los servicios y facturas de la empresa sería una ampliación posterior del proyecto.

1. Un reto, un equipo y un comienzo

Primera pestaña de la aplicación que da una idea de cómo quedará el resultado final.Segunda pestaña de la aplicación que da una idea de cómo quedará el resultado final.Tercera pestaña de la aplicación que da una idea de cómo quedará el resultado final.

En este reto vamos a diseñar una aplicación que creará una interfaz gráfica para un manejo más fácil del programa por parte del cliente, como la que ves a la izquierda. Para trabajar de forma ordenada en la resolución de este problema dividiremos el proyecto en dos ficheros:

  • 'formularioclientes.py' que se encargará de la programación de la interfaz gráfica de usuario: contiene toda la lógica de presentación de datos y hace uso del otro fichero para el acceso a la base de datos. Es el fichero principal del proyecto y será el que debemos ejecutar para poner en funcionamiento la aplicación (fíjate en que hace la llamada a la creación de la interfaz gráfica en su última línea: aplicacion1=FormularioClientes())
  • 'clientes.py' que se encargará del desarrollo de la clase Cliente,  con sus métodos necesarios para el acceso a la base de datos: contiene toda la lógica de acceso a base de datos.

Ten en cuenta que, como el diseño gráfico es más complejo, ya que el uso de la librería tkinter requiere de mucha práctica, esta parte del código se te ofrece aquí para completarlo mediante el análisis que en cada ejercicio deberás realizar de los comandos utilizados en el código ofrecido. En REAldata Inc. ponemos a trabajar a nuestros programadores que aquí te ofrecen el código base:

fichero de código base

En el resto de ejercicios que se encarguen de desarrollar la clase Clientes para acceso a la base de datos, tendrás que desarrollar el código completo según lo visto a lo largo de este recurso.

Clavis dice Observa

Cuando vas a resolver tareas de programación, es importante mantener mucha atención. Además, reflexionar sobre la naturaleza de los procedimientos y recursos más eficientes, te ayudará a tener éxito en la tarea. Por eso, fíjate cómo,en la importación inicial de librerías, se incluye la importación import clientes: esto incluirá el fichero clientes.py que contiene la clase Clientes que vas a definir a lo largo de los ejercicios de este reto. Es la forma en la que Python puede hacer funcionar un proyecto con varios ficheros de código que desarrollan dicho proyecto: importándolos al fichero principal que inicia la ejecución de la aplicación.

2. El superpoder de comenzar la creación: iniciamos los constructores

Es la hora de comenzar la codificación de la aplicación. Te enfrentas a la inmersión inicial en la implementación, que seguro que superarás. Recuerda que siempre que necesites ayuda, tu equipo de compañeros y profesores estarán contigo. Sigue los pasos y ¡pon en marcha las teclas!:

Trabajando con fichero formularioclientes.py

PASO 1: Importaciones

Observa las 5 primeras líneas del fichero de código base:

  • ¿Qué módulos necesitas importar para el programa?
  • ¿Conoces qué hace cada una de las importaciones? Realiza un listado donde expliques el objetivo de cada una.

PASO 2: Construye la parte gráfica

Observa la clase FormularioClientes y localiza el constructor:

  • ¿Qué objeto estamos creando con ventana1?
  • Dentro de ella, observa que se crea otro objeto de clase Notebook. Consulta la documentación y crea una pequeña presentación de qué hace dicha clase y en qué biblioteca se encuentra.
  • A continuación ves que se realiza una llamada a varios métodos de la clase que se te ofrece en el código base. Deduce por qué es necesario esto y documéntalo.

PASO 3: Construye la base de datos

Al ser ejecutado este constructor que inicia la aplicación, deberá contener la construcción del objeto que albergue la base de datos. Localiza esta acción en el constructor proporcionado.

Trabajando con fichero clientes.py

Como has podido comprobar en el constructor de la aplicación que genera el programa, creamos un objeto de la clase Clientes para generar y manejar la necesaria base de datos. Vas ahora a comenzar a programar dicha clase:

  1. Abre un nuevo fichero en tu proyecto para albergar esta clase. Recuerda darle el nombre del que has hecho el import en el fichero principal.
  2. Piensa que cada vez que se realice una operación sobre la base de datos (cargar un cliente, consultar un cliente, listar datos) será necesario abrir la conexión: recuerda cómo se hace esto según has aprendido en el punto 4 del apartado 5.
  3. Además, será necesario crear la tabla de clientes si esta no existe previamente.
  4. Comienza la clase Clientes creando un método llamado abrir (que recibe como parámetro el propio objeto) y que crea la conexión a la base de datos y la tabla. Llama a la base de datos con el nombre bdclientes.db

Lumen dice Consejos de desarrollo

  1. Para la primera pregunta, reflexiona sobre qué necesitas para la visualización de la interfaz.
  2. Para el tercer punto del paso 2, observa que los métodos a los que se llama en el constructor coinciden con las operaciones que realizan las ventanas de la interfaz gráfica...
  3. Recuerda que al intentar crear la tabla de clientes en un método al que se llama varias veces, en las siguientes llamadas, la tabla ya existirá, por lo que el intento de creación generará una excepción de tipo OperationalError. Dispón la estructura necesaria para evitar que esta excepción salte e interrumpa la ejecición del programa (punto 4 del apartado 5_).
  4. Es importante especificar el path donde se encuentra el archivo 'bdclientes.db' si nuestro programa en Python se encuentra en otra carpeta.

Motus dice ¿Has hablado contigo mismo para resolver esta actividad?

No, no eres rara ni raro. Es muy frecuente que cuando estamos trabajando hablemos en silencio con nosotros mismos. Es una forma de comprender mejor lo que hacemos y de buscar soluciones a las tareas o actividades.

De hecho, te aconsejo que lo hagas con mucha frecuencia porque te ayudará a:

  • Recordar algunos pasos que necesites para realizar la actividad.
  • Hacerte preguntas para entender mejor la información.
  • Animarte a terminar la actividad, mantenerte concentrado…
  • Saber cómo te sientes ante la actividad.

¡Habla contigo mismo y aprenderás mejor!

3. Superpoder de los datos: Haciendo crecer la tabla

Usuario que envía datos para almacenar en la base de datos.Si observamos en el punto 1 la imagen que nos muestra la pestaña Carga de clientes, podemos comprobar que su funcionamiento lleva a que, una vez rellenos todos los comandos con los datos del cliente, tengamos que pulsar el botón Confirmar para que los datos se incluyan en la tabla de clientes. Tras cargarlos correctamente, se abre una ventana que nos indica el éxito de la carga.

Para ello utilizaremos los métodos carga_clientes() y agregar(), en la clase FormularioClientes; y alta() en la clase Clientes. Complétalos a continuación para el correcto funcionamiento de esta pestaña de la aplicación:

Trabajando con fichero formularioclientes.py

En el fichero formularioclientes.py de código base proporcionado, nos encontramos que hay que completar dos funciones de la clase FormularioClientes:

Completar carga_clientes()

En las 4 primeras líneas de código de este método se añade la primera pestaña al objeto Notebook, llamada Carga de clientes, y se crea un marco o frame para contener gráficamente los datos.

  1. A continuación se comienza a crear la estructura de elementos que contendrán los datos a agregar. Se te ofrecen creados los dos primeros (Nombre y Apellidos): observa los comandos que crean la estructura y úsalos para crear el resto de campos que es necesario obtener del cliente, hasta completar la pantalla mostrada en el punto 1: Sustituye: [...] por el código correcto.
  2. Observa que el comando que se ejecuta al pulsar el botón Confirmar llama al método agregar() (sin parámetros, ya que pertenecen al propio objeto).

Completar agregar()

Cuando desde la pestaña Carga de clientes se presiona el botón Confirmar, en el método agregar lo primero que hacemos es crear una tupla con los dos datos ingresados en los controles tipo "Entry" y guardarla en la variable datos:

  1. Completa el código para la correcta carga de la tupla datos.
  2. A continuación vemos que se pasan los valores de la tupla datos al método alta() del objeto cliente1, que a continuación crearemos en el otro fichero.
  3. Para completar el método agregar(), resetea todos los campos del frame Cliente. Ayúdate para ello del último comando que se te ofrece en dicho método.

Trabajando con fichero clientes.py

En el fichero clientes.py, en el que estamos codificando la clase Clientes, crea el necesario método alta(), llamado por la ejecución del botón Confirmar, de manera que realices:

  1. Conectar con la base de datos.
  2. Realiza el comando SQL adecuado para introducir los valores en la siguiente fila de la tabla. Recuerda que debes utilizar el comando execute para que Python reconozca el SQL.
  3. Cierra la conexión.

Lumen dice Recuerda...

  • Recuerda que dispones del método abrir creado anteriormente para conectar con la base de datos.
  • No olvides el comando commit para guardar los cambios introducidos en la base de datos.
  • Repasa, si te es necesario, la sintaxis del comando INSERT.

4. Superpoder de encontrar: ¿a que voy y encuentro el dato?

Lupa que busca un dato entre una gran página de codificación.Ahora vas a crear y programar el funcionamiento de la segunda pestaña: la consulta de clientes. El funcionamiento será el siguiente: la pestaña muestra todos los campos con los datos que se almacenan de un cliente. Se realizará una búsqueda poe DNI. PAra ello el usuario escribirá el DNI en el campo correspondiente y el programa deberá buscarlo en la base de datos. Tras encontrarlo, rellenará el resto de campos con los datos del cliente encontrado. ¡Adelante y busca el dato!

Trabajando con fichero formularioclientes.py

En la clase FormularioClientes tenemos a nuestra disposición el método consulta_de_cliente para crear la pestaña de búsqueda con la que vamos a trabajar ahora, y que llama al método consultar al pulsar el botón inferior paa realizar la búsqueda. Tendrás que completar estas dos funciones:

Completar consulta_de_cliente()

En este método se crea la estructura de elementos que contendrán los datos a agregar. Observa el código existente en la clase proporcionada. Se te ofrecen creados los dos primeros (Nombre y Apellidos): observa los comandos que crean la estructura y úsalos para crear el resto de campos que es necesario obtener del cliente, hasta completar la pantalla mostrada en el punto 1: Sustituye: [...] por el código correcto.

Completar consultar()

Cuando se presiona el botón Consultar se ejecuta este método. El método comienza creando una tupla con un solo dato (es obligatoria la coma para que Python lo considere una tupla): el campo dni. Este dato se le pasa al método consulta de la clase Clientes, que trabajarás a continuación en el otro fichero. Dicho método consulta devolverá una lista vacía si no existe el código de artículo ingresado o una lista con una tupla en su interior. Entonces:

  1. Observa que si se obtienen datos de vuelta, debes tomar cada valor devuelto en la tupla para asignarlo a su correspondiente campo en la pestaña de la aplicación, y así poder mostrar el cliente encontrado. Se ofrece la asignación del campo nombre: sustituye [...] por los que quedan por mostrar.
  2. Si no hay datos de vuelta, porque no se ha encontrado ningún cliente con ese DNI, reseteamos el valor de todos los campos (para dar la opción de comenzar una nueva búsqueda) y se muestra un mensaje informativo. Completa de nuevo el código para este segundo caso.

Trabajando con fichero clientes.py

En el fichero clientes.py, en el que estamos codificando la clase Clientes, crea el necesario método consulta(), llamado por la ejecución del botón Consultar, de manera que codifiques:

  1. Conectar con la base de datos.
  2. Crea un cursor que recoja el resultado de la consulta SQL.
  3. Realiza el comando SQL adecuado para realizar la búsqueda por DNI y recoger todos los datos de la correspondiente fila de la tabla del cliente encontrado. Recuerda que debes utilizar el comando execute para que Python reconozca el SQL.
  4. Devuelve los valores encontrados usando el método fetchall de la clase Cursor para devolver todas las filas de la tabla que cumplan la condición.
  5. Cierra la conexión.

Lumen dice Una ayuda

  • Recuerda que para realizar consultas de datos en tablas usamos el comando SELECT.
  • Para realizar el cierre de la conexión en cualquier caso, te puede resultar útil utilizar una estructura de tipo try...finally

5. Superpoder de rescate: recuperando datos

Conjunto de personas alrededor del mundo que representan todos los clientes, con sus características personales.Afrontamos ahora la creación de la última pestaña de nuestra aplicación, en la que va a mostrarse el listado completo de clientes que forman nuestra base de datos. Como se mostraba en las imágenes de la aplicación en el punto 1 de esta sección, esta pestaña dispondrá de un botón llamado Listado completo que, tras pulsarlo, nos mostrará todas las filas de la tabla clientes de la base de datos creada.

¡Te enfrentas a la parte más fácil!

Trabajando con fichero formularioclientes.py

Esta vez, en la clase FormularioClientes, sólo tendrás que completar el método listar(), ya que el método listado_completo() se proporciona codificado por entero:

  • No obstante, te recomendamos que analices bien el código del método listado_completo() ya que en él aprenderás cómo se construye y utiliza un objeto de clase ScrolledText, que es un cuadro de texto en el que se puede mostrar gráficamente texto de varias líneas.
  • En el método listar() (llamado al pulsar el botón), llamamos al método recuperar_todos de la clase Clientes y obtenemos de vuelta una lista con un conjunto de tuplas con cada fila de la tabla. Para insertar todo lo recuperado en el objeto ScrolledText y mostrarlo, se utiliza un blucle for que recorre la lista, imprimiendo en cada iteración un elemento de la lista. Completa el código sustituyendo [...] por los campos recuperados que deben visualizarse.

Trabajando con fichero formularioclientes.py

En el fichero clientes.py, en el que estamos codificando la clase Clientes, crea el necesario método recuperar_todos(), llamado por la ejecución del botón Listado completo, de manera que codifiques:

  1. Conecta con la base de datos.
  2. Crea un cursor que recoja el resultado de la consulta SQL.
  3. Realiza el comando SQL adecuado para recoger todos los datos de las filas de la tabla de clientes. Recuerda que debes utilizar el comando execute para que Python reconozca el SQL.
  4. Devuelve los valores encontrados usando el método fetchall de la clase Cursor para devolver todas las filas de la tabla que cumplan la condición.
  5. Cierra la conexión.

6. El superpoder infatigable: ¡Mejoras!

Finalmente, te proponemos realizar una mejora al programa planteado. ¿Te atreves?  ¡Seguro que el cliente queda muy satisfecho con tu trabajo!

Agrega dos pestañas al programa de administración de clientes:

  1. Una pestaña donde se permita borrar un cliente ingresando su DNI
  2. Y otra pestaña que ofrezca la opción de consultar y modificar los datos de un cliente.

Motus dice ¡Proyecto presentado al cliente!

¡Reto finalizado! ¿Cómo te sientes? ¿Te has dado cuenta de la cantidad de cosas que has tenido que hacer para completar las actividades?

Al realizar estas actividades has tenido que poner en juego todo lo aprendido a lo largo de este recurso. Seguro que sientes orgullo por el trabajo realizado, sobre todo al ver tu aplicación funcionando a pleno rendimiento. ¡Tu trabajo y el de tu equipo no ha pasado desapercibido para RealData Inc.!

Debes saber que aunque no hayas podido realizar el reto completo sin ayuda has alcanzado un gran nivel llegando hasta aquí, ¡las bases de datos y el proceso de desarrollo del software no son fáciles! No olvides consultar con tu profesorado y tus compañeros y compañeras de clase todas las dificultades y dudas que te surja. Y si se te ha dado genial...¡no dudes entonces en ayudar!

El desarrollo de aplicaciones es un trabajo colaborativo, no lo olvides.