Professional Documents
Culture Documents
2010 (ASP.NET) Y
SQL SERVER
MICROSOFT VISUAL 2010
(ASP.NET) Y
SQL SERVER
FREDYS A. SIMANCA H.
Ingeniero de Sistemas con nfasis en Telecomunicaciones
Especialista en Redes de Telecomunicaciones
Especialista en Multimedia para la Docencia
Magster en Informtica Aplicada a la Educacin.
FABIAN BLANCO GARRIDO.
Ingeniero de Sistemas
Especialista en Redes de Telecomunicaciones
Especialista en Multimedia para la Docencia
Magster en Informtica Aplicada a la Educacin.
Magster en Telemtica.
Microsoft Visual Studio 2010 (ASP.NET) y SQL Server
Fredys A. Simanca Herrera Fabin Blanco Garrido
Los autores han intentado a lo largo de este libro distinguir las marcas registradas, sin
intencin de infringir la marca y solo en beneficio del propietario de la misma.
Reservados todos los derechos de publicacin de este libro.
Ninguna parte de este libro puede ser reproducida, grabada en sistemas de
almacenamiento o transmitida en ninguna forma ni por cualquier procedimiento, ya
sea electrnico, mecnico, por fotocopia, magntico o por otro mtodo, sin el permiso
previo o por escrito de los autores del Copyright.
DERECHOS RESERVADOS 2013, primera edicin por Fredys A. Simanca Herrera
Fabin Blanco Garrido
Bogot D.C. Abril de 2013.
Agradecimientos
FredysAlbertoSimancaHerrera
FabinBlancoGarrido
CONTENIDO
INTRODUCCIN
1.CONCEPTOSPREVIOS 10
1.1CONTROLESDESERVIDOR 10
1.2CONTROLESDEVALIDACIN 14
1.3CONTROLESAJAX 18
1.4MASTERPAGES 22
1.4.1QusonlosMasterPages? 23
1.4.2DefinicindeunMasterPage 24
1.5WEBSERVICES 27
1.5.1CaractersticasdelosWebServices 27
1.5.2EstructuraInternadelosServiciosWeb 27
1.5.3TiposdeServiciosWeb 28
1.5.4CreacindeServiciosWebcon.NET 29
1.6CONTROLESDEINICIODESESIN 35
1.7CONEXINAUNABASEDEDATOSDESQLSERVERDESDEASP.NET 53
1.7.1ProyectoSaberPro 53
1.7.2Insertarunnuevoregistro 60
1.7.3UsodelGridViewparatrabajartablas 61
1.7.4PedirconfirmacindelbotnEliminarenelGridView 64
1.7.5InsertarbotnNuevoenelGridView 67
1.7.6InsertarunDropDownListaleditarunregistro 70
1.7.7ValidacindeUsuariosyperfil 71
1.7.8EnvodeCorreodesdeASP.NET 74
1.7.9MduloEntrenadorPruebasSaberPro 75
1.7.10Seleccionaraleatoriamenteregistrosdeunatabla 77
1.7.11Mostrarunaimagendeunatablaenunagrilla 78
1.7.12ValidarDropDownListinsertadodentrodeunGridView 81
1.8ProyectoBancodeProyectosdeGrado 86
1.8.1CambiarelMasterPagedinmicamente 91
1.8.2LafuncinInsertarRegistro 94
1.8.3PedirconfirmacindelbotneliminarenelGridView 89
1.8.4MduloAdministracindereasdeInvestigacin 102
1.8.5Mduloadministracindelneasdeinvestigacin 103
1.8.6Agregarenlagrillauncampodedescripcindeotratabla 104
1.8.7SeleccionarvalordeunaceldadeunGridView 127
1.9GENERACINDEREPORTES 136
1.10GENERACINDEGRFICOS 138
2.SQLSERVER 160
2.1INTRODUCCINASQL 160
2.1.1QuesSQL? 160
2.2LASCONSULTASSIMPLES 161
2.2.1SintaxisdelaSELECT(paraconsultassimples) 161
2.2.2Ordenarlasfilas(ORDERBY) 163
2.2.3LasclusulasDISTINCT/ALL 163
2.2.4LaclusulaTOP 164
2.2.5LaclusulaWHERE 164
2.2.5Condicionesdeseleccin 166
2.2.6CaracteresComodines 168
2.3Lasconsultasmultitablas 168
2.3.1Launindetablas 169
2.3.2Lacomposicindetablas 170
2.3.3LasfuncionesdeColumna 176
2.3.4LaclusulaGROUPBY 177
2.3.5LaclusulaHAVING 178
2.4PROCEDIMIENTOSALMACENADOS 179
2.4.1CreacinProcedimientoAlmacenado(SinParmetrosDeEntrada) 180
2.4.2EjecutarUnProcedimientoAlmacenado 180
2.4.3FormaGeneraldeunProcedimientoAlmacenado 180
2.4.4ModificacindeunProcedimientoAlmacenado 181
2.5TRIGGERSENTRANSACTSQL 189
2.5.1LosDesencadenadoresDML 189
2.5.2LosdesencadenadoresDDL 191
2.5.3EjemploprcticodecmocrearunTriggersenTransactSQL 191
2.6TRANSACCIONESENTRANSACTSQL 198
2.6.1Transaccionesimplcitasyexplicitas 199
2.6.2Transaccionesanidadas 203
2.6.3Puntosderecuperacin(SavePoint) 203
2.6.4Ejerciciodetransacciones 205
2.7FUNCIONESENTRANSACTSQL 208
2.7.1FuncinEscalar 208
2.7.2Funcionesconvaloresdetabladevariasinstrucciones 210
2.7.3Funcionesconvaloresdetablaenlnea 211
2.8CURSORESENTRANSACTSQL 213
2.8.1VentajasdelosCursores 213
2.8.2EstructuradeunCursor 213
2.8.3AsignacinyAsociacindeCursores 226
2.8.4ProcedimientosAlmacenadosyCursores 226
2.9SQLDINMICOENTRANSACTSQL 227
2.10CERTIFICADOSDIGITALES 231
2.10.1FirmaDigital 235
2.10.2UtilizarCertificadosDigitalesDesde.NET 236
2.10.3Consultarlainformacindelcertificadoysusextensiones 239
2.10.4EncriptacinyDesencriptacinUtilizandounCertificado 241
INTRODUCCIN
Hoy en da las capacidades de comunicacin, el trabajo en grupo y los
conocimientos tcnicos, son iniciativas que apoyan a la adaptacin de nuestro pas a
las nuevas tecnologas de aprendizaje, es por ello que se pretende con este material
de clase apoyar el desarrollo de stas capacidades.
Este libro se presenta como el resultado de la experiencia que se ha desarrollado en la
asignatura Electiva Profesional VI (ASP.NET SQL Server) en la Universidad Libre y
al desarrollo de proyectos en el sector empresarial.
Con esta recopilacin de apuntes se busca que los estudiantes conozcan los controles
ms utilizados en ASP.NET, como tambin realizar las operaciones bsicas de las
bases de datos: crear, modificar y borrar tablas, actualizar datos, seleccionar datos de
una tabla, establecer relaciones entre tablas para la seleccin de dos o ms tablas y
realizar consultas avanzadas de bases de datos desde ASP.NET, conocer la
conceptualizacin de los Servicios Web, procedimientos almacenados, funciones con
Transact SQL, Triggers, Transacciones en Transact SQL y Cursores.
A medida que se va siguiendo el material se encontraran ejemplos prcticos buscando
con ello aclarar los conceptos tericos aplicando la prctica, y a su vez sean referentes
para ser aplicados en otros proyectos de ambientes laborales, tomando como base las
situaciones planteadas en los ejercicios que se encuentran en el presente libro.
Los Autores
10
1.CONCEPTOSPREVIOS
1.1CONTROLESDESERVIDOR
DropDownList1.Permitealosusuariosrealizarunaseleccinenunalistadesplegabledeseleccinnica.
Lalistadesplegablepuedecontenercualquiernmerodeelementos.
Utilice el control DropDownList para crear un control de lista desplegable de seleccin nica. Para
controlar la apariencia del control DropDownList, establezca el valor de las propiedades BorderColor,
BorderStyleyBorderWidth.
ParaespecificarloselementosquevanafigurarenelcontrolDropDownList,coloqueunelementoListItem
porcadaentradaentrelasetiquetasdeaperturaydecierredelcontrolDropDownList.
ElcontrolDropDownListtambinadmiteelenlacededatos.Paraenlazarelcontrolaunorigendedatos,
cree primero un origen de datos, como una lista ArrayList, que contenga los elementos que se van a
mostrarenelcontrol.Acontinuacin,utiliceelmtodoDataBindparaenlazarelorigendedatosalcontrol
DropDownList. Utilice las propiedades DataTextField y DataValueField para especificar qu campo del
origendedatossevaaenlazaralaspropiedadesTextyValue,respectivamente,decadaelementodelista
delcontrol.Ahora,elcontrolDropDownListmostrarlainformacindelorigendedatos.Estaopcinla
veremosenfuncionamientocuandoutilicemoselcontrolennuestroaplicativo.
La propiedad que se tiene que tener en cuenta es la SelectedIndex para determinar mediante
programacin el ndice del elemento seleccionado por el usuario en el control DropDownList. A
continuacin,sepodrutilizarelndicepararecuperarelelementoseleccionadodelacoleccinItemsdel
control, la otra propiedad es la propiedad SelectedValue, esta nos determina el valor del elemento
seleccionado.
Ejemplo:
InserteloscontrolesqueobservaenlaimagenenunWebForms(TextBox1,Button1yDropDownList1).
Ingresemosenelbotnelcdigoqueseobservaenlaimagen.
11
Ejecutelaaplicacin(F5)eingresevaloresenelTextboxydeclicenelbotn,observeelresultado.
DeestaformaseagregantemsalDropDownListpormediodecdigo,sepuededeigualmaneraagregar
valores de manera manual, para ello, seleccione el Control, de Clic en la pestaa ( ),
seleccioneEditarElementos,yobservelasiguienteimagen.
ObservelaspropiedadesTextyValue,estassonlasdospropiedadesqueluegopodremosevaluarcuando
seseleccioneunaopcin.ClicenAceptar.
SiqueremosprogramarloseventosdelDropDownList,debemosdeactivarelHabilitarAutoPostBack.
12
InsertemosunLabel1,alfrentedelcontrolparamostrareltemseleccionado.
Elcdigoeselsiguiente:
EnestecasoelmismovalordelSelectedItemesigualalSelectedValue,editeloselementosdelControl
nuevamenteycambielapropiedadValue,cuandosetraendatosdesdeunabasededatosmuchasveces
estasdospropiedadesdebendetenervaloresdistintos,supngasequealusuarioseledeseamostrarlos
nombresdeunosclientes,perointernamenteelvalorquenosinteresaeselnmerodedocumentodel
cliente,perocomonuestrousuarionosesabelosnmerosdedocumentosloqueseledebedemostrar
a l, son los nombres. El siguiente cdigo nos agrega opciones diferentes a text como a value, tiene la
mismafuncionalidadcuandosedeseahacerconbasededatos.
ListBox.ElcomponenteListBoxtieneelmismocomportamientoqueelcontrolDropDownList.
FileUpload.Creauncontrol<inputtype=file>(queporlogeneralsemuestracomouncontroldecuadro
detextoy unbotndeexaminar) que permitealosusuariosseleccionar unarchivoparacargarloenel
servidor.
Ejemplo:EnelejemplosiguientesemuestracmocrearuncontrolFileUploadqueguardalosarchivosen
una ruta de acceso especificada en cdigo. Se llama al mtodo SaveAs para guardar el archivo en el
servidor en la ruta de acceso especificada. La aplicacin ASP.NET que contiene el ejemplo debe tener
derechos de escritura en el directorio especificado del servidor. Se puede conceder explcitamente
13
derechodeescrituraalacuentaenqueseestejecutandolaaplicacin,eneldirectorioenquesevana
guardarlosarchivoscargados.Siseprefiere,sepuedeaumentarelniveldeconfianzaqueseconcedeala
aplicacinASP.NET.
Diseeunavistacomoladelaimagen.
SeleccioneelBotn(UpLoad)yenelcdigoingreseelsiguiente:
Ejecutelaaplicacin,elresultadodebesercomoseobservaenlaimagen.
Hagamos ahora unas pequeas modificaciones para tener informacin sobre el archivo. Modifique el
cdigoydjelocomoseveenlaimagen.
14
Ejecuteyobserveloscambios.
1.2CONTROLESDEVALIDACIN
Se usan para validar los valores que se especifican en otros controles de la pgina. Los controles de
validacinrealizanlavalidacinenelcliente,elservidoroambos,segnlascapacidadesdelexploradoren
elquesemuestralapgina.Loscontrolesdevalidacinproporcionanlasventajassiguientes:
Puedeasociarunoovarioscontrolesdevalidacinacadacontrolquedeseevalidar.
Lavalidacinserealizacuandoseenvaelformulariodelapgina.
Puede especificar mediante programacin si debera realizarse la validacin, lo que resulta de
utilidadsideseaproporcionarunbotndecancelacinparaqueelusuariopuedasalirsintener
querellenarcondatosvlidostodosloscampos.
Loscontrolesdevalidacindetectanautomticamentesisedeberealizarlavalidacinenelclienteoen
elservidor.
15
RequiredFieldValidator.ElcontrolRequiredFieldValidatorseutilizaparaconvertiruncontroldeentrada
enuncampoobligatorio.Elcontroldeentradanosuperalavalidacinsielvalorquecontienenocambia
conrespectoalvalorinicialcuandoserealizlavalidacin.Estoimpidequeelusuariodejeelcontrolde
entradaasociadosinmodificar.Demanerapredeterminada,elvalorinicialesunacadenavaca(""),loque
indicaquesedebeespecificarunvalorenelcontroldeentradaparaquesuperelavalidacin.
CompareValidator.ElcontrolCompareValidatorpermitecompararelvalorespecificado porelusuario
enuncontroldeentrada(porejemplo,uncontrolTextBox)conelvalorespecificadoenotrocontrolde
entradaoconunvalorconstante.TambinsepuedeusarelcontrolCompareValidatorparadeterminarsi
el valor especificado en un control de entrada se puede convertir al tipo de datos especificado por la
propiedadType.
Especifique el control de entrada que desee validar estableciendo la propiedad ControlToValidate. Si
desea comparar un control de entrada especfico con otro control de entrada, establezca la propiedad
ControlToCompareenelnombredelcontrolquedeseecomparar.
Enlugardecompararelvalordeuncontroldeentradaconotrocontroldeentrada,sepuedecompararel
valordeuncontroldeentradaconunvalorconstante.Especifiqueelvalorconstantequevaacomparar
estableciendolapropiedadValueToCompare.
CustomValidator. El control CustomValidator permite crear un control de validacin con lgica de
validacinpersonalizada.Porejemplo,sepuedecrearuncontroldevalidacinquecompruebesielvalor
especificadoenuncuadrodetextoesunnmeropar.
Loscontrolesdevalidacinsiemprerealizanlacomprobacindevalidacinenelservidor.Tambintienen
unaimplementacincompletaenelclientequepermitealosexploradorescompatiblesconDHTML(como
MicrosoftInternetExplorer4.0posterior)realizarlavalidacinenelcliente.Lavalidacinenelcliente
mejoraelprocesodevalidacinyaquesecompruebanlosdatosproporcionadosporelusuarioantesde
enviarlos al servidor. De este modo se pueden detectar los errores en el cliente antes de enviar el
formularioyseevitalaaccindeidayvueltadelainformacinnecesariaparalavalidacinenelservidor.
Para crear una funcin de validacin de servidor, proporcione un controlador para el evento
ServerValidatequerealizalavalidacin.Sepuedeobteneraccesoalacadenadelcontroldeentradaque
se va a validar utilizando la propiedad Value del objeto ServerValidateEventArgs que se pasa al
controlador de eventos como parmetro. El resultado de la validacin se almacena despus en la
propiedadIsValiddelobjetoServerValidateEventArgs.
Paracrearunafuncindevalidacinenelcliente,agregueprimerolafuncindevalidacinenelservidor
que se ha descrito anteriormente. A continuacin, agregue a la pgina .aspx la funcin de script de
validacinenelcliente.
SiutilizaVisualBasic,lafuncindebetenerelsiguienteformato:
16
SubValidationFunctionName(source,arguments)
SiutilizaJScript,lafuncindebertenerlasiguienteforma:
FunctionValidationFunctionName(source,arguments)
Utilice la propiedad ClientValidationFunction para especificar el nombre de la funcin de script de
validacindeclientequeestasociadaalcontrolCustomValidator.Comolafuncindescriptseejecuta
enelcliente,debeestarenunlenguajequeelexploradordedestinoadmita,comoVisualBasicoJScript.
Aligualqueenelcasodelavalidacinenelservidor,lapropiedadValuedelparmetroargumentsobtiene
acceso al valor que se va a validar. Para devolver el resultado de la validacin, establezca la propiedad
IsValiddelparmetroarguments.
RangeValidator.ElcontrolRangeValidatorpermitecomprobarsilaentradadeunusuarioseencuentra
entreunlmiteinferioryunlmitesuperiorespecificados.Sepuedencomprobarintervalosentreparejas
denmeros,caracteresalfabticosyfechas.Loslmitesseexpresancomoconstantes.
Utilice la propiedad ControlToValidate para especificar el control de entrada que se va a validar. Las
propiedades MinimumValue y MaximumValue especifican los valores mnimo y mximo del intervalo
vlido,respectivamente.
LapropiedadTypeseutilizapara especificarel tipodedatos de losvaloresquesevanacomparar.Los
valores que se van a comparar se convierten a este tipo de datos antes de realizarse cualquier
comparacin.
RegularExpressionValidator.ElcontrolRegularExpressionValidatorseutilizaparadeterminarsielvalor
deuncontroldeentradacoincideconunpatrndefinidoporunaexpresinregular.Estetipodevalidacin
permitecomprobarsecuenciasdecaracteresprevisibles,comolasdelosnmerosdelaseguridadsocial,
lasdireccionesdecorreoelectrnico,losnmerosdetelfonoyloscdigospostales,entreotras.
ValidationSummary.ElcontrolValidationSummary permiteresumirlosmensajesdeerrordetodoslos
controlesdevalidacindeunapginaWebenunasolaubicacin.Elresumenpuedeaparecerenforma
delista,listaconvietasounnicoprrafo,enfuncindelvalordelapropiedadDisplayMode.Elmensaje
de error que se muestra en el control ValidationSummary para cada control de validacin de la pgina
vieneespecificadoporlapropiedadErrorMessagedecadacontroldevalidacin.Sinoestestablecidala
propiedadErrorMessagedelcontroldevalidacin,nosemostrarningnmensajedeerrorenelcontrol
ValidationSummarycorrespondienteadichocontroldevalidacin.Tambinsepuedeespecificarunttulo
personalizado en la seccin de encabezado del control ValidationSummary estableciendo la propiedad
HeaderText.
Vamosaverentoncesunejemplodecmofuncionanloscontrolesdevalidacin.
Descarguedeinternetoutiliceotromedioparacrearunahojadeestilo(css).
17
Copie el archivo css a la raz de su sitio web, para adjuntar la hoja de estilos a su pgina, vaya al men
contextualaFormatoAdjuntarhojadeestilos.
Seleccionelahojadeestilo,luegodeclicenAceptar.Despusdehaberadjuntadolahojadeestilohagamos
elsiguientediseo:
Ahora en vista diseo, vamos a arrastrar los siguientes controles de Validacin, tal y como se puede
observarenlafigura.
entre18y25aos.
CompareValidator ControlToValidate Elcontrolquequeremosvalidar,enestecasoes
elpassword.
ControlToCompare Elcontrolquequeremoscomparar,enestecaso
sereldeReingresePassword.
ErrorMessage Elmensajedeerrorquesequieremostrar
cuandosepresentaunerror.
RequiredFieldValidator ControlToValidator Seleccioneelcontrolelcualquierevalidar
ErrorMessage Elmensajequesequieremostrarcuandose
hapresentadounerror.
En el control ValidatorSummary no hay necesidad de estipular nada, ya que lo que hace es sacar un
resumendetodosloserrorespresentados.
Alfinaldebequedarundiseocomoelquesepuedeobservaracontinuacin.
Ejecutelaaplicacinypruebelosresultados.
1.3CONTROLESAJAX
VisualStudio2010yASP.NET3.5permiteeldiseoydesarrollodeaplicacionesconsoporteAJAX.
AJAXsonlassiglasdeAsynchronousJavaScriptAndXML,oloqueeslomismo,JavaScriptyXMLasncrono,
queenotraspalabras,eslacapacidaddelasaplicacionesWebdeestableceruncaminodecomunicacin
asncronoconelservidoryensegundoplano,paranuestrasaplicacionesweb.
Enrealidad,estatcnicatienemuchaimportanciaconaspectoscomoSOA(ServiceOrientedArchitecture)
yRIA(RichInternetApplications).
Aunque no debe haber problemas en el uso de AJAX ya que la mayora de los navegadores Web lo
soportan,hayquetenerencuentaqueexistennavegadoresWebquenosoportanAJAX.
Para crear aplicaciones AJAX en aplicaciones Web con Visual Studio 2010, disponemos de diferentes
objetosqueencontraremosdentrodelCuadrodeherramientastalycomoseindicaenlasiguienteimagen:
19
AtendiendoalCuadrodeherramientas,encontramosdiferentesobjetos
AJAX, como son el objeto ScriptManager, ScriptManagerProxy, Timer,
UpdatePanelyUpdateProgress.
A continuacin se expone un ejemplo sencillo del uso de AJAX en
aplicacionesWeb.
Partimos de una aplicacin Web ASP.NET 3.5 dentro de la cul
insertaremosdoscontrolesLabelyuncontrolButton.
LosnombresdeloscontrolesLabelsonHoraActualyMensaje.Elobjetivo
es mostrar en HoraActual la hora actual del sistema, y en Mensaje un
mensaje de texto que nos servir para indicar que el cdigo pasa por
dondequeremos.
NuestraaplicacinWebenlafasedediseotendrunaspectosimilaral
queseindicaenlasiguienteimagen:
Acontinuacin,indicaremoselcdigodenuestraaplicacinWeb:
20
Esteejemplo,mostrarunadeterminadainformacinlaprimeravezqueseejecutanuestraaplicaciny
mostrarlasiguienteinformacin:
Sipulsamoselbotn,laaplicacinrealizarunrefrescodetodalaaplicacinWebyejecutaruncamino
deidayvueltarefrescandotodoslosobjetosdelaaplicacin.Elresultadounavezejecutadoelcontrol
Buttoneselsiguiente:
Enesteprocesonoobstante,nohemosutilizadoAJAXan.
Comovemos,esteeselmecanismotradicionaldeejecutaraplicacionesWeb,concaminosdeidayvuelta
yrefrescodetodalapginawebcompleta.
ImaginemosentoncesquetenemosvariasfuentesdedatosasociadasanuestrapginaWebyquecada
vezquerefrescamos,sevuelvenalanzartodaslasaccionesdeconsultasobrelasbasesdedatos.
Enlaredse produciraungranconsumodeanchodebanda,y adems,penalizaramosseguramente al
servidorWeb.
LaideadeAJAXesladerefrescarnicamenteaquellainformacinquequeremosrefrescar.
Porlotanto,basndonosenelejemploquehemosdesarrollado,vamosavalernosdeloscontrolesAJAX
deVisualStudio2010yvamosacrearunaaplicacinquerefresquenicamenteaquellainformacinque
queremosrefrescar,ynotodalapginaWeb.
Para hacer esto, vamos a insertar primero un control ScriptManager, y posteriormente un control
UpdatePanel.EstosdoscontrolesestndentrodelgrupodecontrolesdeAJAX.
Una vez hecho esto, insertaremos los controles Button y Label de nombre Mensaje en el control
UpdatePanel.
NuestraaplicacinWebquedarenelentornodediseotalycomoseindicaacontinuacin:
21
Comoelcdigodenuestraaplicacineselmismo,acontinuacinejecutaremosnuestraaplicacinWeb:
PulsaremoselcontrolButtondenuestraaplicacinyobservaremoselresultadoobtenido,quesersimilar
alqueseindicaenlasiguienteimagen:
22
Atendiendo a los resultados, podemos deducir que mientras en el primer caso en el que no usbamos
AJAX,elresultadodelapginaweberauncaminodeidayvueltarefrescandotodalapginaweb,enel
uso de AJAX ese camino de ida y vuelta se ha reducido nicamente a aquellos controles u objetos que
hemoscolocadodentrodelcontrolUpdatePanel.
Este control acta como repositorio contenedor de aquellos controles que queremos actualizar,
permitiendoqueelrestodelaaplicacinnoquedeafectadaporestaactualizacin.
PruebeporejemplocolocandountextboxporfueradelcontrolUpdatePanelparaquenotemejorcomo
lapginanoserefrescaalmomentodedarclicsobreelbotn.
1.4MASTERPAGES
LomshabitualcuandosecreaunaaplicacinounsitioWebesquelaspginasqueloconformansean
todasbastanteparecidasoalmenosqueexistanvariosgruposdepginassimilaresqueslovaranciertos
contenidosentreellas.Porejemplo,puedehaberunacategoradepginasparamostrarartculosenel
quetodassonigualesexceptoporelcontenidodelpropioartculoensupartecentral,mientrasqueen
otrazonadelaaplicacineldiseoescompletamentediferenteperosuspginasseparecentodasentre
s.
Porejemplo,lasiguientefiguramuestracapturasdedospginaspertenecientesalportalMSDN:
23
Ejemplode
dospginassimilaresenMSDN
Ambaspginasdifierennicamenteenelcontenidoylosmensquemuestranenellateral(losbanners
dellateralsonrotativos),yconservanunaestticayunaseriedeelementosquepermanecenconstantes
entodaslaspginasdelsitio.
Tradicionalmenteparaconseguirestasimilitudentrepginashabaquecrearlasindividualmenteorecurrir
aartificiospropioscomoporejemploeldeutilizararchivosdeinclusinpararenderizarciertaspartesde
las pginas desde un mismo origen en disco. An en este ltimo caso la capacidad de modificacin era
limitadaynormalmentesereducaalascabecerasypiesdelaspginasypocoms.Enelprimerodelos
casos(retocarunaauna)cualquiercambioestticodeunsitiomedianamentegrandeerapocomenosque
unalocuraderealizar.
ApartirdeASP.NET2.0seofreceuna nuevacaractersticadestinadaapaliarestatradicionalcarencia y
permitedefinirpginascuyoaspectoyfuncionalidadderivadeunaspginasespecialescomunesllamadas
PginasprincipalesoMasterPages.
1.4.1QusonlasMasterPages?
Una Master Page proporciona una forma de definir una estructura e interfaz comn para un grupo de
pginas pertenecientes a un mismo sitio Web. Esta estructura comn se almacena en un nico archivo
independiente.Ellofacilitamuchosumantenimientopuestoque,paraactualizartodaslaspginasquelo
utilizan,bastaconeditardichoarchivo.
24
UnaMPesenrealidadcomounapginaASPXnormalquecontienecdigo,elementosHTMLycontroles
Web de servidor. Sin embargo posee una extensin diferente (.master) y utilizan una directiva <% @
master%>enlugardeunadirectiva<%@page%>.Porlodemssepuedenconsiderarprcticamente
equivalentes.Estoesimportanteporquesignificaqueyasabemostodolonecesarioparacrearlas.
Una pgina ASPX normal puede derivar su estructura a partir de una MP simplemente aadiendo un
atributoMasterPageFileasudirectivadepgina,as:
Queindicaelarchivodepginaprincipalqueseutilizarparasuestructura.
1.4.2DefinicindeunaMsterPage
ParaagregarunaMsterPageanuestroproyectoslohayqueelegireliconoPginaPrincipaleneldilogo
deagregarnuevareferenciadecualquiercarpetadelmismo:
AlabrirunaMPapareceundiseadoridnticoaldeunapginaASPXnormal.Podemosarrastrarsobresu
superficie cualquier control as como editar su HTML de la manera usual. Tambin lleva un archivo de
cdigo asociado en el que se puede responder a sus diversos eventos. La nica diferencia apreciable a
simple vista respecto a una pgina normal es que contiene por defecto un control de tipo
ContentPlaceHolder.Lasintaxisdeestecontrolesanlogaalasiguiente:
<asp: Cont ent Pl aceHol der i d=" head" r unat =" ser ver " >
</ asp: Cont ent Pl aceHol der >
25
Sunicapropiedadinteresanteesprecisamentesuidentificadoryaqueestetipodecontrolseutilizapara
marcar las posiciones en las que irn los diferentes contenidos de las pginas derivadas dentro de la
plantilladeestructuraqueesunaMasterPage.
Deestemodo,cuandounapginanormalderivedeunaMP,slosepodrintroducircdigodentrodelas
zonasdefinidasporestoscomodinesdecontenido.
CuandoaadimosunanuevapginaASPXanuestroproyectoyexistealmenosunaMasterPage,podemos
marcarunaopcinparaque,antesdecrearla,nospermitaseleccionardequMPderivar.
Paraelloagregueunanuevapgina,comosemuestraenlaimagen.
EstonosevitatenerqueescribirelatributoMasterPageFilemanualmente.
AleditarunapginaquederivadeunaMasterPageapareceelaspectoyestructuradelapginaprincipal
eneldiseador,peroslosepuedentocarlaspartescorrespondientesaloscomodinesdecontenido.
Diseemosahoralapginamaster.Puedeusarcomogualaimagenqueseveenlasiguientefigura.
Envistawebsedebedeveras:
26
EnlapginamastercambieelnombredelContentPlaceHolder:
<asp: Cont ent Pl aceHol der i d=" Det al l es" r unat =" ser ver " >
</ asp: Cont ent Pl aceHol der >
IgualmenteenlaPaginaHija.aspxmodifiquetambienlasiguientelnea:
<asp: Cont ent I D=" Cont ent 1" Cont ent Pl aceHol der I D=" Det al l es" Runat =" Ser ver " >
</ asp: Cont ent >
AhoravayamosalaPaginaHija.aspx,debeyaapareceralgocomoesto:
EscribeodiseaalgodentrodelaetiquetaDetalles,luegopresionaF5paraverelresultadodelapgina.
Deestamaneratodasnuestraspginaspuedentenerelmismodiseosinnecesidadquetengamosque
repetireldiseoencadaunadeellas.
Observelasiguienteimagenparaverlosresultados.
27
1.5WEBSERVICES
Los servicios web pretenden dar un paso ms en el desarrollo de aplicaciones para la web, ya que su
objetivoesquestaspuedanserutilizadasporotrosprogramascapacesdeprocesarlasrespuestascon
otro fin que no sea el de la presentacin de informacin en pantalla, permitiendo adems automatizar
ciertosprocesosenlawebalposibilitartransaccionesdedatossinintervencindeunusuario.
1.5.1CaractersticasdelosServiciosWeb
Losservicioswebposeenunaseriedecaractersticasqueloshacenpreferiblesaestastecnologas.Entre
ellassepuedendestacar:
Utilizacin de estndares existentes. La base de la arquitectura de servicios web la constituye el
protocoloHTTPyelestndarXML.LacomunicacinclienteservicioWebsellevaacabomedianteel
intercambiodedocumentosXMLentreambos.UtilizandoHTTPcomoprotocolodecomunicacin.
WebService
Figura1.Accesoaunserviciowebdesdeuncliente
Independenciadelaplataforma.LautilizacindeXMLcomoformatodeintercambiodeinformacin
entre el cliente y el servicio web permite que la comunicacin entre ambos pueda realizarse
independientemente de la tecnologa o lenguaje con el que tanto uno como otro estn
implementados,ascomolaplataformaenlaqueseejecuten.
Nuevos estndares abiertos.HTTPy XML constituyenla baseprincipaldelosserviciosweb.Sehan
desarrolladounaseriedetecnologasquepermitenestandarizaroperacionescomoladescripcinola
publicacindeunservicioweb.
1.5.2EstructuraInternadelosServiciosWeb
Laestructuraylacomplejidaddeunserviciowebdependendelasfuncionesarealizarydeltipodeservicio
quesetrate.Encualquiercasosepuedendistinguirdoscomponentesbsicos:
Request(XML)
Response
28
PeticinSOAP
RespuestaSOAP
Servidor
Figura2.Serviciowebcon.NET
1.5.3TiposdeServiciosWeb
Enfuncindecmovaaserprocesadalainformacinporunservicioweb,sepuedendividirestosendos
categoras:
Serviciosweborientadosamtodo
Se basan en una interaccin de tipo Invocacin Remota a Mtodo (RPC), donde el documento XML de
peticin del servicio web representa la llamada a un mtodo o procedimiento con sus respectivos
parmetros de entrada, mientras que el documento XML generado como repuesta representa el valor
devuelto por dicho mtodo. Es el caso ms sencillo de servicio web y el ms utilizado, donde cliente y
serviciosecomunicandeformaasncrona.
Serviciosweborientadosadocumento
El documento XML enviado por el cliente al servicio web es procesado por este en su totalidad. Este
procesosellevaacabodeformaasncronayelmismopuedeimplicarllamadasadiferentesmtodosy
procedimientosenloscomponentesdelservidor.
Lallamadadeestetipodeservicioswebserealizadeformaasncrona,loquesignificaqueelclientepuede
continuarsuejecucinmientraselserviciowebprocesaeldocumento.
Servicioweb
ASP.NET
ensamblad
29
1.5.4CreacindeServiciosWebcon.NET
ParacrearunserviciowebvamosaArchivo>NuevoSitioWeb
Luegoenlaventanasiguienteseleccionamoslasopcionesquesevenenlaimagen.
ClicenAceptar.PordefectocreaunmtodollamadoHelloWorld
Vamosacrearnuestropropiomtodo,elmtodoquesevahacerdeejemplosereldevolverunvector
connnmeroderegistrosdependiendodeunfiltro.
Paraellonecesitamoslaclasequenosconectaalabasededatosenelservicioweb.
Seleccionael
FrameWord3.5
SeleccionaServicioWeb
ASP.NET
30
Volvemosalserviciowebycreamoslafuncinquenosinteresa.
Estaeslatabladelacualsacaremoslosregistrosaleatorios.
31
LuegoejecutamoslaaplicacinparaellopresionamosCtrl+F5
Luegoenelnavegadorpodemosobservarqueelserviciowebseestejecutando
SiqueremosprobarelServicioWeb,declicsobreelprocedimientoeingreselosdatos.
32
ClicenInvocaryelresultadosera:
Enestecaso,sedebedetenerenlatablaunbuennmeroderegistros,sisequiereingresarparmetros
mayores.Vamosahoraaelaborarunproyectowebdelcualconsumiremoselservicioweb.
Despusdecrearelsitioweb,vamosaSitioWebAgregarReferenciaWeb
33
Nosmostraraunaventanacomolasiguiente,enURLcopielarutadelserviciowebqueestenejecucin.
ClicenelbotnContinuar,ingreseunnombredeReferenciayclicenAgregarReferencia.
Elresultadoser:
34
Ahoravamosaconsumirelservicioweb,paraelloenelarchivoDefault.aspx,diseemosunavistacomo
lasiguiente.
SeleccionamoselbotnTraerPreguntaseingresamoselsiguientecdigo.
35
Ejecutelaaplicacin,ingreselosdatosyobserveelresultado.
1.6CONTROLESDEINICIODESESIN
1. ChangePassword:Permitealosusuarioscambiarlacontrasea.Elusuariodebeproporcionarprimero
lacontraseaoriginaly,acontinuacin,crearyconfirmarlanuevacontrasea.Silacontraseaoriginal
es correcta, la contrasea de usuario se cambia a la nueva contrasea. El control tambin permite
enviarunmensajedecorreoelectrnicoacercadelanuevacontrasea.
2. CreateUserWizard: Permite crear un asistente para la creacin de nuevo usuario donde se puede
capturar la informacin necesaria para tal fin. De hecho, se requiere informacin, asimismo, de la
contrasea del usuario nuevo grupo, direccin de correo electrnico, la pregunta de seguridad y
respuesta.
3. Login: Muestra una interfaz de usuario para la autenticacin de usuarios. El control Login contiene
cuadrosdetextoparaelnombredeusuarioylacontraseayunacasilladeverificacinquepermitea
los usuarios indicar si desean que el servidor almacene su identidad mediante la suscripcin de
ASP.NETyquelosautentiqueautomticamentelaprximavezquevisitenelsitio.
4. LoginName:Permitemostrarelnombredeiniciodesesindeunusuariosiestehainiciadolasesin
mediante la suscripcin de ASP.NET. Por el contrario, si el sitio utiliza la Autenticacin de Windows
integrada,elcontrolmuestraelnombredecuentadeWindowsdelusuario.
5. LoginStatus: Este control muestra un vnculo de inicio de sesin para los usuarios que no estn
autenticadosyunvnculodecierredesesinparalosqueestnautenticados.Elvnculodeiniciode
sesin lleva al usuario a una pgina de inicio de sesin. El vnculo de cierre de sesin restablece la
identidaddelusuarioactualyloconvierteenunusuarioannimo.
6. LoginView:Permitemostrarinformacindiferentealosusuariosannimosyalosquehaniniciado
unasesin.Elcontrolmuestraunadelasdosplantillas:AnonymousTemplateoLoggedInTemplate.
En las plantillas, puede agregar marcado y controles que muestren informacin apropiada para
usuariosannimosyusuariosautenticados,respectivamente.
36
7. PasswordRecovery:Permiterecuperarlascontraseasdeusuariobasndoseenladireccindecorreo
electrnicoqueseusalcrearlacuenta.ElcontrolPasswordRecoveryenvaalusuariounmensajede
correoelectrnicoconlacontrasea.
Creamosunsitionuevo
YagregamosdosWebFormunoconelnombredeLoginyotrocreateaccount
37
AgregamosunMasterPage
AgregamosunWebFormconelnombredehomeyseleccionamoselMasterPageyotroDefault2.
38
39
VamosalformulariologinyagregamosuncontrolLoginView.
40
AgregamosjuntoalLoginViewelcontrolLogin
41
Enautoformseleccionamosunestilo
VamosapropiedadesalaopcinDestinationPageUrlseleccionamoshome
42
43
Vamos al administrador del sitio, seguridad, asistente de configuracin, vamos al paso dos seleccionar
mtododeacceso(desdeinternet)yfinalizar
AbrimoscreateaccountseleccionamoselcontrolcreateUserWizard,autoformat,despusvamosa
propiedadesopcinDestinationPageUrlseleccionamosHome
44
45
46
AhoraenelMasterPageseleccionamosloscontrolesLoginNameyLoginStatus
EnLoginStatusvamosapropiedadesaLogoutActionyseleccionamosRedirectToLoginPasteyen
LogoutPageUrlseleccionamosLogin
47
Abrimoshome.aspxeinsertamosunLoginName.
AbrimosahoraelDefault2.aspx,einsertamosigualmenteunLoginName
48
Enelhome.aspxagregamosunHyperLinkenlaspropiedadesmodificamosText:(Opciones)ynavigateUrl
seleccionamosdefault2.aspx
49
Corremosnuestraaplicacinparaverificarsipodemosregistrar.
Intenteloguearsecon
cualquierusuario
Debesalirunmensajedeerror,
comoelqueseobservaenla
imagen,declicenRegister
Ingreselosdatosdelusuarioaregistraryde
clicenCrearUsuario
Enlapropiedad
navigateURL,seleccione
Default2.aspx
50
Ahora vamos a agregar un nuevo formulario para cambiar la contrasea con el nombre
Changepassword.aspx,tengapresenteseleccionarlapginamaestra.
EnChangePassword.aspxseleccionamoselcontrolChangePassword.
EnlaspropiedadesdelChangePassword,puedemodificarelformatodevista,siaslodesea.
Listo,ahorapodrloguearseconelusuario
queacabadecrear.
51
NosdirigimosaDefault2.aspxyagregamosunHyperLinkenlaspropiedadesmodificamosText:(Cambiar
Contrasea)yenlapropiedadnavigateUrl,seleccionamoslapginaChangePasword.aspx
CreamosunnuevoWebFormlollamamosPasswordRecovery.aspx
EnlagregamoselcontrolPasswordRecovery,cambieelformatosilodesea.
52
Ahoraenlogin.aspxagregamosunHyperLinkenlaspropiedadesmodificamosText:(Olvidemi
contrasea)yenlapropiedadnavigateUrl,seleccionelapginaPasswordrecovery.aspx
Ejecutamoslaaplicacinyobservamoslosresultados.
53
1.7CONEXINAUNABASEDEDATOSDESQLSERVERDESDEASP.NET
1.7.1ProyectoSaberPro
Cree un proyecto web (usaremos cdigo C#), luego de crear el proyecto agregue una clase, observe la
imagen.
Despusdecrearlaclase,ingreseelsiguientecdigo.
EstafuncinesparartrabajarconlatablaUsuarios,sepuedeusarlamismaparatrabajarcondiferentes
tablas,tododependedelasnecesidadesquesetengaenelformularioqueseesttrabajando.
54
Agregarahoraunformulario,paratrabajarlatablallamadaTbUsuarios,enlaimagensepuedeobservar
eldiseodelatabla.
Agregamos el formulario (frmregistro.aspx), tenga presente seleccionar la opcin que dice Seleccione
pginamaestra.
Tengapresentequealmomentodecrearelproyecto,sedebitenerencuenta,primerocrearelproyecto
vaco,segundocrearunapginamaestraparaelsitioweb.
55
DisearenelWebForms,elformularioderegistrodeusuarios,verlaimagensiguiente.
Nombreloselementosdelasiguientemanera:
TxtDocumento
TxtNombres
TxtApellidos
CmbUniversidad
TxtTelefonoFijo
TxtTelefonoCelular
TxtCorreo
TxtLogin
TxtPassword
CmbPerfil
VamosahoralistarenelCmbUniversidades,lasuniversidadesqueseencuentranregistradasenlabase
dedatos.
56
Seleccioneelcombo,clicenlapestaadeladerechayElegirorigendedatos.
Enlapestaaseleccione<NuevoOrigendeDatos>
57
ClicenelBotnNuevaConexin
SeleccionarMicrosoftSQL
ServeryclicenContinuar
Ingresarelnombredelservidory
seleccionarlabasededatosyclicen
Aceptar
58
ClicenelbotnSiguiente
ClicenelbotnSiguiente
Seleccionamoslatablade
nuestrointers,enestecaso
TbUniversidadesyclicenel
botnSiguiente.
59
ClicenelbotnSiguiente
ClicenelbotnAceptar,yesta
seralavistadelformulario.
60
AhoraprocederemosaconfigurarlasopcionesdelCmbPerfilseleccioneelcombo,clicenlapestaadela
derechayclicenEditarElementos,agreguetresopcionescomosemuestraenlaimagen.ClicenAceptar.
Ejecutelaaplicacin(F5)yenlavistageneraltendralgocomoloqueseobservaenlaimagen.
1.7.2InsertarunNuevoRegistro
Vamosahoraaingresarelcdigoparaingresarunnuevoregistro,elcdigoseriaelsiguiente.
61
Ejecutelaaplicacinyobservelosresultados.
ObservelosencillodeaplicarunaclaseenC#,adicionalaellotienelaventajaquereducemuchocdigo
innecesario.
Sedebecomplementaresteformularioconalgunoscriterios,talescomolavalidacindecadaunodelos
campos,quenoseenvencamposnulos,etc.;Otracosainteresanteparaimplementaraqu,esenviarle
un correo al administrador informndole que se ha registrado un nuevo usuario, para que l revise el
usuarioyloactiveoeliminesegncorresponda.
1.7.3UsodelGridViewparatrabajartablas
El GridView es un elemento de ASP.NET que es muy til al momento de trabajar con las tablas, en las
pginassiguientesvamosavercmopodemostrabajarlo.
AgreguemosunWebFormsllamadofrmadminusuarios.aspx.
Inserteenesteformulariounatabla,conunacolumnaytresfilas,enlasegundafilainserteunGridView,
observalaimagen.
62
Vuelvaaseleccionarlagrilla,clicenlapestaayenElegirOrigendeDatos,declicenNuevoOrigende
Datos.
Seleccionelagrilla,declicenla
pestaasuperiorderecha,
seleccioneFormatoAutomtico,
seleccioneeldesuagradoyde
clicenAceptar.
63
SeleccionalaconexinqueyaestallcreadayclicenelBotnSiguiente.
Seleccionelatabla
TbUsuariosyluegode
clicenelbotn
Avanzadas,yseleccione
laopcinGenerar
instruccionesInsert,
UpdateyDeleteyde
clicenAceptar.
64
ClicenSiguienteyluegoSiguienteparafinalizarelasistente.
Elresultadoseracomoseobservaenlaimagen.
EnlastareasdeGridView,habilitarlassiguientesopciones:
Ejecutelaaplicacinyobservelosresultados.
Vamos a realizar algunas modificaciones en la grilla, para ver ms en detalle las utilidades que tiene,
empezaremosporrealizarunaconfirmacinenelbotneliminar,yaquesiprueba,estebotneliminael
registrodirectamentesinantespedirconfirmacindelusuario.
1.7.4PedirconfirmacindelbotneliminarenelGridView
Parallevaracaboelprocedimiento,seleccionelagrillaydesmarquelaopcinHabilitarEliminacin.
65
DeclicenEditarColumnas
Seleccione
ButtonFieldyclic
enelbotn
Agregar
Propiedad
ButtonTypeen
Link,Text:
Eliminarydeclic
enlaopcinque
diceConvertir
esteinformeen
TemplateField
66
Comoresultadotendremos:
Seleccionelagrilla,vayaalcdigoasp,ubiquelassiguienteslneasyhagaloscambioscorrespondientes
paraquequedecomoseubicaenelresaltadodelaimagen.
Ejecutelaaplicacinynotarqueantesdeeliminarelregistro,pideconfirmacin.
Conlosbotones
deArriba,Abajo,
silodeseaubique
elbotneliminar
desegundo(ver
imagen),Clicenel
botnAceptar.
67
1.7.5InsertarbotnnuevoenelGridView
El GridView debe tener activada sus opciones Habilitar Paginacin, Habilitar Ordenacin y Habilitar
Edicin,seleccionelaopcinEditarColumnas.
Aada un ButtonField a
la grilla y establezca su
propiedad
CommandName en
Insert. Los usuarios
podrn hacer clic en el
botn Insertar para
insertar un nuevo
registro.Enlapropiedad
Textcoloquelomismo.
Hagaclicderechoenel
GridViewyseleccioneEditar
plantillas,luegoEmptyData
Template.Arrastreysuelteun
controlDetailsView(opcin
Datos)dentrodelaplanilla,
establezcalapropiedad
DataSourceIDpara
SqlDataSource1,seleccione
HabilitarInsercin
68
EstablezcalapropiedadDefaultModeenInsertardelDetailsView1,deestamaneracuandolaplantillade
datossemuestra,aparecelistoparaingresardatos(verimagenanterior).
Ahora vaya al cdigo y escriba el siguiente cdigo en el evento RowCommand del gridView como se
muestraacontinuacin.
EnelDetailsView,eneleventoItemInserted,insertarelsiguientecdigo.
69
Ejecutelaaplicacinyhastaaquelresultadodebesercomosemuestraenlassiguientesimgenes.
Seleccione ahora el
DetailsView, y en la
pestaa tareas de
DetailsView,seleccionela
opcinEditarPlantillas.
SeleccioneFooterTemplatee
inserteunbotn,talycomo
seveenlaimagen,la
programacindelbotnser
lasiguiente:
70
Hagaloscambioscorrespondientesparaqueeltemplatequedemejorparaelingresodedatosdeparte
del usuario, tales como cambiarles el tamao a los campos de texto, en Universidad debe aparecer el
comboconlasuniversidades;Enperfil,uncombo,aligualqueenestado,queenpasswordseadeltipo
correspondiente,etc.
1.7.6InsertarenDropDownListaleditarunregistro
AhoraeditelaplantilladelGridView.
EnlasTareasdelGridView,seleccionelacolumnadeUniversidadEditItemTemplate,yallinserteun
DropDownList.
Repita el procedimiento hecho para listar las universidades en el combo, como resultado se tiene un
SqlDataSource2.SeleccioneelDropDownListyvayanapropiedades.
Seleccioneel
GridView,seleccione
laopcinEditar
Columnas,seleccione
lascolumnasenlas
cualesdeseaingresar
elDropDownList
(Universidad,Perfil),y
declicenlaopcin
ConvertirEste
Informeen
TemplateField.Clicen
Aceptarparafinalizar.
71
SeleccioneelDropDownList,yseleccioneEditarEnlacedeDatos,dejelosvalorescomoseobservanenla
imagen.
Verifiquequelas
propiedadesdel
DropDownListestn
comoseobservanenla
figura.
72
Ejecutelaaplicacinyobserveloscambios.
SerecomiendahacerlomismoconelPerfildeUsuario.
1.7.7ValidacindeUsuariosyperfil
Crear dos nuevos master pages, MasterDocente.aspx y MasterEstudiante.aspx y dos Web Pages,
frmmenudocente.aspx(CuyamasterpageserMasterDocente)yfrmmenuestudiante.aspx(Cuyamaster
pageserMasterDocente).
Abrirelcdigodondesevalidaelusuarioyhacerlasiguientemodificacin.
73
Ymodificarlaclasefunciones.
74
1.7.8EnvodeCorreodesdeASP.NET
Frmcontacto.aspx
CdigodeBotnEnviar.
Importarlalibrera
Cambiarlosdatosdeacuerdoaunacuentadeustedes,estemtododeenvodecorrespondenciausauna
autenticacin SMTP, para que funcione con una cuenta de ustedes, deben tener una cuenta con stas
caractersticas.
75
1.7.9MduloEntrenadorproyectoPruebasSaberPro
Inserteunnuevowebforms,elcualllamaremosfrmentrenador.aspx.
Enelnuevoformulariodiseeunavistacomoladelaimagen.(Inserteundropdownlist,unaGridViewy
unBoton).
La primera situacin que hay que resolver es que en el Combo solamente se deben de listar los
componentesdelaUniversidaddelestudiantequeestactualmenteloqueado.
Paraellodefinalassiguientesvariablesydentrodelpageload,ingreseelsiguientecdigo.
76
Session["NombreUsuario"]="estudiante";
Enestalnealoquesehaceesdefinirunusuariodelosquesetienenregistradoenlabasededatos,para
noestarhaciendoel procesodeloqueo,mientrassehacenlasrespectivaspruebassepuededejaresto
as.
LuegosellamaunafuncinqueloquehaceesretornarlaUniversidadalacualperteneceeseusuario.
Univ=fun.traerUniversidad(Session["NombreUsuario"].ToString());
Estalneadebedeestararrojandounerror,yaqueannohemoscreadolafuncin,comopodrnobservar
estafuncindebeestardentrodelalibrera.
Yaenmdulospasadoslahabamoshecho,mssinembargoparaaquellosquenolatengan,lapueden
copiar.
Hastaaqupuedenejecutarlaaplicacinyloquedebeestarhaciendohastaestemomentoeslistarlos
componentesdeestauniversidad.
77
Ahoraalseleccionarunodeloscomponentesdelcombo,debelistarnoslaspreguntasdeesecomponente,
delauniversidaddelusuarioloqueado.
1.7.10Seleccionaraleatoriamenteregistrosdeunatabla
SeleccioneelcomboyhabilitelaopcindeAutoPostBack,ydobleclicparacrearelprocedimiento.
NumPre=fun.traerPreguntas(Convert.ToInt16(DropDownList1.SelectedValue));
Estalneadecdigonostraeelnmerodepreguntasqueestnconfiguradasenbasededatosparaeste
componente.
Comopodrnobservarfaltalafuncinquenosretornaestevalor.
78
Ejecutelaaplicacin,elresultadodebesercomoloquesemuestraenlaimagen.
Pero,primeronoqueremosquenosmuestrelarespuestacorrectaysegundo,queremosquenosmuestre
laimagen.
1.7.11Mostrarunaimagendeunatablaenunagrilla
Paraelloseleccionelagrilla,clicenEditarColumnas.
Deseleccionalaopcin
Generarcampos
automaticamente
79
SeleccioneunoaunoycoloquedeacuerdoasucampoenlabasededatoslaPropiedadDataFielddeigual
maneramodifiquelapropiedadHeaderTextestaesparaelencabezadoquedeseacolocarlealagrilla.
Ejecutelaaplicacinhastaaquyelresultadodeberser:
Agreguecinco
BoundField
80
Ahoradebemosdemostrarlaimagen.
Paraello,seleccionelagrilla,yseleccioneAgregarnuevacolumna,configurelasiguienteventanacomose
veenlaimagen.
Ejecutelaaplicacinyelresultadoser:
81
1.7.12ValidarDropDownListinsertadodentrodeunGridView
Ahora debemos agregar una columna nueva para agregar un Combo, en el cual vamos a seleccionar la
respuestadeseadaporelusuario.
Paraelloseleccionelagrilla,seleccioneEditarColumnas,agregueunanuevaopcinydeclicenConvertir
esteinformeenTemplateField.EnHeaderText,escribaSeleccione.Clicenaceptar.
CliceneditarplantillasyenItemTemplate,elemineelLabelyagregueunDropDownList.
Seleccioneelcomboyagreguelassiguientesopciones.
82
Ejecutelaaplicacinyobservelosresultados.
Bien,ahorasedeseaquealmomentodedarleclicenenviar,nosdebeguardarunregistroenunatablade
cuantaspreguntascorrectashubieronycuantaserradas.
Peroantesdeesto,vamosamostrartemporalmenteenunalistalarespuestacorrectaylarespuestaque
estamosseleccionando,comoparairviendoelprocedimientopasoapaso.
83
Elcdigodelbotnser:
Ejecutelaaplicacin,despusdeseleccionarlasrespuestayaldarclicenelbotnenviar,enlalistadeben
aparecerlasopcionesseleccionadas.
Ahoranecesitamoslasrespuestascorrectas,paraellodebemosdevolveralmomentoenquellenamosla
grilla, tomaremos las respuestas correctas y las guardaremos en un vector. Puede ser tambin en una
cadenadetexto,separadosporalgnsignoespecial.Hagmoslousandoesteltimomtodo.
AntesdelPage_Load
publicstaticstringcadRes="";
Modifiquemoseldropdownlist1.
84
Modifiquemosahoraelbotnenviar.
Ejecutelaaplicacin,debemostrarenellistbox,lasrespuestasdelusuarioconlasrespuestascorrectas.
85
Perononosinteresamostrarestoesunagrillasinoguardarloenlabasededatos.
Latablaparaelloeslasiguiente.
Haganlasmodificacionesalcdigoparaqueestoseaposible.
Lesdejounamuestradealmenoscomosacarlascorrectasylasincorrectas.
Ahora,quesedebedehacer,grabarenlatablaestosdatosyseledebemostraralusuariounresumen,
porejemplo:
Fechadelentrenamiento: 30/10/2012
Usuario 78742034FredysSimancaHerrera
Componente Escritura
PreguntasCorrectas 5
PreguntasIncorrectas 4
Imprimir
86
1.8ProyectoBancodeProyectosdeGrado
Diseodelastablas.Hastaelmomentosedebendetenerlassiguientestablas.
Basededatos:banproyectos
Tabla:TbUsuarios
Tabla:TbProgramas
87
Tabla:TbPropuestas
Tabla:TbPropuestasEstudiantes
Tabla:TbAreasInvestigacion
Tabla:TbLineasInvestigacion
Tabla:TbFechasPropuestas
88
Hastaahoraestassonlastablas,creadas,msadelantecuandosecrearnlasquehacenfalta.
VamosahoraaldiseodelaplicativoenVisualStudio.
Creeunnuevoproyecto(banproyectos)
Insertarunpagemaster,llamadomaster.master,enestemasterpage,diseeunapresentacincomola
queseobservaenlaimagen.
Ntesequesehainsertadounmen,puededescargarunmendeinterneteinsertarlodentrodelmaster
page.
Lasopcionesdelmenson:
Inicio
InformacinGeneral
o Queselcomit
o Funciones
o Integrantes
Contctenos
Regstrese
IniciarSesin
Mas(Opcional)
Colciencias
MinisteriodeEducacin
Correodecontacto(Puedeirenelpedepgina).
89
AgregarunWebFormsllamadoDefault.aspx,elcualvaasernuestrapginaprincipal,porahorapueden
escribiralgocomoloqueseobservaenlaimagen.
Culessonlospasoslgicosaseguir?
Hacerlaautenticacindeusuarios
Disearinicialmentelainterfazdeadministrador
Haceringresosalabasededatosde:
o Programas
o reasdeInvestigacin
o LneasdeInvestigacin
o FechasdePropuestas
Estseralaideaporahora,paraeldesarrollodelproyecto.
Cambielaspropiedadesdeloscontroles.
90
Control Propiedad
TextBox1 Name:TxtLogin
TextBox2 Name:TxtPassword
Paraunmejorfuncionamiento,vamosadejartodoloquetienequeverconvariablesyconexionesala
basededatosenunaclasellamadaFunciones.cs,observelaimagen.
Elcdigodelaclase,eselqueseobservaenlaimagen.
TenerpresentequedebedehacerlasreferenciasalaslibrerasparapodertrabajarelaccesoalSQLServer
yenelnombredelservidor,alldebeirelnombrequetengaensucomputador.
Ahora nos vamos a frmlogin.aspxfrmlogin.aspx y en la siguiente imagen podr observar el cdigo del
formularioqueseincluirporahora.
LasLibreras:
Elcdigocompletodelaclasefrmlogin:
91
Lo primero que hay que hacer es insertar la referencia a la clase que acabamos de crear (Funciones),
dentro del Button1, lo que se hace es hacer la consulta que deseamos, ejecutamos la consulta, con las
respectivasvariables(DA,DT)yvalidamoselresultado,siseencuentraporlomenosconunregistroque
cumpla las condiciones dadas en la consulta, se declaran unas variables de tipo sesin, esto con el
propsitodepoderteneraccesoaestasvariablesdesdecualquierotrapartedelproyecto,ydependiendo
delperfildelusuariomostrarlasopcionesdelmen.
Ntese que se est haciendo referencia a un archivo llamado frmmenu.aspx, este archivo an no est
creado, pero antes de crearlo insertemos tres page master ms (masteradmin, masterdocente y
masterestudiante).Hagalonecesarioparaquelainterfazenlostresmasterquedeigual.
Ahorasiagreguemoselarchivofrmmenu.aspx,almomentodeagregarloseleccionecomopginamaestra
delarchivolamasteradmin.master,ejecutelaaplicacin,declicenIniciarSesinyobservelosresultados.
1.8.1CambiarelMasterPagedinmicamente.
Enelfrmmenu.aspx,ingresedosLabeleingreseelsiguientecdigo.
92
Lafuncinesparacambiarlapginamaestradelarchivodependiendodelperfildelusuarioloqueado.Y
enelpageloadsemuestraenlosdoslabellasvariablesdesesinusadasenelformularioanterior,esto
soloconelpropsitodeverqueefectivamenteestfuncionandoelmanejodevariablesdetiposesin.
Modifiquemoselmenadministradorconlassiguientesopciones(estasopcionessontemporales,sonlas
quenecesitamosporahora,esposiblequemsadelantesedebanincluirms).
Inicio
Fechas
o Fechaspropuestas
o Fechasproyectos
Revisiones
o Propuestas
o Proyectos
Parmetros
o Programas
o reasInvestigacin
o LneasInvestigacin
Seguridad
o NuevoUsuario
o AdminUsuarios
CerrarCesin
Insertarahoradosformularios,frmprogramas.aspxyfrmlogout.aspx,lavistadelproyectodebeir:
93
Eldiseodelformulariofrmprogramas.aspx.
Elcdigodelformulario.
NotequehayunafuncinllamadaInsertarRegistro,estafuncinestdentrodelaclaseFuncionessehace
deestamaneraparapoderinvocarladetodoslosformulariosdondesenecesite.
TxtPrograma
GridViewIDGrilla
94
1.8.2LafuncinInsertarRegistro:
Ahora,laideaesmostrarenlaparteinferiorenlagrillalosregistrosquesevaningresando.
Seleccionelagrilla,clicenlapestaadeladerechayElegirorigendedatosyNuevoOrigendeDatos.
SeleccioneSQL(BasedeDatos)yclickenAceptar.
95
C
l
i
c
e
n
e
l
B
o
t
N
u
e
v
a
C
o
n
e
x
i
S
e
l
e
c
c
i
o
n
a
r
M
i
c
r
o
s
o
f
t
S
Q
L
S
e
r
v
e
r
c
l
i
c
e
n
C
o
n
t
i
n
u
a
r
I
n
g
r
e
s
a
r
e
l
n
o
m
b
r
e
d
e
l
s
e
r
v
i
d
o
r
s
e
l
e
c
c
i
o
n
a
r
l
a
b
a
s
e
d
e
d
a
t
o
s
c
l
i
c
e
n
A
c
e
p
t
a
r
96
ClicenelbotnSiguiente
ClicenelbotnSiguiente
Seleccionamoslatablade
nuestrointers,eneste
casoTbProgramas,ydamos
clicenelbotnAvanzadas
97
Seleccionelaopcindela
imagenydeclicenAceptar
ClicenelbotnSiguiente
ClicenelbotnFinalizar
98
Ejecutelaaplicacinyobservelosresultados,debensercomolosquesemuestranenlaimagen.
Volvamos al diseo del formulario, seleccionamos la grilla y en las tareas de GridView, habilitar las
siguientesopciones.
Ejecutelaaplicacinyobservelosresultados.
99
Vamos a realizar algunas modificaciones en la grilla, para ver ms en detalle las utilidades que tiene,
empezaremosporrealizarunaconfirmacinenelbotneliminar,yaquesiprueba,estebotneliminael
registrodirectamentesinantespedirconfirmacindelusuario.
1.8.3PedirconfirmacindelbotneliminarenelGridView
Parallevaracaboelprocedimiento,seleccionelagrillaydesmarquelaopcinHabilitarEliminacin.
DeclicenEditarColumnas
Seleccione
ButtonFieldy
clicenelbotn
Agregar
100
Comoresultadotendremos.
Seleccionelagrilla,vayaalcdigoasp,ubiquelassiguienteslneasyhagaloscambioscorrespondientes
paraquequedecomoseubicaenelresaltadodelaimagen.
Propiedad
ButtonTypeen
Link,Text
Eliminarydeclic
enlaopcinque
diceConvertir
esteinformeen
TemplateField
Conlosbotones
deArriba,Abajo,
silodeseaubique
elbotneliminar
desegundo(ver
imagen),Clicenel
botnAceptar.
101
Ejecutelaaplicacinynotarqueantesdeeliminarelregistro,pideconfirmacin.
Muybien!Ahoravamosadevolvernosunpocoenlaejecucindelproyectoyvamosahacerelformulario
decontctenos,queestenlaparteinicialdenuestroproyecto.
Inserte un Web Forms, con el nombre de frmcontacto.aspx, recuerde seleccionar la pgina maestra
(master.master)paraesteformulario.
CdigodeBotnEnviar.
Importarlalibrera
102
Cambiarlosdatosdeacuerdoaunacuentadevalida,estemtododeenvodecorrespondenciausauna
autenticacinSMTP,paraquefuncione,debentenerunacuentaconestascaractersticas.
1.8.4MduloAdministracindereasdeInvestigacin(frmareasinvestigacion.aspx).
Este formulario es muy igual al anterior (frmprogramas), haga el siguiente diseo que observa en la
imagen.
ControlTextBox,name=TxtArea
Noolvideninsertarlalibrera.
CdigodelBotnEnviar.
103
Repitaenesteformulario,elprocedimientohechoconelformularioanterior,paraagregarunagrilla,al
finaleldiseodelformulariodebesercomoseobservaenlaimagen.
1.8.5Mduloadministracindelneasdeinvestigacin(frmlineasinvestigacion.aspx)
Paraesteformulario,elaborenelsiguientediseo.
Controles:
DropDownList:Nombre(CmbArea)
TextBox:Nombre(TxtLinea)
AliniciarelformulariolaideaesqueenelcombodereasdeInvestigacinselistelatablareas,paraello
enelpageloadingreseelsiguientecdigo.
LafuncinllenarCombo,debeirenelmismoformulario,cuyocdigoes:
104
NotequeenlafuncinllenarCombo,hayunafuncinllamadaf.consultarRegistros(),estafuncindebeir
enlaclaseFuncionesyelcdigoeselsiguiente.
CdigodelbotnCancelar
Response.Redirect("frmmenu.aspx");
CdigodelbotnEnviar
1.8.6Agregarenlagrillauncampodedescripcindeotratabla
Comoleshabacomentadoen,cuandoinsertamoslagrillaparaadministrarlatablaTbLineasInvestigacin,
enelcampo deIdArea,noerabueno mostrarlealusuariosolamenteelcdigodelrea,yaquepara el
usuario este cdigo no le dice mayor cosa, lo que podemos hacer entonces es mostrarle el cdigo y el
105
nombre del rea. Para ello repita el mismo procedimiento aplicado en las anteriores grillas, pero en la
ventanadeConfigurarlainstruccindelSelect,seleccionamoslaprimeracondicin,observelaimagen.
Ingreselossiguientescomandosparacadaunadelasopcionesqueobservaenlasimgenes.
106
Yterminenelprocedimientonormal,comoenlosanteriorescasos.
Activelassiguientesopcionesdelastareasdeldatagrid
107
Ejecutelaaplicacinyobservelosresultados.
Lavistageneraldelformulariodebequedarcomoseobservaenlaimagen.
Declicenelbotneditar,notequeenelcampodeIdArea,lagrillamuestrauncdigo(1,2,2)paraelcaso
delosregistrosquesevenenlaimagen,estonoesconvenienteparaelusuario,yaquelnotieneforma
desaberculessonloscdigosparaunadelasreas,loidealesmostrarleuncomboconlasreas.Observe
laimagenquesemuestraacontinuacin.
108
Parahaceresto,sigalossiguientespasos:
Seleccionelagrilla,cliceneditarcolumnas,seleccionelacolumnaIdAreaydeclicenConvertirInforme
enTemplateField,observelaimagen.
Vuelvaaldiseodelformularioyestavez,seleccionedentrodelasopcionesdelagrillaEditarPlantillas.
Y en tareas del grid view, seleccione EditItemTemplate, al seleccionar esta opcin debe aparecerle un
textbox,elimineeltextboxeingreseunDropDownList,observelaimagenparaunamejorgua.
109
Usandoelasistente,lleneelDropDownListconlatablaTbAreasInvestigacion,comoresultadosetieneun
SqlDataSource2.
SeleccioneelDropDownList,yseleccioneEditarEnlacedeDatos,dejelosvalorescomoseobservanenla
imagen.
Ejecutelaaplicacinypruebequetodoestfuncionando.
Hasta ahora del mdulo Administrador hemos elaborado las opciones de Programas, reas de
InvestigacinyLneasdeInvestigacin.
Para dejar este mdulo por ahora hasta aqu, inserte un formulario llamado frmlogout.aspx, ha este
formulariodebellevarnoslaopcindeCerrarSesin,yenelinserteelsiguientecdigo.
110
Esto lo que hace es que al momento en que el usuario de clic en esta opcin el cierra la sesin y se
direccionaalDefault.aspx,queeselarchivoinicialdelaaplicacin.
Porahoravamosadejardealadoelmduloadministradoryvamosalainterfazinicialeinsertemoslos
formulariosparalasopcionesquehacenfalta.
Ingrese los formularios que hacen falta (observe la imagen). Para todos ellos el master, es el
master.master
Enestepuntoledebende
hacerfaltaestos
formularios:
Frmconfirmar.aspx
Frmfunciones.aspx
Frmintegrantes.aspx
Frmqueeselcomite.aspx
Frmregistro.aspx
Yaveremosparaquees
cadaunodeellos.
111
Elformulariofrmregistroyfrmconfirmar,ladinmicadelregistroesquealmomentoenqueunusuario
ingresesusdatosalsistema,inicialmentesegrabacomounusuarioinactivoyseleenvaunlinkalcorreo
quehayaregistradoparaqueingresealaplataformayactivesucuenta.
Empecemosentoncespordisearelformulariofrmregistro.aspx
NoolvidelaconfiguracindelcomboCmbPrograma
Coloque los nombres de los controles iguales a los que se encuentran en la tabla, anteponindole tres
letrasdeltipodecontrol,puedeobservarlosnombresenel cdigoigualmente.(Txtparatextbox,Cmb
paraDropDownList,FulparaFileUpload).
ElcdigoparaelbotnIngresareselqueseobservaenlaimagen.
Lleneelcomboconla
tablaTbProgramas
usandoelasistente.
Estassonlasopciones
delCmbPerfil
112
Observebienelcdigo,interpreteloqueseesthaciendoenl.Observeporejemploquesehacreado
unafuncinllamadaenviarCorreo,estodebidoaqueestolovamosanecesitarmuchoeneltranscursode
la ejecucin del proyecto, entonces para no estar duplicando cdigo se crea la funcin, la funcin la
podemosencontrarenlaclaseFunciones.Esteeselcdigo.
113
Sitodoestfuncionandoalcorreodebellegarlaconfirmacin.Observelaimagen.
Elresultado
114
Ahoratocahacerelcdigodelformulariofrmconfirmar.aspx
Envistadiseo:
Elcdigo:
LoniconuevoqueseencuentraaqueslainstruccinRequest.QueryString,estafuncinloquehacees
tomarelvalordelavariablequehasidoenviadaporlabarradedirecciones.
115
Bien,estonosdejalisto,todoloqueeselmduloinicial,lainformacindelcomitdetrabajosdegrado
sedebedebuscaroincluiralgoall.
Qusigue?RetomarelmduloAdministrador,ycontinuarconeldesarrollodelproyecto.
ComotrabajoquedahacerlasdosopcionesdelMdulodeSeguridad.
Nuevos Usuarios. La idea aqu es hacer lo mismo que est en frmregistro.aspx pero, aqu no hay
necesidaddeenviarcorreodeconfirmacin,yaquesesuponequeelqueestcreandoestenuevousuario
eselAdministrador,porconsiguientehayqueenviaruncorreoperoinformandoalqueseestregistrando
quehasidoregistradoyculessunombredeusuarioysucontrasea.Y,estavezseleenvaellinkcon
direccionamientoalfrmlogin.aspx.
Cmosegundoatenerencuentaesqueelusuariodebequedarenestadoactivado.
En tercer lugar, en las opciones de perfiles deben aparecer los tres perfiles (Administrador, Docente y
Estudiante).
AdminUsuarios.Estaopcindelmdulo,nosdebepermitirmodificardatosalusuario,eliminarelusuario
(no se debe eliminar completamente, solo cambiar su estado a inactivo), pueden hacerlo como mejor
puedan,tenerpresentequeaquellosusuarios(estudiantes)quetenganfoto,sepuedamodificarsufoto
oeliminarlafoto.
116
Enprograma,debelistarselosprogramasqueseencuentranenlatablaTbProgramas.
Enperfil,debeaparecerlastresopcionesdeperfiles:Administrador,DocenteyEstudiante.
Enelformulariofrmadminusuarios.aspx,puedenverenvistadiseocomopodraquedar,esunaopcin,
haymltiplessoluciones.
AldarclicenelBotnBuscar,debe
mostrarmeelusuarioconeldocumento
ingresado.
117
Mdulo Administrar Fechas. La idea de esta opcin es programar las fechas de presentacin de las
propuestasyproyectosdegrado,latablaesTbFechasPropuestas,cuyodiseoes:
Eldiseodelformulario,seracomoseobservaenlasiguienteimagen.
Seeditaelregistro,siempreycuandoencuentreunacoincidenciaenlabasededatos
TbUsuarios,elcampodocumentonodebesermodificable,yaqueeslallaveprimaria,aldar
clicenActualizarseguardarloscambiosenelregistrosiloshubierayvuelvealapantalla
anterior,aldarclicenelbotnEliminar,seeliminarelregistroactual,previaconfirmacinpor
partedelusuariodelaoperacin.
Esrecomendablebuscaruncontrolpara
poderseleccionarlafecha,observela
siguienteimagen,yentipode
documento,PropuestasoProyectos
118
Elcdigodelformulario,botnEnviar
CdigodelPageLoad
Enestecasoheusado
uncontrolAJAX
Lasopcionesdelcombo
119
LafuncinllenarCombo
YelbotnCancelar
Usando el asistente como en casos anteriores, se debe llenar la grilla con la tabla TbFechasPropuesta,
comolasopcionesquesepuedenobservarenlasiguienteimagen.
QuedapendienteenelmduloAdministradorlasopcionesdeRevisarPropuestasyRevisarProyectos.
Adicionalaellosedebetenerpresentequesedebevalidarquenoesposibletenerdosfechasactivas,ya
seaparalaspropuestasoparalosproyectos.
MduloEstudiante(frmuploaddocumentos.aspx)
OpcinUploadDocumentos.Enestaopcinlaideaesquelosestudiantessubanlosdocumentos,yasea
delaspropuestasodelosdocumentos.
Latablaparaestaopcineslasiguiente:
Noolvidarvalidarel
botndelEliminar
120
TbPropuestas
TbPropuestasEstudiantes
Diseeelsiguienteformulario:
InsertarunScriptManager,yaquesevaa
usarAJAX,enelformulario,enla
siguienteimagenseexplicarcondetalle
enquemomento.
UsandoelasistentelleneelComboBox
conlatablaTbLineasInvestigacion
Sellenaporcdigocon
lafuncinllenarDirector
Laideaesquesellenanlosdatosdelapropuesta,seseleccionaelarchivo,quedebeserenformatoWord,seledaclicen
enviar,ypasoseguidoldebemostrarnoslaopcindepoderseleccionarlosestudiantesqueestnpresentandola
presentepropuesta,paraelloseagregarenotrafiladelatabla,primerounUpdatePanel(AJAX),segundounPanel,ypor
ultimounformularioyunagrilla,observelaimagen.
121
Empecemosporelcdigodelform_loaddelformulario.
PrimeroVaun
UpdatePanel
DentrodelUpdatePanel,
debeirunPanel
Diseeelformulariocomose
observaenlaimagen.
Estagrillavaenlazadaalatabla
TbPropuestasEstudiantes,perodebetraer
losdatoscomoelttulodelapropuesta,y
losnombresyapellidosdelosestudiantes.
PropiedadReadOnlyentrueo
cambiarloporunlabel.
122
Elcdigoprimerovalidaqueexistenfechasparasubirpropuestasactivas,sihayfechasactivascontinua,
casocontrario,muestraelmensaje.
LafuncinllenarDirector
CdigodelBotnEnviar
123
BotnCancelar
124
CdigodelBotnAceptar
CdigodelBotnTerminar
Hastaestemomentosedebeejecutarlaaplicacinyelresultadodebesercomoelquesemuestraenlas
imgenes.
Sellenan
losdatosy
clicenel
botn
Enviar
125
Seingresaeldocumento
delestudianteyAgregar
Esteserelresultado,
puedeagregarvarios
estudiantes.
126
Una validacin que debe ir aqu, pero que por cuestiones didcticas no se incluye, se deja como tarea
extraclasealestudianteesquenosedebepermitiringresarmsdetresestudiantesaunapropuesta.
Paraterminar,declicenelbotnTerminar.
ElprocesoparaelUpLoaddelosproyectosesigualaeste,serecomiendacrearunacarpetaparaproyectos,
haymuchasvalidacionesycontrolesquesedebendetenerpresenteenesteformulario,perosesiguen
dejandoparatrabajoextraclase.
Como ya hemos ingresado las propuestas, volvemos al perfil de administrador, para completar las dos
opcionesqueestnpendiente,RevisarPropuestasyRevisarProyectos.
OpcinPropuestas
EnlagrillasolosedebendelistarlaspropuestascuyoestadoseaRevisin,lopodemoshacerporcdigo
o por el asistente, como en pasos previos lo hemos hecho por el asistente, esta vez lo vamos a hacer
medianteelusodecdigo.
Enelpage_loadiraelsiguientecdigo.
127
Loquenosarrojacomoresultado:
Laideaahoraesaadirunbotnquenoslleveaotroformularioparaverlosdetallesdelapropuesta.
1.8.7SeleccionarvalordeunaceldadeunGridView
Seleccionamoslagrilla,editamosTareas
deGridView,enelegirorigendedatos,
seleccionamosSqlDataSource1yluego
clicenEditarColumna
DelosCampos
Disponiblesseleccione
CommandFieldy
agreguelaopcin
Seleccionar,en
Aparienciaenmicasohe
seleccionadoImage,
paracolocarunaimagen.
128
Resultado:
Enlapropiedad
InsertImageURL,
seleccionelaimagen
quedese.Clicen
Aceptar
Silaimagenhaquedadomuy
grande,puedeconvertirlacolumna
enTemplateFieldyluegoeditarla
parapodercambiareltamaodela
imagen.
VayaalaspropiedadesdelGridView
ycreeeleventoen
SelectedIndexChanged
129
Sitodovabien,elcdigohtmlseracomoseveenlaimagen.
Seleccionamos la grilla, damos doble clic sobre ella e insertamos el siguiente cdigo para probar si
efectivamentenoesttomandoelvalorquedeseamos,enestecasoelnmerodelapropuesta.
Vamosaprobarprimero,siefectivamentenosesttomandoelvalordelacolumna.
Enlapropiedad
DataKeyNamesdelagrilla
escribaoseleccione
NumeroPregunta
130
Ahora,aldarclicsobreelregistrovamosadireccionarloaotroformulario,endondevamosamostraro
editarelregistro,paraqueelrevisoringreselosdatos.
Modifiquemoselcdigo,quedaracomoseobservaenlasiguienteimagen.
LaideaesqueelComitdeGradoserene,porconsiguiente,setomaelnmerodepropuestaysegraba
enunatablalaevaluacindelcomitconlasobservacioneshechasalapropuesta.
CmbDirector
CmbEstadoAgregartems:
Revision,Aprobada,Aprobada
conCondicionesyRechazada
TxtObservacion
131
Eldiseodelatabla:TbEvaluacionPropuestas
Empecemosconelcdigodelformulario.
Cdigodelpage_load
LafuncinllenarDirector
132
FuncintraerEstudiantes
ElcdigodelbotnEnviar
RepasemoslasopcionesdelmduloAdministrador.
InicioOK
Fechas
o ProgramarFechasOK
Revisiones
o PropuestasOK
o Proyectos*
Parmetros
o ProgramasOK
o reasInvestigacinOK
o LneasInvestigacinOK
Seguridad
o NuevoUsuarioOK
o AdminUsuariosOK
CerrarCesinOK
133
*RevisionesdeProyectos,elcomportamientodeestaopcineselmismoqueparapropuestas,sedebe
listar los proyectos que estn en estado de revisin, se selecciona el que se desea, se pasa a otro
documentoyenesedocumentoseleasignanlosdosrevisoresalproyecto,elcomitdetrabajodegrado
no revisa proyectos, solamente mira la informacin del proyecto, quien es el director, etc, y asigna los
jurados.
Deberaseralgocomo:
Frmrevisarproyectos.aspx
LatablaTbProyectos
Al dar clic sobre la imagen, debe llevar a frmdetallesproyectos.aspx, al igual que en la propuesta, el
formulariodebeseralgocomoelquesemuestraacontinuacin.
Sinotanenlatablaanterior
estelNmerodePropuesta,
conestenmeropodemos
traerdelatablapropuestala
informacincorrespondiente
alproyecto,estoquieredecir
queunestudiantenopodr
ingresarproyectossinotienen
lapropuestaAprobada
CampoAutonumrico
134
EstodejaralistoelmdulodeAdministrador
LasopcionesdelmduloEstudiante.
Inicio
Documentos
UploadPropuestasOK
UpLoadProyectos
RevisionesPropuestas
RevisionesProyectos
CerrarSesin
OpcinUploadProyectos
Lavistadeldiseodelformulario.
Sedebendetenerpresentaalgunasconsideraciones,enelenvodelproyecto.
Quelestudiantequeestsubiendoelproyectotengalapropuestaaprobada
Quehayafechaabiertaparasubidadeproyectos
Queelestudiantenohayasubidoyaelproyectoparalafecha
Opcin Revisiones Propuestas. En esta opcin lo nico que se debe hacer es listar la tabla
TbEvaluacionPropuestas,tenerpresentequeelestudianteloqueadosolopuedeverlaolasevaluaciones
desupropuesta.
Opcin Revisiones Proyectos. Igualmente en esta opcin, solo se debe listar la tabla
TbEvaluacionProyectos(enelmdulodocentesemostrareldiseodelatabla),tenerencuentaqueel
estudiantesolopuedeverlaevaluacindesuproyecto.
LasopcionesdelMduloDocente
Inicio
RevisinDocumentos
Proyectos
CerrarSesin
OpcinProyectos(frmevaluacionproyectos.aspx)
135
Eldiseodelformulario.Eldocentesolopodrverlosproyectosasignadosal.
Yporltimoelformulariodondeeldebersubirelproyectoconlascorreccionesylasobservaciones.
LatablaTbEvaluacionProyectos
Frmcalificarproyectos.aspx
136
Si desea guardar el proyecto en una ruta especfica se debe dar clic en el botn ,
donde se abrir un explorador de Windows el cual corresponde a la ubicacin del directorio
como se muestra a continuacin:
138
Una vez seleccionado el directorio, se procede a digitar el nombre con el que se creara (Ej:
Reportes) y luego damos clic en el botn para crear el proyecto.
A continuacin se despliega el asistente para configurar el origen de los datos que incluiremos
en el reporte, para lo cual se selecciona la opcin Base de datos y damos clic en el botn
.
A continuacin seleccionamos la opcin Conjunto de datos y damos clic en el botn .
139
Es indispensable la conexin con la base de datos que requerimos, para ello se debe dar clic en
el botn Nueva conexin.
En la ventana de configuracin de la conexin se presenta la opcin .
En la opcin se presentan los diferentes tipos de base de datos a los cuales
podremos conectarnos segn el origen de la base de datos, en este caso conectaremos con el
Proveedor de datos de .NET Framework para SQL SERVER. Seleccionar origen de datos
(Microsoft SQL Server) y dar clic en botn .
140
Una vez seleccionado el origen de datos, seleccionamos la instancia del servidor SQL
(normalmente se instala SQL SERVER la instancia por defecto queda como
NOMBRE_EQUIPO\SQLEXPRESS).
Seleccionamos el modo Login al servidor SQL SERVER. Si es por credenciales ingresar el
usuario y el password.
Ahora bien, si ya estn los parmetros correctos en el origen de datos y la conexin con el
servidor se presentara un combo con la lista de las bases de datos de SQL SERVER,
procedemos a seleccionar la requerida.
141
Una vez ingresados todos los requisitos de configuracin del servidor a continuacin podemos
probar la conexin dando clic en el botn .
Si la conexin es satisfactoria, damos clic en el botn de la prueba de conexin y clic
en el botn de la ventana de configuracin de la nueva conexin.
(Se puede desplegar la opcin cadena de conexin para ver la cadena del datasource para la
conexin a la base de datos, como se muestra en la siguiente imagen):
142
Continuamos con el ingreso del nombre con el que se guardara la configuracin, dar clic en el
botn .
A continuacin se presenta una lista con los objetos de la base de datos entre los cuales estn
las tablas creadas en Microsoft SQL Server 2008 R2, seleccionamos la tabla que se requiera e
ingresamos el nombre del dataset y dar clic en el botn .
143
En este paso ya obtenemos el origen de datos y los objetos de la base de datos; de all
seleccionamos la tabla donde se encuentran los datos a presentar en el reporte y dar clic en el
botn .
Al dar clic en , con el anterior paso se presentara un asistente para elaborar el
informe, en este se observan los campos de la tabla que deben ser parametrizados y sern
incluidos en el informe.
144
El asistente permite adicionar funciones de SQL para presentar los datos, como se muestra en
la siguiente imagen:
Una vez seleccionados los campos que se presentan en el informe, damos clic en el botn
siguiente, se genera una vista previa del diseo, damos clic en el botn .
El asistente tiene opciones para modificar el color del estilo, una vez seleccionado dar clic en el
botn .
145
Una vez configurado el origen de datos y diseado el informe con el asistente, los controles que
se presentan en el formulario son los siguientes:
ReportViewer: este proporciona un entorno de diseo integrado para que pueda generar
definiciones de informe de cliente (.rdlc) utilizando datos de cualquier objeto de datos ADO.NET
El reportViewer tiene asociado el reporte de reporting service Report1.rdlc.
En el explorador de la solucin, encontramos el archivo Report1.rdlc.
DataSource: es la fuente de acceso a nuestro origen de datos.
146
Una vez verificado cada uno de los componentes se procede a Compilar la solucin.
El reporte se presenta de la siguiente forma:
Reporting Service: trae la opcin de exportar el informe a formato EXCEL, PDF o WORD.
El proceso se da seleccionando el formato y se guarda en un directorio.
147
Crear un procedimiento almacenado, el cual retornara la consulta de los datos que se desean
mostrar en la grfica.
Ejecutar el Procedimiento Almacenado mediante la instruccin EXEC
nombre_procedimiento, para asegurarse que la consulta sea exitosa y el resultado sea el
esperado.
Creacin de proyecto en Visual Studio 2010
Una vez que se tenga lista, por decirlo as, la capa de datos en SQL, crear un nuevo proyecto
en Visual Studio 2010. Para crear el nuevo proyecto vamos al men - - .
Seleccionamos el tipo de proyecto y le colocamos el nombre con el que se desea crear.
150
Agregar objeto reportViewer al formulario del proyecto.
Cuando ya se tiene cargado el proyecto, abrir el nuevo formulario y del cuadro de herramientas
seleccionar el objeto reportViewer. Arrstrelo a la forma para agregar dicho objeto.
Para que el objeto quede del tamao del formulario, seleccione la propiedad acoplar al
contenedor, quedar como se muestra a continuacin:
151
Agregar el origen de datos
El siguiente paso es adicionar el origen de datos, para agregar el origen de datos dar clic
derecho sobre la solucin en el explorador de soluciones, seleccione la opcin y
luego seleccione .
152
Se presentara una lista de los elementos visual C# entre los cuales se encuentra la opcin de
Datos, seleccinelo y a continuacin escoja el tipo de elemento Conjunto de datos. Ingrese el
nombre (Ej: DataSet1.xsd) y dar clic en el botn .
En el explorador de soluciones se visualizara en el despliegue de opciones un elemento
DataSet.
En el diseador del DataSet se encuentra la opcin o link de ir al Explorador de servidores, este
presentara la lista de conexiones a base de datos configurada con anterioridad.
153
Una vez se muestre la ventana del explorador de soluciones se pueden visualizar todos los
objetos de la base de datos, en este caso utilizaremos el procedimiento almacenado creado
anteriormente. Seleccionar el procedimiento almacenado y agregar objeto al diseador del
dataset.
Una vez se agrega al diseo del DataSet se visualizan los campos que retorna la ejecucin del
procedimiento almacenado.
154
En la ventana de las tareas del componente se muestra la opcin Elegir orgenes de datos.
Seleccionar.
A continuacin se presenta el DataSet y la instancia. Seleccionamos la correspondiente.
Verificar en el cdigo del formulario que el enlace de los datos este correcto.
159
Compilar proyecto
Ahora solo queda compilar el proyecto. Presione tecla F5 o de clic en el botn compilar de
Visual Studio.
Reporte generado:
El reporte ya tiene la opcin de exportar diferentes formatos como Excel, PDF o Word.
Seleccione el formato e ingrese el directorio con el nombre que se va a guardar.
160
2. SQL SERVER
2.1 INTRODUCCIN A SQL
2.1.1 Qu es SQL?
La sigla que se conoce como SQL corresponde a la expresin inglesa Structured
Query Language (entendida en espaol como Lenguaje de Consulta
Estructurado), la cual identifica a un tipo de lenguaje vinculado con la gestin de bases
de datos de carcter relacional que permite la especificacin de distintas clases de
operaciones entre stas. Gracias a la utilizacin del lgebra y de clculos relacionales,
el SQL brinda la posibilidad de realizar consultas con el objetivo de recuperar
informacin de las bases de datos de manera sencilla.
El cientfico Edgar Frank Codd (1923-2003) fue quien propuso un modelo relacional
para las bases de datos y cre un sublenguaje para acceder a los datos a partir del
clculo de predicados. En base al trabajo de Codd, IBM (International Business
Machines) defini el lenguaje conocido como Structured English Query Language
(SEQUEL).
El SEQUEL se considera el antecesor de SQL, un lenguaje de cuarta generacin que
se estandariz en 1986. La versin ms primitiva de SQL, por lo tanto, fue la que se
bautiz como SQL-86 (tambin conocida como SQL1).
En esencia, el SQL es un lenguaje declarativo de alto nivel ya que, al manejar conjuntos
de registros y no registros individuales, ofrece una elevada productividad en la
codificacin y en la orientacin a objetos. Una sentencia de SQL puede resultar
equivalente a ms de un programa que emplee un lenguaje de bajo nivel.
161
Una base de datos, dicen los expertos, implica la coexistencia de mltiples tipos de
lenguajes. El denominado Data Definition Language (tambin conocido como DDL) es
aqul que permite modificar la estructura de los objetos contemplados por la base de
datos por medio de cuatro operaciones bsicas. SQL, por su parte, es un lenguaje que
permite manipular datos (Data Manipulation Language o DML) que contribuye a la
gestin de las bases de datos a travs de consultas.
2.2 LAS CONSULTAS SIMPLES.
La sentencia SELECT nos permite consultar los datos o campos almacenados en una
tabla de la base de datos.
La tabla origen (clusula FROM)
Esta sentencia Indica la tabla (o tablas) desde la que queremos recuperar los datos. En
el caso de que exista ms de una tabla se denomina a la consulta "consulta combinada"
o "join". En las consultas combinadas es necesario aplicar una condicin de
combinacin a travs de una clusula WHERE.
Seleccin de columnas
Como ya vimos anteriormente la sentencia SELECT sirve para seleccionar datos de una
tabla especfica, si queremos que aparezca todas las columnas de la tabla basta con
colocar SELECT * y nos traer todas las columnas, pero si solo queremos ver unas
columnas especificas es necesario colocar el SELECT y el nombre de las columnas o
campos que desea ver en las consulta.
A continuacin vamos a hacer un ejemplo de las sentencias SELECT y FROM
respectivamente supongamos que tenemos una tabla en nuestra base de datos llamada
162
Presenta el resultado ordenado por las columnas indicadas. El orden puede expresarse
con ASC (orden ascendente) y DESC (orden descendente). El valor predeterminado
es ASC.
Ahora vamos a ver un ejemplo del order by utilizando nuevamente la tabla Tbcarros del
ejemplo anterior vamos a organizar segn la marca para ello debemos adicional la
siguiente sentencia:
El resultado debe ser el siguiente:
Si nos damos cuenta lo ha organizado en orden alfabtico segn la marca.
2.2.3 Las clusulas DISTINCT / ALL
La sentencia DISTINCT Indica que queremos seleccionar slo los valores distintos a
una referencia y la referencia ALL indica que queremos seleccionar todos los valores.
Es el valor por defecto y no suele especificarse casi nunca.
164
El resultado sera:
La Sentencia TOP se emplea para obtener slo una cantidad limitada de registros, la
primera n registros de una consulta.
En este caso solo mostraremos los primeros dos.
Especifica una condicin que debe cumplirse para que los datos sean devueltos por la
consulta. Admiten los operadores lgicos AND, OR y NOT.
165
Para esta sentencia el ejemplo que vamos a realizar es que nos muestre la informacin
del carro o carros con matriculas 'ZMU-084' O matricula ='MAA-566' solo tiene que
encontrar la primera ya que la segunda que colocamos no existe en la base de datos ya
que es un condicional O puede encontrar cualquiera de las dos o las dos la consulta
seria de la siguiente forma:
Y el resultado sera el siguiente:
Como nos podemos dar cuenta solo nos muestra la informacin de un solo carro que
cumple con la condicin de la matrcula. En cuanto el operador lgico AND se trabaja
en la misma sentencia nicamente cambiamos donde est el OR en la consulta anterior
por el AND con este operador lgico si es necesario que las dos condiciones se
cumplan para que pueda ver el resultado. El NOT nos muestra todos menos el dato que
coloquemos en la consulta.
Ejemplo:
Consultar carros modelos entre 2000 y 2008.
Test de pertenencia a un conjunto: Examina si elvalorde la expresin es uno de
los valoresincluidosenlalistade valores.
Test de valor nulo: Una condicin de seleccin puede dar como resultado el valor
verdadero TRUE, falso FALSE o nulo NULL
Ejemplo
Consultar los carros que no tiene registrado color.
Resultado:
168
En este caso no sali ningn resultado por que el color lo dejamos como No Null.
Test de correspondencia con patrn: Se utiliza cuando queremosutilizar
caracteres comodinespara formar el valor con el compara
Ejemplo:
Consultar todos los carros que sean Nissan:
Los comodines SQL pueden ser usados en la bsqueda de datos en una base de datos
pueden sustituir a uno o ms caracteres cuando se busquen los datos
Los comodines deben usarse con el operador LIKE Se pueden usar con SQL los
siguientes comodines:
169
COMODN SIGNIFICADO
% Cualquiercadenadeceroomscaracteres.
_ Cualquiercarcter.
[] Cualquiercarcterindividualdelintervalo(porejemplo[abcdef])especificado.
[^] Cualquiercarcterindividualfueradelintervalo(porejemplo[^af)especificado.
Ejemplo
Ahora seleccionaremos los carros que empiecen con "ZM" la matricula.
Fuente: www.aulaclic.com/sql
2.3.2 La composicin de tablas
La composicin de tablas consiste en concatenar filas de una tabla con filas de otra. En este
caso se obtiene una tabla con las columnas de la primera tabla unida a las columnas de la
segunda tabla, y las filas de la tabla resultante son concatenaciones de filas de la primera tabla
con filas de la segunda tabla.
Fuente: www.aulaclic.com/sql
Existen distintos tipos de composicin, se utiliza siempre el ms apropiado segn el caso. Los
tipos de composicin de tablas son:
El producto cartesiano
El INNER J OIN
El LEFT / RIGHT J OIN
El operador UNION
El operador UNION combina el resultado de dos o ms instrucciones SELECT en un
nico conjunto de resultados.
Se utiliza el operador UNION cuando los datos que se desean residen en ubicaciones diferentes
y no se puede tener acceso a ellos con una nica consulta. Al utilizar el operador UNION, tenga
en cuenta los siguientes hechos e instrucciones:
171
SQL Server requiere que las tablas a las que se hace referencia tengas tipos de datos
similares, el mismo nmero de columnas y el mismo orden de columnas en la lista de seleccin
de cada consulta.
SQL Server quita las filas duplicadas del conjunto de resultados. Sin embargo, si utiliza la
opcin ALL, se incluyen todas las filas en el conjunto de resultados.
Debe especificar los nombres de las columnas en la primera instruccin SELECT. Por lo tanto,
si desea definir nuevos encabezados de columnas en el conjunto de resultados, deber crear
los alias de columnas en la primera instruccin SELECT.
Sintaxis lgica del operador:
Instruccin SELECT UNION [ALL] Instruccin SELECT
Se presenta el siguiente ejemplo:
Se utiliza el operador UNION
El resultado es:
172
El Producto Cartesiano
El producto cartesiano es un tipo de composicin de tablas, aplicando el producto cartesiano a
dos tablas se obtiene una tabla con las columnas de la primera tabla unidas a las columnas de
la segunda tabla, y las filas de la tabla resultante son todas las posibles concatenaciones de
filas de la primera tabla con filas de la segunda tabla.
La sintaxis es la siguiente:
FROM nombreTabla AS aliasTabla
El producto cartesiano se indica poniendo en la FROM las tablas que queremos componer
separadas por comas, podemos obtener as el producto cartesiano de dos, tres, o ms tablas.
Para el ejemplo las dos tablas de donde se consultan los datos estn de la siguiente manera:
173
El resultado es:
El LEFT JOIN y el RIGHT JOIN
El LEFT JOIN y RIGHT JOIN son otro tipo de composicin de tablas, tambin denominada
composicin externa. Son una extensin del INNER JOIN.
La sintaxis del LEFT J OIN es la siguiente:
FROM tabla1 LEFT J OIN tabla2 ON tabla1.col1 comparar tabla2.col2
La descripcin de la sintaxis es la misma que la del INNER JOIN, lo nico que cambia es la
palabra INNER por LEFT (izquierda en ingls).
Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de
la izquierda que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos
de la tabla de la derecha con valores nulos.
En el siguiente ejemplo se busca traer tambin las materias que no est viendo ningn
estudiante.
175
El resultado es:
La sintaxis del RIGHT JOIN es la siguiente:
FROM tabla1 RIGHT J OIN tabla2 ON tabla1.col1 comparar tabla2.col2
La sintaxis es la misma que la del INNER JOIN, lo nico que cambia es la palabra INNER
por RIGHT (derecha en ingls).
Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de la
derecha que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos de
la tabla de la izquierda con valores nulos.
En el siguiente ejemplo se busca traer solamente las materias que estn viendo ningn
estudiante.
El resultado es:
176
2.3.3 Las funciones de Columna
En la lista de seleccin de una consulta de resumen aparecen funciones de columna tambin
denominadas funciones de dominio agregadas. Una funcin de columna se aplica a una
columna y obtiene un valor que resume el contenido de la columna.
Las siguientes son funciones de columna:
SUM (expresin) AVG (expresin) STDEV (expresin) STDEVP (expresin)
MIN (expresin) MAX (expresin) COUNT (expresin) COUNT (*)
La funcin SUM() calcula la suma de los valores indicados en el argumento. Los datos que se
suman deben ser de tipo numrico (entero, decimal, coma flotante o monetario...). El resultado
ser del mismo tipo aunque puede tener una precisin mayor.
StDev() y StDevP() calculan la desviacin estndar de una poblacin o de una muestra de la
poblacin representada por los valores contenidos en la columna indicada en el argumento. Si
la consulta base (el origen) tiene menos de dos registros, el resultado es nulo. AVG(), STDEV(),
STDEVP() los resultados no sern los mismos con valores 0 que con valores nulos. Vemoslo
con un ejemplo:
Las funciones MIN() y MAX() determinan los valores menores y mayores respectivamente. Los
valores de la columna pueden ser de tipo numrico, texto o fecha. El resultado de la funcin
tendr el mismo tipo de dato que la columna. Si la columna es de tipo numrico MIN() devuelve
177
el valor menor contenido en la columna, si la columna es de tipo texto MIN() devuelve el primer
valor en orden alfabtico, y si la columna es de tipo fecha, MIN() devuelve la fecha ms
antigua y MAX() la fecha ms reciente.
La funcin COUNT(nb columna) cuenta el nmero de valores que hay en la columna, los datos
de la columna pueden ser de cualquier tipo, y la funcin siempre devuelve un nmero entero.
Si la columna contiene valores nulos esos valores no se cuentan, si en la columna aparece un
valor repetido, lo cuenta varias veces.
COUNT(*) permite contar filas en vez de valores. Si la columna no contiene ningn valor
nulo, COUNT(nbcolumna) y COUNT(*) devuelven el mismo resultado, mientras que si hay
valores nulos en la columna, COUNT(*) cuenta tambin esos valores mientras que
COUNT(nb columna) no los cuenta.
Seleccin en el origen de datos
El origen de datos se encuentra en la clusula FROM la cual es una lista separada por comas
de nombres de tablas, nombres de vistas y clausulas JOIN.
Si queremos eliminar del origen de datos algunas filas, basta incluir la clusula WHERE que
ya conocemos despus de la clusula FROM.
Origen mltiple
Si los datos que necesitamos utilizar para obtener el resumen se encuentran en varias tablas,
se debe formar el origen de datos adecuado en la clusula FROM como si fuera una consulta
multitabla normal.
2.3.4 La clusula GROUP BY
Agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen de acuerdo con
los valores de una o ms columnas o expresiones. Se devuelve una fila para cada grupo. Las
funciones de agregado de la lista de seleccin de la clusula SELECT proporcionan informacin
sobre cada grupo en lugar de filas individuales.
La clusula GROUP BY tiene una sintaxis que cumple la norma ISO y otra sintaxis que
no cumple dicha norma. Solo se puede usar un estilo de sintaxis en cada instruccin SELECT.
178
2.4 PROCEDIMIENTOSALMACENADOS
Un procedimiento almacenado (stored procedure en ingls) es un programa el cual es almacenado
fsicamenteenunabasededatos.Suimplementacinvaradeunmanejador debasesde datosaotro.
La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una peticin de
usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un
servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y slo necesita
enviar sus resultados de regreso al usuario, deshacindose de la sobrecarga resultante de comunicar
grandes cantidades de datos salientes y entrantes. Usos tpicos para procedimientos almacenados
incluyen la validacin de datos siendo integrados a la estructura de base de datos (los procedimientos
almacenados utilizados para este propsito a menudo son llamados disparadores; triggers en ingls), o
encapsular un proceso grande y complejo. El ltimo ejemplo generalmente ejecutar ms rpido como
un procedimiento almacenado que de haber sido implementado como, por ejemplo, un programa
corriendo en el sistema cliente y comunicndose con la base de datos mediante el envo de consultas
SQL y recibiendo sus resultados. Los procedimientos pueden ser ventajosos: Cuando una base de datos
esmanipuladadesdemuchosprogramasexternos.Alincluirlalgicadelaaplicacinenlabasededatos
utilizando procedimientos almacenados, la necesidad de embeber la misma lgica en todos los
programasqueaccedenalosdatosesreducida.Estopuedesimplificarlacreaciny,particularmente,el
mantenimientodelosprogramasinvolucrados.Podemosverun claroejemplodeestosprocedimientos
cuandorequerimosrealizarunamismaoperacinenunservidordentrodealgunasotodaslasbasesde
datos y a la vez dentro de todas o algunas de las tablas de las bases de datos del mismo. Para ello
podemos utilizar a los Procedimientos almacenados autocreables que es una forma de generar ciclos
redundantesatravsdelosprocedimientosalmacenados.
180
2.4.1CreacinProcedimientoAlmacenado(SinParmetrosDeEntrada)
En la cabecera de definicin de un procedimiento almacenado primero se escriben las palabras
reservadas CREATE PROCEDURE a continuacin el nombre del procedimiento de almacenamiento
dejandounespacioenblanco.
En tercer lugar la lista de los parmetros cada uno de ellos debe empezar con @ no se colocan entre
parntesis,vacadaparmetroconsutipodedato,yvanseparadosporcomasnoseindicanadasison
de entrada, sin embargo si el parmetro es de entrada salida se incluye al final la palabra reservada
OUTPUT.
CREATE PROCEDURE Nombr ePr ocedi mi ent o
@Par am1 i nt ,
@Par am2 i nt ,
@Par am3 i nt OUTPUT
AS
BEGI N
- - aqui vi enen l as i nst r ucci ones del pr ocedi mi ent o al macenado
END
Ya veremos que los parmetros de cursor se utiliza una clusula diferente; por ltimo un parmetro
puede tener un valor por omisin adems tambin hay que decir que no hay un marcador que indique
donde termina un procedimiento almacenado, muchas veces se coloca la palabra GO al final de cada
procedimiento lo cual considera que el procedimiento termina, antes de la palabra GO o hasta el final
delficheroloqueocurraprimero.EncerrarBEGINlaslneasdelprocedimientoentrelaspalabrasBEGIN
yEND(FinaldelProcedimiento).
2.4.2EjecutarUnProcedimientoAlmacenado
Se utiliza la instruccin EXECUTE y a continuacin espacio en blanco el nombre del procedimiento
almacenado si tienen parmetros se deben aadir todos los parmetros separados por comas se debe
repetirlaclusulaOUTPUTparapoderrecibirvaloresenunparmetrodesalidasinoseincluyeOUTPUT
habrtratadoelparmetroenunadireccindeentrada.
EXECUTE Nombr ePr ocedi mi ent o
2.4.3FormaGeneraldeunProcedimientoAlmacenado
EnconclusinunProcedimientoalmacenadosecreaconlaspalabrasreservadasCREATEPROCEDUREa
continuacin el nombre, luego se colocan los parmetros con su tipo de dato. Se deben encerrar las
instrucciones entre las palabras reservadas BEGIN Y END luego se debe ejecutar el programa el cual se
almacenaenelServidor.
181
Enlasiguienteimagensepuedeverelejemplodeunprocedimientoalmacenado.
2.4.4ModificacindeunProcedimientoAlmacenado
ParamodificarelprocedimientoalmacenadosedeberealizarconlapalabraALTERdespusdelnombre
colocarlosparmetros.
182
Unrepasogeneral
183
184
Usos. Los usos 'tpicos' de los procedimientos almacenados se aplican en la validacin de datos,
integradosdentrodelaestructuradelbancodedatos.Losprocedimientosalmacenadosusadoscontal
propsito se llaman comnmente disparadores o triggers. Otro uso comn es la 'encapsulacin' de un
APIparaun procesocomplejoograndeque podra requerirla 'ejecucin' devariasconsultasSQL,tales
comolamanipulacindeun'dataset'enormeparaproducirunresultadoresumido.
Tambin pueden ser usados para el control de gestin de operaciones, y ejecutar procedimientos
almacenados dentro de una transaccin de tal manera que las transacciones sean efectivamente
transparentesparaellos.
Ventajas. La ventaja de un procedimiento almacenado, en respuesta a una peticin de usuario, est
directamentebajoelcontroldelmotordelmanejadordebasesdedatos,locualcorregeneralmenteen
un servidor separado de manejador de bases de datos aumentando con ello, la rapidez de
procesamientoderequerimientosdelmanejadordebasesdedatos.Elservidordelabasededatostiene
accesodirectoalosdatosnecesariosparamanipularyslonecesitaenviarelresultadofinalalusuario.
LosprocedimientosalmacenadospuedenpermitirquelalgicadelnegocioseencuentrecomounAPIen
labasededatos,quepuedensimplificarlagestindedatosyreducirlanecesidaddecodificarlalgica
en el resto de los programas cliente. Esto puede reducir la probabilidad de que los datos sean
corrompidosporelusodeprogramasclientesdefectuososoerrneos.Deestemodo,elmotordebase
de datos puede asegurar la integridad de los datos y la consistencia, con la ayuda de procedimientos
185
almacenados. Algunos afirman que las bases de datos deben ser utilizadas para el almacenamiento de
datossolamente,yquelalgicadenegocioslodeberaseraplicadaenlacapadenegociodecdigo,a
travs de aplicaciones cliente que deban acceder a los datos. Sin embargo, el uso de procedimientos
almacenadosnoseoponealautilizacindeunacapadenegocio.
Acontinuacinnosdetenemosaexplicarlaforma generaldeunprocedimientoalmacenadoycomose
modifica utilizando la palabra reservada ALTER. Se explica cmo es posible utilizar parmetros de
entradaycomoejecutarunprocedimientoalmacenadoconparmetrosdeentrada.Alfinaltambinse
detallacmoutilizarvalorespordefectoparalosparmetrosdeentrada.
Vamos a ejecutar un ejemplo con procedimientos almacenados a travs de parmetros, vamos a
emplearlabasededatoscustomers.
En esa Base de datos se va escoger una seleccin donde aparezca Identificador, el nmero de la
compaa,elcontactoydelpas.
SevaacrearunprocedimientoquesellameClientescomoyanosencontramosdentrodeNorthwindno
tenemosningnproblema,ejecutamos.
En la parte de abajo y despus de darle ejecutar nos debe mostrar el mensaje de que ha sido creado
correctamente.
Como ya lo hemos ejecutado y no hemos dado ningn parmetro de entrada ni de salida debemos
ejecutarelprocedimientoClientesloseleccionamosydamosejecutar.
Comopodemosvernosdevuelve93filasperoenrealidadnosestdevolviendotodaslasfilastodoslos
registrosdelatablaaunquesolonosdevuelva4camposporregistro.
186
Vamos a cambiar un poco nuestro procedimiento para que sea ms flexible nuestra consulta, vamos a
decirlequenosfiltreporlosclientesingleses.Simplementeaadimoslaclusulaquesemuestra.
Como se haba mencionado anteriormente para alterar un procedimiento que ya est creado debemos
emplearlasentenciaALTER
Procedemosaejecutarloynosdebemostrarquelohaejecutadocorrectamente.
Por cierto una manera de ver los procedimientos es dirigirse a la ventana de la derecha minimizamos
tabladandoclicenelsmbolo
187
Loquenosvaaaparecerestodoloquerepresentalabasededatos.
Acontinuacinejecutamosclientessimplementeseleccionamosydamosejecutar.
EXECUTE Cl i ent es
Nosdebemostraracontinuacin7filasycomolehabamosdichonosdebedevolverlosclientesingleses
nicamente los cuatro campos y esta filtrado como lo habamos indicado que lo realizara en la tabla
anterior.
Despus de observar esto
desplegamos el men de
programacin dando clic
enelsmbolo+
Luego de encontrar el
procedimiento Clientes
desplegamos el men, aparece
otro con nombre Parmetros y
aparece uno que dice Devuelve
entero en este momento no nos
muestra los parmetros.
188
No olvidemos agregar los parmetros para los debidos clientes segn lo tengamos en la tabla deberan
sercomosemuestraenlaimagenyotroparmetrodeentradacolocandolapalabraALTER,elnombre
delavariable@Pas
Lo dems es lo mismo que lo que habamos hecho anteriormente lo nico que cambia es la clusula
Whereyesevalorseasociaalavariable@Pais
Ahora generamos un valor por defecto, se aade despus de la variable el valor por defecto, que el
stringseacualquiernumerooletras,fraseopalabra,laconsultaeslamisma.Ejecutamosclientesynos
debetraertodos.
189
Ejecuteelprocedimientoalmacenadoparacadacaso,yobservelosresultados.
Observeconlossiguientesejemplos:
Observequeocurreparacadacaso.
2.5TRIGGERSENTRANSACTSQL
2.5.1LosDesencadenadoresDML
Lasintaxisgeneraldeuntriggereslasiguiente.
190
LasinstruccionesdetriggersDMLutilizandostablasespeciales
La primera tabla (inserted) solo est disponible en las operaciones INSERT y UPDATE y en ella
estn los valores resultantes despus de la insercin o actualizacin. Es decir, los datos
insertados.InsertedestarvacaenunaoperacinDELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, estn los valores
anteriores a la ejecucin de la actualizacin o borrado. Es decir, los datos que sern borrados.
DeletedestarvacaenunaoperacinINSERT.
Lasiguienteinstruccinprovocarqueeltriggerseejecute:
Podemosespecificaraqucolumnasdelatabladebeafectareltrigger.
191
PodemosactivarydesactivarTriggersatravsdelassiguientesinstrucciones.
2.5.2LosdesencadenadoresDDL
Lasintaxisgeneraldeuntriggereslasiguiente.
La siguiente instruccin impide que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de
datos.
2.5.3EjemploprcticodecmocrearunTriggersenTransactSQL
Despus de haber conceptualizado toda la parte terica de lo que es un trigger y cmo funciona
procederemosconeldesarrollodenuestroejemplo.
IngreseaSQLServer2008o2005,inicio>todoslosprogramas>MicrosoftSQLServer2008o2005>SQL
ManagementStudio.
192
Nosconectamosconnuestrousuarioycontrasea
Despus de habernos conectado procederemos con la creacin de una nueva base de datos llamada
MITRIGGERparaellodaremosclicderechoenBasedeDatosyclicenNuevabasededatos
AsignamoselnombredenuestrabasededatosydamosclicenAceptar.
Luegodehabercreadonuestrabasededatosprocederemosacrear2tablasdelasiguientemanera:
193
LaprimeratablasellamarCliente
DentrodelatablaClienteingresaremoslossiguientescampos.
IdCliente(pk,varchar(20)),
Nombre(varchar(20)),
Apellido(varchar(20)),
Direccion(varchar(20))
Unavezcreadalatablaingresaremos3datosdentrodelatabladelasiguienteforma:
194
UnavezingresadodatosdentrodeestatablaprocederemosconlacreacindelatablaNo.2
LasegundatablasellamaraPedidos
DentrodelatablaPedidosingresaremoslossiguientescampos.
IdCliente(pk,varchar(20)),
Nombre(varchar(20)),
Fecha(date)
UnavezcreadanuestrasegundatablaprocederemosconlaimplementacindenuestroTrigger.
ParaprocederconlaejecucindenuestroTriggervamosaabrirlaconsoladeconsultasoquerydela
siguientemanera:
ClicderechosobrelabasededatosyacreadayclicenNuevaconsulta.
Unavezingresadoalaventanadeconsultaprocederemosarealizarun:
195
Sel ect * f r omCl i ent e
Sel ect * f r omPedi dos
Nota:paraejecutarlasconsultassedaclicenelbotnEjecutarenlapartesuperior.
Paraverificarquelastablascreadasestncorrectas.
El siguiente cdigo lo ingresaran dentro de la consulta con el fin de que el trigger afecte la tabla de
clientescomoladePedidosconelfindequenospermitarealizarlasmodificacionesquesedeseen.
Una vez digitada seleccione toda la instruccin y de clic en el botn Ejecutar all aparecer como
resultadoComandoscompletadoscorrectamente.
196
Realizandonuevamenteun:
Sel ect * f r omCl i ent e
Sel ect * f r omPedi dos
Enlastablaspodemosnotarqueannohaydatosnimodificaciones.
Porloqueprocederemosainsertarelsiguientecdigoynotarloscambiosquesevanaproducir
Una vez digitada seleccione toda la instruccin y de clic en el botn Ejecutar all aparecer como
resultado(1filasafectadas).
197
Finalmenterealizandonuevamenteun:
Sel ect * f r omCl i ent e
Sel ect * f r omPedi dos
Enambastablaspodremosobservarlamaneraenquesivieronafectadasmediantelautilizacindelos
TriggersenTransactSQL
198
2.6TRANSACCIONESENTRANSACTSQL
UnatransaccinesunconjuntodeoperacionesTransactSQLqueseejecutancomounnicobloque,es
decir, si falla una operacin Transact SQL fallan todas. Si una transaccin tiene xito, todas las
modificacionesdelosdatosrealizadasdurantelatransaccinseconfirmanyseconviertenenunaparte
permanentedelabasededatos.Siunatransaccinencuentraerroresydebecancelarseorevertirse,se
borrantodaslasmodificacionesdelosdatos.
Elejemploclsicodetransaccinesunatransferenciabancaria,enlaquequitamossaldoaunacuentay
lo aadimos en otra. Si no somos capaces de abonar el dinero en la cuenta de destino, no debemos
quitarlodelacuentadeorigen.
SQL Server funciona por defecto conTransacciones de confirmacin automtica, es decir, cada
instruccinindividualesunatransaccinyseconfirmaautomticamente.
Sobre el ejemplo anterior de la transferencia bancaria, un script debera realizar algo parecido a lo
siguiente:
199
Esta forma de actuar seria errnea, ya que cada instruccin se ejecutara y confirmara de forma
independiente,porloqueunerrordejaralosdatoserrneosenlabasededatos(yeseeselpeorerror
quenospodemosencontrar!)
2.6.1Transaccionesimplcitasyexplicitas
ParaagruparvariassentenciasTransactSQLenunanicatransaccin,disponemosdelossiguientes
mtodos:
Transacciones explcitas. Cada transaccin se inicia explcitamente con la instruccinBEGIN
TRANSACTIONyseterminaexplcitamenteconunainstruccinCOMMIToROLLBACK.
Transacciones implcitas. Se inicia automticamente una nueva transaccin cuando se ejecuta una
instruccinquerealiza modificaciones en los datos, pero cada transaccin se completa
explcitamenteconunainstruccinCOMMIToROLLBACK.
Paraactivardesactivarelmododetransaccionesimplcitasdebemosejecutarlasiguienteinstruccin.
200
201
Elsiguienteejemplomuestraelmismoscriptcontransaccionesimplcitas:
202
La transaccin sigue activa hasta que emita una instruccin COMMIT o ROLLBACK. Una vez que la
primera transaccin se ha confirmado o revertido, se inicia automticamente una nueva transaccin la
siguientevezquelaconexinejecutaunainstruccinparamodificardatos.
La conexin contina generando transacciones implcitas hasta que se desactiva el modo de
transaccionesimplcitas.
Podemosverificarelnmerodetransaccionesactivasatravsde@@TRANCOUNT.
203
Otro punto a tener en cuenta cuando trabajamos con transacciones son los bloqueos y el nivel de
aislamiento.
2.6.2Transaccionesanidadas.
Podemos anidar varias transacciones. Cuando anidamos varias transacciones la instruccin COMMIT
afectaralaltimatransaccinabierta,peroROLLBACKafectaratodaslastransaccionesabiertas.
Un hecho a tener en cuenta, es que, si hacemos ROLLBACK de la transaccin superior se desharn
tambinloscambiosdetodaslastransaccionesinternas,aunquehayamosrealizadoCOMMITdeellas.
Unaconsideracinatenerencuantacuandotrabajamoscontransaccionesanidadaseslaposibilidadde
utilizarpuntosdeguardadooSAVEPOINTs.
2.6.3Puntosderecuperacin(SavePoint).
Lospuntosderecuperacin(SavePoints)permitenmanejarlastransaccionesporpasos,pudiendohacer
rollbackshastaunpuntomarcadoporelsavepointynoportodalatransaccin.
Elsiguienteejemplomuestracmotrabajarconpuntosderecuperacin.
204
Caractersticas
LasinstruccionesbsicasdeSQLsoninsertar,consultar,modificar,yeliminar.
Enlastransaccionesexistencuatrocaractersticasbsicas:
Atomicidad:Eslapropiedadqueaseguraquelasoperacionessehanrealizadoono,serealizaelcommit
paraconfirmaroelrollbackparadeshacer
Consistencia:Eslapropiedadqueaseguraquesoloaquelloqueempiezasepuedeacabar,porlotantose
ejecutansololasoperacionesquenovayanaromperlasreglasydirectricesdeintegridadenlabasede
datos
Aislamiento:Eslapropiedadqueaseguraqueunaoperacinnopuedeafectaraotras.Estoaseguraque
la realizacin de dos transacciones sobre la misma informacin sean independientes y no generen
ningntipodeerror
Durabilidad:Eslapropiedadqueaseguraqueunavezrealizadalaoperacinestapersistirynosepodr
deshaceraunquefalleelsistema
BeginTransaction
Insert
Update
205
Delete
IfError
Rollback
Else
Commit
Datosimportantesparatenerencuenta
Las transacciones permiten agrupar pasos fsicos cuando se realizan modificaciones en las bases de
datos.
Enlastransaccionesseconsolidancondosinstruccionesbsicas
COMMIT:Eslaconfirmacindelatransaccinparalamodificacindelosdatosdelabasededatos
ROLLBACK:Eslaqueanulacualquiermodificacinrealizadaalabasededatos.
2.6.4Ejerciciodetransacciones
IngresealServidormedianteelManagamentStudio.
CreeunabasededatosllamadaVentas,dentrodeellaunatablallamadaVentasigualmente,observela
imagenparavermejoreldiseo.
206
Ubqueseenestatablaydeclicenlaopcinde .
Estonosllevaalasiguientepantalla.
Digitamoslasiguienteinstruccin:
Primeroprocedemosaseleccionarlainformacindelatablaventas
ydamosclickenejecutar locualnospermiteverlasiguiente
informacin
207
Luegoejecutamosloscomandosdelatransaccin.
Empezamosporejecutar ynosmuestralasiguienteinformacin.
Luegoejecutamoselupdate.
Como podemos ver tenemos 1 fila afectada si deseamos confirmar la operacin seleccionamos la
instruccinCOMMIT,yejecutamoslainstruccin.
Sinodeseamosrealizarelcambio
DebemosseleccionarlainstruccinROLLBACKyejecutarla.
208
Loquerevierteloscambiosrealizados.
2.7FUNCIONESENTRANSACTSQL
Una funcin definida por el usuario es una rutina de TransactSQL que acepta parmetros, realiza una
accin,comounclculocomplejo,ydevuelveelresultadodeesaaccincomounvalor.Elvalordevuelto
puedeser unvalorescalar(nico)ounatabla.Utiliceestainstruccinparacrearunarutinareutilizable
quesepuedautilizardeestasformas:
EninstruccionesTransactSQLcomoSELECT
Enlasaplicacionesquellamanalafuncin
Enladefinicindeotrafuncindefinidaporelusuario
Paraparametrizarunavistaomejorarlafuncionalidaddeunavistaindizada
Paradefinirunacolumnaenunatabla
ParadefinirunarestriccinCHECKenunacolumna
Parareemplazarunprocedimientoalmacenado.
EnestaGuaseexplicarancomocrearlassiguientesfuncionesenSQLServer,pararealizarlafuncinen
la consola de SQL Server, se selecciona en la parte superior izquierda la opcin NUEVO QUERY, como
ejemplolabasededatosmasterquevienepordefectoconSQLserver2010paratrabajarlos3tiposde
funciones:
FuncionesEscalares
Funcionesconvaloresdetablasdevariasinstrucciones
Funcionesconvaloresdetablaenlnea
2.7.1FuncinEscalar
Esta funcin permite devolver un solo valor, son parecidas a las funciones que se utilizan dentro de los
lenguajesdeprogramacinseutilizanparaclculosbsicosmatemticosyaquedevuelvenunsolovalor
esdecirunescalar.Lafuncinseconformadelasiguienteforma:
Cr eat e Funct i on Nombr e de l a Funci n ( @par amet r os r eci bi dos t i po de
par met r o)
Ret ur ns Ti po de r et or no
209
as
Begi n
Decl ar e var i abl es que necesi t amos t i po de var i abl e
Sent enci as a ej ecut ar con l as var i abl es y l os par met r os que
r eci bi mos
Ret ur n var i abl e que r et or namos
end
Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.
Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Selectdbo.NombreFuncion(ValorParametro)asNombreColumnaAMostrarFromTabla
Para ejecutar el Query se selecciona y se da click en ejecutar y en la parte inferior se muestran los
resultados.
210
Acontinuacionsehaceotrapruebaparaverificarelcorrectofuncionamientodelafuncion.
2.7.2Funcionesconvaloresdetabladevariasinstrucciones
Esunhibridoentrevistayprocedimientoalmacenado,yaquesonconsultasconunainstruccinselect
perorecibenparmetroscosaquenopuedehacerlavistanielparmetroalmacenado,elprocedimiento
puede encapsular insert, update o un conjunto de instrucciones SQL por lo que la funcin es ms
eficiente de efectuar consultas con parmetros y es la herramienta que se debe preferir para hacer
sentenciasdeestetipo.Lafuncinseconformadelasiguienteforma:
Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.
Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Select*fromnombre_funcion(parametro)
Para ser ejecutar el Query se selecciona y se da click en ejecutar y en la parte inferior se muestran los
resultados.
2.7.3Funcionesconvaloresdetablaenlinea
Sonigualesqueunafuncinconvaloresdetabladevariasinstruccionessoloquesuconstruccinesalgo
diferentepuesnosedefinenvariablesdetipoTableynoesnecesarioutilizarlaspalabrasBeginyEnd.
Lafuncinseconformaas:
CreatefunctionNombre_funcion(@parametrosrecibidostipodeparmetro)
Returnstable
As
Return(selectcampos_tablafromtablawherecampo_validacion=@parametrosrecibidos)
212
Paraquelafuncionseaalmacenadaenlabasededatosseseleccionaysedaclickenejecutar.
Parallamarlafuncinyserejecutadaseconstruyeunqueryconlasiguientesintaxis:
Select*fromnombre_funcion(parametro)
Para ser ejecutar el Query se selecciona y se da click en ejecutar y en la parte inferior se muestran los
resultados.
Hacertodoelcapitulodefunciones
213
2.8CURSORESENTRANSACTSQL
Puntero que recorre fila a fila un conjunto de resultados obtenidos a partir de una consulta TSQL
(sentencia SELECT), permite modificar y realizar operaciones con este conjunto de resultados. Son
utilizadosprincipalmenteenprocedimientosalmacenados,desencadenadoresyScriptsdeTransactSQL
a fin de poner el contenido de un conjunto de resultados a disposicin de otras instrucciones de
TransactSQL.
Consistededospartes:
Conjunto de resultados del cursor: el conjunto (tabla) de filas resultado de la ejecucin del query
queseasocialcursor.
Posicindelcursor:Unpunteroaunafiladentrodelconjuntoderesultados.
La posicin del cursor indica la fila actual del cursor.Se puede modificar o eliminar esa fila usando las
sentenciasupdateodelete.EstassentenciasnoutilizanunaclusulaWHEREnormal(conpredicadosde
condicin).Encambio,elcursoridentificalafila,paralocualdebeserabiertoyposicionadoenlamisma
utilizandolasentenciaFETCH.
El comando FETCH permite cambiar la posicin actual del cursor, moviendo su posicin una o ms filas
enelconjuntoderesultadosdelcursor.
2.8.1VentajasdelosCursores
Amplanelprocesamientodelosresultadosporque:
Permitensituarseenfilasespecficasdelconjuntoderesultados.
Recuperanunafilaobloquedefilasdelaposicinactualenelconjuntoderesultados.
Aceptan modificaciones de los datos de las filas en la posicin actual del conjunto de
resultados
Aceptan diferentes grados de visibilidad para los cambios que realizan otros usuarios en la
informacindelabasededatosquesepresentaenelconjuntoderesultados.
Proporcionan instrucciones de TransactSQL en secuencias de comandos, procedimientos
almacenadosyaccesodedesencadenadoresalosdatosdeunconjuntoderesultados.
2.8.2EstructuradeunCursor
Enelsiguientediagramadeflujosepresentalasecuencialgicaquesigueladeclaracinyejecucinde
uncursor.
214
Declare Cursor. Los cursores se declaran utilizando la instruccin DECLARE CURSOR definiendo sus
atributos, su comportamiento de desplazamiento y la consulta utilizada para generar el conjunto de
resultadossobreelqueoperaelcursor.
DeclareCursoraceptatantolasintaxisbasadaenelestndarISOcomolasintaxisqueutilizaunconjunto
deextensionesdeTransactSQL.
SintaxisEstndarISO
Argumentos:
INSENSITIVE:Defineuncursorquehaceunacopiatemporaldelosdatosqueutiliza.Todaslassolicitudes
que se realizan al cursor se responden desde esta tabla temporal detempdb; por tanto, las
modificacionesrealizadasenlastablasbasenosereflejanenlosdatosdevueltosporlasoperacionesde
capturarealizadasenelcursoryademsestecursornoadmitemodificaciones.
215
SCROLL: Especifica que estn disponibles todas las opciones de captura (FIRST, LAST, PRIOR, NEXT,
RELATIVE, ABSOLUTE). Si no se especifica SCROLL en una instruccin DECLARE CURSOR de ISO, la nica
opcindecapturaqueseadmiteesNEXT.
Ejemplo:
SintaxisExtendidaTransactSQL.
DeclaracindelosArgumentosGlobalyLocal
Local.Especficaqueelmbitodelcursoreslocalparaelprocesoporlotes,procedimientoalmacenadoo
desencadenadorenquesecreelcursor.
Ejemplo:
Global. Especifica que el mbito del cursor es global para la conexin. Puede hacerse referencia al
nombre del cursor en cualquier procedimiento almacenado o proceso por lotes que se ejecute en la
conexin.
216
Ejemplo:
SinoseespecificaGLOBALniLOCAL,elvalorpredeterminadosecontrolamediantelaconfiguracinde
laopcindebasededatosdefaulttolocalcursor.
DeclaracindelosArgumentosFORWARD_ONLYySCROLL
FORWARD_ONLY.Especificaque elcursorslosepuededesplazardelaprimeraalaltimafila.FETCH
NEXTeslanicaopcinderecuperacinadmitida.
Ejemplo:
SCROLL.Especficaqueestndisponiblestodaslasopcionesderecuperacin(FIRST,LAST,PRIOR,NEXT,
RELATIVE, ABSOLUTE). Si no se especifica SCROLL en una instruccin DECLARE CURSORla nica opcin
derecuperacinqueseadmiteesNEXT.
Ejemplo:
217
DeclaracindelosArgumentosSTATIC,KEYSET,DYNAMICyFAST_FORWARD
STATIC.Defineuncursorquehaceunacopiatemporaldelosdatosquevaautilizar.Todaslassolicitudes
queserealizanalcursorserespondendesdelatablatemporaldetempdb;portanto,lasmodificaciones
realizadas en las tablas base no se reflejan en los datos devueltos por las operaciones de recuperacin
realizadosenelcursorynoadmitemodificaciones.
Ejemplo:
KEYSET.Especificaquelapertenenciayelordendelasfilasdelcursorsefijancuandoseabreelcursor.
Elconjuntodeclavesqueidentificalasfilasdeformanicaestintegradoenlatabladenominadakeyset
detempdb.
Ejemplo:
DYNAMIC. Define un cursor que, al desplazarse por l, refleja en su conjunto de resultados todos los
cambiosrealizadosenlosdatosdelasfilas.Losvaloresdelosdatos,elordenylapertenenciadelasfilas
puedencambiarencadaoperacinderecuperacin.
Ejemplo:
Ejemplo:
218
DeclaraciondelosArgumentosREAD_ONLY,SCROLL_LOCKS,OIPTIMISTICyTYPE_WARNING
READ_ONLY. Evita que se efecten actualizaciones a travs de este cursor. No es posible hacer
referencia al cursor en una clusula WHERE CURRENT OF de una instruccin UPDATE o DELETE. Esta
opcinreemplazalacapacidaddeactualizarelcursor.
Ejemplo:
Ejemplo:
OPTIMISTIC. Especfica que las actualizaciones o eliminaciones posicionadas realizadas a travs del
cursor no serealizarn correctamente si la fila se ha actualizado despus de ser leda en el cursor. Si la
fila se ha modificado, el intento de actualizacin o eliminacin posicionada genera un error. No es
posibleespecificarOPTIMISTICsiseespecificatambinFAST_FORWARD.
Ejemplo:
Ejemplo:
219
CompatibilidadentreArgumentos
Se compara la compatibilidad de todos los cursores, para as crearlos con cada uno de los argumentos
vistosantes:
OPENCURSOR
AbreuncursorylollenaejecutandolainstruccinTransactSQLespecificadaenlainstruccinDECLARE
CURSORoSETcursor_variable.
Sintaxis:
Argumentos:
GLOBAL:Especificaquecursor_namehacereferenciaauncursorglobal.
cursor_name: Es el nombre de un cursor declarado. Si existe un cursor global y uno local con el
nombrecursor_name,cursor_namehacereferenciaalcursorglobalsiseespecificaGLOBAL;encaso
contrario,cursor_namehacereferenciaalcursorlocal.
cursor_variable_name:Eselnombredelavariablecursorquehacereferenciaauncursor.
Ejemplo:Abreuncursorybuscatodassusfilas.
220
RecuperacindeFilasconFETCH
FETCH
Recuperaunafilaespecficadeuncursor.
Sintaxis:
Parmetros:
NEXT:Devuelvelafiladeresultadosinmediatamenteposterioralafilaactualyaumentalafilaactual
a la fila devuelta. Si FETCH NEXT es la primera operacin de captura en un cursor, se devuelve la
primera fila del conjunto de resultados. NEXT es la opcin predeterminada para la captura de
cursores.
PRIOR:Devuelvelafiladeresultadosinmediatamenteanterioralafilaactual,yreducelafilaactuala
la fila devuelta. Si FETCH PRIOR es la primera operacin de captura en un cursor, no se devuelve
ningunafilayelcursorquedaposicionadodelantedelaprimerafila.
FIRST:Devuelvelaprimerafiladelcursorylaconvierteenlafilaactual.
LAST:Devuelvelaltimafiladelcursorylaconvierteenlafilaactual.
221
ABSOLUTE{n|@nvar}:Sino@nvarespositivo,sedevuelvelafilandesdeelprincipiodelcursory
la fila devuelta se convierte en la nueva fila actual. Sino @nvares negativo, se devuelve la
filananterioralfinaldelcursorylafiladevueltaseconvierteenlanuevafilaactual.Sino@nvares
0,nosedevuelvenfilas.ndebeserunaconstanteenteray@nvardebesersmallint,tinyintoint.
RELATIVE{n|@nvar}:Sino@nvarespositivo,sedevuelvelafilanposterioralafilaactualylafila
devueltaseconvierteenlanuevafilaactual.Sino@nvaresnegativo,sedevuelvelafilananteriora
lafilaactualylafiladevueltaseconvierteenlanuevafilaactual.Sino@nvares0,sedevuelvelafila
actual.SiseespecificaFETCHRELATIVEconno@nvarseestableceenunnmeronegativooen0en
la primera operacin de captura que se realiza en un cursor, no se devuelven filas.ndebe ser una
constanteenteray@nvardebesersmallint,tinyintoint.
CLOSE. Cierra un cursor abierto mediante la liberacin del conjunto de resultados actual y todos los
bloqueosdecursormantenidosenlasfilasenlasqueestcolocado.CLOSEdejalasestructurasdedatos
accesibles para que se puedan volver a abrir, pero las capturas y las actualizaciones posicionadas no se
permitenhastaquesevuelvaaabrirelcursor.CLOSEdebeejecutarseenuncursorabierto,porloqueno
sepermiteencursoresquesloestndeclaradosoqueyaestncerrados.
Sintaxis:
Argumentos:
GLOBAL:Especificaquecursor_namehacereferenciaauncursorglobal.
cursor_name:Eselnombredeuncursorabierto.Sihayuncursorglobalyotrolocalconel
nombrecursor_name,cursor_namehacereferenciaalcursorglobalsiseespecificaGLOBAL;delo
contrario,cursor_namehacereferenciaalcursorlocal.
cursor_variable_name:Eselnombredeunavariabledecursorasociadaauncursorabierto.
DEALLOCATE.Quitaunareferenciaauncursor.Cuandosehadesasignadolaltimareferenciaalcursor,
MicrosoftSQLServerliberalasestructurasdedatosquecomponenelcursor.
Sintaxis
Argumentos:
cursor_name: Es el nombre de un cursor ya declarado. Si hay un cursor global y otro local con el
nombrecursor_name,cursor_namehace referencia al cursor global si se especifica GLOBAL y, si no
seespecificaGLOBAL,hacereferenciaalcursorlocal.
@cursor_variable_name:Nombredeunavariablecursor.Debeserdetipocursor.
222
VariablesGlobales@@CURSOR_ROWS,@@FETCH_STATUSylafuncinCURSOR_STATUS
@@CURSOR_ROWS.Devuelveelnmerodefilascorrespondientesactualmentealltimocursorabierto
enlaconexin.Puedellamara@@CURSOR_ROWSparadeterminarqueelnmerodefilasquecumplan
lascondicionesdelcursorserecuperenenelmomentoenquesellamaa@@CURSOR_ROWS.
Ejemplo
EnesteejemplosedeclarauncursoryseutilizaSELECTparamostrarelvalorde@@CURSOR_ROWS.La
opcintieneelvalor0antesdeabrirelcursor;elvalor1indicaqueelconjuntodeclavesdelcursorse
estllenandodeformaasincrnica.
Valordevuelto Descripcin
m Elcursorserellenadeformaasincrnica.Elvalordevuelto(m)eselnmerode
filasquecontieneactualmenteelconjuntodeclaves.
1 Elcursoresdinmico.Comoloscursoresdinmicosreflejantodosloscambios,el
nmerodefilascorrespondientesalcursorcambiaconstantemente.Nuncase
puedeafirmarquesehanrecuperadotodaslasfilasquecorrespondan.
0 Nosehanabiertocursores,nohayfilascalificadasparaelltimocursorabierto,
ostesehacerradoosuasignacinsehacancelado.
n Elcursorestcompletamenterelleno.Elvalordevuelto(n)eselnmerototalde
filasdelcursor.
223
Valordevuelto Descripcin
0 LainstruccinFETCHseejecutcorrectamente.
1 LainstruccinFETCHnoseejecutcorrectamenteolafilaestaba
msalldelconjuntoderesultados.
2 Faltalafilacapturada.
Por ejemplo, supongamos que un usuario ejecuta una instruccin FETCH sobre un cursor y a
continuacin llama a un procedimiento almacenado que abre y procesa los resultados de otro cursor.
Cuando vuelve el control desde el procedimiento almacenado llamado, @@FETCH_STATUS reflejar la
ltimainstruccinFETCHejecutadaenelprocedimientoalmacenado,nolaejecutadaantesdellamaral
procedimiento.
Ejemplos
Esteejemploutiliza@@FETCH_STATUSparacontrolarlasactividadesdelcursorenunbucleWHILE.
CURSOR_STATUS. Una funcin escalar que permite al que llama a un procedimiento almacenado
determinar si el procedimiento ha devuelto un cursor y el conjunto de resultados de un determinado
parmetro.
Sintaxis:
CURSOR_STATUS(
{'local','cursor_name'}
{'global','cursor_name'}
{'variable','cursor_variable'})
224
Argumentos
'local':Especificaunaconstantequeindicaqueelorigendelcursoresunnombrelocaldecursor.
'cursor_name': Es el nombre del cursor. Un nombre de cursor debe ajustarse a las reglas para los
identificadores.
'global':Especificaunaconstantequeindicaqueelorigendelcursoresunnombreglobaldecursor.
'variable':Especificaunaconstantequeindicaqueelorigendelcursoresunavariablelocal.
'cursor_variable':Es el nombre de la variable de cursor. Una variable de cursor debe definirse
medianteeltipodedatoscursor.
Valor
devuelto
Nombredecursor Variabledecursor
1 Elconjuntoderesultadosdelcursortieneal
menosunafila.
Para los cursores INSENSITIVE y de
conjunto de claves, el conjunto de
resultadostienealmenosunafila.
Paraloscursoresdinmicos,elconjuntode
resultados puede tener cero, una o ms
filas.
Elcursorasignadoaestavariableestabierto.
ParaloscursoresINSENSITIVEydeconjuntode
claves, el conjunto de resultados tiene al
menosunafila.
Para los cursores dinmicos, el conjunto de
resultadospuedetenercero,unaomsfilas.
0 El conjunto de resultados del cursor est
vaco.*
El cursor asignado a esta variable est abierto,
pero el conjunto de resultados est
definitivamentevaco.*
1 Elcursorestcerrado. Elcursorasignadoaestavariableestcerrado.
2 Noaplicable. Puedeser:
Elprocedimientollamadoanteriormentenoha
asignado ningn cursor a esta variable
OUTPUT.
El procedimiento llamado anteriormente
asign un cursor a esta variable OUTPUT, pero
seencontrabaenunestadocerradoalterminar
el procedimiento. Por tanto, se cancela la
asignacin del cursor y no se devuelve al
procedimientoquehacelallamada.
No hay ningn cursor asignado a una variable
declaradadecursor.
3 No existe ningn cursor con el nombre
indicado.
Noexisteunavariabledecursorconelnombre
indicado o, si existe, no tiene todava ningn
cursorasignado.
*Loscursoresdinmicosnodevuelvennuncaesteresultado.
225
DeclaracinCursorForUpdate
ParaactualizarlosdatosdeuncursordebemosespecificarFORUPDATEdespusdelasentenciaSELECT
enladeclaracindelcursor,yWHERECURRENTOF<nombre_cursor>enlasentenciaUPDATE.
Ejemplo:
Declaracindevariablesparaelcursor
Declaracindelcursor
Aperturadelcursor
Lecturadelaprimerafiladelcursor
Lecturadelasiguientefiladelcursor
226
Cierredelcursor
Liberarlosrecursos
2.8.3AsignacinyAsociacindeCursores
LainstruccinDECLARECURSORasignayasociauncursoraunnombredecursor.
Unavariabledecursorsepuedeasociarauncursormedianteunodeestosdosmtodos:
A) PornombreconunainstruccinSETqueasociauncursoraunavariabledecursor.
B) Tambin se puede crear y asociar un cursor a una variable sin necesidad de definir un nombre de
cursor.
1.15.6ProcedimientosAlmacenadosyCursores
Losprocedimientosalmacenadosresultantilesparalamanipulacinde cursores,dadoquesepueden
crear y eliminar cada vez que sea llamado un procedimiento almacenado, adems facilitan la tarea de
realizaroperacionesqueconllevaranmayortiempoparasersolucionadas.
Se puede crear un procedimiento almacenado para que cree un cursor o se podra utilizar para que
realicecualquieroperacin,enestecasosemuestralautilizacindeunprocedimientoalmacenadopara
querealicelasumadetodoslosIDsdeunatabla,quesontradosapartirdeuncursor.
227
Ejemplo:
CREATEPROCEDURESUMA
@SUMAINTOUTPUT
AS
BEGIN
SET@SUMA=0
DECLARE@IDINT
DECLARECURSOR_SUMACURSORLOCALFOR
SELECTIDFROMPECES
OPENCURSOR_SUMA
FETCHNEXTFROMCURSOR_SUMA
INTO@ID
WHILE(@@FETCH_STATUS=0)
BEGIN
SET@SUMA=@SUMA+@ID
FETCHNEXTFROMCURSOR_SUMA
INTO@ID
END
CLOSECURSOR_SUMA
DEALLOCATECURSOR_SUMA
END
aquieslatransaccionquellamaalprocedimientoyretornaunvalor.
DECLARE@SUMAINT
EXECUTESUMA@SUMAOUTPUT
SELECT@SUMA
2.9SQLDINMICOENTRANSACTSQL
Eneldesarrollodesoftwarecuandosedeseacrearunaaplicacincompletaparaelmanejodeunabase
de datos relacional, se hace necesaria la implementacin de una herramienta que soporte la capacidad
de consulta en SQL y la adaptabilidad a situaciones diversas con facilidad de los lenguajes de
programacin tradicionales. Transact SQLes el lenguaje de programacin que proporciona SQL Server
paraextenderelSQLestndarconotrotipodeinstrucciones.
Transact SQL permite dos formas de ejecutar SQL dinmico (construir sentencias SQL dinmicamente
paraejecutarlasenlabasededatos):
228
LainstruccinEXECUTEosimplementeEXEC
Elprocedimientoalmacenadosp_executesql
INSTRUCCIN EXECUTE: permite ejecutar una cadena de caracteres de tipo nvarchar que representa
unasentenciaSQL.
ElsiguienteejemplomuestracomoejecutarunacadenadecaracteresconlainstruccinEXEC.
Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:
Tambin conSQL dinmico podemos ejecutar sentencias de tipo DDL (Data Definition Languaje), como
CREATETABLE,DROP,ALTER.Acontinuacinsepresentaunejemplo.
229
Alejecutarlasinstruccioneselresultadoobtenidoeselsiguiente:
2.9.1ProcedimientoAlmacenadoSP_EXECUTESQL
Paraejecutarsqldinmico,serecomiendautilizarelprocedimientoalmacenadosp_executesql,enlugar
deunainstruccinEXECUTE.
sp_executesqladmitelasustitucindeparmetros
sp_executesqlesmsseguroyverstilqueEXECUTE
sp_executesqlgeneraplanesdeejecucinconmsprobabilidadesdequeSQLServerlosvuelva
autilizar,esmseficazqueEXECUTE.
230
Enelsiguienteejemplosemuestraeluso(muysimple)desp_executesql.
Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:
sp_executesqladmitelasustitucindevaloresdeparmetrosparacualquierparmetroespecificadoen
la cadena TransactSQL a ejecutar. El siguiente ejemplo muestra el uso de sp_executesql con
parmetros:
Alejecutarlasentenciaelresultadoeselsiguientesegnlosdatosdelejemplo:
231
2.10CERTIFICADOSDIGITALES
Muybreveresumendelahistoriadelacriptografa
Enlahistoriadesdehacemilesdeaosqueelhombretratadeocultarsusmensajesyescritosdeojosa
los cuales no desea mostrar su contenido, y para esto encripta estos textos utilizando, en un principio,
mtodos sencillos que incluan el uso de lpiz, papel o alguna mquina sencilla. Luego, a principios del
siglo XX, comenz a utilizar mquinas mecnicas y electromecnicas, como la conocida mquina de
rotores llamada Enigma, la cual fue utilizada por las fuerzas Alemanas desde 1930, proporcionando
mtodosdecifradomscomplejosyeficientes.
LacriptografamodernacomenzcuandoClaudeShannonpublicelartculoCommunicationTheoryof
Secrecy Systems en la Bell System Technical Journal en 1949, y poco tiempo despus, junto a Warren
Weaver,publicaronellibroMathematicalTheoryofCommunication.Estosdocumentos,juntosconotros
publicados posteriormente, formaron las bases de la teora de la criptografa, aunque fueron
organizacionesgubernamentalessecretas(comolaNSA)lasquesiguieronconlainvestigacin.Recina
mediados de los 70 hubieron grandes avances a nivel pblico: la creacin del estndar de cifrado DES
(DataEncryptionStandard)ylacreacindelacriptografaasimtrica.
Mtodos De Cifrado. Los mtodos de cifrado de la criptografa moderna se dividen, a gran escala, en
dos:cifradodeflujoycifradodebloques,ysteltimoasuvezsedivideencifradosimtrico(conclave
secreta)ycifradoasimtrico(conclavepblica).
232
Cifrado de flujo. Los algoritmos de cifrado de flujo pueden realizar el cifrado incrementalmente,
transformando el mensaje original en un mensaje cifrado bit a bit. Esto lo logra construyendo un
generadordeflujodeclave,elcualesunasecuenciadebitsdetamaoarbitrarioquepuedeemplearse
para oscurecer el contenido del flujo de datos combinando el flujo de clave con el flujo de datos
mediantelafuncinXOR.Sielflujodeclaveesseguro,elflujodedatoscifradostambinloser.
Estemtodoesutilizadoenalgunasaplicacionescomoelcifradodeconversacionestelefnicas,dondeel
cifrado en bloques es inapropiado porque los flujos de datos se producen en tiempo real en pequeos
fragmentos y las muestras de datos pueden ser muy pequeas (hasta de 1 bit), y sera un desperdicio
rellenarelrestodelosbitsantesdecifrarelmensajeytransmitirlo.
Cifradoporbloques.Enestetipodecifradoelmensajeseagrupaenbloques,porlogeneralde128bits
oms,antesdeaplicarelalgoritmodecifradoacadapartedeformaindependienteutilizandolamisma
clave.
Cifrado simtrico. La criptografa simtrica es el mtodo criptogrfico que usa una misma clave para
cifrarydescifrarlosmensajes.Lasdospartesquesecomunicandebenponersedeacuerdodeantemano
sobre la clave a utilizar y, una vez que ambas tienen acceso a esta clave, el remitente cifra el mensaje
utilizndola,loenvaaldestinatario,ystelodescifraconlamismaclave.
Existenalgunosalgoritmosmuyconocidos,comoelDES(DataEncryptionStandard),elcualfueundiseo
deunidaddecifradoporbloquesdegraninfluenciadesarrolladoporIBMypublicadocomoestndaren
1977.
CifradoasimtricoElcifradoasimtricoeselmtodocriptogrficoqueusaunpardeclavesparaelenvo
de mensajes. Una de estas claves es pblica y se puede entregar a cualquier persona, la otra clave es
privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Los mtodos
criptogrficos garantizan que ese par de claves slo se puede generar una vez, de modo que se puede
asumirquenoesposiblequedospersonashayanobtenidocasualmenteelmismopardeclaves.
Sielremitenteusalaclavepblicadeldestinatarioparacifrarelmensaje,unavezcifrado,slolaclave
privada del destinatario podr descifrar este mensaje, ya que es el nico que la posee. Por lo tanto se
logralaconfidencialidaddelenvodelmensaje,nadiesalvoeldestinatariopuededescifrarlo,nisiquiera
lamismapersonaquegenerelmensaje.
Sielpropietariodelpardeclavesutilizasuclaveprivadaparacifrarelmensaje,cualquieraqueposeasu
clavepblicapodrdescifrarlo.Enestecasoseconsiguetantolaidentificacincomolaautenticacindel
remitente,yaquesesabequeslopudohabersidolquienutilizsuclaveprivada(salvoalguiensela
hubiese podido robar). Esta idea es el fundamento de la firma electrnica, de la cual hablamos ms
abajo.
Lossistemasdecifradodeclavepblicaosistemasdecifradoasimtricossecrearonconelfindeevitar
elproblemadelintercambiodeclavesqueposeeelsistemadecifradosimtrico.Conlasclavespblicas
noesnecesarioqueelremitenteyeldestinatariosepongandeacuerdoenlaclaveaemplear.Todolo
que se requiere es que, antes de iniciar la comunicacin secreta, el remitente consiga una copia de la
233
clavepblicadeldestinatario.Esms,esamismaclavepblicapuedeserusadaporcualquieraquedesee
comunicarseconsupropietario.
Cabemencionarqueaunqueunapersonalograraobtenerlaclavepblica,nopodradescifrarelmensaje
encriptado con esta misma clave, slo podra encriptar mensajes que podran ser ledos por el
propietariodelaclaveprivada.
CertificadoDigital
UnCertificadoDigitalesundocumentodigitalmedianteelcualunterceroconfiable(llamadoautoridad
decertificacinoCA)garantizalavinculacinentrelaidentidaddeunsujetooentidadysuclavepblica.
Estedocumentocontiene,entreotrosdatos,elnombredelusuarioysuclavepblica.
Los certificados digitales tienen distintos usos dependiendo de la finalidad para la cual se lo est
utilizando,porejemplo:
Uncertificadodigitalestablecelaidentidaddeunusuarioenunared
Los servidores pueden configurarse para permitir el acceso a usuarios con ciertos certificados o
asignarlelaidentidaddeunusuariodeldominiosegnsucertificado
Losclientespuedenserconfiguradosparaconfiarenservidoresquepresentanciertoscertificados,
porejemplo,losquevienenpreconfiguradosenlosnavegadoresparautilizarseensesionesSSL.
Loscertificadospuedenutilizarseparafirmadocumentoselectrnicos.
234
Unadelascertificacionesmsusadasyunestndarenlaactualidadeninfraestructurasdeclavepblica
PKIs(PublicKeyInfrastructure)esX.509ensuversin3.
Certificado digital X.509. X.509 es un estndar publicado oficialmente en 1988 que especifica, entre
otrascosas,formatosestndarespara certificadosdeclavespblicasyunalgoritmodevalidacindela
rutadecertificacin.
EnX.509sedefineunacapadeabstraccinparasuministrarserviciosdeautenticacinalosusuariosde
undirectorioX.500.
En la actualidad es ampliamente utilizado el formato de certificado digital X.509 v3, por ejemplo, para
realizarconexionessegurasaservidoreswebatravsdeSSL(SecureSocketsLayer).
Este tipo de certificados posee un formato donde guarda distintos datos, por ejemplo, un nmero de
serie,laclavepblicadelusuario,lasfechasdevalidezdelcertificado,elnombredelusuario(enformato
X.500),etc.
Acontinuacinmuestrounejemplodeuncertificadodigital:
NmerodeSerie: 21479
VersinX.509: v3
Titular: CN=GustavoCantero,E=g.cantero@scientia.com.ar,OU=Personanoverificada
NoamparadobajoelDecreto427/98delaIFDAPN,O=PolticadeCertificacinde
CorreoElectrnico
Emisor: CN=ACdelaSubsecretaradelaGestinPblicaparaCertificadosdeCorreo
Electrnico,OU=PolticadeCertificacinenhttp://ca.sgp.gov.ar,OU=No
amparadoporelDecreto427/98IFDAPN,OU=SubsecretaradelaGestin
235
Pblica,O=JefaturadeGabinetedeMinistros,L=CiudaddeBuenosAires,C=AR
Validez(noantesde): mi03jun2009 19:14:35,ART
(nodespusde): jue03jun2010 19:14:35,ART
Algoritmodefirma: sha1WithRSAEncryption
ClavePblica: E0EE9902030130818902818100E5AEA6F0745EDA39A2CF7270C2CC9C
E7D6014F51BF7A8388514B07B4BC2D93C422AEC0202697743C14D54B
51E45F5C434A03F66F5C4045CC95E27E6C9CF5F62D996B6D7CECC786
ED61D89B47EDB46D3B19190D86E8C2FD893E01F2850AB7AE58069A60
92116AA2374CB04EEE290340C0CC84F4CE6432F3F035D7E77B790001
Huelladigital(MD5): C68C853864543D7C222F9176B8D7479C
Huelladigital(SHA1): 4AFC0115CC500CFDB0D8B56468F5F24EE47BBCFA
2.10.1FirmaDigital
La firma digital hace referencia a un mtodo criptogrfico que asocia la identidad de una entidad (una
personaounequipoinformtico)aunmensajeodocumento,pudiendoadems,asegurarlaintegridad
deldocumentoomensaje.
Para realizar esto se calcula el hash del documento, se encripta el resultado con la clave privada del
certificadodelusuario,yseadjuntaaldocumentojuntoconelcertificado(perosinlaclaveprivada,slo
conlapblica).
236
Luego, para verificar la firma del documento, se lo abre, se valida el certificado adjunto (se verifica la
fechadevalidez,silaentidademisoraesdeconfianza,etc.),seobtienelafirma(elhashencriptado),se
lodesencriptaconlaclavepblica,secalculaelhashdeldocumento(sinlafirma)yseverificaqueambos
hash,eldesencriptadoyelcalculado,seaniguales.
2.10.2UtilizarCertificadosDigitalesDesde.NET
Consultar los repositorios de certificados. Como primer paso vamos a recorrer los certificados que
tenemosinstaladosennuestramquina.ParaestodebemosutilizarlaclaseX509Store,lacualnosdala
posibilidad de consultar un repositorio de certificados, por ejemplo, el repositorio raz (Root), el
repositorio donde estn los certificados de las autoridades certificantes (CertificateAuthority), o el
repostorio personal (My). Tambin tenemos que elegir la ubicacin del certificado, es decir, si vamos a
quererconsultarloscertificadosqueestnaniveldemquinaodeusuario.Tenganencuentaquesivan
autilizarlaclaseX509StoredesdeASP.NETdebenleerloscertificadosqueestnaniveldemquina,ya
queelusuarioASP.NETraravezvaateneralgncertificadoinstalado.
LuegodeelegidoelrepositorioquequeremosabrirdebemosutilizarelmtodoOpenparaqueconsulte
almismo.
237
Una vez abierto el repositorio, la propiedad Certificates contendr una coleccin (basada en la clase
X509Certificate2Collection)deloscertificadosalmacenados.
DespusdeutilizarelrepositorionohayqueolvidardecerrarelmismoconmtodoClose.
Acontinuacinmuestrocmoabrirelrepositoriopersonalyescribirenlaconsoladedebuglosnombres
yfirmasdigitales(hash)decadacertificado:
Creunnuevoproyectowebtalycomosemuestraenlaimagen(Unaaplicacindeconsola).
Ingreseelsiguientecdigo:
238
Aquestparamayorfacilidad,noolvidenporfavorquenobastaconsolocopiarsinotambinanalizar
queescadalneadecdigo.
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Security.Cryptography;
usingSystem.Security.Cryptography.X509Certificates;
usingSystem.Diagnostics;
namespaceCertDigitales
{
classProgram
{
staticvoidMain(string[]args)
{
X509StoreobjStore=newX509Store(StoreName.Root,StoreLocation.CurrentUser);
objStore.Open(OpenFlags.ReadOnly);
foreach(X509Certificate2objCertinobjStore.Certificates)
Console.WriteLine(objCert.SubjectName.Name+":"+objCert.Thumbprint);
objStore.Close();
Console.ReadKey();
}
}
}
Ejecute la aplicacin con F5 y observe los resultados. Se lista por consola el repositorio de certificados
digitalesquehayenelcomputador.
239
2.10.3Consultarlainformacindelcertificadoysusextensiones
Cada certificado posee una serie de datos. Adems de estos datos los certificados poseen extensiones,
que definen distintos posibles usos dependiendo de las mismas, y segn la extensin poseen distintos
datos almacenados. Por ejemplo, en la extensin del tipo 2.5.29.37 (tambin llamada Enhanced Key
Usage)seguardacualvaasereldestinodelcertificado,porejemploparaautenticacindelcliente.
Estas extensiones estn en la coleccin Extensions del certificado, y para obtener la informacin
almacenadadebecastearsesegneltipodelmismo.Parasaberqutipodeextensineslaalmacenada
se puede leer la propiedad Oid, la cual devuelve la clase homnima que representa un identificador de
un objeto criptogrfico (cryptographic object identifier) y luego, de este objeto, podemos leer la
propiedadFriendlyNameparaobtenerelnombredelaextensin.
Acontinuacinhayuncdigodeejemplodondesemuestralainformacindeuncertificado:
240
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Security.Cryptography;
usingSystem.Security.Cryptography.X509Certificates;
usingSystem.Diagnostics;
namespaceCertDigitales
{
classProgram
{
staticvoidMain(string[]args)
{
X509Certificate2objCert1;
//X509Certificate2objCertB;
X509StoreobjStore;
objStore=newX509Store(StoreName.Root,StoreLocation.LocalMachine);
objStore.Open(OpenFlags.ReadOnly);
foreach(X509Certificate2objCertBinobjStore.Certificates)
{
Console.WriteLine(objCertB.SubjectName.Name);
if(objCertB.SubjectName.Name=="CN=MicrosoftRootCertificateAuthority,DC=microsoft,DC=com")
{
StringBuilderobjSB=newStringBuilder("Detalledelcertificado:\n\n");
//Detalle
objSB.AppendLine("Persona="+objCertB.Subject);
objSB.AppendLine("Emisor="+objCertB.Issuer);
objSB.AppendLine("Vlidodesde="+objCertB.NotBefore.ToString());
objSB.AppendLine("Vlidohasta="+objCertB.NotAfter.ToString());
objSB.AppendLine("Tamaodelaclave="+objCertB.PublicKey.Key.KeySize.ToString());
objSB.AppendLine("Nmerodeserie="+objCertB.SerialNumber);
objSB.AppendLine("Hash="+objCertB.Thumbprint);
//Extensiones
objSB.AppendLine("\nExtensiones:\n");
foreach(X509ExtensionobjExtinobjCertB.Extensions)
{
objSB.AppendLine(objExt.Oid.FriendlyName+"("+objExt.Oid.Value+')');
if(objExt.Oid.FriendlyName=="KeyUsage")
{
X509KeyUsageExtensionext=(X509KeyUsageExtension)objExt;
objSB.AppendLine(""+ext.KeyUsages);
}
if(objExt.Oid.FriendlyName=="BasicConstraints")
{
X509BasicConstraintsExtensionext=(X509BasicConstraintsExtension)objExt;
objSB.AppendLine(""+ext.CertificateAuthority);
objSB.AppendLine(""+ext.HasPathLengthConstraint);
objSB.AppendLine(""+ext.PathLengthConstraint);
}
if(objExt.Oid.FriendlyName=="SubjectKeyIdentifier")
{
X509SubjectKeyIdentifierExtensionext=(X509SubjectKeyIdentifierExtension)objExt;
objSB.AppendLine(""+ext.SubjectKeyIdentifier);
}
if(objExt.Oid.FriendlyName=="EnhancedKeyUsage")//2.5.29.37
{
X509EnhancedKeyUsageExtensionext=(X509EnhancedKeyUsageExtension)objExt;
OidCollectionobjOids=ext.EnhancedKeyUsages;
foreach(OidoidinobjOids)
objSB.AppendLine(""+oid.FriendlyName+"("+oid.Value+')');
241
}
}
Console.WriteLine(objSB.ToString());
}
}
Console.ReadKey();
}
}
}
Cmo no contamos con un certificado digital de alguna empresa he usado este de Microsoft
(CN=MicrosoftRootCertificateAuthority,DC=microsoft,DC=com).
ImportsMicrosoft.VisualBasic
ImportsSystem.Data
ImportsSystem.Collections.Generic
ImportsSystem
ImportsSystem.Linq
ImportsSystem.Text
ImportsSystem.Security.Cryptography.X509Certificates
ImportsSystem.Diagnostics
ImportsSystem.Security.Cryptography
ImportsSystem.Security.Cryptography.Pkcs
ImportsManifiesto.WS.ManifiestoService
ImportsManifiesto.WS.WSManifiesto
PartialClass_Default
InheritsSystem.Web.UI.Page
ProtectedSubPage_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.Load
DimobjCertBAsX509Certificate2
DimobjStoreAsNewX509Store
objStore=NewX509Store(StoreName.Root,StoreLocation.LocalMachine)
objStore.Open(OpenFlags.ReadOnly)
ForEachobjCertBInobjStore.Certificates
IfobjCertB.SubjectName.Name="CN=CertificadoEmpresarialClaseA,O=CerticamaraS.A.EntidaddeCertificacion,L=Carrera91621
Bogota,C=CO"Then
DimobjContentAsContentInfo=NewContentInfo(Encoding.ASCII.GetBytes("FredysSimanca"))
DimobjEncryptedDataAsEnvelopedCms=NewEnvelopedCms(objContent)
DimobjRecipientAsCmsRecipient=NewCmsRecipient(objCertB)
objEncryptedData.Encrypt(objRecipient)
DimbytResultAsByte()=objEncryptedData.Encode()
Response.Write(bytResult.ToString)
EndIf
Next
EndSub
EndClass
242
HeusadouncertificadodigitaldeCerticamaraparailustracindelejemplo.
Elsiguienteeselcdigoparaelprocesodedesencriptado.
'desencriptando
objEncryptedData=NewEnvelopedCms()
objEncryptedData.Decode(bytResult)
objEncryptedData.Decrypt()
DimbytDocAsByte()=objEncryptedData.ContentInfo.Content
Response.Write("Datosdesencriptados:"+Encoding.ASCII.GetString(bytDoc))
Entotalquedaraas:
ImportsMicrosoft.VisualBasic
ImportsSystem.Data
ImportsSystem.Collections.Generic
ImportsSystem
ImportsSystem.Linq
ImportsSystem.Text
ImportsSystem.Security.Cryptography.X509Certificates
ImportsSystem.Diagnostics
ImportsSystem.Security.Cryptography
ImportsSystem.Security.Cryptography.Pkcs
ImportsManifiesto.WS.ManifiestoService
ImportsManifiesto.WS.WSManifiesto
PartialClass_Default
InheritsSystem.Web.UI.Page
ProtectedSubPage_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.Load
DimobjCertBAsX509Certificate2
DimobjStoreAsNewX509Store
objStore=NewX509Store(StoreName.Root,StoreLocation.LocalMachine)
objStore.Open(OpenFlags.ReadOnly)
ForEachobjCertBInobjStore.Certificates
IfobjCertB.SubjectName.Name="CN=CertificadoEmpresarialClaseA,O=CerticamaraS.A.EntidaddeCertificacion,L=Carrera91621
Bogota,C=CO"Then
DimobjContentAsContentInfo=NewContentInfo(Encoding.ASCII.GetBytes("FredysSimanca"))
DimobjEncryptedDataAsEnvelopedCms=NewEnvelopedCms(objContent)
DimobjRecipientAsCmsRecipient=NewCmsRecipient(objCertB)
objEncryptedData.Encrypt(objRecipient)
DimbytResultAsByte()=objEncryptedData.Encode()
Response.Write(bytResult.ToString)
'desencriptando
objEncryptedData=NewEnvelopedCms()
objEncryptedData.Decode(bytResult)
objEncryptedData.Decrypt()
DimbytDocAsByte()=objEncryptedData.ContentInfo.Content
Response.Write("Datosdesencriptados:"+Encoding.ASCII.GetString(bytDoc))
EndIf
Next
EndSub
EndClass