Vous êtes sur la page 1sur 91

UniversidaddeCostaRica FacultaddeIngeniera EscueladeIngenieraElctrica

IE0502ProyectoElctrico

Sistemacomputarizadoparaelmanejode inventariodebodega.

Por: FranciscoJosZumbadoAlvarez

CiudadUniversitariaRodrigoFacio Diciembredel2008

Sistemacomputarizadoparaelmanejode inventariodebodega.

Por: FranciscoJosZumbadoAlvarez

SometidoalaEscueladeIngenieraElctrica delaFacultaddeIngeniera delaUniversidaddeCostaRica comorequisitoparcialparaoptarporelgradode: BACHILLERENINGENIERAELCTRICA

AprobadoporelTribunal:

_________________________________ Ing.AndrsDazSoto ProfesorGua

_________________________________ _________________________________ Ing.RobertoRodrguezRodrguez Ing.JosFreddyRojasChavarra Profesorlector Profesorlector

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.

Seleccionarelgestordebasededatos,lenguajesdeprogramacinyherramientasquese utilizarnparaeldesarrollodelaaplicacin,utilizandocriteriostalescomorendimiento, flexibilidadyseguridad,entreotros.

Desarrollarunaaplicacinwebquepermitahacerconsultasyadministrarlabasededatos. Crearunsistemadecontroldeaccesopararestringirelaccesoaalgunasfuncionesdela basededatosasignandociertospermisosalosusuarios.

1.4Metodologa.

Seinvestigasobrebasesdedatosdelicencialibreylosdiferentesgestoresparadeterminarel gestorquemsseadecaalasnecesidadesyrequerimientosdelproyecto.

Seinvestigasobrelateoradebasesdedatosparautilizarlaeneldiseodelabasededatosa construir.

Serealizaunaentrevistaconelencargadodelabodegapararecolectarinformacinsobrelos diferentesaspectosquedebeconsiderarlabasededatosparaelinventario.

SerealizaunaentrevistaconelprofesortutorJoseFreddyRojasparaobtenerunaguaenel diseodelabasededatos.

Se disea la base de datos, tomando en cuenta la informacin recopilada y utilizando 2

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:

Redundanciaeinconsistenciadelosdatos: Laredundanciapuedeaumentarelcostode almacenamientoyacceso,ademssepuedepresentarelcasodequediferentescopiasdelos datosnoconcuerdenporloquesepresentaunainconsistenciaenlosdatos,porejemplosi paraunclientedeunbancosepresentanvariasdireccionesdedomicilio.

Dificultaddeaccesoalosdatos: Cuandolacantidaddedatosesconsiderable,sepuede quererencontrarlosdatosquecumplanciertascaractersticas,locualsepuedecomplicarsi noseutilizanmtodosadecuadosyaqueseranecesariofiltrarestainformacindemanera 4

manualobiencrearunaaplicacinnuevaquehagaestetrabajo.

Aislamientodedatos: Ladiferenciadeformatosydelugaresdealmacenamientopuede provocarqueseadifcilobtenertodoslosdatosnecesarios.

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:

Estticas: Sonbasesdedatosdesololecturaquepuedeutilizarseparaalmacenardatos histricosdondelosdatosnodebenvariareneltiempo.

Dinmicas:Enestasbasesdedatoslainformacinalmacenadaesmodificadaatravsdel tiempo,demaneraqueseleagregannuevosdatosyotrossonactualizados,ademspor 5

supuestodeoperacionesdeconsulta. Segnsucontenido:

Bibliogrficas:Contienennicamentelosdatosparalalocalizacindelafuenteprimaria. Porejemplolabasededatosdeunabibliotecaquecontienelosdatosdelostextosyenque seccinsepuedelocalizarperonocontieneeldocumentoens.

De texto completo: Almacenan fuentes primarias en su totalidad por ejemplo todo contenidodediferentesedicionesdelibrosyrevistas.

Directorios:Unejemplosonlasguastelefnicas. Deinformacinbiolgica: Almacenaninformacindedatosbiolgicoscomosecuencias denucletidosyprotenas.

2.1.3Abstraccindedatos. Laabstraccindedatossepresentaen3nivelesdistintos:

Nivelfsico:Esteniveleselmsbajoydescribelaformaenquelosdatossonalmacenados fsicamente.

