Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sistema de Inventario 2 (Tesis)
Sistema de Inventario 2 (Tesis)
IE0502ProyectoElctrico
Sistemacomputarizadoparaelmanejode inventariodebodega.
Por: FranciscoJosZumbadoAlvarez
CiudadUniversitariaRodrigoFacio Diciembredel2008
Sistemacomputarizadoparaelmanejode inventariodebodega.
Por: FranciscoJosZumbadoAlvarez
AprobadoporelTribunal:
DEDICATORIA
ADiosportodoloquemedaenlavida.Amifamiliayamigosportodoelapoyoy porserunaparteimportanteenmivida.
RECONOCIMIENTOS
Alosprofesoresquemeayudaronenlarealizacindelproyecto, ascomoademspersonasquehicieronestoposible.
INDICEGENERAL
NDICEDEFIGURAS..................................................................................................................vii NDICEDECUADROS................................................................................................................viii NOMENCLATURA.......................................................................................................................ix RESUMEN......................................................................................................................................x CAPTULO1:Introduccin.........................................................................................................1 1.1Justificacin...................................................................................................................1 1.2Objetivogeneral............................................................................................................2 1.3Objetivosespecficos.....................................................................................................2 1.4Metodologa...................................................................................................................2 CAPTULO2:DesarrolloTerico................................................................................................4 2.1BasesdeDatos...............................................................................................................4 2.1.1Objetivodeunabasededatos.......................................................................4 2.1.2Tiposdebasesdedatos..................................................................................5 2.1.3Abstraccindedatos.....................................................................................6 2.2ModelosdeDatos..........................................................................................................7 2.2.1Modeloslgicosbasadosenobjetos..............................................................7 2.2.2Modeloslgicosbasadosenregistros...........................................................8 2.2.3Modelosfsicos...............................................................................................9 2.3SistemasGestoresdebasesdedatos...........................................................................9 2.4Lenguajesdedefinicindedatos(DDL).....................................................................10 2.5Lenguajesdemanipulacindedatos(DML).............................................................10 2.6Administradordebasededatos..................................................................................10 2.7Usuariosdebasededatos............................................................................................11 2.8LenguajerelacionalSQL.............................................................................................11 2.8.1Estructurabsica..........................................................................................12 2.8.2Tuplasduplicadas..........................................................................................13 2.8.3Operacionesdeconjuntos.............................................................................13 2.8.4Operadoresagregados...................................................................................13 2.8.5HAVING..........................................................................................................14 2.8.6Subconsultas...................................................................................................14 2.8.7Definicindedatos.........................................................................................14 2.8.8Tiposdedatos.................................................................................................14 2.8.9ndices.............................................................................................................15 2.8.10Vistas.............................................................................................................15 2.8.11Eliminacindetablas,ndicesyvistas.......................................................16 2.8.12Manipulacindedatos................................................................................16 2.8.13Normalizacindebasesdedatos................................................................17 2.9EllenguajedeprogramacinRuby.............................................................................19 2.9.1Filosofadellenguaje.....................................................................................20 2.9.2Semntica.......................................................................................................20 2.9.3Sintaxis...........................................................................................................20 2.9.4Metaprogramacin........................................................................................21
2.10ModeloVistaControlador.........................................................................................21 2.10.1Descripcindelpatrn................................................................................22 2.11RubyonRails...............................................................................................................22 2.11.1 PrincipiosFundamentales..........................................................................23 2.11.2ElModeloVistaControladordeRubyonRails.........................................23 2.11.3Soportedebasesdedatos.............................................................................24 CAPTULO3:Estructurageneraldelsistemadeinventariodebodega..................................26 3.1Estructuradelaaplicacinyaspectosgenerales........................................................26 3.2Basededatos..................................................................................................................26 3.3Modelo............................................................................................................................27 3.4Controlador....................................................................................................................27 3.5 Vista................................................................................................................................ 28 3.6Archivosdeconfiguracin............................................................................................29 3.7Otrascarpetas...............................................................................................................30 3.8Pluginsutilizados..........................................................................................................31 CAPTULO4:Diseodelabasededatos..................................................................................33 4.1Basededatosparaactivosdebodega.........................................................................33 4.2Basededatosparamanejodeusuarios......................................................................35 CAPTULO5:Modelo..................................................................................................................40 5.1Modelosdelsistemadeactivos.....................................................................................40 5.2Modelosdelsistemadeautenticacindeusuarios....................................................42 CAPTULO6:Controladores......................................................................................................44 6.1Controladoresdesistemadeactivos...........................................................................44 6.2Controladoresdesistemadeautenticacindeusuarios...........................................49 CAPTULO7:Vistas....................................................................................................................55 7.1Vistasdelsistemademanejodeactivos.....................................................................55 7.2Vistasdelsistemadeautenticacindeusuarios........................................................61 7.3Plantillagenricaparavistas.....................................................................................67 CAPTULO8:Traducciones.......................................................................................................71 CAPTULO9:Pruebas................................................................................................................74 9.1Pruebasdevalidacin.................................................................................................74 9.2Bsquedas....................................................................................................................76 CAPTULO10:Conclusionesyrecomendaciones.....................................................................78 10.1Conclusiones................................................................................................................78 10.2Recomendaciones........................................................................................................79 BIBLIOGRAFA............................................................................................................................80
INDICEDEFIGURAS
Figura1.Interrelacinentrenivelesdeabstraccindedatos.....................................................7 Figura2.DiagramaERparaelsistemademanejodeactivos..................................................35 Figura3.Vistaparacreacindeactivo.........................................................................................57 Figura4.Vistaparaedicindeactivo...........................................................................................59 Figura5.Vistadelistadodeactivos...............................................................................................61 Figura6.Vistadelistadodeusuarios............................................................................................63 Figura7.Vistadeedicindecontrasea.......................................................................................64 Figura8.Vistadelistadoderolesasignados................................................................................65 Figura9.Vistadelistadoderolesnoasignados............................................................................ 66 Figura10.Vistafinaldelsistemaparaunusuarioconectado.....................................................69 Figura11.Vistafinaldelsistemaparaunusuariodesconectado................................................ 70 Figura12.Pruebadevalidacindeplacaexistente......................................................................74 Figura13.Pruebadevalidacindenmerodeserieenblanco..................................................75 Figura14.Pruebadevalidacindeplacaenblanco....................................................................75 Figura15.Pruebadevalidacindeplacanonumeral.................................................................76 Figura16.Pruebadebsquedadeactivopornmerodeserie. .................................................76 Figura17.Pruebadebsquedadeactivoporplaca....................................................................77
INDICEDECUADROS
Cuadro1.Activosenniveldenormalizacin0.............................................................................33 Cuadro2.Activosenniveldenormalizacin1.............................................................................33 Cuadro3.Activosenniveldenormalizacin2.............................................................................34 Cuadro4.Estadosenniveldenormalizacin2............................................................................34 Cuadro5.Marcasenniveldenormalizacin2.............................................................................34 Cuadro6.Modelosenniveldenormalizacin3...........................................................................34 Cuadro7.Marcasenniveldenormalizacin3.............................................................................35 Cuadro8.Tabladeroles.................................................................................................................37 Cuadro9.Tabladepermisos..........................................................................................................37
NOMENCLATURA
ROR:RubyonRails. CSS:CascadingStyleSheet.Hojasdeestiloencascada,formatoutilizadoparadescribirelformato depginasescritasenHTMLoXML. XML: ExtensibleMarkupLanguage.Metalenguajeextensibledeetiquetasutilizadoendesarrollo web. HTML: Hyper TextMarkupLanguage. Lenguaje demarcado predominante enel desarrollo de pginaserb. RTML: Real Time Markup Language. Lenguaje propietario de Yahoo utilizado para describir pginaswebparalaaplicaciopnYahoo!StoreEditor. JavaScript:Lenguajedeprogramacininterpretadoutilizadoprincipalmenteenpginasweb. Framework:Estructura de soporte que permite desarrollar proyectos de software utilizando una metodologadedesarrolloespecfica.
RESUMEN
Este proyecto tiene como objetivo desarrollar una aplicacin que permita almacenar y manejarlainformacindelosequiposexistentesenelinventariodelabodegadelaescuelade IngenieraElctricadelaUniversidaddeCostaRica. SeutilizelgestordebasededatosPostgreSQLdebidoasubuenareputacinyestabilidad enelmanejodelasbasesdedatos. Paradesarrollarlaaplicacinwebseutilizellenguaje Ruby medianteun framework de desarrollodenominadoRubyonRails. La estructura dela aplicacin comode cualquier aplicacin de RubyonRails,sigue el paradigmaModelovistacontrolador.Estepermitesepararlaaplicacinenunmodeloquerealizala comunicacinconlabasededatos,unavistaquemanejalapartevisibleparaelusuario,esdecirlas pginas web propiamente y un controlador encargado de interpretar y ejecutar las acciones realizadasporelusuarioypermiteenlazarelmodeloylasvistasdelaaplicacin. Laaplicacinsedividienunabasededatosparamanejodelosactivosdebodega,enla cualsealmacenanlosdiferentesactivosclasificadospormarca,modelo,estadoyconsurespectivo nmerodeplacayserial,yunabasededatosparaelalmacenamientodelainformacindelos usuariosylassesionesdeestos. De esta manera se aadi a la aplicacin un sistema de autenticacin de usuarios con diferentespermisosparaestos,segnseanusuariosnormalesquenicamentepuedanconsultarla informacinousuariosadministradoresquepuedenmodificarlainformacin. Finalmentelaaplicacindesarrolladacumpleconlosobjetivosplanteadosysedetermin queesadecuadaparacumplirlafuncindeseadadealmacenarlainformacindeelinventariodela bodegadelaescuelaalmismotiempoquepermitealosusuariosconsultarymodificarinformacin demaneraremotaatravsdeInternet.
CAPTULO1:Introduccin.
1.1Justificacin. Enlaactualidadvivimosenunmundoenelcuallaeficienciaesunfactordeterminanteen todosloscampos,ylabsquedadeestahallevadoaldesarrollotecnolgicoconequiposqueson capaces de realizar tareas que antes deban realizarse completamente por personas, lo cual conllevabaamuchoserroreshumanosyqueademsrequerandemuchotiempoparallevarsea cabo. Eldesarrollodelacomputacinhapermitidoampliardegranformalasfuncionalidadesque selepuedendaralosavancestecnolgicos,yaquehapermitidounprocesamientorpidoyeficaz delainformacin.Eldesarrollodebasesdedatosparallevarregistrosinformticosesunadelas cosasquemshacontribuidoenelmanejodelainformacin,loquelashallevadoaexpandirsey popularizarseenmuchoscampos,convirtindolasenunaherramientaindispensablealahorade competir. Elalmacenamientodelainformacinhasidounaspectomuyimportante,sinembargoeste almacenamientonoservirademuchosinosetuvieraunadecuadoaccesoalainformacin.Las redesdecomputadorashansidofundamentalesenesteaspecto,permitiendoausuariosaccedera informacinenotroladodelmundodesdeunacomputadora,atravsdelaInternetoderedes privadasdeinformacin. Esteproyectopretendeutilizarestasherramientasquenospresentalatecnologaactualpara crearunsistemadealmacenamientocomputarizadoparaelinventariodelabodegadelaEscuelade IngenieraElctricadelaUniversidaddeCostaRica,medianteunabasededatosmanejadapor mediodeunainterfaz web,quepermitaalosfuncionariosdelabodegallevarunregistroms adecuadodelosequiposymaterialespresentesenlabodegayquealavezpermitaalosestudiantes y profesores acceder a este inventario de forma remota para comprobar la existencia y 1
disponibilidaddemateriales. 1.2Objetivogeneral.
Crear un sistema computarizado de base de datos que permita almacenar, consultar y modificarelinventariodelabodegadelaEscueladeIngenieraElctricadelaUniversidad deCostaRica,permitiendoalusuariounmanejosimplemedianteunainterfazweb.
1.3Objetivosespecficos.
Diseareimplementarunabasededatosquepermitadescribirdemaneraptimalosactivos delabodegadelaEscueladeIngenieraElctricadelaUniversidaddeCostaRica.
1.4Metodologa.
Seinvestigasobrebasesdedatosdelicencialibreylosdiferentesgestoresparadeterminarel gestorquemsseadecaalasnecesidadesyrequerimientosdelproyecto.
Seinvestigasobrelateoradebasesdedatosparautilizarlaeneldiseodelabasededatosa construir.
Serealizaunaentrevistaconelencargadodelabodegapararecolectarinformacinsobrelos diferentesaspectosquedebeconsiderarlabasededatosparaelinventario.
SerealizaunaentrevistaconelprofesortutorJoseFreddyRojasparaobtenerunaguaenel diseodelabasededatos.
tcnicasdediseoadecuadas.
Seinvestigasobreloslenguajesmsadecuadosquepermitancrearunainterfazwebparala basededatosdiseada,paraescogerellenguajemsconveniente.
Se investiga sobre el lenguaje escogido y sus diferentes herramientas que permitan el desarrollodelproyecto.
Sedesarrollaunainterfazwebparalabasededatos,quepermitaalusuariointeractuarcon estademanera.
Serealizanpruebasalaaplicacinparadetectarycorregirfallasenelsistemaygarantizarel buenfuncionamiento.
Alolargodetodoelproyectosedesarrollaladocumentacinescritadeeste.
CAPTULO2:DesarrolloTerico.
2.1BasesdeDatos[1][2]. Lasbasesdedatosobancosdedatossonconjuntosdedatosqueformanpartedeunmismo contextoysonalmacenadosdeunaformaordenadaparasuutilizacinposterior. Una biblioteca es un ejemplo de base de datos, donde la mayora de los datos son documentosimpresosytextos. El desarrollo tecnolgico y en especial de la computacin ha contribuido a desarrollar nuevasymseficientesformasdealmacenarbasesdedatos. Lossistemasdebasesdedatosestndiseadosparapoderalmacenargrandescantidadesde datos,loqueimplicalacreacindeestructurasadecuadasparaalmacenarlainformacinascomo ascomodemecanismosparalagestindeesta. Otropuntoimportanteenlasbasesdedatosesquedebenserlossuficientementeseguras para garantizar el almacenamientoconfiable de datos yno permitir manipulacin porparte de personasnoautorizadas. 2.1.1Objetivodeunabasededatos. Los sistemas de bases de datos son creados para evitar diversos problemas en el almacenamientodedatoscomolossiguientes:
manualobiencrearunaaplicacinnuevaquehagaestetrabajo.
Anomalasdelaccesoconcurrente:Ensistemasdealmacenamientodedatosquepermiten a varios usuarios acceder y actualizar la informacin al mismo tiempo, pueden ocurrir anomalasalahoradehacerestaactualizacindelosdatos,porejemplosisemodificaun datoalmismotiempopor2usuarios,elresultadofinalpuedeserincorrecto.
ProblemasdeSeguridad:Elaccesoalainformacindebeserrestringidoaciertosusuarios de manera que otros no autorizados sean bloqueados y se de un acceso seguro a la informacin.
ProblemasdeIntegridad:Elsistemadealmacenamientodedatosdebesercapazdeevitar que algunos datos obtengan ciertos valores que se consideraran errneos, para de esta maneralograrmantenerlaintegridaddelosdatos. Todosestosproblemashanllevadoalacreacindesistemasgestoresdebasesdedatospara
evitar que se presenten dichos problemas, y as lograr un almacenamiento de los datos ms eficiente. 2.1.2Tiposdebasesdedatos. Lasbasesdedatossepuedenclasificardediferentesformas: Segnlavariabilidaddelosdatos:
Dinmicas:Enestasbasesdedatoslainformacinalmacenadaesmodificadaatravsdel tiempo,demaneraqueseleagregannuevosdatosyotrossonactualizados,ademspor 5
supuestodeoperacionesdeconsulta. Segnsucontenido:
De texto completo: Almacenan fuentes primarias en su totalidad por ejemplo todo contenidodediferentesedicionesdelibrosyrevistas.
2.1.3Abstraccindedatos. Laabstraccindedatossepresentaen3nivelesdistintos:
Nivelfsico:Esteniveleselmsbajoydescribelaformaenquelosdatossonalmacenados fsicamente.
Lasiguientefiguranosmuestralainterrelacinentreestosnivelesdeabstraccin:
Vista1
Vista2
Vistan
Nivel Conceptual Nivelfsico Figura1.Interrelacinentrenivelesdeabstraccindedatos. 2.2ModelosdeDatos[1]. Unmodelodedatosesungrupodeherramientasconceptualesqueseutilizanparadescribir losdatos,lasrelacionesentreellos,lasemnticaylasrestriccionesdeconsistencia.Sedividenen: modeloslgicosbasadosenobjetos,modeloslgicosbasadosenregistrosymodelosfsicos. 2.2.1Modeloslgicosbasadosenobjetos. Los modelos lgicos basados en objetos se utilizan para describir datos en el nivel conceptualyelniveldevisin.Estosmodelospermitenunaestructuracinflexible,ademsque permitenespecificarrestriccionesdelosdatosexplcitamente. Existenvariosmodelosdeestetipo,sinembargolosmsrepresentativossonelmodelo entidadrelacinyelmodeloorientadoaobjetos. Elmodeloentidadrelacin: Enestemodelosedefinenentidadesquesonobjetosquesedistinguendeotrosobjetospor ciertos atributos especficos que poseen. Adems se describen las relaciones que presentan diferentesentidades. Elmodelopresentaademslasrestriccionesalasquesedebenajustarlabasededatoscomo porejemplolacantidaddeentidadesalaquesepuedeajustarotraentidadpormediodeunconjunto derelacin.
Laestructuradeunmodeloentidadrelacinsepuededescribirgrficamentepormediode diagramasER,loscualespresentanlasdiferenteentidadesysurelacinentreellasascomolos atributosdecadaentidad. Elmodeloorientadoaobjetos: Estemodelosebasaenunacoleccindeobjetosloscualescontienenvaloresalmacenados envariables.Estosvaloresseconsideranalavezobjetos,porloquesetienenobjetosquecontienen otros objetos que operan sobre el objeto. Adems el objeto se componen de cdigos que se denominanmtodosyqueoperantambinsobreelobjeto. Ladiferenciaconelmodeloentidadrelacinesqueenelmodeloorientadoaobjetoscada objetoposeesupropiaidentidadsinimportarlosvaloresquecontiene. 2.2.2Modeloslgicosbasadosenregistros. Los modelos basados enregistros describendatosenelnivelconceptualyfsico.Estos modelosseutilizanparaespecificarlaestructuralgicadelabasededatos,ademsdeproporcionar unadescripcinaunnivelmsaltodelaimplementacin. Estemodelotrabajaconregistrosfijosenelnivelfsico,loscualesposeenuntipofijoyuna longitud tambin fija. Estos modelos no poseen mecanismos para la representacin directa del cdigoenlabasededatos,sinoqueseapoyanenotroslenguajesseparadosqueseasocianal modelopararealizarlasconsultasyactualizacionesalabasededatos. Losmodelosmsimportantesbasadosenregistrossonelmodelorelacional,elderedyel modelojerrquico.Elprimerodeelloseselmsaceptado. Modelorelacional:Estemodelopresentalosdatoselarelacinentreellosenunacoleccin detablas.Cadatablapresentaunnmerodecolumnasdeterminado. Modelo de red: En el modelo de red los datos se presentan mediante colecciones de registros,ylasrelacionessepresentanmedianteenlaces,quesepuedenvercomopunteros. 8
Modelojerrquico:Elmodelojerrquicoesparecidoalmodeloderedpueslosdatosysus relacionessonpresentadosenregistrosyenlaces.Ladiferenciaesqueenestemodelolos registrosseordenancomocoleccionesderboles. Ladiferenciaentrelosmodelosrelacionalesylosderedyjerrquicosradicaenqueenlos dosltimosseutilizanpunterosoenlaces,mientrasqueenelrelacionalseconectanestosregistros mediantelosvaloresquecontienen. 2.2.3Modelosfsicos. Estosmodelosseutilizanparadescribirlosdatosenelnivelmsbajo.Losmsconocidos sonelmodelounificadoryeldememoriadeloselementos. 2.3SistemasGestoresdebasesdedatos[1][3]. Unsistemagestordebasededatos(SGBD),esunaaplicacindesoftwareespecficaque estdedicadaafuncionarcomounainterfazentrelabasededatos,elusuarioylosprogramasque utilizandichainformacin. Estospermitenalosusuariosaccedermodificarlosarchivosquecontienenlainformacin, presentandoestainformacinalusuarioatravsdediversosnivelesdeabstraccindemaneraquela interaccinconelsistemasealomssimpleposibleparaelusuario. ElpropsitofinaldelosSGBDseseldemanejardeformasencillayordenadaconjuntosde datosrelevantesparabrindarunbuenmanejodeestos. UnSGBDcumplelassiguientesfunciones:
Interactuarconelgestordearchivos:Losdatossealmacenaneneldiscoduroutilizandoel sistema de archivos propiodel sistema operativoutilizado. El SGBD es el encarado de transformarlassentenciasdealmacenamientodelosdatosalformatopropiodelsistemade archivosdebajonivel.
Implantacindelaintegridad:ElSGBDseencargadehacercumplirlasrestriccionesque 9
Implantacindelaseguridad:Sedebencumplirlosrequisitosdeseguridaddelabasede datosparaevitaraccesosnoautorizadosaestaporpartedeusuariosrestringidos.
Controldeconcurrencia:Sedebecontrolarlainteraccindevariosusuariosqueactualizan labasededatossimultneamente,paraqueseconservelaconsistenciadelosdatos.
Procedimentales:Estosrequierenqueesusuarioespecifiquelosdatosquesonnecesitadosy dequemaneraobtenerlos.
No procedimentales: El usuario debe especificar los datos necesitados pero no como obtenerlos.
2.6Administradordebasededatos[1]. Unadministradordebasesdedatoseslapersonaquetieneelcontrolcentraldelosdatosy 10
delosprogramasqueaccedenalabasededatosoeninglsdatabaseadministrator(DBA). Losadministradoresdebasesdedatostienenvariasfuncionesentrelasqueseencuentran:
Programadoresdeaplicaciones:Sonusuariosquecreanaplicacionesparainteractuarcon elsistemapormediodesentenciasDMLincorporadasenunlenguajeprincipal.
Usuarios sofisticados: Son usuarios que interaccionan con el sistema sin escribir programas.nicamentehacensusconsultasenellenguajedeconsultasdelabasededatos.
Usuarios especializados: Son usuarios que escriben aplicaciones de bases de datos especializadasquenoencajanenelmarcotradicionaldeprocesamientodedatos.
Usuariosingenuos:Sonusuariosqueinteractanconelsistemautilizandolosprogramasde aplicacincreados.Comounusuariodeuncajeroautomtico.
Lenguajededefinicindedatos(DDL):Proporcionardenesquedefinenlosesquemasde relacin.Ademseliminanrelaciones,creanndicesymodificanlosesquemas.
Definicindevistas:Seincluyenrdenesparadefinirvistas. Autorizacin:Sepuedendefinirpermisosdeaccesoadiferentesrelacionesyvistas. Integridad:Seincluyenrdenesparaespecificarrestriccionesdeintegridadcomplejas. Control de transacciones: Incluye rdenes para especificar el inicio y el final de las transacciones.Ademsalgunasimplementacionespermitenbloqueodedatosparacontrolde concurrencia.
2.8.1Estructurabsica. UnaexpresinSQLconstadetresclusulasbsicas:select,fromywhere.
From: Esta clusula lista las relaciones que se van a examinar en la ecaluacin de la expresin.
Where:Implicalosatributosdelasrelacionesqueseespecificaronconlaclusulafrom.
indicartodoslosatributossepuedesustituirlosAiporunasterisco(*),estoseleccionartodoslos atributosdelasrelacionesri. 2.8.2Tuplasduplicadas. El lenguaje SQL as como casi todos los lenguajes de consulta comerciales permiten duplicadosenlasrelaciones.Hayvecesquequeremoseliminarestosduplicados,paraestoseutiliza ellapalabradistinctdespesdelafraseselect,delasiguienteforma: selectdistinctX fromY Demaneracontrariaseutilizalapalabraallparaevitarqueseeliminenlosduplicados. selectallX fromY
2.8.3Operacionesdeconjuntos.
Lasoperacionesdeconjuntosunin,interseccinydiferenciasonincluidasporellenguaje SQL. Paralaoperacindeuninseutilizalasentenciaunion,paralaoperacindeinterseccinse utilizaintersect,mientrasqueparalaoperacindediferenciaseutilizalapalabraminus. La operacin union elimina las tuplas duplicadas automticamente. Para mostrar los duplicadosdebemosescribirunionall. La operacin union es parte del estndar SQL, sin embargo varios productos no las soportan.Mientrastantolasoperacionesintersectyminusnoseincluyenenelestndar.
2.8.4Operadoresagregados. SQLpresentaoperadoresagregadosqueutilizancomoargumentounatributo.Elvalordel operador agregado se calcula sobre todos los elementos de la columna especificada o de ser especificadosgrupossecalcularsobrelosvaloresdecadagrupo.
13
2.8.5HAVING. Laclusulahavingessimilaralaclusulawhere,esutilizadaparaconsiderarsologrupos quecumplan unrequisitoespecfico.Estaclusulautilizaexpresiones quecontenganfunciones agregadas. Toda funcin que involucre expresiones con funciones agregadas debe ir en esta clusula. 2.8.6Subconsultas. Lasclusulashavingywherepermitenelusodesubconsultasencualquierlugarendondese espereunvalor.Elvalordelasubconsultadebederivardelasubconsultaprevia,estapropiedad ampliaelpoderexpresivodeSQL. Unasubconsultapuedeserdelasiguienteforma:
select X from Y where Z > (select Z from Y where W= 'frase')
14
2.8.9ndices. Losndicesnospermitenrealizardeunaformamsrpidaelaccesoaunarelacin,sepuede compararconunndicedeunlibroquenospermiteencontrardemaneramsrpidalaubicacinde lainformacinquenecesitamos. Elndiceevitaqueelsistemadearchivosleatodalatablaparalocalizarlainformacin deseada,ypermitealsistemadebasededatoschequearelvalordelndiceprimeroparaversieste lepermiteencontrardeformamsrpidalainformacin. Es recomendado crear ndices en las tablas para hacer ms eficiente el acceso a la informacin.Paracrearunndiceseutilizaelcomando createindex. Lasintaxisutilizadaesla siguiente: createindexnombre_del_indice onnombre_de_la_tabla(nombre_del_atributo); Elnicocambioquepuedepercibirunusuarioconlautilizacindendiceseselincremento 15
enlavelocidadalahoradebuscarinformacin. 2.8.10Vistas. Unavistaesunatablavirtual,esdecirunatablaquenoexistefsicamenteenlabasede datosperoqueelusuariolapuedevercomosiexistiese. Lavistanotienedatospropiosalmacenados,sinoqueelsistemaguardaladefinicindela vistaquepermitesabercualessonlastablasbasequepresentanlainformacinquelavistanecesita. Elcomandoutilizadoparacrearvistasescreatevie.Lasintaxisqueseutilizaes: createviewnombre_de_la_vista assentencia_select Sentecia_selectserefiereaunainstruccinselectquepermiteadquirirlainformacinpara crearlatabladelavista. 2.8.11Eliminacindetablas,ndicesyvistas. Paraeliminartablasseutilizalainstruccindroptable,conlssiguientesintaxis: droptablenombre_de_la_tabla Paralaeliminacindeindicesseutilizaelcomandodropindex,lasintaxiseslasiguiente: dropindexnombre_del_ndice Paraeliminarvistasseutilizaelcomandodropview,conlasiguientesintaxis: dropviewnombre_de_la_vista 2.8.12Manipulacindedatos. Existencomandosparamanipulacindedatosquepermiteninsertar,actualizaryborrarlos datosencadatabla. Parainsertartuplasalastablasseutilizaelcomandoinsertinto,quepresentalasiguiente sintaxis: insertintonombre_de_la_tabla(nombre_atributo_1 16
[,nombre_atributo_2][,...]) values(valor_atributo_1 [,valor_atributo_2][,...]); Paraborrarunatuplaseutilizaelcomandodeletefrom,conlasiguientesintaxis: deletefromnombre_de_la_tabla wherecondicin; Tambinsepuedenrealizarcambiosenunvaloranteriormenteingresado,paralocualse utilizaelcomandoupdate,quepresentalasiguientesintaxis: updatenombre_de_la_tabla setnombre_atributo_1=valor_1 [,...[,nombre_atributo_k=valor_k]] wherecondicin;
2.8.13Normalizacindebasesdedatos[4]. Lanormalizacindebasesdedatosesunprocesoutilizadoeneldiseodebasesdedatos relacionales,medianteelcualsepuedenevitarciertosproblemasenelmanejodelosdatos. Enlanormalizacinsetransformanlosdatosenestructurasmspequeasdemaneraque seanmssimples,msestablesymsfcilesdemantener.Ademshacemsfcilesdeentenderlas estructurasdedatosparalaspersonas. Otradesusventajas consisteenquesereduceelespaciodealmacenamientoporquese evitandatosduplicados. Lanormalizacinpermitebsicamenteevitarredundanciaenlosdatosalmacenados,adems deproblemasenlaactualizacindeestosdatos.Permitedeestaformagarantizarlaintegridadde losdatos. Enelmodelorelacionaldebasesdedatos,lasrelacionessesuelenvercomotablas,siempre ycuandocumplanciertosrequisitoscomoquetodaslascolumnasdebentenerunnombrenico. 17
Lasfilasdelatablaotuplasnopuedenestarrepetidas,esdecir,nosepermitendatosduplicados. Ademsenunacolumnatodoslosdatosdebenserdelmismotipo. Formasnormales: Lasformasnormalessonlosdiferentesnivelesdenormalizacinquesepuedenalcanzaral realizarundiseodeunabasededatos. Existen 5 formas normales, sin embargo las primeras 3 formas son suficientes para las necesidadesdelamayoradebasesdedatos.Inclusiveseconsideraenalgunoscasosinadecuado llevar una base de datos a un nivel mayor al necesario ya que puede aumentar el nivel de complejidaddeestainnecesariamente. Formanormal1(1NF): Enestaformaseestablecequesedebeneliminartodoslosgruposrepetitivosenlastablas. Ademssedebecrearunatablaseparadaparalostiposdedatosrelacionados. Porltimoseestablecequecadatabladebetenerunaclaveprimariaparaidentificarasus datos,estaclaveprimariadebesernicaparacadaelementodelatabla. Formanormal2(2NF): Lasegundaformanormalestablecequelastablasqueposeengruposdedatosqueseaplican avarioselementosalavezsedebencreartablasseparadasparadichosdatosysedeberelacionar dichastablasmedianteclavesexternas. Formanormal3(3NF): Eltercerniveldenormalizacintienencomoobjetivoevitarqueexistandatosduplicadoso erroresenestos,porlocualsedebeubicarentablasseparadasloselementosquenodependandela clave,esdecirloselementosenlatablaquenoseanexclusivosdeelelementodelatablaquese identificaconelidentificadordelatabla. Eltercerniveldedenormalizacinimplicaquelastablaspuedencrecertodoloquequieran 18
sin duplicacin ni corrupcin de datos. Este nivel de normalizacin se dice suficiente para la mayora de las aplicaciones, ya que puede manejar los datos obtenidos en su totalidad de una manerafcil. Formanormal4(4NF): Encasosespecficosenlosquesetieneunarelacindevariosconvariosesdecir,queun elementodelatablaAtengavarioselementosdelatablaB,yquealmismotiempounelementode latablaBtengavarioselementosdelatablaA,senecesitaunniveldeformalizacin4. Esteniveldeformalizacinindicaquecuandoexistenrelacionesdevariosconvarios,las entidadesindependientesnosepuedenalmacenarenlamismatabla. Formanormal5(5NF): Esteniveldenormalizacinseaplicaalgunasveces,sinembargoenlamayoradeloscasos noesnecesarioparaobtenerunamejorfuncionalidadennuestraaplicacin. El principio de esta dice que se puede reconstruir la tabla original desde las tablas resultantesenlasquefueseparadadichatabla. Elaplicarestareglapermiteasegurarquenosehacreadoningunaentradaextraaenlas tablas,yquelaestructuradetablascreadaesdeltamaojusto.Sinembargonoesnecesariaa menosqueseestetrabajandoconunaestructuradedatosdemasiadoextensa. 2.9EllenguajedeprogramacinRuby[5][7]. Ruby esunlenguajedeprogramacinorientadoaobjetos,interpretadoymultiplataforma, fuecreadoporYukihiroMatsumotoen1993ypresentadopblicamenteen1995.Lasintaxisdel lenguajeestainspiradaenotroslenguajescomo Perl y Python,ademsposeecaractersticasde programacin orientada a objetos. Adems comparte funcionalidad con otros lenguajes de programacincomoLisp,Lua,DylanyCLU. Suimplementacinoficialesdistribuidabajounalicenciadesoftwarelibre. 19
2.9.1Filosofadellenguaje. El creador de este lenguaje ha expresado que su creacin fue hecha pensando en la productividadascomolafacilidadydiversinparaelprogramador,esporesoquepresentauna buenainterfazalusuario,dndoleunmayornfasisalasnecesidadesdelprogramadorquealasde lamquina. Ellenguajesigueunprincipiollamadoprincipiodelamenorsorpresa,quequieredecir queellenguajedebegenerarlamenorconfusindelosusuariosexperimentados,estodebidoaque elcreadordecidihacerunlenguajequefueracapazdehacerlaprogramacinmsdivertidaparael mismo,minimizandoeltrabajoalahoradeprogramaryevitandoconfusiones. 2.9.2Semntica. Enestelenguajetodoslostiposdedatossonconsideradocomounobjeto,incluyendolas clasesylostiposqueenotroslenguajessondefinidoscomoprimitivas.Todaslasfuncionesdon mtodosylasvariablessonreferenciasaobjetos,peronuncaunobjetoporsisolas. Permiteademsutilizarprogramacinprocedural,esdecirquesepuedendefinirfuncionesy yvariablesfueradelasclases,todasestasdefinicionessernpartedeunobjetorazllamadoObject. En Ruby noserequieredepolimorfismodefuncionesyaqueentodaslasfuncionesse puedenpasardatosdedistintaclaseencadallamadadelmtodo,debidoaqueellenguajemaneja tiposdedatosdinmicos. 20
Elpolimorfismodetipossiessoportado,esdecirquesepuedenmanejarclasesutilizandola interfazdesuclasepadre. 2.9.3Sintaxis. LasintaxisdeestelenguajeesmuyparecidaaladePerlyPython.Lasclasesylosmtodos sedefinenconpalabrasclaves. Lasvariablespuedenllevarprefijosparaindicarelrangodevaloresquepuedetomaresa variable. Laspalabrasclavesseutilizanparadefinirvaloressinutilizarllaves,adiferenciadeotros lenguajescomo PerlyC.Lossaltosdelneasoninterpretadoscomoelfinaldeunasentencia,el puntoycomatambinsepuedeutilizarparadichopropsito. EnRubylasvariablesdeclasesprivadassemantienendentrodeellas,ysolosepueden utilizaratravezdemtodosdeacceso.Seobligaatodaslasvariablesdeclasesaserprivadaspero tambinseproporcionaunaformasencilladeutilizarmtodosdeaccesoaellas. 2.9.4Metaprogramacin. LametaprogramacinesunadelascaractersticasdeRuby.Consisteencrearprogramasque puedanmanipularoinclusivecrearotrosprogramascomodatos,orealizardurantelacompilacin partedeltrabajoqueserealizaradurantelaejecucindeotraforma. Estacaractersticapermitealprogramadorahorrartiempodedesarrollodecdigo. El compilador es la herramienta que comnmente utiliza la metaprogramacin, ya que permitealprogramadorrealizarunprogramaenunlenguajedealtonivelyluegolotraducea lenguajeensamblador,locualahorramuchotiempo. 2.10ModeloVistaControlador[9][10]. ElModeloVistaControladoresunpatrndediseodesoftwarequeseutilizaeneldiseo deaplicacionesconinterfacessofisticadas. 21
Este patrn permite separar una aplicacin en tres componentes distintos: La lgica de control,losdatosylainterfazdeusuario. EsutilizadocomnmenteenaplicacioneswebendondelavistaeselcdigoHTMLyotros cdigosquepermitendesplegardatosdinmicamente,elmodeloeselsistemagestordebasesde datosylalgicadenegociomientrasqueelcontroladoreselmecanismoquerecibeloseventos desdelavista. 2.10.1Descripcindelpatrn. Elpatrnestaconformadoportreselementoscomosemencion: Modelo: El modelo es el encargado deacceder a la capa de almacenamiento de datos, adems dedefinirlafuncionalidaddelsistema.Ademsdebellevarunregistrodelas vistas y controladoresdelsistema,paraqueseacapazdenotificaraestossobreloscambiosquepueda producirunagenteexternoalosdatos. Vista:Lavistaseencargaderecibirlosdatosdeunmodeloymostrarlosalusuario.Debe tenerademsunregistrodelcontroladorqueporlogeneralesinstanciadoporestafase.Presentael modeloenunformatoquepuedainteractuarconelusuario,porlogeneraleslainterfazdelusuario. Controlador: Es el encargado de recibir los eventos de entrada e interpretarlos para determinarlaaccinquedeberealizarcadaevento.Porejemplocuandounusuariorealizaunclic sobreunbotnelcontroladordeberecibirlasolicitudydeterminarlaaccinarealizar. 2.11RubyonRails[6][11]. RubyonRailsesunframeworkparadiseodeaplicacioneswebdecdigoabiertoescritoen ellenguajeRuby.EstesigueelparadigmadelaarquitecturadeModeloVistaControlador(MVC). Un framework esunaestructuradedesarrollodesoftwareapartirdelacualsepueden desarrollar otrosproyectos.Porlogeneralincluyesoportedeprogramas,bibliotecasylenguaje interpretadoquepermiteunirloscomponentesdelproyecto. 22
RubyonRailsfueescritoporDavidHeinemeierHanssonyliberadoalpblicoporprimera vezenelao2004.Apartirdeesemomentosehanlanzadovariasversiones,siendolamsactual laversin2.1publicadael1deJuniodel2008. La principal caracterstica de este framework es que permite desarrollar aplicaciones de utilidad en el mundo real de una forma sencilla, reduciendo la cantidad de cdigo y de configuracinnecesariosconrespectoaotrasopciones. LametaprogramacinpropiadellenguajeRubyesutilizadaporRubyonRailsparapermitir unasintaxismslegibleparalosusuarios. Existenmuchosproyectosypginasconocidosqueutilizan RubyonRails, queaunquees muyrecientehatenidogranaceptacinentrelosusuariosademsqueposeegrandocumentacinen lneaparafacilitarlaayudaadesarrolladores. 2.11.1 PrincipiosFundamentales. Ruby onRails utiliza dos principios fundamentales comolosonel principiode No te repitasyeldeConvencinsobreConfiguracin. ElprincipiodeNoterepitasserefierealhechoderealizarlasdefinicionesunasolavez. Esporesoquealahoradeprogramarloscomponentesseintegrandemaneraquenoesnecesario establecerpuentesentreellosyaqueelmismosistemalosrealiza,porejemplosisequieredefinir una clase no es necesario especificar los nombres de las columnas sino que son identificadas automticamenteatravsdelabasededatos. ElprincipiodeConvencinsobreConfiguracinbuscaqueelprogramadornicamente debaespecificarlasconfiguracionesquenoseanconvencionales.Estopermitequealrealizaruna basededatospartiendodecero,sepuedanseguirlasconvencionespropiasdeRubyonRailsloque ahorracdigo. 2.11.2ElModeloVistaControladordeRubyonRails.
23
RubyonRailspresentaunpatrnModeloVistaControladordefinido,loselementosdeeste modelosonlossiguientes: Modelo:Elmodeloconsistebsicamenteenlas clases quesonlarepresentacinde las diferentestablasdelabasededatos.Paraaccederalasclasesdelmodelosedebenicamente heredar la clase ActiveRecord::Base y el programa encontrar que tabla debe utilizar y que columnasposeedichatabla. Aldefinirunaclasesedetallaasuvezlasrelacionesentrelasclasesmedianteunaestructura objetorelacional. Lasrutinasparavalidacindedatosascomolasdeactualizacintambinsonespecificadas eimplementadasenelmodelo. Vista:Lavistapresentalalgicaquepermitelavisualizacindelosdatosdelasclasesdel Controlador.Estaesconsideradaporlogeneralparaaplicacioneswebcomoelcdigoincluidoen HTML. En RailsseutilizaunmodelodeRubyintegrado,queutilizaarchivosconformatoRTML. EstosestncompuestosporcdigosHTML,mezcladosconcdigode Ruby. Tambinsepueden construirvistasenHTMLoXML. CadamtododelcontroladordebellevaruncdigoenHTMLparamostrarinformacinal usuario.Ladistribucindeloselementosdelapginasedescribeseparadamentedelasaccionesdel controlador. Controlador: Estas clases son las que responden a la interaccin con el usuario y determinanlalgicaquesedebeseguircuandosedaunevento,paramanipularlosdatosdelas clasesymostrarlosresultadosatravsdelavista.Estosmtodossoninvocadosporelusuario utilizandounnavegadorwebenaplicacionesdeestetipo. Elcontroladoresimplementadoen RubyonRails porel ActionPack. Apartirdelaclase
24
ApplicationController se pueden heredar otras clases para definir acciones como mtodos para invocaratravsdelnavegadorweb. RubyonRailspermiteconstruirdeformarpidalamayorpartedelalgicadecontrolylas vistasnecesariasparalasoperacionesmscomunes. 2.11.3Soportedebasesdedatos. RubyonRailsproporcionasoporteparalautilizacindebasesdedatos,favoreciendosuuso atravsdeungestordebasesdedatos.SesoportalabibliotecaSQLiteencasodequenosepueda utilizarunabasededatos.Lainteraccinconlabasededatosesabstractadesdeelpuntodevista delprogramador,ylosaccesossonrealizadosautomticamentesinnecesidaddeutilizarconsultas detipoSQLaunquedequererusarsesepuedenutilizar. Entrelossistemasgestoresdebasededatossoportadosseencuentran:MySQL,PostgreSQL, SQLite,IBMDB2,OracleyMicrosoftSQLServer.
25
CAPTULO3:Estructurageneraldelsistemadeinventariode bodega.
3.1Estructuradelaaplicacinyaspectosgenerales. Labasededatosdelsistemadesarrolladoestadivididaendospartesesenciales:Unabase dedatosquemanejalosactivosdelabodega,consusdiferentesmarcas,modelosyestadosdelos activos,yotratablaquemanejalosusuariosenlacualsealmacenalainformacinpersonaldeestos ascomolainformacinutilizadaparalaconexindeestosalsistemacomolosonelnombrede usuarioylascontraseas. Paralabasededatosseutilizelgestordebasededatos PostgeSQL,queesdeusolibre, ademsdeserunodelosmsreconocidosporsuexcelentemanejodedatospermitiendoconservar suintegridadycoherencia. Laaplicacinsedesarrolloenellenguajedeprogramacin Ruby utilizandoel framework Ruby on Rails, el cual permite implementar el manejo de la base de datos deuna forma ms sencilla, ahorrando al programador mucho cdigo que se puede hacer genrico para todas las aplicaciones. Laaplicacinutilizaunaestructuramodelovistacontrolador,porlotantoloscdigosestas clasificados segn estas tres secciones. Todos estos archivos relacionados directamente con la aplicacinseencuentranenlacarpetaapp,divididosencarpetasseparadasparacadaunadelas secciones. Ademsexistenvariosarchivosdeconfiguracinascomolibrerasutilizadasentreotras cosas. 3.2Basededatos. ComoyasemencionseutilizaesgestordebasededatosPostgreSQL,paraeldesarrollode laaplicacinseutilizlaversin8.3.3. 26
Seutilizaunadaptadorqueseencargaderealizarelmanejodelabasededatos,incluyendo lacreacindelasbasesdedatosautilizarylacreacindesustablas,traduciendocdigoRubyen sentenciasSQLpararealizardichastareas. La base de datos se encarga del almacenamiento de forma segura y confiable de la informacin, tanto de activos de bodega como de usuarios, sesiones y roles utilizados para la autenticacinalsistema. 3.3Modelo. Elmodeloeslaparteencargadadelmanejodirectodelabasededatosysusrelaciones.Esla representacin delabasededatosdesdelaaplicacin,demaneraquemanejalastablasy sus elementoscomoclases,demaneraquesepuedahacerreferenciaaellasdeunaformasencilladesde cualquierpartedelcdigo. Enestapartesedefinenademslassentenciasdemapeoobjetorelacionalquedescribenla relacinentrelasclases,esdecirentreloselementosdelastablasdelabasededatos. Ademssedefinenlasrutinasdevalidacindedatosquepermitenconservarlaintegridad delosmismos,especificandoquereglassedebenseguirantesdeintroducirunvaloralabasede datos. Sedefinentambinalgunasfuncionesquerequierenlarevisinomanipulacindirectamente delosvaloresdelabasededatos,porejemplosisequiereencriptarlacontraseadelosusuariosse puededefiniraqulafuncinquerealicedichatarea. Entre las funciones que se puede definir esta tambin funciones para filtrar los datos ingresados mediante expresiones regulares que permitan eliminar caracteres indeseados en una entradadeunvaloralabasededatos. 3.4Controlador. Elcontroladoreselencargadodemanejarloseventosqueserealizanenlaaplicacin,porlo
27
generalprovocadosporunaaccindelusuario. Setienencontroladoresseparadosparacadatabladelabasededatos,pordefecto,aunquese puedencrearnuevoscontroladoresparaotrasacciones. Lasaccionesbsicasquemanejaelcontroladorsonlasdenuevo,crear,editar,actualizar, destruirylistarymostrar. Nuevo: Cuando se quiere crear un nuevo elemento esta accin se encarga de crear un elemento en blancoqueluegoes actualizadoconlos datosqueseingresanporelusuario. La necesidaddecrearunelementoenblancoesquedeestaformasepuedeasignarenlavistaun campodelavariableacadaelementodelaformaquedebellenarelusuario. Crear: La accin de crear se encarga de tomar los datos ingresados por el usuario y actualizarelelementoquepreviamentefuecreadoconlaaccinnuevo. Editar:Editarseencargadeasignarenlavistalosvaloresactualesdeelelementoaeditar deformaqueelusuariolomodifiqueaplacer. Actualizar: Toma los elementos modificados porelusuario enla vista deeditar,y los actualizaenlabasededatos. Destruir:Destruyeeloloselementosseleccionados,eliminndolodelabasededatos. Listar:Haceunabsquedaymuestraunalistadeloselementosqueelusuariodeseaver. Mostrar:Muestraelcontenidodeunelementoespecficoqueelusuarioquierever. Enalgunoscasoshayaccionesquenosenecesitan,comoporejemploenelcasodelas sesiones, estassecreancuandounusuarioseconectaalsistema,sinembargonoesnecesario editarlasniactualizarlas,simplementeseeliminancuandoelusuariosedesconecta,porlotanto dichasaccionesnoestndefinidasparaestecaso. 3.5Vista. La vista maneja la interfaz del sistema con el usuario. Esta dividida tambin segn el 28
elementoadesplegarylaaccinquesevaarealizar.Porejemploexisteunavistaparalistarlos activos,otraconlaformaparaqueelusuariocreeunnuevoactivoconlosdatosrequeridos,otra muy similar alaanteriorconunaformaquedespliegalosdatosactualesdeelactivoparaser modificadosporelusuario,ascomounavistaparamostrarlosdatosdeunactivoespecfico. Estasvistasseencargandecomunicarseconelcontroladorparatomarlosdatosqueestele pidealmodeloydesplegarlosenpantallaalusuario. LasvistasestnenlenguajeHTML,sinembargoposeencdigo Ruby integradomediante unasentenciaespecialquepermiteinsertarestoscdigos. Apartedeunavistaparacadaaccinarealizarexistaunaarchivodemscaraolayoutque manejaunainterfazalrededordelapantalladondesedesplieganlosdatos,esdecir,manejalabarra dettulodelaaplicacin,labarralateralyenfin,laestructurageneraldelainterfazconelusuario. RubyonRailscreaunlayoutpordefectoparacadaunadelastablas,sinembargo,ennuestra aplicacin se utiliz un nico layout para desplegar todas las vistas, el cual fue llamado aplicacin.html.rb.Ellayoututilizadonoposeeningunadescripcindeestilosyformatos,para estoseutilizaunarchivonombradoinventario.csselcualestaescritoenunlenguajedeHojade estilo en cascada (CSS), en el cual se especifican los tipos y tamaos de letra, el color y las tabulacionesdelosdiferenteselementosdelastablas. 3.6Archivosdeconfiguracin. Losarchivosdelacarpetaconfigposeenlaconfiguracindelaaplicacin,dondesepuede definirconfiguracionesparalosdiferentesambientesdetrabajo,ascomolaconfiguracindela base de datos, las rutas por defecto para las vistas e informacin relacionada con los plugins instaladosparalaaplicacin. Losarchivosdeconfiguracinmsimportantesson: database.yml:Enestearchivoseespecificalascaractersticasdelabasededatosautilizar.
29
Elnombredelabasededatos,eladaptadorparamanejardichabasededatos,lacodificacin,el usuariodelabasededatosylacontraseasonloselementosdescritosenestearchivo,paracada unodelosambientesdetrabajo,yaseadesarrollo,produccinoprueba. environment.rb:Enestearchivoposeeinformacinrelacionadaconlasgemasinstaladasy quelaaplicacinvaautilizar.Lasgemassonbibliotecasde Ruby queseadministrandeforma sencillaconelcomandogemdesdelaterminal. routes.rb:Enestearchivoseespecificalasrutasporlascualessevaainvocarlasdiferentes vistasenelnavegador.Ademsseespecificalarutapordefectodelaaplicacin. 3.7Otrascarpetas. Elsistemaestacompuestoporotrascarpetasquecontienentambininformacinimportante paraelfuncionamientodelaaplicacin.Acontinuacinseresumelafuncinycontenidodelas msrelevantes: db: Tieneinformacindelabasededatos.Enellaseguardaelcdigodelasdiferentes migracionesrealizadasparalabasededatos.Lasmigracionespermitenmodificarlasbasesdedatos sincomprometerlaintegridaddelosdatosexistentes. Ademsenelarchivoschema.rbsepresentaladescripcindelaestructuraactualdela basededatos,ascomolaversindelamigracinqueseestacorriendo. lib:Contieneinformacindebibliotecasinstaladaselelproyecto.Enlaaplicacinrealizada contienearchivosdeunodelospluginsinstalados,necesariosparasubuenfuncionamiento. log: Contieneunregistrodelasnotificacionesdesplegadasporelsistemadurantetodoel desarrollodelaaplicacin.Ascomoalgunasnotificacionesdealgunosdelos plugins utilizados quepermitenrevisarlasaccionesquesehanrealizado. public: Poseearchivos web quenocambiancomolasimgenes,lashojasdeestiloylos archivosenlenguajeJavaScript,ademsdealgunosarchivoenHTML. 30
script: Estacarpetacontiene scripts parapodercorrervariasherramientasqueseutilizan con Rubyon Rails.Entrelos scripts quesepuedenencontrarestnlosutilizados paragenerar cdigoyelqueseutilizaparaarrancarelfuncionamientodelservidordedesarrollo. vendor: Este directorio contiene bibliotecas desarrolladas por terceros, es decir que no correspondenaladistribucinde RubyonRails.Porejemploaquseencuentranlasbibliotecas utilizadasporlospluginsinstaladosdentrodelacarpetadelproyecto. Index: EstacarpetaescreadaporelpluginActasferret.Enellaseguardanlosndices generadosporlasbsquedasquesehayanrealizadodemaneraquelasbsquedassubsiguientes puedanutilizarestainformacinparaagilizareltiempoderespuestadedichabsqueda. 3.8Pluginsutilizados. Seutilizaron6 plugins paraeldesarrollodelaaplicacin.Tresdeellosseutilizaronpara podercrearllavesforneaspararealizarlasrelacionesentrelastablasyaumentarlaconfiabilidad delsistemaenelmanejodelosdatos.MuchasreferenciasindicabanqueenRubyonRailsnoera necesariocrearestasllavesforneas,yaquelaaplicacinseencargademanejarlarelacinentrelos datos.Sinembargo,lacreacindeestasllavespermiteunmanejomsseguroyconfiabledeestos datosyaprovocaqueelpropiosistemagestordebasededatoscompruebeestasrelaciones. Lostrespluginsutilizadosparaestepropsitofueron: redhillonrails_core:Esteplugincontienebibliotecasnecesariasparaelfuncionamientodelosotros dosplugins. foreign_key_migrations: Creallavesforneasenlabasededatosautomticamentealahorade realizar una migracin de la base de datos. Se pueden especificar de varias formas las llaves forneasdeseadasenelsistema.Alcrearunacolumnadelaformacosa_id,esteautomticamente creaunallaveforneausandoelidentificadordelatablacosas foreign_key_associations: Crea automticamente relaciones en el modelo basado en las llaves 31
forneasexistentesenlabasededatos. Losotrostrespluginsutilizadosenfueron: Restful_authentication:Creaunaestructurabaseparalacreacindeunsistemadeautenticacinde usuarios. acts_as_ferret:Realizabsquedasenlabasededatosdelsistema.Permiteutilizarvariasfunciones parabsquedascondiferentesparmetros. will_paginate:Utilizadoparalapaginacindeloselementosdesplegadosenpantalla.Seconsider que al crecer la base de datos es mejor desplegarla de una manera ms ordenada como lo es mediantepginas,especificandounnmerorazonabledeelementosporpginademaneraquesise deseacargarunatablaconmuchoselementoslapginacargueestosporseccionesaumentandola velocidaddenavegacindelapginaweb.
32
CAPTULO4:Diseodelabasededatos.
Comoseexplicanteriormente,labasededatosestadivididaendosseccionesprincipales. Elprimerconjuntodetablasseencargadealmacenarlainformacinobjetivodelsistema,esdecirla informacindelosactivosdeinventariojuntoconsusmarcas,modelosyestados. Laotrapartedelabasededatoseslaencargadadealmacenarlainformacindelosusuarios creadosenelsistemaqueesutilizadaporelsistemadeautenticacin.Aqusetieneunatablapara informacindelosusuarios,otraenlaquesealmacenanlosrolesexistentesyunaquecontienela informacinquedescribecualesrolesposeecadausuario. 4.1Basededatosparaactivosdebodega. Paradisearestapartedelabasededatosseinvestigconelencargadodelabodegadela EscueladeIngenieraElctricadelaUniversidaddeCostaRica,cualeralainformacinimportante quedebaposeercadaunodelosactivosdebodegaycualesclasificacioneseraimportanterealizar conestos. Lainformacinquesedebealmacenarenlabasededatoseslasiguiente: Cuadro1.Activosenniveldenormalizacin0. Activos #Placa #Serie Modelo Descripcin Marca Estado
Aplicandolaprimeraregladenormalizacindebasesdedatosseagregaunidentificadora latabla.Seconsiderlaopcindeutilizarelnmerodeplacacomoidentificador,sinembargola posibilidaddequeestenmerodeplacanoexistaoesterepetidoevitaquesepuedautilizarpara esto.Unavezincluidalacolumnadelidentificadorsetiene: Cuadro2.Activosenniveldenormalizacin1. Activos ActivoId #Placa #Serie Modelo 33 Descripcin Marca Estado
Elsegundoniveldenormalizacinindicaquesedebendecreartablasseparadasparalos gruposdedatosqueapliquenavariosregistros.Ennuestronoexisteningngrupodedatosqueeste aplicadovariasvecesaunregistroporlotantonoesnecesariorealizarningncambio. El tercer nivel de normalizacin indica que se deben de eliminar los campos que no dependen de la clave. Podemos notar como el modelo con su respectiva descripcin es independientedecadaactivoindividual,porlocualsepuedesepararenunanuevatabla.Deigual formaelestadodelequipoesindependientedelaclaveprimariadeelactivodemaneraquela estructuradetablasseconvierteenlasiguiente: Cuadro3.Activosenniveldenormalizacin2. Activos ActivoId #Placa #Serie Rel.Modelo_id Rel.Estado_id
34
instalado para dicho propsito. Adems se decidi aadir algunos campos para informacin personaldelosusuarioscomolosonelnombre,eltelfono,nmerodecdulaycarnencasode existir. Elesquemaposee3tablas:Unatabladeusuariosconlainformacindeestos,unaderoles, conlosdatosdelosdiferentesrolescreadosyunatabladepermisosenlacualserelacionanlos usuarioscondiferentesrolesparadeestaformaasignarlospermisosalosusuariossegnelnivelde accesoalaaplicacindeseadoparacadaunodeellos. Labasededatosdeusuarioscontienelassiguientescolumnas:
Id_usuario:Elidentificadordelatabla. Login:Elnombredelusuarioenelsistema. Email:Elcorreoelectrnico. crypted_password:Lacontraseaencriptada. Salt:Variableutilizadaparalaencriptacindelosdatos. remenber_token: Un identificador para ser recordado por el sistema en un computador especfico.
puedaasignardichorolaunusuarioparabrindarlepermisosespecialesaeste.Latablaposeela
36
siguienteinformacin:
Elarchivoschema.rbdelacarpetadbnosmuestrafinalmentelaestructuradelabasededatos consusllavesforneasrespectivas.
ActiveRecord::Schema.define(:version=>20081126080143)do create_table"activos",:force=>truedo|t| t.string"num_serie" t.integer"placa" t.integer"modelo_id" t.integer"estado_id" t.datetime"created_at" t.datetime"updated_at" end create_table"estados",:force=>truedo|t| t.string"nombre" t.datetime"created_at" t.datetime"updated_at" end create_table"marcas",:force=>truedo|t| t.string"nombre_marca" t.datetime"created_at" t.datetime"updated_at"
37
end create_table"modelos",:force=>truedo|t| t.string"nombre_modelo" t.string"descripcion" t.integer"marca_id" t.datetime"created_at" t.datetime"updated_at" end create_table"permissions",:force=>truedo|t| t.integer"role_id",:null=>false t.integer"user_id",:null=>false t.datetime"created_at" t.datetime"updated_at" end create_table"roles",:force=>truedo|t| t.string"rolename" t.datetime"created_at" t.datetime"updated_at" end create_table"users",:force=>truedo|t| t.string"login" t.string"email" t.string"crypted_password",:limit=>40 t.string"salt",:limit=>40 t.datetime"created_at" t.datetime"updated_at" t.string"remember_token" t.datetime"remember_token_expires_at" t.string"nombre" t.string"apellido" t.integer"telefono" t.string"carne" t.integer"cedula" end add_foreign_key"activos",["modelo_id"],"modelos",["id"],:name=>"activos_modelo_id_fkey" add_foreign_key"activos",["estado_id"],"estados",["id"],:name=>"activos_estado_id_fkey" add_foreign_key"modelos",["marca_id"],"marcas",["id"],:name=>"modelos_marca_id_fkey" add_foreign_key"permissions",["role_id"],"roles",["id"],:name=>"permissions_role_id_fkey" add_foreign_key"permissions",["user_id"],"users",["id"],:name=>"permissions_user_id_fkey" end
Entre las cosas que se puede notar es que Ruby on Rails al crear una tabla, crea automticamenteenelladoscolumnascorrespondientesalafechadecreacinyalafechade actualizacindelelemento,estevalorsealmacenaautomticamentealahoradecrearydeeditarun
38
elementorespectivamente.Estopermitellevarunseguimientoporfechadelasmodificacionesenla basededatosypuedesermuytilenalgunoscasos. Parallegaralaestructuraanteriordelabasededatossedebieronrealizarvariasmigraciones de esta, ya que conforme avanz el desarrollo de la aplicacin, se encontraron nuevos requerimientosysenecesitorealizaralgunoscambios. De igual manera de necesitarse en el futuro agregar nuevos elementos o cambiar la estructuradelabasededatos,sepuederealizardemanerasencillamediantemigraciones.
39
CAPTULO5:Modelo.
Elmodeloeslaseccindelprogramaencargadadehacerelmanejodirectodelabasede datos.Enelsedefinenloselementosdeunatablacomoobjetosde Ruby yademssehacela validacin de los datos introducidos, para definir las reglas en el manejo de los datos que contribuyanacuidarlaintegridaddeestos. Existeunmodeloparacadaunadelastablaspresentesenlabasededatos. 5.1Modelosdelsistemadeactivos. activos.rb:
classActivo<ActiveRecord::Base belongs_to:estado belongs_to:modelo acts_as_ferret:fields=>[:num_serie,:placa] defself.per_page 40 end validates_uniqueness_of :placa validates_numericality_of:placa,:allow_nil=>true validates_presence_of:num_serie,:placa
end
Podemosvercomosedefinenlasrelacionesenentrelastablas.Enestecasoseespecifica quecadamodeloperteneceaunestadoyaunmodelo. Lasentenciaacts_as_ferretesutilizadaporelplugindelmismonombre.Medianteestase especificaquesevaautilizarelsistemadebsquedasenlascolumnasespecificadasluegoentre parntesis. Seconsiderquelasbsquedasdelosactivossedebanrealizarporsunmerodeserieopor suplaca.Deestamanerasepuedeencontrarunactivoespecficocuandosenecesite. Lasentenciadef_self.per_pagedefineelnmerodeelementosquesedebedesplegarpor pgina.Estenmeroeselparmetroqueutilizaelplugindepaginacinparasabercomoacomodar loselementosporpginayesmuysencillocambiarloparaajustarloalgustodelusuario. 40
41
Denuevoseutilizael plugin parabsquedas,enestecasoserealizanbsquedasenla columnadenombredelamarca. 5.2Modelosdelsistemadeautenticacindeusuarios. Comosemencionoanteriormentetenemosunatabladepermisosusuariosquealmacenala informacindetodoslosusuariosregistradosenelsistema.Ademsexisteunatabladerolesque poseeunaidentificacindelosrolesexistentesyunatabladepermisosqueposeelainformacinde cualesusuariosposeencualespermisos.Acadausuarioselepuedeasignarvariospermisos,es decirvariosroles. user.rb:
attr_accessor:password acts_as_ferret:fields=>[:login,:email,:nombre,:apellido,:telefono,:carne,:cedula] validates_presence_of:login,:email validates_presence_of:password,:if=>:password_required? validates_presence_of:password_confirmation,:if=>:password_required? validates_length_of:password,:within=>4..40,:if=>:password_required? validates_confirmation_of:password,:if=>:password_required? validates_length_of:login,:within=>3..40 validates_length_of:email,:within=>3..100 validates_uniqueness_of:login,:email,:case_sensitive=>false validates_numericality_of:telefono validates_numericality_of:cedula has_many:permissions has_many:roles,:through=>:permissions before_save:encrypt_password
Las anteriores sentencias definen lavalidacindedatos paralos usuarios.En este caso tenemosqueseactivanlasbsquedasenelnombredelusuario,enelcorreoelectrnico,enel nombreyapellidodelapersona,eltelfono,carnycdula. Adems se define que tanto el nombre de usuario, como el correo, la contrasea y su confirmacindebenestarpresentesalahoradecrearunusuario,deotraformasepresentaunerror. Elnombredeusuarioyelcorreoelectrnicodebentenerunlargodeterminadoparaser vlidos,porloqueseespecificaunlargomnimode3caracteresenamboscasosyunmximode 40yde100paraelnombredeusuarioyelcorreorespectivamente.Estosdebensernicosadems. 42
Lavalidacindedatosespecificaademsqueloscamposdenombredeusuarioycorreo debensernicos. Loscamposdetelfonoynmerodecduladebensersolonmeros,deestamaneraseevita queseingresencaracteresnodeseadosalatablaquepuedenalterareldatoquesequiere. En cuanto a las relaciones con otras tablas, se define que los usuarios tienen muchos permisos,yasuveztienenmuchosrolesatravsdelospermisos. Enestearchivoademsseespecificanvariasfuncionesquetienenqueverconelchequeode labasededatos.Entreestasfuncionesseencuentranlasqueseencargandeencriptarlosdatosde lascontraseas,lasqueseencarganderecordarunusuarioenunequipoyotrasfuncionesalas cualesnoselesdiounusoennuestraaplicacinyaquealgunasfuncionalidadescomolaactivacin porcorreonoerannecesariassegnlosrequerimientosdelaaplicacin.
role.rb:
classRole<ActiveRecord::Base has_many:permissions has_many:users,:through=>:permissions end
puedetenervariosrolesyasuvezunrolpuedeestarasociadoavariosusuariosalmismotiempo.
44
CAPTULO6:Controladores.
Los controladores son las partes del cdigo encargadas de realizar las acciones que el usuarioordene.Estaspuedenirdesdedesplegarelementosenpantalla,hastahacermodificacionesa labasededatosagregando,quitandoomodificandoelementosenesta. Las acciones bsicas que Ruby on Rails define por defecto son: Nuevo, crear, editar, actualizar,destruir,mostrarylistar. SesabequeRubyonRailscreaestasaccionespordefectoalcrearlaestructuraparacada unadesustablas.Envarioscontroladoresdelaaplicacinestasaccionesnofueronmodificadas, porlotantosonidnticasenvarioscontroladores.Porlotantosevaacomentarestasunanicavez yademssevanaexplicarloscambiosrealizadosenelcasodehaberlos. 6.1Controladoresdesistemadeactivos. Setienencomosemencionmuchoscdigosquesonsimilaresenloscontroladoresdeel sistemadeactivos.Debidoaestosemencionaprimeroloscdigosquesonsimilaresentodoslos casos,conelobjetivodeevitarlaexplicacinrepetidadecdigos. Lassiguienteslneasestnpresentesentodosloscontroladoresdeelsistemadeactivos comoloson:Activos,modelos,marcasyestados.
includeAuthenticatedSystem layout'application' before_filter:login_required,:only=>[:show,:index] before_filter:check_administrator_role,:only=>[:destroy,:new,:edit,:update]
Aliniciodelarchivotenemoslassentenciasanteriores.Enellassedefinequesevaaincluir las libreras del sistema de autenticacin de usuarios, esto para utilizar seguidamente algunas funcionesparaaplicarlosfiltrosalasaccionesdelcontrolador. Sedefinequesevaautilizarellayoutapplication,elcualfuecreadocomounamscara genricaparatodosloscontroladores.Estoseexplicarmsadelanteenelcaptulodevistas. Se definen adems los filtros a la pgina. Mediante esto se puede generar permisos de 45
ingresoalasdiferentesaccionesdelcontrolador.Enestecasoyeneldelosotroscontroladoresdel sistemadeactivos,siunusuarioseencuentraconectadoalsistema.Encasodequeestesed,el usuario tiene acceso a las funciones de mostrar y de listar. Sin embargo si adems de estar conectado,elusuarioposeeunpermisodeadministrador,selebrindaaccesoalasfuncionesque realizanmodificacionesdelabasededatos,comolosonlasdecrear,editarydestruirelementos.
defindex @estados=Estado.find(:all) respond_todo|format| format.html#index.html.erb format.xml{render:xml=>@estados} end end
El mtodode mostrar es muy similaral anterior,con ladiferenciaqueenestecaso se selecciona nicamente uno de los elementos de la tabla, especificando en la funcin find el identificadordeesteelemento,mediante:id.
defnew
46
Elmtododenuevopermitecrearunelementovacoparadesplegarunaformadondeel usuario pueda asignar los valores deseados al elemento. Esto permite asignar una variable del elementoacadaunodeloscamposdelaformaparaluegopasarledichosparmetrosintroducidos porelusuarioalmtododecrearparaqueestecreeelelementoconestosparmetros.
defcreate @estado=Estado.new(params[:estado]) respond_todo|format| if@estado.save flash[:notice]='Elestadofuecreado.' format.html{redirect_to(@estado)} format.xml{render:xml=>@estado,:status=>:created,:location=>@estado} else format.html{render:action=>"new"} format.xml{render:xml=>@estado.errors,:status=>:unprocessable_entity} end end end
Comosemencionanteriormenteestemtodopermitecrearunnuevoelemento(eneste caso un estado) con los parmetros introducidos por el usuario, que se indican a travs de la sentenciaparams[:estado].Ademssielusuarioescreadoseespecificaquesedebemostrarel elementocreadoenlasiguientepgina,ydesplegarunmensajeindicandoqueelelementofue creado. Encasodequenosehayapodidocrearelelementosedebevolveralapginanuevopara modificarlosparmetros.
defedit @estado=Estado.find(params[:id])
47
end
Elmtododeactualizarbuscainicialmenteelelementoquesevaamodificarmedianteel identificadorindicadoparaluegohacerunllamadoalafuncinupdate_attributesqueactualiza los atributos de el elemento con los parmetros indicados entre parntesis que provienen del formulariodeedicinquesemodificanteriormente. Sedireccionaluegoamostrarelelementomodificadoencasodequedichamodificacinse hayarealizadosatisfactoriamente,ademssedespliegaunmensajeindicandoquedichoelemento fueactualizado. Encasodequenosepuedarealizarlaactualizacinsevuelvealapginadeeditarpara realizarloscambioscorrespondientes.
defdestroy @estado=Estado.find(params[:id]) @estado.destroy respond_todo|format| format.html{redirect_to(estados_url)} format.xml{head:ok} end end
48
Podemosnotarcomoseverificaprimerosiexistealgnparmetrodebsqueda,encasode queexistasellamaalafuncionfind_by_contentsqueproporcionael plugin acts_as_ferret, mediantelacualserealizalabsquedadeactivosrelacionadosaelparmetroindicado. Si no existe el parmetro anterior se revisa la existencia de algn otro parmetro, para determinar cuales activos se deben desplegar. Si existe algn parmetro se revisa si es un identificadordemodeloodeestadoyencadacasosesebuscaloselementosconesteidentificador.
49
Enelcasodelcontroladordelosmodelosseutilizalamismalgicaparadeterminarsiexiste un parmetro de marca que haya sido enviado para desplegar nicamente los modelos pertenecientesadichamarcaencasodeexistirelparmetro.Ademsseverificalaexistenciadeun parmetrodebsquedatambin.
ifparams[:q] query=params[:q] @modelos=Modelo.find_by_contents(query,:limit=>:all) elseifparams[:marca_id].nil? @modelos=Modelo.find(:all) else @modelos=Modelo.find(:all,:conditions=>["marca_id=?",params[:marca_id]]) end
6.2Controladoresdesistemadeautenticacindeusuarios. Entreloscontroladoresdelsistemadeusuariostenemosuncontroladorquemanejatodolo correspondientealmanejodelosusuarios,esdecir,lacreacin,edicin,eliminacinydespliegue deestos.Ademsdeestosetieneuncontroladorpararealizarlaactualizacindelascontraseas, llamadoaccounts. Otrocontroladoreselqueseencargadelmanejodelosroles.Estepermitecrearrolesas comoasignarlosausuarios. Elltimocontroladoreselqueseencargadecrearydestruirlassesiones,estepermiteque unasesinsearecordadaenunequipoespecfico. users_controller.rb: layout'application'
before_filter:login_required,:only=>[:show,:edit,:update] before_filter:check_administrator_role,:only=>[:index,:destroy,:new,:create]
50
Losmtodosdemostrar,nuevo,editar,actualizarydestruirsonidnticosalos explicadosparaelsistemadeactivos,porloqueseevitarsudiscusin. sessions_controller.rb: En este controlador se maneja la creacin de sesiones de usuarios, es decir cuando un usuarioconectaalsistemasecreaunasesin,lacualesdestruidaenelmomentoenqueesteusuario sedesconecta.
layout'application' before_filter:login_required,:only=>:destroy before_filter:not_logged_in_required,:only=>[:new,:create]
Primero se define que se utilizar el layout application al igual que para todos los controladoresdelaaplicacin. Adems seaplicanlos filtros alos usuarios,demanera quesiunusuarioseencuentra conectado,elsistemalepermitadestruirlasesin,esdecirdesconectarse.Deigualformasiun usuarionoestaconectadoselepermitecrearunasesin,esdecirconectarsealsistema.
defcreate password_authentication(params[:login],params[:password]) end
Elmtododecrearllamaelmtodopassword_authenticationconlosparmetrosdeel
51
nombredeusuarioylacontraseaquehayansidoingresadosporelusuario.
defpassword_authentication(login,password) user=User.authenticate(login,password) ifuser==nil failed_login("Sunombredeusuarioocontraseaesincorrecto.") else self.current_user=user successful_login end end
Elmtodopassword_authenticationasuvezllamaelmtodoauthenticatedelmodelo delosusuarios,queverificalaexistenciadeunusuarioconlosparmetrosintroducidos.Encasode existir se iguala el usuario actual current_user a dicho usuario y se llama al mtodo succesful_login.Encasodenoexistirsellamaalmtodofailed_loginintroduciendocomo parmetrounmensajedeerrorindicandoqueelnombredeusuarioolacontraseanosoncorrectos.
deffailed_login(message) flash.now[:error]=message render:action=>'new' end
Elmtodofailed_logindespliegaelmensajequesepascomoparmetroyenvadenuevo alapginadeingresoalsistema.
defsuccessful_login ifparams[:remember_me]=="1" self.current_user.remember_me cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at} end flash[:notice]="Sehaconectado!" return_to=session[:return_to] ifreturn_to.nil? redirect_touser_path(self.current_user) else redirect_toreturn_to end
El mtodo successful_login se encarga de revisar si el usuario marc la casilla de remember_meparaserrecordadoeneseequipo,silacasillafuemarcadaentoncessellamael mtodoremember_tokenyremember_token_expires_atqueseencargandeasignarunafecha enlaquesedebedejarderecordaralusuarioeneseequipo.Eltiempoconfiguradoesde2semanas, 52
Inicialmentesedefinequelosmtodosdeestecontroladorsernaccesiblesnicamenteael olosusuariosadministradores.
defindex @user=User.find(params[:user_id]) @all_roles=Role.find(:all) end
Elmtododelistarbuscaelusuarioconelidentificadorespecificado.Ademsbuscatodos losrolesexistentesparaluegomostrarlarelacinentreelusuarioylosrolesexistentesenlavista. Los mtodos mostrar, nuevo, crear y editar son idnticos a los descritos anteriormenteparaelsistemademanejodeactivos. 53
Elmtodoactualizar,permiteasignarunrolaunusuario:
defupdate @user=User.find(params[:user_id]) @role=Role.find(params[:id]) unless@user.has_role?(@role.rolename) @user.roles<<@role end redirect_to:action=>'index' end
54
else flash[:error]="Ocurriunerror,sucontraseanofuecambiada." render:action=>'edit' end else flash[:error]="Lanuevacontraseanocoincideconlaconfirmacin." @old_password=params[:old_password] render:action=>'edit' end else flash[:error]="Sucontraseaviejaesincorrecta." render:action=>'edit' end end
Elmtodoprimeroverificaquelacontraseaviejaingresadaseacorrecta.Luegorevisaque lacontraseanuevaseaigualalaconfirmacindeestayquenoseaunacontraseaenblanco,para posteriormente salvar estas contraseas para el usuario actual y desplegar una notificacin indicandoquelacontraseafueactualizada. Sinosepuedeguardarlacontraseaseenvaunmensajedeerrorindicandoquenosepudo actualizarestayseregresaalapginadeedicindelacontrasea. Luego, si la contrasea nueva asignada no coincidi con la confirmacin de esta, o la contraseaviejaingresadanocoincideconlaalmacenadaparaeseusuario,sedespliegaunmensaje deerrorindicandocadacaso.
55
CAPTULO7:Vistas.
Lasvistascorrespondenalapartedelaaplicacinencargadaderealizarlainterfazgrfica conelusuario.AlserunaaplicacinwebestasserealizanencdigosHTML,usandoademsllaves especialesparaaadircdigoenlenguajeRubyembebidodentrodelHTML. Existenvistasparatodosloscontroladores.Porejemploparaactivosexisteunavistaque listalosarchivosyesllamadaporelmtodolistardelcontrolador.Deigualformaexistenvistas paralosmtodosnuevo,mostraryeditar. Enalgunoscasosnofuenecesariotodasestasvistasdebidoaquealgunasdeestasacciones noestabandefinidasenelcontroladorcomosevioenelcaptuloanterior. 7.1Vistasdelsistemademanejodeactivos. Enestecasolasvistasdeactivossonlasmsrepresentativaspuesestastuvieronlamayor cantidaddemodificaciones.Debidoaestoseexplicarbsicamenteestasvistasaclarandoquelas vistasparalosmodelos,marcasyestadossonmuysimilareseinclusivemssencillasporloque serarepetitivoexplicarlas. Comoesdesuponerselavistacreadapordefectoparanuevoyparaeditarsoncasi idnticas,nicamentedifierenenunpardetextos.Debidoaesto,paraevitarrealizarloscambiosen ambasvistasseutilizauncdigogenricoqueesutilizadoporlasdosvistas.Estecdigosellama parcial(partial)ysedefineiniciandoelnombredelarchivoconelsmbolo_. _form.html.erb:
#_form.html.erb <p> <%=f.label:num_serie%><br/> <%=f.text_field:num_serie%> </p> <p> <%=f.label:placa%><br/> <%=f.text_field:placa%> </p> <p> <%=f.label:modelo_id%><br/> <%=select("activo","modelo_id",Modelo.find(:all).collect{|c|[c.nombre_modelo,c.id]})%>
56
<%=link_to'Crearmodelo',new_modelo_path,:popup=>true%></p> </p> <p> <%=f.label:estado_id%><br/> <%=select("activo","estado_id",Estado.find(:all).collect{|c|[c.nombre,c.id]})%> </p> <p> <%=f.submitlabel_text%> </p> <p><label
Estecdigoseencargadedesplegarelformularioparacreacinyedicindelosactivos. Primerodespliegauncamposdetextoparaingresarelnmerodeserieydeplaca.Luegocreaun listadesplegableconlalistadelosmodelosexistentesydelosestadosrespectivamente.Finalmente secreanunbotnparaenviarlosdatos. Cabedestacarqueloscdigosquesepresentanentrelasllaves<%=%>,correspondena cdigosenlenguajeRuby. En los archivos new.html.erb y edit.html.erb se especifica que se utiliza el anterior cdigoysepasacomovariableelnombredelbotn,yaqueestaeslanicadiferenciaentrelas pginasdecrearydeeditar. new.html.erb:
<h1>Nuevoactivo</h1> <%form_for(@activo)do|f|%> <%=f.error_messages%> <%=render:partial=>"form",:locals=>{:f=>f,:label_text=>"Crear"}%> <%end%> <%=link_to'Atrs',activos_path%>
edit.html.erb:
<h1>Editaractivo</h1> <%form_for(@activo)do|f|%> <%=f.error_messages%> <%=render:partial=>"form",:locals=>{:f=>f,:label_text=>"Actualizar"}%> <%end%> <%=link_to'Ver',@activo%>| <%=link_to'Atrs',activos_path%>
paramostrarelcontenidoactualdelestadoqueseestaeditando. Elresultadodeestoesunapginacomolaquesemuestraacontinuacin:
58
<%=h@activo.placa%> </p>
Ahorasemuestraunencabezadoparaelnmerodeserieylaplacadelactivo,desplegandoluegoel valordeesavariablequesellamamediantelasentencia@activo.placa.
<p> <b>Modelo:</b> <%=h@activo.modelo.nombre_modelo%> </p> <p> <b>Estado:</b> <%=h@activo.estado.nombre%> </p>
59
Figura4.Vistaparaedicindeactivo. Laltimavistaparalosactivoscorrespondealadelistarlosactivos.Enestaselistanuna seriedeactivossegnlosparmetrosquesehayanespecificado.Lalistapuedeserparaunamarca especfica para un estado determinado o simplemente puede ser una lista de activos que correspondanaunparmetrodebsquedaingresadoporelusuario. Index.html.erb:
<%form_tag({:controller=>'activos',:action=>'index'},:method=>'get')do%> <%=text_field_tag"q",params[:q]||'#deserieoplaca'%> <%=submit_tag"Buscar!"%> <%end%>
Inicialmentesecreauncampodetextoparabsquedasigualalcomentadoenelcasodeel archivodemostrar.
<%ifparams[:modelo_id].nil?andparams[:estado_id].nil?%> <h1>Listadeactivos</h1> <%elseifparams[:modelo_id].nil?%> <h1>Listadeactivosenestado"<%=hEstado.find(params[:estado_id]).nombre%>"</h1> <%else%> <h1>Listadeactivosparaelmodelo"<%=hModelo.find(params[:modelo_id]).nombre_modelo%>"</h1> <%end%> <%end%>
60
parmetroespecfico.SinoexistensedespliegasimplementeelmensajeListadeactivos.
<tableborder="1"> <tr> <th>Numserie</th> <th>Placa</th> <th>Modelo</th> <th>Descripcin</th> <th>Estado</th> <th>Marca</th> </tr>
Secreaahoraunatablayelnombredesuscolumnas,paracadaunodelosparmetrosdel activo.
<%foractivoin@activos%> <tr> <td><%=link_toactivo.num_serie,activo%></td> <td><%=hactivo.placa%></td> <td><%=link_to%Q{#{activo.modelo.nombre_modelo}},{:action=>'index',:modelo_id=>activo.modelo_id} %></td> <td><%=activo.modelo.descripcion%></td> <td><%=link_to%Q{#{activo.estado.nombre}},{:action=>'index',:estado_id=>activo.estado_id}%></td> <td><%= link_to %Q{#{activo.modelo.marca.nombre_marca}}, {:action => 'index', :marca_id => activo.modelo.marca_id}%></td> <%ifcurrent_user.has_role?('administrator')%> <td><%=link_to'Eliminar',activo,:confirm=>'Estseguroquedeseaeliminaresteelemento?',:method =>:delete%></td> <%end%> </tr> <%end%> </table>
seagragaunaconfirmacindeestaaccinparaevitarqueseelimineunactivoporerror.
<%=will_paginate@activos%> <br/> <%ifcurrent_user.has_role?('administrator')%> <%=link_to'Crearactivo',{:action=>'new',:modelo_id=>params[:modelo_id]}%> <%end%>
Figura5.Vistadelistadodeactivos. 7.2Vistasdelsistemadeautenticacindeusuarios. Tenemos en esta seccin las vistas para los controladores correspondientes a usuarios, cuentas,roles,sesiones,ycontraseas. Comosemencionenelcaptulodecontroladores,algunosdelosmtodoscomunesno estnpresentesenmuchosdeloscasos,debidoaquenosonnecesariosoporseguridadnofueron definidos.
62
Paralosusuariostenemoslasvistasparacrear,editar,listarymostrarusuarios. Enelcasodelistarseutilizunparcialparasepararelcdigo,demaneraqueenestese realice nicamente la parte que despliega los usuarios, mientras que el resto de la pgina se completaenelsiguientearchivo. index.html.erb(users):
<%form_tag({:controller=>'users',:action=>'index'},:method=>'get')do%> <%=text_field_tag"q",params[:q]||'BuscarUsuario'%> <%=submit_tag"Buscar!"%> <%end%>
Primeroseagregauncuadrodetextoparaingresarparmetrosdebsqueda,igualesalos mencionadosparaelcasodelosactivos.
<h2>Listadeusuarios</h2> <tableborder="1"> <tr> <th>Usuario</th> <th>Nombre</th> <th>Apellido</th> <th>Carn</th> <th>Roles</th> </tr> <%=render:partial=>'user',:collection=>@users%> </td>
Secreaunatablaconalgunosdelosparmetrosdelosusuarios.Luegoseespecificaquese debecompletarconelcdigodelparcialuser.
<%=link_to'Crear_usuario',new_user_path%>
Secrealuegounenlaceparapermitircrearnuevosusuarios. _user.html.erb:
<trclass="<%=cycle('odd','even')%>"> <td><%=link_touser.login,user_path(user)%></td> <td><%=huser.nombre%></td> <td><%=huser.apellido%></td> <td><%=huser.carne%></td> </td>
Latablasecompletaconlosdatosdelosusuarioscomosemuestraanteriormente.Notodos losdatossondesplegadosparaevitarquelatablasehagamuyanchaeincmoda.Porlotantose 63
despliegan nicamente los datos ms significativos. El resto de los datos se pueden observar presionandosobreelenlacedeelnombredeusuarioelcualdirigehacialapginademostrar dichousuario.
<%ifuser==current_user%> <td>Usuarioactual</td> <%else%> <td><%=link_to'Editarroles',user_roles_path(user)%></td> <td><%=link_to'Eliminar',user,:confirm=>'Estaseguroquedeseaeliminarelusuario?',:method=>:delete %></td> <%end%> </tr>
64
Esta forma permite el cambio de contraseas. Se despliega un cuadro te texto para la contraseavieja,luegosedespliegaunoparalacontraseanuevayotroparasuconfirmacin. Adems se despliega un texto indicando al usuario que la contrasea debe estar entre 4 y 40 caracteres.Finalmentesecolocaunbotnparaenviarlosdatos.Lavistasepresentaacontinuacin:
Figura7.Vistadeedicindecontrasea.
Losrolessoncreadosydestruidosnicamentedesdeelcdigofuente,porlotantonoexiste vistasparacrearnieditarestos.Lanicavistadisponibleparalosrolesesladelistarlosroles,la
65
Figura8.Vistadelistadoderolesasignados.
66
67
El cdigo anterior especifica el nombre que tendr la pgina en la barra de ttulo del exploradorweb.Luegoseespecificaelnombredelarchivodehojasdeestilosqueseutilizarque correspondeainventario.css.
<divid="banner"> <%=image_tag("rails.png")%> <%=@page_title||"InventariodeBodegaEIE"%> </div>
divisinseledaelidentificadorbanner.
<divid="side"> <h1>Enlaces</h1> <%iflogged_in?%> <li><%=link_to'Activos',activos_path%><br/></li> <li><%=link_to'Marcas',marcas_path%><br/></li> <li><%=link_to'Modelos',modelos_path%><br/></li> <%ifcurrent_user.has_role?('administrator')%> <li><%=link_to'Estados',estados_path%></li> <%end%> <br/><br/> <li>Loggedinas:</li> (<%=link_toh(current_user.login.capitalize),user_path(current_user)%>)<br/><br/> <%=link_to'Editarcuenta',edit_user_path(current_user)%><br/> <%=link_to'Cambiarcontrasea',change_password_path%><br/> <%=link_to'Desconectarse',logout_url%><br/> <%ifcurrent_user.has_role?('administrator')%><br/> <li><%=link_to'Administrarusuarios',users_path%></li> <%end%> <%else%> <li><%=link_to'Entrar',new_session_path%></li> <%end%><br/> </div>
69
Laltimadivisindelapginacorrespondealespaciodondesedesplieganlasvistaspara todas las acciones y contenidos de la base de datos que fueron explicadas en los apartados anteriores. Seindicaprimerounpardesentencias paraquesedesplieguen,encasodeexistir, mensajesdenotificacinodeerror.Luegomediantelasentencia<%=yield%>seindicaque sedesplieguenlainformacindelasotrasvistas. El ltimoarchivoquecompone lasvistascorrespondealarchivodehojadeestilos que permiteespecificarelformatodecadaunadelaspartesdelapgina.Enesteseespecificancolores, tiposdeletra,tamaodelasdivisionesdelapgina,alineacionesdeltextoentreotrascosas.Este archivo se encuentra en la ruta public/stylesheets y es denominado inventario.css. La explicacindeelcdigodeestearchivonoseconsideradeimportanciaporloqueseomite. Acontinuacinsemuestralaestructuradelapginatantoparaunusuarioconectadocomo paraunosinconectarse.
70
Figura10.Vistafinaldelsistemaparaunusuarioconectado.
Figura11.Vistafinaldelsistemaparaunusuariodesconectado.
71
CAPTULO8:Traducciones.
Losmensajesdeerrorquesepresentanalahoraderealizarlavalidacindelosdatosson mensajesgenricosdesplegadospor RubyonRails.Comosepuedesuponerestosmensajesestn pordefectoeningls,porloquefuenecesariorealizarunparchepararealizarlatraduccinde estosmensajes.Setradujoademslaformaenlaquesedesplieganlasfechasytiemposrestantes. Pararealizarestosecreunacarpetallamadaoverridesenlacualsealbergaronestos archivosdetraduccionesquesecomentanacontinuacin: errors.rb
moduleActiveRecord classErrors begin @@default_error_messages={ :inclusion=>"noestincluidoenlalista", :exclusion=>"estreservado", :invalid=>"noesvlido", :confirmation=>"noesunaconfirmacin", :accepted=>"debeseraceptado", :empty=>"nopuedeestarvaco", :blank=>"nopuedeestarenblanco", :too_long=>"esdemasiadolargo(mximo%dcaracteres)", :too_short=>"esdemasiadocorto(mnimo%dcaracteres)", :wrong_length=>"notienelalongitudcorrecta(deberatener%dcaracteres)", :taken=>"yaexisteenelsistema", :not_a_number=>"debeserunnmero"} end end end
72
El mdulo anterior se encarga de presentar los encabezados de los mensajes de error. CuandoexistenerroressedesplieganlosmensajesHayerroresqueimpidenguardarenelregistro yCompruebelossiguientescampos. date.rb:
require'date' classDate remove_const(:MONTHNAMES) MONTHNAMES=[nil]+%w(EneroFebreroMarzoAbrilMayoJunioJulioAgostoSeptiembreOctubreNoviembre Diciembre) remove_const(:ABBR_MONTHNAMES) ABBR_MONTHNAMES=[nil]+%w(EneFebMarAbrMayJunJulAgoSepOctNovDic) remove_const(:DAYNAMES) DAYNAMES=%w(DomingoLunesMartesMiercolesJuevesViernesSbado) remove_const(:ABBR_DAYNAMES) ABBR_DAYNAMES=%w(DomLunMarMiJueVieSb) end
Estemdulorealizaelcambioalespaoldelosnombresdelosmesesylosdas,ademsde
lasabreviacionesdelosdas.
classTime alias:strftime_nolocale:strftime defstrftime(format) format=format.dup format.gsub!(/%a/,Date::ABBR_DAYNAMES[self.wday]) format.gsub!(/%A/,Date::DAYNAMES[self.wday]) format.gsub!(/%b/,Date::ABBR_MONTHNAMES[self.mon]) format.gsub!(/%B/,Date::MONTHNAMES[self.mon]) self.strftime_nolocale(format) end end
Este mdulo cambia el formato de la fecha a un formato latino en el que se despliega primeroeldaseguidoporelmsyelao.
moduleActionView
73
moduleHelpers moduleDateHelper defdistance_of_time_in_words(from_time,to_time=0,include_seconds=false) from_time=from_time.to_timeiffrom_time.respond_to?(:to_time) to_time=to_time.to_timeifto_time.respond_to?(:to_time) distance_in_minutes=(((to_timefrom_time).abs)/60).round distance_in_seconds=((to_timefrom_time).abs).round casedistance_in_minutes when0..1 return(distance_in_minutes==0)?'menosdeunminuto':'1minuto'unlessinclude_seconds casedistance_in_seconds when0..4then'menosde5segundos' when5..9then'menosde10segundos' when10..19then'menosde20segundos' when20..39then'mediominuto' when40..59then'menosdeunminuto' else'1minuto' end when2..44then"#{distance_in_minutes}minutos" when45..89then'aprox.1hora' when90..1439then"aprox.#{(distance_in_minutes.to_f/60.0).round}horas" when1440..2879then'1da' when2880..43199then"#{(distance_in_minutes/1440).round}das" when43200..86399then'aprox.1mes' when86400..525599then"#{(distance_in_minutes/43200).round}months" when525600..1051199then'aprox.1ao' else"over#{(distance_in_minutes/525600).round}years" end end end end end
74
CAPTULO9:Pruebas.
Laspruebasrealizadasalsistemaconsistieronbsicamenteenpruebasparacomprobarla integridaddelosdatos.Ademsserealizaronalgunaspruebasparacomprobarelfuncionamiento correctodelasbsquedas. 9.1Pruebasdevalidacin. Las pruebas de validacin se realizaron para comprobar el buen funcionamiento de la validacindelosdatos.Enelcasodelosactivosseespecificoquelaplacadebaserunvalornico, esdecirquenopuedeestarregistradaanteriormenteenelsistema,estoevitaqueseingresenal sistemaequiposqueyahansidoregistradosanteriormenteporloqueseevitaladuplicacinde datos. Seintententoncesintroducirunvalordeplacayaexistente,teniendoelsiguienteresultado.
Figura12.Pruebadevalidacindeplacaexistente. Alintentaringresarunaplacayaexistenteelsistemalanzaelmensajedeerrorindicandoque la placa ya existe, adems se evita la creacin del activo. Adems se conservan los calores ingresadosporelusuariodemaneraquelospuedamodificarfcilmenteademsdecorroborarcual fueelvalorqueprodujoelerror.
75
Otrapruebadevalidacinrealizadaconsisteentratardecrearunactivoconalgunodelos camposenblanco:
Figura13.Pruebadevalidacindenmerodeserieenblanco.
76
Figura15.Pruebadevalidacindeplacanonumeral. Unavezmselsistemaindicaqueexisteunerrorenlaplacayaqueestadebeserunnmero yenlapruebaseintentingresaruncarcter. Enelcasodelosusuarioslaspruebasdevalidacinfueronsimilares,obtenindose prcticamentelosmismosresultadosporloqueesrepetitivocomentarlo. 9.2Bsquedas. Las bsquedas se habilitaron en el caso de los activos, los modelos , las marcas y los usuarios.Seprobentonceselfuncionamientodeestasencadaunodeloscasossegnelparmetro debsquedaespecificado. Enelcasodelosactivoslasbsquedassepuedenrealizarpornmerodeserieoporplaca. Elresultadodeamboscasoseselsiguiente:
Figura16.Pruebadebsquedadeactivopornmerodeserie. 77
78
CAPTULO10:Conclusionesyrecomendaciones.
10.1Conclusiones.
EldesarrollodeaplicacionesconunaherramientacomoRubyonRailsessencillodebidoa que evita al programador tener que programar cosas que ya han sido desarrolladas, permitiendo a este concentrarse realmente en las partes que son esenciales segn los requerimientosdelaaplicacinquedebedesarrollar.
Unsistemacomputarizadodebasededatosparaalmacenaractivosdebodegapermiteun manejoconfiabledelainformacin,ademsfacilitarealizarcambiosenelinventario,de manera que se puede considerar como una gran mejora con respecto a inventarios almacenadosenpapel.
79
10.2Recomendaciones.
Se podra agregar al sistema una seccin para manejo de componentes electrnicos existentesenbodega,demaneraquelosestudiantespuedaningresaralsistemayrevisarlos elementos que tienen disponibles para realizar sus laboratorios. Estos elementos como resistencias,condensadores,integrados,etcsedebenmanejarentablasdiferentes,yaqueno poseenlosmismosatributosquelosequiposyesmuydifcilllevarcontroldelacantidad existente,sinonicamentedesuexistenciaenlabodega.
Elsistemapuedecompletarseconunsistemademanejodeprstamosalosestudiantes,que permita a un estudiante reservar equipos de forma remota y al administrador llevar un registrodigitaldelosprestamosquesehanrealizado.Paraestosepuedecrearunatablaque contengalarelacinentrelosusuariosylosequiposquehansidoprestadosaestos.La modificacin de la base de datos se puede realizar fcilmente mediante migraciones de maneraquesemantengalainformacinexistenteenella.
80
BIBLIOGRAFA:
[1]KorthH.F.,Fundamentosdebasesdedatos,Segundaedicion,McGrawHill/ InteramericanadeEspaaS.A.,Mxico,1993. [2]Wikipedia.BasedeDatos,Wikipedia, http://es.wikipedia.org/wiki/Base_de_datos [3]Wikipedia.SistemasGestoresdeBasedeDatos,Wikipedia, http://es.wikipedia.org/wiki/Sistemas_gestores_de_bases_de_datos,Setiembre,2008. [4]Wise,B.Normalizacindebasesdedatosytcnicasdediseo, http://www.bulma.net/body.phtml?nIdNoticia=483,2001. [5]Wikipedia.Ruby,Wikipedia, http://es.wikipedia.org/wiki/Ruby,Setiembre,2008. [6]Wikipedia.RubyonRailsWikipedia, http://es.wikipedia.org/wiki/Ruby_on_Rails,Setiembre,2008. [7]RubyTutorial,http://rubytutorial.wikidot.com/introduccion,Junio,2008. [8]ManualdelUsuariodePostgreSQL, http://es.tldp.org/Postgresqles/web/navegable/user/user.html [9]Wikipedia.ModeloVistaControlador,Wikipedia, http://es.wikipedia.org/wiki/Modelo_Vista_Controlador,Setiembre,2008. [10]PatrnModelocontroladorvista, http://www.proactivacalidad.com/java/patrones/mvc.html,Octubre,2008. [11]JessDugarteRailsenespaol, http://jdugarte.blogspot.com/2008/04/railsenespaol.html,Abril,2008.
81