12
« en: 11 de Junio 2018, 05:18 »
Holaa! Me ha surgido una gran duda, ya implemente el método de modificación, lo habia estado revisando y estaba bien. Pero quería mover ese método a otra clase, pero al momento de ejecutarse no modifica, tendría que agregarle algo a todos los metodos si los quisera mover a otra clase?
Gracias.
Esta es la clase Métodos, a esta recientemente le habia agregado la modificacion
import javax.swing.JOptionPane;
import java.io.*;
import java.util.ArrayList;
public class Metodos {
private File archivo = new File("archiyect.txt");
private ArrayList<Medicamentos> medicamentos = new ArrayList<>();
public Metodos()
{
/*
* El constructor de Metodos lo que hará es comprobar si ya existe un
* archivo con datos de Medicamentos ya creado.
* Si existe, recuperará estos datos, creará objetos Medicamentos y los
* pasará al ArrayList desde donde podremos trabajar con ellos.
* Si no existe, no hará nada, tendremos un ArrayList vacio listo para
* que podamos hacer las primeras altas.
*/
if (archivo.exists())
{
try {
BufferedReader leer = new BufferedReader(new FileReader(archivo));
String linea = leer.readLine();
while(linea != null)
{
/*
* Separamos los atributos del Medicamento de la linea que hemos leido
* En la linea los atributos estan separados por un doble guion "--"
* La linea contendrá los 8 atributos correspondientes a un Medicamento.
* Sin embargo, los 4 últimos es posible que no tengan datos validos, si no que
* puede que contengan valores null y 0, ya que los únicos atributos que son
* de obligatoria cumplimentación son los primeros 4.
*/
String[] atributos = linea.split("--");
//Los 4 atributos obligatorios
String clave = atributos[0];
String nombre = atributos[1];
int precio = Integer.parseInt(atributos[2]);
int existencia = Integer.parseInt(atributos[3]);
/*
* Ahora recogemos los 4 atributos opcionales.
* Los de tipo String, si no fueron cumplimentados,
* tendrían valor null y en el archivo de texto se
* habrá escrito la palabra "null". Sin embargo,
* al leer del archivo estamos recibiendo un String
* con el texto "null". No podemos pasar este texto
* directamente al atributo, sino que en este caso
* debemos pasar el valor null, que no es lo mismo
* que un string con el texto "null". Son cosas distintas.
*/
String nombreGenerico;
if (atributos[4].equals("null"))//Este atributo tenía valor null cuando se guardo en el archivo
nombreGenerico = null;
else
nombreGenerico = atributos[4];
int caducidad = Integer.parseInt(atributos[5]);
String formaFarmaceutica;
if (atributos[6].equals("null"))
formaFarmaceutica = null;
else
formaFarmaceutica = atributos[6];
int concentracion = Integer.parseInt(atributos[7]);
/*
* Ya tenemos los 8 atributos.
* Podemos añadir al ArrayList un nuevo Medicamento.
*/
medicamentos.add(new Medicamentos(clave, nombre, precio, existencia, nombreGenerico,
caducidad, formaFarmaceutica, concentracion));
//Medicamento añadido, leemos una nueva linea y si contiene datos, se repetirá este proceso
linea = leer.readLine();
}
leer.close();
//Lectura concluida.
//Podemos informar por pantalla cuantos Medicamentos hemos recuperado del archivo
JOptionPane.showMessageDialog(null, "Cantidad de Medicamentos recuperados: " + medicamentos.size(),
"Datos Leidos", JOptionPane.INFORMATION_MESSAGE);
} catch (Exception ex)
{
JOptionPane.showMessageDialog(null, "No se pudo leer datos del archivo: " + archivo.getAbsolutePath(),
"Error de Lectura", JOptionPane.WARNING_MESSAGE);
}
}
}
public void altas() throws FileNotFoundException,IOException
{
/*
* Los Medicamentos tienen 8 atributos, pero para su creacion solo
* son obligatorios propocionar 4. En este ejemplo solo pediremos
* los 4 atributos obligatorios.
*/
String clave = JOptionPane.showInputDialog("Dame la clave del producto");
String nombre = JOptionPane.showInputDialog("Escribe el nombre del producto");
int precio = Integer.parseInt(JOptionPane.showInputDialog("Escribe el precio del producto"));
int existencia = Integer.parseInt(JOptionPane.showInputDialog("Cuántos productos hay en existencia"));
/*
* Tenemos los 4 atributos.
* Crearemos un Medicamento y lo añadiremos al ArrayList.
* Luego, lo añadiremos al archivo de texto en disco.
*/
Medicamentos nuevoMed = new Medicamentos(clave, nombre, precio, existencia);
medicamentos.add(nuevoMed);
try{
BufferedWriter escribir = new BufferedWriter(new FileWriter(archivo, true));
escribir.write(nuevoMed.toString());
escribir.newLine();
escribir.close();
}catch(IOException e){
JOptionPane.showMessageDialog(null, "No se pudo escribir datos en archivo: " + archivo.getAbsolutePath(),
"Error de Escritura", JOptionPane.WARNING_MESSAGE);
}
}
/**
* Este metodo contruye un String con todos los datos de un
* Medicamento para ser mostrado en pantalla.
* Es útil porque puede ser utilizado para las funciones
* de listado, búsqueda por clave, busqueda por nombre..
* @param m Objeto Medicamentos que queremos mostrar.
* @return Cadena String con todos los datos
*/
private String mensajeMedicamento(Medicamentos m)
{
return "Clave: " + m.getClave()
+ "\nNombre: " + m.getNombre()
+ "\nPrecio: " + m.getPrecio()
+ "\nExistencias: " + m.getExistencia()
+ "\nNombre Generico: " + m.getNombregenerico()
+ "\nCaducidad: " + m.getCaducidad()
+ "\nForma Farmaceutica: " + m.getFormafarmaceutica()
+ "\nConcentracion: " + m.getConcentracion();
}
public void listado()
{
/*
* Recorremos el ArrayList y por cada Medicamento existente
* construimos un mensaje con los datos y lo mostramos en un
* Dialogo de Confirmacion.
* El usuario tiene la oportunidad de finalizar el listado pulsando
* el boton NO de este dialogo.
* Antes de nada, por supuesto, hemos de comprobar si existen medicamentos
* ya registrados
*/
if (medicamentos.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
else
{
for (int i = 0; i < medicamentos.size(); i++)
{
/*
* Para mostrar el medicamento usamos el String que nos devuelve el metodo
* mensajeMedicamento() y además le añadimos otra linea indicando al usuario
* que puede detener el listado pulsando el boton NO de la ventana de dialogo.
* Esta ventana, en su título superior, además mostrará el número de posicion
* que ocupa este Medicamento en el ArrayList y el total que hay.
* Un mensaje tipo ---> Medicamento nº 4/30
* Así el usuario tendrá una idea de cuantos Medicamentos quedan por listar.
*/
String mensaje = mensajeMedicamento(medicamentos.get(i)) + "\n\n¿Desea seguir visualizando el listado?";
int seguir = JOptionPane.showConfirmDialog(null, mensaje, "Medicamento nº " + (i+1) + "/" + medicamentos.size(), JOptionPane.YES_NO_OPTION);
if (seguir == JOptionPane.NO_OPTION)//Usuario NO quiere seguir con el listado, "rompemos" el bucle
break;
}
}
}
//CONSULTA POR CLAVE
public void consultasc()
{
if (medicamentos.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
else
{
String clave = JOptionPane.showInputDialog("Introduzca clave del medicamento a buscar:");
/*
* Recorremos el ArrayList mediante un bucle FOR EACH para buscar el Medicamento con
* la clave que nos han indicado.
* Si lo encontramos, mostramos sus datos y detenemos el bucle de búsqueda.
* Si no lo encontramos, habría que informar al usuario de que no existe dicha clave.
* Para controlar si hemos encontrado o no el Medicamento, podemos usar una variable
* booleana. Esta variable comenzará con valor false.
* Si lo encontramos, la pondremos a true.
* Al terminar el bucle de busqueda, si esta variable conserva el valor false inicial,
* sabremos que el Medicamento no fue encontrado e informaremos al usuario.
*/
boolean encontrado = false;
for (Medicamentos m:medicamentos)
{
if (m.getClave().equalsIgnoreCase(clave))
{
encontrado = true;//¡¡Lo hemos encontrado!!
JOptionPane.showMessageDialog(null, mensajeMedicamento(m), "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
}
}
//Bucle de busqueda terminado, hemos de comprobar si fue encontrado el medicamento o no
if (!encontrado)
JOptionPane.showMessageDialog(null, "No se encontro medicamento con clave: " + clave, "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
}
}
//CONSULTA POR NOMBRE
public void consultasn()
{
//consultas por nombre
if (medicamentos.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
else
{
String nombre = JOptionPane.showInputDialog("Introduzca nombre del medicamento a buscar:");
/*
* Recorremos el ArrayList mediante un bucle FOR EACH para buscar el Medicamento con
* el nombre que nos han indicado.
* Si lo encontramos, mostramos sus datos y detenemos el bucle de búsqueda.
* Si no lo encontramos, habría que informar al usuario de que no existe dicho nombre.
* Para controlar si hemos encontrado o no el Medicamento, podemos usar una variable
* booleana. Esta variable comenzará con valor false.
* Si lo encontramos, la pondremos a true.
* Al terminar el bucle de busqueda, si esta variable conserva el valor false inicial,
* sabremos que el Medicamento no fue encontrado e informaremos al usuario.
*/
boolean encontrado = false;
for (Medicamentos m:medicamentos)
{
if (m.getNombre().equalsIgnoreCase(nombre))
{
encontrado = true;//¡¡Lo hemos encontrado!!
JOptionPane.showMessageDialog(null, mensajeMedicamento(m), "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
}
}
//Bucle de busqueda terminado, hemos de comprobar si fue encontrado el medicamento o no
if (!encontrado)
JOptionPane.showMessageDialog(null, "No se encontro medicamento con ese nombre: " + nombre, "Mostrando medicamento", JOptionPane.INFORMATION_MESSAGE);
}
}
public void bajas()throws FileNotFoundException,IOException
{
/*
* El metodo para hacer bajas es muy parecido al metodo de consulta por clave.
* Solo que esta vez al encontrar el medicamento, este ha de ser eliminado del
* ArrayList y también del fichero de texto donde guardamos los datos.
* Borrar del ArrayList se hace con una sencilla instruccion.
* Borrar la linea de datos del archivo de texto, es un poco más laborioso.
* Para facilitar la tarea, lo ideal es eliminar el archivo por completo
* y volver a crearlo de nuevo con todos los Medicamentos contenidos en el
* ArrayList, donde ya no estará el Medicamento que hemos dado de baja.
*/
if (medicamentos.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
else
{
String clave = JOptionPane.showInputDialog("Introduzca clave de Medicamento a eliminar:");
boolean encontrado = false;//Para controlar si lo hemos encontrado
boolean borrado = false;//Para controla si el usuario ha decidido eliminarlo
for (int i = 0; i < medicamentos.size(); i++)
{
if (medicamentos.get(i).getClave().equalsIgnoreCase(clave))
{
encontrado = true;
String mensaje = mensajeMedicamento(medicamentos.get(i)) + "\n\n¿Desea dar de baja?";
int confirmar = JOptionPane.showConfirmDialog(null, mensaje, "Confirmar Baja", JOptionPane.YES_NO_OPTION);
if (confirmar == JOptionPane.YES_OPTION)//SI quiere dar de baja
{
//Eliminamos del ArrayList
medicamentos.remove(i);
borrado = true;
}
}
}
/*
* Bucle de busqueda terminado ahora comprobamos si el Medicamento fue encontrado o no.
* Si no fue encontrado, informamos al usuario con un mensaje
* Si fue encontrado y eliminado guardaremos los datos actualizados en el archivo de texto.
* Para crear este archivo habrá que recorrer de nuevo el ArrayList y añadir una linea de texto
* por cada Medicamento que contenga.
*/
if (encontrado && borrado)
{
try {
//Intentamos borrar archivo actual
if (archivo.delete())
{
//Archivo borrado, creamos uno nuevo actualizado
BufferedWriter escribir = new BufferedWriter(new FileWriter(archivo, true));
for (Medicamentos m:medicamentos)
{
escribir.write(m.toString());
escribir.newLine();
}
escribir.close();
JOptionPane.showMessageDialog(null, "Medicamento eliminado.\nLos cambios se han guardado", "Baja de Medicamento",
JOptionPane.INFORMATION_MESSAGE);
}
else//Por algun motivo, no se pudo borrar archivo
{
JOptionPane.showMessageDialog(null, "Error de acceso a archivo.\nLos cambios no han sido guardados", "Baja de Medicamento",
JOptionPane.WARNING_MESSAGE);
}
} catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Error de acceso a archivo\nTipo de error: " + ex.getLocalizedMessage());
}
}
else if(!encontrado)//No fue encontrado
{
JOptionPane.showMessageDialog(null, "NO se encontro Medicamento con la clave: " + clave, "Baja de Medicamentos",
JOptionPane.INFORMATION_MESSAGE);
}
}
}
/* public void modificacion()throws FileNotFoundException,IOException
{
if (medicamentos.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Medicamentos registrados");
else
{
String clave = JOptionPane.showInputDialog("Introduzca la clave del Medicamento para modificar:");
boolean encontrado = false;//Para controlar si lo hemos encontrado
boolean borrado = false;//Para controla si el usuario ha decidido eliminarlo
for (int i = 0; i < medicamentos.size(); i++)
{
if (medicamentos.get(i).getClave().equalsIgnoreCase(clave))
{
encontrado = true;
String mensaje = mensajeMedicamento(medicamentos.get(i)) + "\n\n¿Desea modificar este medicamento?";
int confirmar = JOptionPane.showConfirmDialog(null, mensaje, "Confirmar Baja", JOptionPane.YES_NO_OPTION);
if (confirmar == JOptionPane.YES_OPTION)//SI quiere modificar
{
medicamentos.remove(i);
borrado = true;
String claved = JOptionPane.showInputDialog("cual es la nueva clave del producto");
String nombre = JOptionPane.showInputDialog("cual es el nuevo nombre del producto");
int precio = Integer.parseInt(JOptionPane.showInputDialog("cual es el nuevo precio del producto"));
int existencia = Integer.parseInt(JOptionPane.showInputDialog("Cuántos productos hay en existencia"));
Medicamentos nuevoMed = new Medicamentos(claved,nombre, precio, existencia);
medicamentos.add(nuevoMed);
borrado = true;
}//
else{
JOptionPane.showMessageDialog(null, "NO se encontro Medicamento con la clave: " + clave, "Baja de Medicamentos",
JOptionPane.INFORMATION_MESSAGE);
}
}
}
}
}*/
}
El método de modificacion lo puse en comentario porque la quiero mover a otra clase