Nivelconceptual:Elnivelconceptualdescribecualesdatosvanaseralmacenados realmenteycualeslarelacinentreestosdatos.Enesteniveltrabajaeladministradordela basededatosqueeselquedecidelainformacinquesealmacenar.

NiveldeVisin:Elniveldevisinmuestrasolounapartedelabasededatosquepuedeser importantesegnelusuarioqueaccedaalosdatos.Desdeestenivelpuedenhabervarios puntosdevistadependiendodelusuario.

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

pueden tener ciertos datos. El administrador de la base de datos es el encargado de especificarestasrestricciones.

Implantacindelaseguridad:Sedebencumplirlosrequisitosdeseguridaddelabasede datosparaevitaraccesosnoautorizadosaestaporpartedeusuariosrestringidos.

Copiadeseguridadyrecuperacin:ElSGBDdebedetectarfallosenlabasededatoscomo problemasconeldiscodealmacenamientoydebesercapazdecrearcopiasdeseguridad paraunavezquesepresenteunfallopoderrecuperardichainformacin.

Controldeconcurrencia:Sedebecontrolarlainteraccindevariosusuariosqueactualizan labasededatossimultneamente,paraqueseconservelaconsistenciadelosdatos.

2.4Lenguajesdedefinicindedatos(DDL)[1]. Unlenguajededefinicindedatosespecificaelesquemadeunabasededatospormediode unconjuntodesentencias.Elresultadodelacompilacindeestassentenciasesunconjuntode tablasalmacenadasenunarchivollamadodiccionariodedatos. 2.5Lenguajesdemanipulacindedatos(DML)[1]. Unlenguajedemanipulacindedatospermitealosusuariosaccederymanipularlosdatos segnsuorganizacin. Puedenserdedostipos:

Procedimentales:Estosrequierenqueesusuarioespecifiquelosdatosquesonnecesitadosy dequemaneraobtenerlos.

No procedimentales: El usuario debe especificar los datos necesitados pero no como obtenerlos.

2.6Administradordebasededatos[1]. Unadministradordebasesdedatoseslapersonaquetieneelcontrolcentraldelosdatosy 10

delosprogramasqueaccedenalabasededatosoeninglsdatabaseadministrator(DBA). Losadministradoresdebasesdedatostienenvariasfuncionesentrelasqueseencuentran:

Definirelesquema. Definirlaestructuradealmacenamientoyelmtododeacceso. Modificarelesquemaylaorganizacinfsica. Concederautorizacindeaccesoalosusuarios. Especificarlasrestriccionesdeintegridaddelosdatos.

2.7Usuariosdebasededatos[1]. Existencuatrotiposdistintosdeusuariosdebasededatosquesediferencianporlaformaen queinteractanconelsistema:

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.

2.8LenguajerelacionalSQL[1][8]. EllenguajeSQLfuedesarrolladooriginalmenteporlaempresaIBMaliniciodeladecada delossetenta.Sunombresignificalenguajedeconsultaestructurado,delinglsStructuredQuery Language. Estelenguajesehaestablecidocomoellenguajerelacionaldebasededatosestndar. Poseevariaspartes: 11

Lenguajededefinicindedatos(DDL):Proporcionardenesquedefinenlosesquemasde relacin.Ademseliminanrelaciones,creanndicesymodificanlosesquemas.

LenguajeDemanipulacindedatos(DML):ElSQLincluyeunsistemadeconsultasbasado enlgebrarelacionalyclculorelacionaldetuplas.Ademssepuedeninsertar,eliminary modificartuplasenlabasededatos.

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.

Select: Estaoperacinseusaparalistarlosatributosquesedeseanenelresultadodela consulta.

From: Esta clusula lista las relaciones que se van a examinar en la ecaluacin de la expresin.

Where:Implicalosatributosdelasrelacionesqueseespecificaronconlaclusulafrom.

UnaconsultatpicaenSQLpresentalasiguienteestructura: selectA1,A2,...,An fromr1,r2,...,rm whereP DondelosAirepresentanatributosmientrasquelosirrepresentanrelaciones.AdemsPes

unpredicado. Siseomitelaclusula where sedaporunhechoqueelpredicadoPesverdadero.Para 12

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

AVG:Calculaelcostopromedio. COUNT:Haceunacuentadelosartculosquepertenecenalatabla. SUM:Calculalasumadetodoslosvalores. MIN:Calculaelvalormnimo. MAX:Calculaelvalormximo.

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')

