Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Materia
Ingeniera en Software
Docente
Ing. Ma. Xchitl Altamirano Herrera
Equipo 2
Jair Martnez Prez Jos Luis De La Cruz Margarito Jess Alberto Antonio Prez Luis Alberto Nava Garca Francisco Mndez Cruz GRUPO: Sistemas62
INDICE
Introduccin CAPITULO I Marco conceptual 1.0 Introduccin 1.1 Antecedentes 1.2 Definicin del problema 1.3 Objetivos generales y especficos 1.4 Justificacin 1.5 Alcances y limitaciones de estudio
3 4 4 4 5 5
CAPITULO II Marco terico 2.1 Desarrollo del sistema del control de inventarios 2.2 Sistemas del control de inventarios 2.3 Java 2.4 Java orientado a objetos 2.5 Libreras 2.6 MYSQL
6 6 9 9 9 9
CAPITULO III Marco operativo 3.1 Diseo del sistema 3.1.2 Modelo de cascada 3.2 Manual de usuario 3.3 Manual tcnico 3.3.1 Objetivos del sistema 3.3.2 Caractersticas tcnicas del sistema 3.3.3 Disposicin y diseo del software 3.3.4 Diagrama de flujo pseudocdigo del sistema 3.3.5 Todas las lneas de cdigo y lenguaje comn 3.3.6 Documentos 3.3.6.1 Diagramas y esquemas que expliquen los aspectos del programa 3.3.6.2 Diagramas de casos de usos 3.3.6.3 Diagramas de casos de secuencia 3.7. Estructura de la base de datos 3.8 Formato de pantalla 3.9 Narraciones 3.10 Recuperacin de errores 3.11 Conclusiones 3.12 Anexos 3.13 bibliografa 10 11 26 37 37 37 37 38 41 51 51 51 52 53 54 55 55 56 57 61
INTRODUCCIN
Los sistemas han llegado para quedarse puesto que ellos nos han facilitado nuestras vidas. En la actualidad existen diversos tipos de software que son capaces de facilitarnos nuestras vidas, diversas empresas en el mundo son beneficiados con dichos sistemas. Pero cada vez las empresas son ms exigentes para que logren su fcil administracin y la seguridad de los datos que se manipulan dentro de la misma. La administracin siempre ha sido uno de los puntos ms relevantes en una organizacin ya que si una dependencia de gobernacin aun siguiera con los mtodos tradicionales, lo ms seguro es la perdida de informacin, entre otras datos. Tambin las empresas u organizaciones buscan seguridad, y es as como los desarrolladores cada vez ms implementan lo necesario para que el cliente quede satisfecho.
1.1 Antecedentes.
En busca de software similares en la red nos encontramos con varios semejantes a nuestra propuesta, son fciles de usar dicen sus comerciales, pero la verdad el cliente lo que busca el que sea un software capaz de controlar su empresa y a su vez teniendo ganancias monetarias.
1.4 Justificacin.
La mayora de los empresarios siguen trabajando en sus empresas con el mtodo tradicional y eso les hace perder mucho tiempo el cual genera prdidas en las ganancias. El encargado del control de autos, es decir el que se encarga de dar de alta o bajas de algn tipo de auto, es muy tedioso llevar a cabo esta actividad puesto que si en un da llega ms de 100 autos de diferentes marcas, etc. Con el sistema de control de inventarios le es ms fcil llevar a cabo esta actividad, al mismo cuando los clientes le soliciten algn modelo lo podrn mostrar de manera grfica y eso ara ms atractivo la adquisicin de un auto.
Limitaciones
Falta de tiempo para poder culminar el sistema de control de inventarios e implementacin de un punto de venta. Falta de recursos econmicos para la implementacin de un lector de cdigo de barras para el nmero de serie del auto.
2.1 DESARROLLO DEL SISTEMA DE CONTROL DE INVENTARIOS 2.2 INGENIERIA DEINVENTARIOS EN SISTEMAS DE CONTROL
El desarrollar un sistema es crear un material para el apoyo a las necesidades del cliente y que se quede satisfecho. El software que se va a desarrollar se necesita que se involucre el cliente y los desarrolladores para poder terminar el sistema. Se requiere del analista para que le explique al equipo de desarrolladores o programadores para resolver el problema del cliente. Como todo sistema o software debe de tener un ciclo de vida, y en este caso implementamos el uso del modelo de cascada.
A continuacin se muestra una imagen del proceso del desarrollo del sistema.
REQUERIMIENTOS
Todo aquello que es necesario para el buen funcionamiento del sistema de control de inventarios.
ANALISIS
Es aqu donde el gestor del proyecto debe de observar lo que realmente el cliente y cmo podemos trabajar para poder satisfacer las necesidades del cliente.
DISEO
Es el interfaz con que es usuario va a trabajar y cumplan con las especificaciones del cliente.
CODIFICACION
Es la parte ms fuerte del proyecto, es decir, que es necesario que el lder del proyecto est en constante comunicacin con los desarrolladores para que no existan dudas y fallas en el sistema a desarrollarse.
VERIFICACION
Se realiza las pruebas necesarias para que no exista ningn tipo de error.
2.3 JAVA
JAVA se cre en el ao 1991 orientado y servir como una herramienta de la programacin para un proyecto de ser-top-box en una pequea operacin denominada the Green Project en SunMicrosystem.
2.5 LIBRERIAS
Gracias a las libreras que en la red existen, nos facilita y simplifica las tareas gran parte de la programacin. Las libreras existentes simplemente se mandar a llamar cuando sean necesarios.
2.6 MYSQL
HISTORIA
SQL (Structured Query Language) Es un sistema creado para la gestin de base de datos esta fue creada por la empresa Sueca MYSQL AB, el cual cuenta con los derechos de autor(copyright) del cdigo fuente del servidor SQL, as tambin de la misma marca. El software MYSQL es de cdigo abierto, bajo la licencia de GNU, lo nico que diferencia de una versin libre, es en el soporte tcnico que se ofrece, y la posibilidad de integrar este gestor en un software propietario, ya que de otra manera se rompera la licencia GPL.
Caractersticas de MYSQL
Mayor rendimiento No importa el tamao de los registros Etc.
10
MODELO DE CASCADA
Sistema El sistema al comenzar debe mostrar un inicio en el cual se deber escribir la contrasea para poder acceder al sistema posteriormente poder trabajar el sistema para poder visualizar, actualizar, eliminar, dar de alta autos que los proveedores nos proporcionen, esto debe brindar facilidades al usuario para poder ser de manera grfica y as terminar con el proceso tradicional. As las empresas que cuenten con este software puedan llevar un control ptimo y as aprovechar las ofertas que las nuevas tecnologas ofrecen.
Requerimientos.
Analizando los requisitos que necesitara el sistema, se determinaron los tipos de requisitos: Requisitos del programa con respecto a informacin del usuario El nombre del usuario. La clave del usuario (contrasea). Conocer el manejo de una pc.
Requisitos del software con respecto al equipo en el cual se ejecutara. Pc porttil o Escritorio. Caractersticas medias. Que se cuente con paquetera JDK. Tener un gestor de base de datos MYSQL. Si se trabajara en lnea se considera caractersticas medias. El software puede ser ejecutable en dos plataformas en Windows y Linux.
11
Anlisis.
Crear una interfaz grfica de usuario (GUI) para la ejecucin del sistema. Antes de iniciar el sistema, se debe teclear usuario y contrasea. El en GUI se debe de poder configurar los parmetros: actualizar, eliminar y dar de alta algn auto. Se debe de registrar el usuario para poder manipular el sistema.
Diseo.
Figura 1. Esta imagen es el inicio del sistema (simula la carga del sistema).
Figura 2. Se muestra el menu, donde se debe teclear el nombre del usurio y contrasea.
12
13
Figura 4. Se despliega el men en donde se puede realizar altas y bajas de proveedores, tipo de autos, marcas, estados del auto, etc.
Figura 5. En esta parte del men, se puede realizar lo siguiente: bsqueda de proveedor, buscar autos y la bsqueda de autos por nmero de serie.
14
Figura 6. Es esta parte del men se puede realizar lo siguiente; realizar backup, restaurar la base de datos y la opcin de salir.
15
Cdigo
Para la creacin del Backup:
16
public RestaurarBD() { initComponents(); this.setTitle("RESTAURAR BASE DE DATOS"); this.setLocationRelativeTo(null); } private File archivo; Conexion con = new Conexion(); public void RecuperarBackup() { try { // Ejecucion del cliente mysql Process p = Runtime.getRuntime().exec("C:\\Program Files (x86)\\MySQL\\MySQL Server 5.5\\bin\\mysql --host="+con.getServidor()+" -password="+con.getPassword()+" --user="+con.getUsuario()); // Lectura de la salida de error y se muestra por pantalla. InputStream es = p.getErrorStream(); muestraSalidaDeError(es); // Lectura del fichero de backup y redireccion a la entrada estandar // de mysql. OutputStream os = p.getOutputStream(); FileInputStream fis = new FileInputStream(jTextField1.getText()); byte buffer[] = new byte[1024]; int leido = fis.read(buffer); while (leido > 0) { System.out.println(leido); os.write(buffer, 0, leido); leido = fis.read(buffer); } os.close(); fis.close(); JOptionPane.showMessageDialog(null, "La base de Datos ha sido restaurado con xito"); } catch (IOException e) { // e.printStackTrace(); System.exit(0); } }
17
Para agregar clientes: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: PROVEDORES t = new PROVEDORES(); if (nombre1.getText().equals("") || domicilio.getText().equals("") || estado.getText().equals("") || ciudad.getText().equals("") || pais.getSelectedItem().equals(0) || telefono1.getText().equals("") || correo.getText().equals("") || rfc.getText().equals("")) { JOptionPane.showMessageDialog(null, "ERROR!! Instrodusca los datos correos en los campos", "ERROR", JOptionPane.ERROR_MESSAGE); } else { t.setProvedor(nombre1.getText()); t.setDomicilio(domicilio.getText()); t.setEstado(estado.getText()); t.setCiudad(ciudad.getText()); t.setPais(pais.getSelectedItem().toString()); t.setTelefono(telefono1.getText()); t.setCorreo(correo.getText()); t.setRfc(rfc.getText()); try { t.nuevo(); JOptionPane.showMessageDialog(null, "Provedor agregado exitosamente!!","INFORMACION",JOptionPane.INFORMATION_MESSAGE); nombre1.setText(""); domicilio.setText(""); estado.setText(""); ciudad.setText(""); pais.setSelectedIndex(0); telefono1.setText(""); correo.setText(""); rfc.setText(""); } catch (ClassNotFoundException | SQLException ex) { //Logger.getLogger(provedorAgregar.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null, ex+"ERROR!! "+JOptionPane.INFORMATION_MESSAGE); } }
18
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: PROVEDORES t = new PROVEDORES(); if (nombre1.getText().equals("") || domicilio.getText().equals("") || estado.getText().equals("") || ciudad.getText().equals("") || pais.getSelectedItem().equals(0) || telefono1.getText().equals("") || correo.getText().equals("") || rfc.getText().equals("")) { JOptionPane.showMessageDialog(null, "ERROR!! Instrodusca los datos correos en los campos", "ERROR", JOptionPane.ERROR_MESSAGE); } else { t.setId_provedor(Integer.parseInt(idP.getText())); t.setProvedor(nombre1.getText()); t.setDomicilio(domicilio.getText()); t.setEstado(estado.getText()); t.setCiudad(ciudad.getText()); t.setPais(pais.getSelectedItem().toString()); t.setTelefono(telefono1.getText()); t.setCorreo(correo.getText()); t.setRfc(rfc.getText()); try { t.actualizar(); JOptionPane.showMessageDialog(null, "Provedor Actualizado exitosamente!!","INFORMACION",JOptionPane.INFORMATION_MESSAGE); nombre1.setText(""); domicilio.setText(""); estado.setText(""); ciudad.setText(""); pais.setSelectedIndex(0); telefono1.setText(""); correo.setText(""); rfc.setText(""); idP.setText(""); } catch (ClassNotFoundException | SQLException ex) { //Logger.getLogger(provedorActualizar.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null, ex+"ERROR"+JOptionPane.ERROR_MESSAGE); } } }
19
Para eliminar un proveedor private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: int res = JOptionPane.showConfirmDialog(null, "Desea salir realmente!... ?", "PREGUNTA", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (res == JOptionPane.YES_OPTION) { if (idP.getText().equals("")) { JOptionPane.showMessageDialog(null, "ERROR!! no hay provedor que eliminar", "ERROR", JOptionPane.ERROR_MESSAGE); } else { try { p.setId_provedor(Integer.parseInt(idP.getText())); nombre.setText(p.getProvedor()); p.borrar(); JOptionPane.showMessageDialog(null, "provedor Eliminado ","INFORMACION",JOptionPane.INFORMATION_MESSAGE); idP.setText(""); nombre.setText(""); } catch ( ClassNotFoundException | SQLException ex) { //Logger.getLogger(provedorEliminar.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null, ex+"ERROR"+JOptionPane.ERROR_MESSAGE); } } } else if (res == JOptionPane.NO_OPTION) { } }
20
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: TIPO_AUTOS t = new TIPO_AUTOS(); if(nombre.getText().equals("")){ JOptionPane.showMessageDialog(null, "ERROR!! Campos vacios","ERROR",JOptionPane.ERROR_MESSAGE); }else{ t.setTipo(nombre.getText()); try { t.nuevo(); JOptionPane.showMessageDialog(null, "Tipo de auto agregado exitosamente!!","INFORMACION",JOptionPane.INFORMATION_MESSAGE); nombre.setText(""); } catch ( NullPointerException| ClassNotFoundException | SQLException ex) { //Logger.getLogger(tipoAutoAgregar.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null, ex+"ERROR"+JOptionPane.ERROR_MESSAGE); } } }
21
Para actualizar el tipo de auto private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: TIPO_AUTOS t = new TIPO_AUTOS(); if(nombre.getText().equals("")){ JOptionPane.showMessageDialog(null, "ERROR!! Campos vacios","ERROR",JOptionPane.ERROR_MESSAGE); }else{ t.setId_tipoAutos(Integer.parseInt(idTA.getText())); t.setTipo(nombre.getText()); try { t.actualizar(); JOptionPane.showMessageDialog(null, "Tipo de auto actualizado exitosamente!!","INFORMACION",JOptionPane.INFORMATION_MESSAGE); nombre.setText(""); } catch ( ClassNotFoundException | SQLException ex) { //Logger.getLogger(tipoAutoActualizar.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null,ex+"ERROR"+JOptionPane.ERROR_MESSAGE); } } }
22
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: TIPO_AUTOS t = new TIPO_AUTOS(); int res = JOptionPane.showConfirmDialog(null, "Desea salir realmente!... ?", "PREGUNTA", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (res == JOptionPane.YES_OPTION) { if (idTA.getText().equals("")) { JOptionPane.showMessageDialog(null, "ERROR!! no hay provedor que eliminar", "ERROR", JOptionPane.ERROR_MESSAGE); } else { try { t.setId_tipoAutos(Integer.parseInt(idTA.getText())); nombre.setText(t.getTipo()); t.borrar(); JOptionPane.showMessageDialog(null, "tipo de auto Eliminado ","ERROR",JOptionPane.INFORMATION_MESSAGE); idTA.setText(""); nombre.setText("");
} catch (NullPointerException| ClassNotFoundException | SQLException ex) { //Logger.getLogger(provedorEliminar.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null, ex+"ERROR"+JOptionPane.ERROR_MESSAGE); }
} } else if (res == JOptionPane.NO_OPTION) { } }
23
private void provedoresActionPerformed(java.awt.event.ActionEvent evt) { try { // TODO add your handling code here: mostrar.setText(""); p.buscarProvedor(provedores.getSelectedItem().toString()); mostrar.append(" PROVEDOR: "+p.getProvedor()+"\n"+ " DOMICILIO "+p.getDomicilio()+"\n"+ " ESTADO "+p.getEstado()+"\n"+ " CIUDAD "+p.getCiudad()+"\n"+ " PAIS "+p.getPais()+"\n"+ " TELEFONO "+p.getTelefono()+"\n"+ " CORREO "+p.getCorreo()+"\n"+ " RFC "+p.getRfc());
24
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try { // TODO add your handling code here: mostrar.setText(""); t.buscarSerie(serie1.getText()); dg.buscar(t.getId_auto()); m.buscar(dg.getMarca()); ta.buscar(dg.getId_tipoAuto()); p.buscar(dg.getId_provedor()); es.buscar(t.getEstado()); mostrar.append("MARCA: "+m.getMarca()+"\n"+ "MODELO: "+dg.getNombre_modelo()+"\n"+ "TIPO DE AUTO: "+ta.getTipo()+"\n"+ "PROVEEDOR: "+p.getProvedor()+"\n"+ "NO. SERIE: "+t.getNo_serie()+"\n"+ "PRECIO DE VENTA: "+t.getPrecio_venta()+"\n"+ "FECHA DE ENTRADA: "+t.getFecha_entrada()+"\n"+ "ESTADO DEL AUTO: "+es.getEstado()+"\n"+ "DEFECTOS: \n\n"+t.getDefectos()+"\n\n"+ "ESPECIFICACIONES: \n\n"+dg.getEspecificacion()); } catch (NullPointerException | ClassNotFoundException | SQLException ex) { // Logger.getLogger(BuscarAutoPor_serie.class.getName()).log(Level.SEVERE, null, ex); } }
Verificacin
Se aplic verificacin de caja blanca con algunos de nuestros compaeros de clases, el cual obtuvimos buenos resultados, tal como lo es que nuestra interfaz es muy amigable.
25
Nombre de Usuario
Contrasea
26
3.- En la primera lista despegable llamada archivo se encuentran botones para realizar el respaldo y restaurar la informacin de la base de datos.
1.- Realizar backup. Sirve para hacer respaldos de la informacin cada vez que se desee.
2.- Restaurar BD. Sirve para restaurar la informacin que requiera por si ha sido
27
2 3
4
5 6
1.- Proveedores.- Muestra informacin acerca de este, as como mismo agregar y eliminar proveedores.
A B C D
28
B.- Actualizar Proveedores.- Actualiza la informacin deseada. (Tiene que seleccionarlo primero).
C.- Eliminar Proveedor.- Elimina al proveedor que desee. (Tiene que seleccionarlo primero). D.- Salir.- Regresa a la venta anterior
29
2.- Tipos Autos.- Muestra el tipo de auto existente, as mismo como agregar y/o eliminar
B C D
B.- Actualizar Tipo.- Actualiza un tipo de auto existente. (Tiene que seleccionarlo primero).
C.- Eliminar Tipo.- Elimina al proveedor que desee. (Tiene que seleccionarlo primero). D.- Salir.- Regresa a la venta anterior
30
3.- Marcas.- Posee informacin de las puras marcas existentes, al igual que las anteriores se pueden agregar, actualizar y/o eliminar informacin.
B.- Actualizar Tipo.- Actualiza un tipo de auto existente. (Tiene que seleccionarlo primero). C.- Eliminar Proveedor.- Elimina al proveedor que desee. (Tiene que seleccionarlo primero). D.- Salir.- Regresa a la venta anterior
31
4.- Estado Auto.- Muestra informacin del estado del auto, as como actualizarla, eliminarla o agregar un estado.
A B C D
B.- Actualizar Tipo.- Actualiza un tipo de auto existente. (Tiene que seleccionarlo primero).
C.- Eliminar Proveedor.- Elimina al proveedor que desee. (Tiene que seleccionarlo primero). D.- Salir.- Regresa a la venta anterior
32
5.- Registrar Autos.- Muestra solamente la marca y modelo de los autos existentes, as mismo se podr agregar, actualizar y eliminar datos.
.
A B C D
B.- Actualizar auto.- Actualiza un tipo de auto existente. (Tiene que seleccionarlo primero).
C.- Eliminar auto.- Elimina al proveedor que desee. (Tiene que seleccionarlo primero).
33
6.- Registro Auto.- Muestra la informacin ms completa de los autos existentes, as como tambin se podr agregar actualizar y/o eliminar informacin del auto deseado.
B.- Actualizar auto.- Actualiza un tipo de auto existente. (Tiene que seleccionarlo primero).
C.- Eliminar auto.- Elimina al proveedor que desee. (Tiene que seleccionarlo primero).
34
5.- Bsquedas.- Hace la bsqueda de la informacin de los proveedores como la de los autos existentes segn sus necesidades o como mejor guste.
2
3
1.- Bsqueda por proveedor. Muestra informacin de los proveedores que la empresa tiene en ese momento.
35
2.- Buscar Autos. Busca informacin de los autos existentes al seleccionarlos de la lista.
3.- Buscar auto por No_serie. Busca el auto proporcionndole un nmero de serie y si este existe arrojara la informacin, sino existe manda un mensaje que no existe
36
37
DIAGRAMA CONCEPTUAL
38
Y registro de auto individualmente o Actualizar o Eliminar o Dar de alta En el men bsqueda: o Podemos buscar la informacin de los proveedores. Se busca los proveedores por su nombre. o Autos. Se busca por su marca y modelo.
39
o Y autos por su nmero de series. Solo se introduce el nmero de serie. Si no desea hacer nada tiene el botn salir. o Le aparece un mensaje de confirmacin.
40
41
42
43
44
45
46
47
48
49
50
3.3.6 DOCUMENTOS
3.3.6.1 Diagramas y esquemas que expliquen los aspectos del programa
3.3.6.2 Diagramas de caso de usos.
51
52
53
Normas y procedimientos del programa: El programa funciona siempre y cuando tenga valores o informacin en la base de datos, y para crear a un usuario nuevo tiene que crearlo desde consola en MYSQL. Notas de apoyo: El programa de tal forma que existe una clase que realiza la conexin. Para conectarse con las dems sucursales requiere configurar las IP. Adems el programa est diseado para integrarle ms IP.
54
3.9 Narraciones
Prueba aplicada a los programas y al sistema con los resultados obtenidos:
Se le aplicaron pruebas en donde se mostraba la ventana directamente. Pero se solucion con un filtro de seguridad en la cual se le pone una contrasea y un usuario. Adems en la bsqueda de informacin lo muestra de manera clara y concisa ya que solo se muestra la informacin requerida por el usuario.
Incluir y mantener actualizadas una hoja de aprobaciones y cambios del sistema: Se aprob darle una interfaz ms agradable con colores claros ya que lo tenamos en colores muy fuertes. Se adapt una opcin para que el programa funcione en red. Que el programa trabaje como servidor y usuario, es decir de forma local.
55
3.11 Conclusin
En conclusin lo resultante al trabajar en un software administrativo es que los programas de hoy da pueden facilitar de manera significativa hablando de la cantidad y el tiempo de los procesos que se efectan diariamente dentro de una empresa, el software es una herramienta que facilita, optimiza y reduce errores que un trabajador sin esta ayuda no podra hacerlo de manera eficaz o tal vez ocasionara errores involuntarios. Nuestra experiencia al trabajar con este proyecto nos ha dado una vista an ms clara del tipo de software que se utiliza en el mundo laboral, dejndonos con una idea ms clara.
56
3.12 Anexos Anexo 1. Diagrama de caso de usos del proceso de instalacin del sistema de control de inventarios.
57
Anexo 2. Diagrama de caso de usos para el uso del sistema de control de inventarios.
58
59
60
3.13 Bibliografa
Historia de JAVA
http://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)
Historia de MYSQL
http://barbaraaaa.obolog.com/historia-mysql-870383
61