2.8.7Definicindedatos. SQLposeevariassentenciasutilizadasparadefinirdatos.Paradefinirrelacionesseusael comandocreatetablequecreaunatablaconlosatribuutosespecificados. Lasintaxisdeestecomandoeslasiguiente: createtablenombredelatabla (atributo1,tipodelatributo1 [,atributo2,tipodelatributo2] [,...]);

14

2.8.8Tiposdedatos. SQLsoportavariostiposdedatos.Lostiposmsimportantesyutilizadossemuestrana continuacin:


INTEGER:Esunenterobinariode31bitsdeprecisinconsignodepalabracompleta. SMALLINT:Unenterobinarioconsignodemediapalabrade15bitsdeprecisin. DECIMAL(p[,q]):Esunnmerodecimalconsignoquepresentapdigitosdeprecisiny ademscontieneqdigitosaladerechadelpuntodecimal.

FLOAT:Nmerodedoblepalabraconsignoyconcomaflotante. CHAR(n):Esunacadenadecaracteresconunalongitudfijadencaracteres. VARCHAR(n):Esunacadenadecaracteresconunalongitudvariabledeunvalormximo dencaracteres.

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

ElnombredellenguajeprocededeunabromaenalusinalnombredellenguajePerl,yaque amboshacenreferenciaanombresdepiedraspreciosas. Laltimaversinestabledellenguajehastaestemomentoesla1.8.6quefuepublicadaen Diciembredel2007,mientrasqueesemismomesaparecilaversin1.9.0queesunaversinde desarrolloquepresentavariasmejoras.

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

Cuadro4.Estadosenniveldenormalizacin2. Estados EstadoId Nombre_estado

Cuadro5.Marcasenniveldenormalizacin2. Modelos Modelo_id Nombre_Modelo Descripcin Marca

Peropodemosnotarcomoenestaltimatablalamarcapuedeaplicarsetambinavarios modelosporloqueestanodependedelallaveprimariadedichatablaporloquesecreaunatabla separadaparalasmarcasyserelacionanlastablasmedianteunallavefornea,delasiguiente forma: Cuadro6.Modelosenniveldenormalizacin3.

34

Modelos Modelo_id Nombre_Modelo Descripcin Rel.Marca_id

Cuadro7.Marcasenniveldenormalizacin3. Marcas MarcaId Nombre_marca

Figura2.DiagramaERsistemademanejodeactivos. Tenemosahoracuatrotablasseparadas.Elcuartoniveldenormalizacinsedicequesedebe aplicarensituacionesenlasquesedaunarelacindevariosconvarios.Ennuestrocasonoes necesarioestenivelporlotantoseconsideraqueeltercernivelessuficienteparaquesedeun manejofcilysegurodelosdatos. 4.2Basededatosparamanejodeusuarios. Lasegundapartedelabasededatoseslaqueestarelacionadaconelmanejodeusuariosdel sistema.Enestaparteseutilizunesquemasiguiendoalgunoslineamientosbrindadosporelplugin 35

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.

remember_token_expires_at:Eltiempodevencimientodelidentificador. Nombre:Elnombredelapersonaasignadaadichousuario. Apellido:Elapellidodelapersonaasignadaadichousuario. Telfono:Elnmerotelefnicodelusuario. Cdula:Lacduladeidentidaddelapersona. Carn:Encasodeserestudiantesealmacenalainformacindesucarn. Latabladerolesalmacenaelnombredelosrolesexistentesenelsistema,demaneraquesele

puedaasignardichorolaunusuarioparabrindarlepermisosespecialesaeste.Latablaposeela

36

siguienteinformacin:

Cuadro8.Tabladeroles. Roles Role_Id Rolename

Latabladepermisosalmacenalainformacindecualesusuariosestnrelacionadoscon ciertosroles,esdecir,lospermisosquecadausuarioposeeenelsistema: Cuadro9.Tabladepermisos. Permisos Permissions_Id role_Id User_Id

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

Sequierequeelvalordelaplacaseaunvalornico,yademsqueseasiempreunnmero, porloqueseindicaquesedebevalidarestedatoparacomprobarqueseaunnmero. Finalmenteseespecificaquetantoelnmerodeseriecomolaplacadebenestarpresentes, deotraformanosepermitecrearoeditarelactivo. estados.rb:


classEstado<ActiveRecord::Base has_many:activos end

Enestemodelosedefinenicamentelarelacinentrelosestadosylosactivos.Seespecifica entoncesquecadaestadotendrmuchosactivosasignados. modelo.rb:


classModelo<ActiveRecord::Base belongs_to:marca has_many:activos acts_as_ferret:fields=>[:descripcion,:nombre_modelo] end

Enestecasoseespecificquelosmodelospertenecenaunamarca.Ademscadamodelo poseevariosactivos. Paraestecasoseaplictambinelsistemadebsquedasyseespecificoqueestassepueden realizarenlacolumnadenombredelmodeloascomoensudescripcin. modelo.rb:


classMarca<ActiveRecord::Base has_many:activos,:through=>:modelos has_many:modelos acts_as_ferret:fields=>[:nombre_marca] end

Enelcasodelasmarcas,sedefinequeestastienenmuchosmodelos,ademscomocada modeloposeevariosactivos,seespecificaquecadamarcatienemuchosactivosatravsde los modelos.

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

Elmodelodelosrolesdefinenicamentequeestosposeenvariospermisosyqueademsa travsdeestospermisosposeemuchosusuarios. permissions.rb:


classPermission<ActiveRecord::Base belongs_to:user belongs_to:role end

Enelcasodelospermisossepuedenotarqueelmodeloespecificaqueestospertenecena usuariosyarolesalmismotiempo.Deestamanerasemanejaenestatablalarelacinentrelos usuariosylosroles,quedandofinalmenteunarelacindemuchoscontramuchos,yaqueunusuario 43

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

Elmtododelistarmostradoanteriormentepermiteencontrartodosloselementospresentes enlatabla,mediantelafuncinfindquetienecomoparmetro:alllocualindicaquesedeben buscartodosloselementospresentes. LassiguienteslneassonfuncionesqueutilizaRubyparadeterminarsisedebedesplegarla pginaencdigoHTMLoenXML.Estodependedelasextensionesdelosarchivoscreadosenlas vistas.MedianteestoRubygeneraautomticamenteelcdigoparadesplegarloquesedesee,enel formatoquesedecida.


defshow @estado=Estado.find(params[:id]) respond_todo|format| format.html#show.html.erb format.xml{render:xml=>@estado} 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

@estado=Estado.new respond_todo|format| format.html#new.html.erb format.xml{render:xml=>@estado} end end

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

Elmtododeeditarsimplementebuscaunelementoconelnmerodeidentificacinelegido paraagregarestosvaloresalaformademaneraqueelusuariopuedamodificarestosvalorespara realizarloscambiosquequiera.


defupdate @estado=Estado.find(params[:id]) respond_todo|format| if@estado.update_attributes(params[:estado]) flash[:notice]='Elestadofueactualizado.' format.html{redirect_to(@estado)} format.xml{head:ok} else format.html{render:action=>"edit"} format.xml{render:xml=>@estado.errors,:status=>:unprocessable_entity} end end 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

Elmtododedestruirbuscaelelementoquesedeseaeliminaratravsdesuidentificadory llamaalmtododestroyqueseencargadeeliminarlodelabasededatos.Posteriormenteenvaa lapginandicedeloselementos. Enelcasodelosactivoselmtododelistarfuemodificadodemaneraquesiseindicaun estadoounmodeloespecficosedesplieguesolamentelosactivosqueposeeneseatributo.Para estofuenecesariopasarcomoparmetroaestemtodoyaseaelidentificadordeelmodeloodeel estadosegncorresponda.Encasodequeningunodelosdosexistasedespliegantodoslosactivos existentes.


defindex ifparams[:q] query=params[:q] @activos=Activo.find_by_contents(query,:limit=>:all) else if(params[:estado_id].nil?andparams[:modelo_id].nil?) @activos=Activo.paginate:page=>params[:page],:order=>'updated_atDESC' elseifparams[:modelo_id].nil? @activos=Activo.paginate:page=>params[:page],:conditions=>["estado_id=?",params[:estado_id]] else @activos=Activo.paginate:page=>params[:page],:conditions=>["modelo_id=?",params[:modelo_id]] end end

end respond_todo|format| format.html#index.html.erb format.xml{render:xml=>@activos} end end

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]

Aligualqueenlosotroscontroladoresdiscutidos,seespecificaquesevaautilizarellayout application. Seguidamentesedefinen losfiltrosparalosusuarios.Enestecasoaunusuario normalselepermitenicamentelasaccionesdemostrar,editaryactualizar,esosiestaslas

50

podrrealizarsolosobresupropiousuario. Alusuarioadministradorselepermiteademscrear,eliminaryverusuarios. Elmtododelistaressencilloynicamenteseleagreglaverificacindeparmetrospara bsquedas.


defindex ifparams[:q] query=params[:q] @users=User.find_by_contents(query,:limit=>:all) else @users=User.find(:all) end end

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

sinembargoesteparmetroesposiblecambiarloenelmodelousers.rb. Ademssedespliegaunmensajeindicandoquesehaconectadoelusuarioalsistemayenva alapginadeiniciodelsistema,quesehaconfiguradocomolalistadeactivos.


defdestroy self.current_user.forget_meiflogged_in? cookies.delete:auth_token reset_session flash[:notice]="Sehadesconectado." redirect_back_or_default('/') end

Elmtododedestruirllamaaforget_meparaevitarqueelusuariosigasiendorecordado porelsistemaeneseequipo.Ademsborradelacachedelsistemaelidentificadorquepermite recordaralusuario.Luegodespliegaunmensajeindicandoqueelusuariohasidodesconectadodel sistemayredireccionaalarutarazdelaaplicacin. roles_controller.rb: Estecontroladorseencargaderealizarlagestinderolesparalosusuarios.Susfunciones sonlasdecrearyeliminarroles,desplegarlosrolespertenecientesaunusuarioylosrolesqueno hansidoasignadosaeste,demaneraqueeladministradorpuedaasignarestosrolesalosusuarios.


layout'application' before_filter:check_administrator_role

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

Elmtodoanteriorbuscatantoelrolcomoelusuarioysiesteusuarionoposeeelrolse procedeaasignarloyposteriormenteredireccionaalistardenuevolosrolesparaelusuario. Elmtododestruirrealizalaoperacininversadelmtodoactualizar,yaquepermitequitar unrolaunusuario:


defdestroy @user=User.find(params[:user_id]) @role=Role.find(params[:id]) if@user.has_role?(@role.rolename) @user.roles.delete(@role) end redirect_to:action=>'index' end end

Aligualqueelmtodoactualizar,estemtodobuscaelrolyelusuarioyluegoevalasiel usuarioposeeelrolparadeserasborrarlodelalistaderolesdelusuarioquesealmacenaenla tabladepermisos. accounts_controller.rb: Estecontroladorseencarganicamentederealizarlaactualizacindecontraseasdelos usuarios,yaqueesteprocesoserealizaporapartealaactualizacindelrestodelosdatosdel usuario.Debidoaesto,elnicomtodoqueposeeeseldeactualizarquesemuestraacontinuacin:


defupdate returnunlessrequest.post? ifUser.authenticate(current_user.login,params[:old_password]) if((params[:password]==params[:password_confirmation])&&!params[:password_confirmation].blank?) current_user.password_confirmation=params[:password_confirmation] current_user.password=params[:password] ifcurrent_user.save flash[:notice]="Contraseaactualizada." redirect_toroot_path#profile_url(current_user.login)

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%>

Podemosnotarcomoladiferenciaentrelosdoscdigosradicabsicamenteenelttulodela pginayenelnombredelbotn,queenuncasosepasaelparmetroCrearyeneldeeditarse pasaelparmetroActualizar.Ademsenelcasodeeditarseagregaunenlacealapginaver 57

paramostrarelcontenidoactualdelestadoqueseestaeditando. Elresultadodeestoesunapginacomolaquesemuestraacontinuacin:

Figura3.Vistaparacreacindeactivo. Otradelasvistascorrespondealademostrarqueseencargadepresentarenpantallalos valoresdelasdiferentesvariablesdeunactivoespecficocreadoanteriormente. show.html.erb:


<%form_tag({:controller=>'activos',:action=>'index'},:method=>'get')do%> <%=text_field_tag"q",params[:q]||'#deserieoplaca'%> <%=submit_tag"Buscar!"%> <%end%>

Elcdigoanterioriniciacreandouncampodetextoparaingresarlosparmetrosdeuna bsqueda.Estesecreacomounformaquellamaalmtodolistardeelcontroladordeactivos, pasndoleaesteelparmetrodelabsqueda.Ademsseincluyeuntextopordefecto#deserieo placaparaindicaralusuarioqueesossonlosparmetrosqueseutilizanparalabsqueda.


<p> <b>Numserie:</b> <%=h@activo.num_serie%> </p> <p> <b>Placa:</b>

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>

Enelcasodeelmodeloyelestadoparaelactivo,sabemosqueenlatabladeactivosse almacenanicamenteelnmerodeidentificacindeestos,medianteunallavefornea.Porlotanto paralogrardeplegarelnombredelmodeloydeelactivoesnecesariorealizarunallamadaalas herenciasdeeseactivocomoloson@activo.modeloy@activo.estadoyllamarahorasial nombredecadaunodeellosparaserdeplegado.


<%ifcurrent_user.has_role?('administrator')%> <%=link_to'Editar',edit_activo_path(@activo)%>| <%=link_to'Atras',activos_path%> <%end%>

Finalmenteseevalasielusuarioactualesadministradoryenesecasosedesplieganlos enlacesparapodereditardichoactivoyparavolveralapginaanterior. Elcdigodespliegaunapginacomolasiguiente:

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%>

Elencabezadodelapginapuedevariardependiendodeeltipodeactivosquesedespliega enlapgina,porlotantoserealizaunalgicaparadeterminarsiexistealgnparmetrodetipode modeloodeestado,paradeesamaneraespecificarenlapginaquelalistadeactivosesparadicho

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>

Lalistasellenamedianteunasentenciafordetodoslosactivosencontradosparaese parmetro. Seagregaademsunenlacealnmerodeseriedelactivodemaneraquealpresionarsobre estesedesplieguelapginadondesemuestradichoactivo. Deigualmanerasecreaunenlaceenelnombredelmodeloydeelestadodemaneraqueal presionarsobreellossellamaalmtodolistarysepasacomoparmetroelidentificadordeese parmetro.Estopermitedesplegarsolamentelosactivosquepertenezcanalmodeloseleccionadoo quetenganelestadoseleccionadosegnseaelcaso. Seincluyeademssielusuarioesadministradorunenlaceparaborrarcadaactivo,adems 61

seagragaunaconfirmacindeestaaccinparaevitarqueseelimineunactivoporerror.
<%=will_paginate@activos%> <br/> <%ifcurrent_user.has_role?('administrator')%> <%=link_to'Crearactivo',{:action=>'new',:modelo_id=>params[:modelo_id]}%> <%end%>

Finalmenteseagregaunasentenciaparaindicarquesedebedesplegarenvariaspginaslos activosparaevitarqueserecarguemucholaspginasyrealizarlabsquedadeunactivoespecfico deunamaneramscmoda.Luegoseverificasielusuarioesadministradorysiesasseincluyeun enlaceparacrearunactivoconelparmetrodelmodeloseleccionadoencasodeexistir. Finalmentelapginadesplegadaeslasiguiente:

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>

Parafinalizarlatablasecreanenlacesaeditarrolesyeliminarelusuario.Estosenlacesno sedesplieganenelcasodelusuarioactualporqueseraunerrorgraveeliminarocambiarelrolaun usuarioadministradoryaqueperderalacapacidaddeingresodenuevoalsistemaosucualidadde administrador. Estavistasepresentaacontinuacin:

Figura6.Vistadelistadodeusuarios. Lavistaeditarpermiteeditarlosdatospersonalesdeelusuario,sinembargoelcambiode contraseaslorealizaotrocontroladorporlotantoestosparmetrosnosemodificanenestavista. Lavistanuevoymostrarsonmuysimilaresalasmostradasanteriormente.Enlavista nuevosisecreaunaformaparaintroducirtodoslosdatosdelusuario,incluyendoelnombrede usuarioenelsistema(login)ylacontrasealacualtieneuncampodeconfirmacinparaevitar

64

introducirunerrorenlacontrasea. Elcambiodeunacontrasealorealizaelcontroladoraccounts_controller.rbporlotanto setieneunavistaseparadaparaesto: edit.html.erb(accounts): <%form_tagurl_for(:action=>"update")do%>


<p><labelfor="Contraseaanterior"class="block">Contraseaanterior</label><br/> <%=password_field_tag'old_password',@old_password,:size=>45%></p> <p><labelfor="Contraseanueva"class="block">Contraseanueva</label><br/> <%=password_field_tag'password',{},:size=>45%><br/> <small>Entre4y40caracteres</small></p> <p><labelfor="Confirmaciondecontraseanueva"class="block">Confirmaciondecontraseanueva</label><br/> <%=password_field_tag'password_confirmation',{},:size=>45%></p> <%=submit_tag'Cambiarcontrasea'%> <%end%>

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

cualpermiteverunalistadelosrolesparaunusuarioespecficoyaadiroquitarrolesaeste.Para estoseutilizporcomodidaddeprogramacinunparcialllamado_role.html.erb. _role.html.erb:


<li> <%=role.rolename%> <%if@user.has_role?(role.rolename)%> <%=link_to'Removerrol',user_role_url(:id=>role.id,:user_id=>@user.id),:method=>:delete%> <%else%> <%=link_to'Agregarrol',user_role_url(:id=>role.id,:user_id=>@user.id),:method=>:put%> <%end%> </li>

Estecdigoverificaparacadacdigosiesteestaasignadoalusuario,encuyocasoseagrega unenlacearemoverrol,sielrolnoestaasignadoalusuarioseincluyeunenlaceparaagregarel rolalusuario. index.html.erb(roles): <h2>Rolespara<%=h@user.login.capitalize%></h2>


<h3>Rolesasignados:</h3> <ul><%=render:partial=>'role',:collection=>@user.roles%></ul> <h3>Rolesdisponibles:</h3> <ul><%=render:partial=>'role',:collection=>(@all_roles@user.roles)%></ul>

Elcdigoanteriormuestraelnombredelusuarioparaelcualseestandesplegandolosroles, luegomuestraporseparadolosrolesasignadosalusuarioy losrolesdisponiblesdelasiguiente manera:

Figura8.Vistadelistadoderolesasignados.

66

Figura9.Vistadelistadoderolesnoasignados. Lavistaparacrearunasesincorrespondealaformadeingresoalsistemadondesele solicitaalusuariosunombredeusuarioysucontraseaparapoderconectarsealsistema. Elarchivopresentaestaforma:


<center><h1>Introduzcasunombredeusuarioycontrasea</h1> <%form_tagsession_pathdo%> <p><labelfor="login">Usuario</label><br/> <%=text_field_tag'login'%></p> <p><labelfor="password">Contrasea</label><br/> <%=password_field_tag'password'%></p> <p><labelfor="remember_me">Rememberme:</label> <%=check_box_tag'Recordarmeenesteequipo'%></p> <p><%=submit_tag'Entrar'%></center> <%end%>

Comopodemosversemuestrainicialmenteunencabezadoindicandoquesedebeingresarel nombredeusuarioylacontrasea,Luegoseagregandoscamposdetextoparaelnombrede usuarioylacontrasea.

67

Ademsseproporcionalaopcindeserrecordadoenelequipomedianteunacasillade verificacin. Finalmenteseagregaunbotnparaenviarlosdatoseingresaralsistemaencasodequesean correctos.

7.3Plantillagenricaparavistas. Lasvistasdelosapartadosanterioressirvenparadesplegarlosdatosdelabasededatosy realizarcambiosenesta.Otrapartedelasvistaspermitedarleunaspectomsestticoalapgina, mientrasqueproporcionaalgunosmensparamovilizarsefcilmenteentrepginas.Estaplantilla permitecrearencabezadosalapgina,ascomobarraslateralesentreotrascosas. Laplantillacreadaparaelproyectocontieneunencabezadoconelttulodelsistemayuna barralateraldondesepuedenavegaratravsdelasdiferentespginasdelaaplicacin. application.html.erb:


<title>SistemadeinventarioEIE</title> <%=stylesheet_link_tag'inventario'%> </head> <bodyid="inventario">

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>

Secrealaprimeradivisindelapgina.Estacorrespondeaelencabezadodelapgina.En esteseagregaunaimagenconelsmbolodeelframeworkutilizado.Despusseagregauntextoque harlasdettulodelaaplicacin.SeseleccionocomottuloInventariodeBodegaEIE.Aesta 68

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>

Lasegundadivisincorrespondealabarralateralyesdenominadaside.Estacontieneel menquepermitealosusuariosseleccionarlaspaginasdeseadas. Seevalasiunusuarioestaconectado.Siloestasedespliegaenelmenlosenlacespara veractivos,marcasymodelos.Siademselusuarioesadministradorseagregaelenlacedeestados. Luegosedespliegaelnombredelusuarioconectadoascomoenlacesparaeditarcuenta, cambiarcontraseaydesconectarsedelsistema.Unavezmssielusuarioesadministradorse agregalaopcindeadministrarusuarios. Enelcasoenqueelusuarionoesteconectadoalsistemasimplementesedespliegaun enlaceaEntrarqueenvaalapginadeconexinalsistema.


<divid="main"> <%ifflash[:notice]%> <%="<divclass='notices'>"+flash[:notice]+"</div>"%> <%end%> <%ifflash[:error]%>

69

<%="<divclass='error'>"+flash[:error]+"</div>"%> <%end%> <%=yield%> </div> </div>

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

Elmduloanteriormodificalaclaseerrorsqueseencargademanejarlosmensajesde errorparadiferentessituaciones.Sepuedeobservarcomosepresentancambiosendiferentestipos deerror,comoelcasodequeunvalorseainvlido,quenopuedeestarvacooquelalongitudno estaenelrangopermitido.


moduleActionView#nodoc moduleHelpers moduleActiveRecordHelper deferror_messages_for(object_name,options={}) options=options.symbolize_keys object=instance_variable_get("@#{object_name}") unlessobject.errors.empty?

72

content_tag("div",content_tag(options[:header_tag]||"h2","Hayerroresqueimpidenguardarelregistro")+ content_tag("p","Compruebelossiguientescampos:")+ content_tag("ul",object.errors.full_messages.collect{|msg|content_tag("li",msg)}),"id"=>options[:id]|| "errorExplanation","class"=>options[:class]||"errorExplanation") end end end end end

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

Enestemdulosedefinenlasexpresionesparaloscasosdedistanciadetiempo.Sedefinen primerolasdistanciasapartirdeelnmerodesegundos,desde5segundoshasta1minuto.Luego sedefinenlasdistanciassegnlosminutos,quevandesdeunosminutoshastadistanciasdevarios aos.Paraestoseestablecenalgunosrangosenlosqueseconsideracadacondicin,porejemplo, entre45minutosy89minutosseconsideraunadistanciadeaproximadamente1hora. Finalmenteestosarchivossonincluidosenelarchivodeconfiguracinenvironment.rb. Deestamaneralaaplicacinsabequedebecargarestosarchivosalahoradecorrerelservidor,de maneraqueelparchequedefuncionando.

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.

Figura14.Pruebadevalidacindeplacaenblanco. Comoseobservasetratodedejarelnmerodeserieylaplacaenblanco.Enamboscasosel sistemanotificelerrorindicandolacasillaquedebetenerunvalor. Laltimapruebaparalosactivosconsisteenconsiderarunnmerodeplacaquecontenga caracteresdiferentesanmeros.Estodebidoaquesesuponequelosnmerosdeplacadebenser estrictamentenumricos.Lasiguientefiguramuestraelresultado:

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

Figura17.Pruebadebsquedadeactivoporplaca. Seobservacomolosresultadoscoincidenconlabsquedarealizadaenlosdoscasos. Ademsseprobutilizandoletrasmaysculasyminsculasysedeterminoquelasbsquedasno sonsensitivasamaysculasyminsculaslocualessatisfactorioyaquesedeseaquesedetectenla mayorcantidaddeelementosconcadabsqueda,coincidentesconelparmetro. Laspruebasdebsquedarealizadasparaelcasodelasmarcas,modelosyusuariostuvieron resultadossimilares,porloquefueronmuysatisfactorias.

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.

Elpatrnmodelovistacontroladorpermiteunmayorordenyunaindependenciaentrelas partesdelaaplicacin,brindandoacadaunadeellasunafuncinespecificadiferentealas funcionesdelasotraspartesdelprograma.Ademspermitequeelentendimientodelcdigo seamssencillo.

Unsistemacomputarizadodebasededatosparaalmacenaractivosdebodegapermiteun manejoconfiabledelainformacin,ademsfacilitarealizarcambiosenelinventario,de manera que se puede considerar como una gran mejora con respecto a inventarios almacenadosenpapel.

Laspruebasrealizadasalsistemafueronsatisfactoriasporloquesepuedeconfiarenel funcionamientocorrectodelsistema.Lavalidacindelosdatoseslacorrecta,ypuedeser modificadasegnlasdirectivasdeseadasporelencargadodebodegaquevaautilizarel sistema.

Elsistemadesarrolladocumplecontodaslasespecificacionesyrequerimientosquefueron solicitadosporloquesepuedeutilizarparasustituirelsistemaactualdealmacenamientode informacin de inventario de la bodega de la Escuela de Ingeniera Elctrica de la UniversidaddeCostaRica.

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