ASIGNATURA LABORATORIO DE PROGRAMACIN Qu es .NET? .NET es toda una nueva arquitectura tecnolica! desarrollada "or #icroso$t "ara la creacin % distri&ucin del so$t'are co(o un servicio. Esto quiere decir! que (ediante las )erra(ientas de desarrollo "ro"orcionadas "or esta nueva tecnolo*a! los "rora(adores "odr+n crear a"licaciones &asadas en servicios "ara la 'e&. Las caracter*sticas "rinci"ales que con$or(an .NET son las siuientes, - La "lata$or(a .NET Fra(e'or.! que "ro"orciona la in$raestructura "ara crear a"licaciones % el entorno de e/ecucin "ara las (is(as. - Los "roductos de #icroso$t en$ocados )acia .NET! entre los que se encuentran 0indo's .NET Server! co(o siste(a o"erativo que incluir+ de $or(a nativa la "lata$or(a .NET Fra(e'or.1 2isual Studio .NET! co(o )erra(ienta interada "ara el desarrollo de a"licaciones1 O$$ice .NET1 &.Central "ara .NET! etc. - Servicios "ara .NET desarrollados "or terceros $a&ricantes! que "odr+n ser utili3ados "or otras a"licaciones que se e/ecuten en Internet. E4isten adicional(ente un con/unto de "roductos! que &a/o la etiqueta de Servidores E("resariales "ara .NET 5.NET Enter"rise Servers6 se inclu%en dentro de la estrateia .NET. Entre estos "roductos "ode(os encontrar a S7L Server 8999! :i3Tal. Server! Co((erce Server 8999! etc. Sin e(&aro! )e(os de )acer una "untuali3acin i("ortante, estos "roductos no est+n &asados en .NET Fra(e'or.! "ueden $uncionar dentro del entorno de e/ecucin de .NET Fra(e'or.! "ero el ;nico "roducto actual(ente desarrollado &a/o el nuevo entorno es 2isual Studio .NET. Gracias a .NET % a su (odelo de desarrollo &asado en servicios! se $le4i&ili3a % enriquece el (odo en el que )asta a)ora se constru*an a"licaciones "ara Internet. La idea que su&%ace &a/o esta tecnolo*a! es la de "o&lar Internet con un e4tenso n;(ero de a"licaciones! que &asadas en servicios "ara la 'e& 50e& Services6! $or(en un (arco de interca(&io lo&al! racias a que dic)os servicios est+n $unda(entados en los est+ndares SOAP % <#L! "ara el interca(&io de in$or(acin. En este sentido! un "rora(ador "uede crear 0e& Services "ara que sean utili3ados "or sus "ro"ias a"licaciones a (odo de co("onentes 5"ero de una $or(a (uc)o (+s avan3ada que e("leando el (odelo CO# cl+sico6! siuiendo una estructura de "rora(acin %a conocida. .NET FRAMEWORK CONCEPTOS INICIALES #as reciente "lata$or(a de desarrollo "ro"uesta "or #icroso$t So"orta (ultilenua/e Provee un nuevo nivel de intero"erati&ilidad que "er(ite reutili3ar co("onentes )ec)os en otros lenua/es de "rora(acin. Inclu%e caracter*sticas nuevas co(o, #ane/o din+(ico de (e(oria Seuridad #ane/o de Errores E/ecucin controlada =e"uracin a trav>s de (;lti"les lenua/es PRCTICA EN LABORATORIO La "resente clase "retende deter(inar la "otencialidad de .Net Fra(e'or. 2ISUAL :ASIC .NET - Utili3ando el :loc de notas diite el siuiente cdio. I("orts s%ste( #odule #odulo? Pu&lic su& (ain56 console.'riteline5@Aola visual &asicB6 End su& End #odule - Guarde el arc)ivo en la unidad C, con el no(&re Pror!"!#$.#$. - Aaa clic en Inicio CD Prora(as CD #icroso$t 2isual Studio .NET 899E CD Aerra(ientas de 2isual Studio 899E CD 2isual Studio 899E Co((and Pro("t. - =iite al siuiente orden v&c Prora(av&.v& - O&serve que .NET Fra(e'or. )a enerado el arc)ivo e/ecuta&le Prora(av&.e4e. - E/ecute el arc)ivo .e4e 2ISUAL CF - Utili3ando el :loc de notas diite el siuiente cdio. usin S%ste(1 class )ola G "u&lic static void #ain56 G Console.0riteLine5HAola visual CFH61 I I - Guarde el arc)ivo en la unidad C, con el no(&re Pror!"!%s.%s - Aaa clic en Inicio CD Prora(as CD #icroso$t 2isual Studio .NET 899E CD Aerra(ientas de 2isual Studio 899E CD 2isual Studio 899E Co((and Pro("t. - =iite al siuiente orden csc Prora(acs.cs - O&serve que .NET Fra(e'or. )a enerado el arc)ivo e/ecuta&le Prora(acs.e4e. - E/ecute el arc)ivo .e4e. CONOCIENDO EL ENTORNO &IS'AL Pu&lic Class For(? In)erits S%ste(.0indo's.For(s.For( Private Su& :utton?JClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles :utton?.Clic.
#essae:o4.S)o'5HIn. )olaH6 Te4t:o4?.Te4t K HUniv. ContinentalH End Su& Private Su& Ti(er?JTic.5:%2al sender As O&/ect! :%2al e As S%ste(.EventArs6 Aandles Ti(er?.Tic.
#e.O"acit% CK 9.9E I$ #e.O"acit% K 9 T)en #e.Close56 End I$ End Su& El formulario es una clase Private Su& For(?JClosin5:%2al sender As O&/ect! :%2al e As S%ste(.Co("onent#odel.CancelEventArs6 Aandles #%:ase.Closin e.Cancel K True #e.Ti(er?.Ena&led K True End Su& End Class BASE DE DATOS Qu es SQL SERVER?. S7L Server es un Ad(inistrador de :ase de datos Relacional de arquitectura clienteL servidor 5R=:#S6 que usa ordenes S7L! conocidas co(o TransactCS7L! "ara (andar requeri(ientos desde un cliente al S7L Server. Ar(u)*e%*ur! C+)e,*e- Ser#).or. =e la (anera (+s si("le un cliente es cualquier co("onente del siste(a que requiere servicios o recursos de otros co("onentes del siste(a. Un servidor es un co("onente del siste(a que "ro"orciona servicios o recursos a otros co("onentes del siste(a. Co("onentes de un ClienteL Servidor dataL &ase s%ste(. Ser#).or. Coleccin de datos % o&/etos orani3ados que $acilitan servicios co(o &;squedas! ordena(ientos! recu"eracin! actuali3aciones % an+lisis de datos. Todos los servicios de acceso a datos ocurren "or (edio del servidor. La &ase de datos se co("one de es"acio $*sico de datos % los servicios de &ase de datos. C+)e,*e. Es un so$t'are que "odr*a ser usado "or una "ersona o "or un "roceso auto(ati3ado. Inclu%e el so$t'are que interact;a con el servidor requiriendo datos del servidor o (andando datos. Co(unicando datos entre el cliente % el servidor. =e"enden de c(o )a%an sido i("le(entados el cliente % el servidor. El (edio de co(unicacin $*sico "uede ser una red Local % el (edio de co(unicacin lica lo constitu%e el lenua/e S7L 5Structured 7uer% Lanuae6. Cateor*as de las i("le(entaciones dataC&ase s%ste(. !. F)+e/B!se. S0s*e" Estos siste(as usan una a"licacin que directa(ente accede a los arc)ivos de datos u&icados en un equi"o local o un servidor de red. Estos siste(as i("le(entan los servicios de : = % el nivel lico de co(unicacin co(o "arte de la a"licacin cliente b. . 1os*/B!se. S0s*e". Usados en (ain$ra(es % (inico("utadorasI. Estos siste(as i("le(entan todos los servicios de la : = % la $uncionalidad del cliente en un ran co("utador. CREACIN DE BASE DE DATOS ?. Cree una &ase de datos lla(ada 'CCI utili3ando S7L Server 899M tal co(o se (uestra en la $iura. 8. Es"eci$ique le no(&re de al &ase de datos N. O&serve las o"ciones de "ro"iedades a con$iurar O. Una ve3 creada la &ase de datos "rocedere(os a crear las ta&las de de la :=
BASE DE DATOS SENTENCIAS SQL SENTENCIA 23 SELECT O P N AS Su(a! ?8 L Q AS =ivision GO SENTENCIA 43 SELECT $na(e! UPPER5$na(e6 AS R#a%;sculasS! LO0ER5$na(e6 AS R#in;sculasS! SU:STRING5$na(e! N! N6 AS RSu&cadenaS FRO#e("lo%ee GO SENTENCIA 53 SELECT /o&Jid! CASE /o&Jid 0AEN ? TAEN TNuecesT 0AEN 8 TAEN TFrutaT 0AEN N TAEN TNuecesT 0AEN Q TAEN TFrutaT 0AEN M TAEN TNuecesT 0AEN ?O TAEN TNuecesT 0AEN ?8 TAEN TFrutaT 0AEN ?E TAEN TFrutaT ELSE TOtrosT EN= AS /o&Jid FRO# /o&s SENTENCIA 63 LU Lista todos los aceites cu%o no(&re co(;n co(ien3a con la (is(a letra que su no(&re latino UL SELECT OilNa(e! LatinNa(e FRO# Oils 0AERE LEFT5OilNa(e! ?6 K LEFT5LatinNa(e! ?6 CC Crear la varia&le t)e local =ECLARE VOilNa(e c)ar5E96 CC Ca(&iar el valor SET VOilNa(e K TGer(an C)a(o(ileT CC #ostrar el valor de la varia&le SELECT VOilNa(e SENTENCIA 73 CC =e(uestra las $unciones de $ec)a % )ora SELECT =ATENA#E5#ont)! GET=ATE566 AS RNo(&re Fec)aS! =AW5GET=ATE566 AS R=iaS! #ONTA5GET=ATE566 AS R#esS! WEAR5GET=ATE566 AS RAXoS SENTENCIA 83 PRINT TWo (e e/ectuoT GOTO PuntoSalto PRINT TWo no (e e/ecutoT PuntoSalto, PRINT TWo ta(&i>n (e e/ecutoT SENTENCIA 93 CC Crear una varia&le local de ti"o ta&la =ECLARE Vta&laLocal TA:LE 5a c)ar5E96! & c)ar5E966 CC Utili3ar INSERT INTO "ara crear $ilas INSERT INTO Vta&laLocal SELECT $na(e! lna(e FRO# e("lo%ee
CC #ostrar los resultados SELECT a!& FRO#Vta&laLocal SENTENCIA :3 CC Utili3ar una varia&le local co(o contador =ECLARE Vcontador int SET Vcontador K ? 0AILE Vcontador Y ?? :EGIN PRINT Vcontador SET Vcontador K Vcontador P ? EN= E;ERCICIOS DE SENTENCIAS SQL =escri&a el resultado de cada sentencia S7L HSelect artJid! artJno(&! artJ"cos $ro( Articulos ')ere artJ"cosDO99 and artJ"cosYQ99H ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Z. HSelect su(5artJstoc6 $ro( ArticulosH ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Z. HSelect catJid! su(5artJstoc6 $ro( Articulos rou" &% catJidH Select Cateor%I=! u(5UnitsInStoc.6 $ro( "roducts rou" &% Cateor%I= ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Z. HSelect su(5artJstoc6 $ro( Articulos ')ere catJidKT#UL99?T OR catJidKTCO#99?TH ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Z. HSelect U $ro( Articulos ')ere artJstoc :ET0EEN E and ?EH ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Z. HSelect (a45artJstoc6 $ro( ArticulosH ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ HSelect (in5artJstoc6 $ro( ArticulosH ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ HSelect av5artJstoc6 $ro( ArticulosH PROCEDIMIENTOS ALMACENADOS STORED PROCED'RE ?. Crear un Store Procedure que "er(ita "asar co(o "ar+(etro el no(&re de una ta&la que se desea visuali3ar sus datos CREATE PROCE=URE ta&la Vta&la? c)ar5N96 AS declare Vc(d c)ar5M96 set Vc(dK TSELECT U FRO# T P Vta&la? e4ec5Vc(d6 GO E/ecutar el Store Procedure Tabla Exec tabla 'Cliente' 8. Crear un Store Procedure que "er(ita actuali3ar los datos de un cliente deter(inado CREATE PROCE=URE actuali3ar VIdCliente int! VNo(&re c)ar5896! VA"ellido c)ar5896! V=ireccion c)ar 5896 AS UP=ATE cliente SET No(&reKVNo(&re! A"ellidoKVA"ellido!=ireccionKV=ireccion 0AERE idclienteKVIdCliente GO E/ecutar el Store Procedure Actualizar E4ec actuali3ar ?!T[oseT!TGarciaT!TCastroT N. Crear N Store Procedure que nos "er(itan Insertar! Actuali3ar % eli(inar un reistro de la ta&la Productos. WINDOWS FORM< CONTROLES =iseXe los siuientes $or(ularios FORM'LARIO MEN' =FORM2> Pu&lic Class #enu In)erits S%ste(.0indo's.For(s.For( LOAD =i( )i/o As Ne' Fr()i/o )i/o.#diParent K #e )i/o.S)o'56 End Su& GRABAR =i( ra&ar As Ne' S%ste(.IO.Strea(0riter5HC,\arc)ivo.t4tH6 =i( te4to As Strin te4to K CT%"e5#e.Active#diC)ild! Fr()i/o6.Te4t:o4?.Te4t ra&ar.0rite5te4to6 ra&ar.Close56 COPIAR =i( dato As Strin dato K CT%"e5#e.Active#diC)ild! Fr()i/o6.Te4t:o4?.SelectedTe4t Cli"&oard.Set=ataO&/ect5dato6 PEGAR =i( dato As Strin dato K Cli"&oard.Get=ataO&/ect.Get=ata5=ataFor(ats.Te4t6 #s:o45dato6 COLOR CT%"e5#e.Active#diC)ild! Fr()i/o6.Te4t:o4?.ForeColor K S%ste(.=ra'in.Color.Ros%:ro'n CASCADA #e.La%out#di5#diLa%out.Cascade6 FORM'LARIO 1I;O Private Su& Fr()i/oJLoad5:%2al sender As O&/ect! :%2al e As S%ste(.EventArs6 Aandles #%:ase.Load =i( lee As Ne' S%ste(.IO.Strea(Reader5HC,\arc)ivo.t4tH6 Te4t:o4?.Te4t K lee.ReadToEnd lee.Close56 End Su& LISTBO? AND ADDING CONTROLS AT R'N TIME =iseXe el $or(ularios, Private Su& FcontrolesJLoad5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles #%:ase.Load Lstlista.Ite(s.AddRane5Ne' Strin56 GHAlanH! HAl$redoH! HAlvaroH! HAndresH! HAntonioH! H[uanH! H[ulietaH! H[ulioH! H[uliusH! H#iuelH! H#ilarosH! H#innieHI6 End Su& Private Su& t4tno(&reJTe4tC)aned5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles t4tno(&re.Te4tC)aned Lstlista.SelectedInde4 K Lstlista.FindStrin5t4tno(&re.Te4t6 End Su& Private Su& LstlistaJ=ou&leClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles Lstlista.=ou&leClic. t4tno(&re.Te4t K Lstlista.SelectedIte( End Su& Private Su& :tnarearJClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles :tnarear.Clic. =i( #iTe4t:o4 As Ne' S%ste(.0indo's.For(s.Te4t:o4 Posicionto" PK 89 T&.To" K Posicionto" Controls.Add5T&6 =i( #iList:o4 As Ne' S%ste(.0indo's.For(s.List:o4 Posicionto" PK O9 a.To" K Posicionto" Controls.Add5a6 End Su& CLASES Y OBJETOS =iseXe EL siuiente $or(ulario Private Su& :utton?JClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles :utton?.Clic.
=i( a As Ne' Avion Te4t:o4?.Te4t K a.(arca a.i("ri(ir56 =i( & As Ne' Aco(&ate &.(arca K HACo(&ate To%otaH &.(odelo K HACo(&ate A<=H &.(isil K HFRACNQH &.(ostrar56 &.i("ri(ir56 =i( c As Ne' Aes"ia c.i("ri(ir56 End Su& CLASES3 Pu&lic Class Avion Private (i(odelo As Strin K H:OINGH Private (i(arca As Strin K H''H Pu&lic Pro"ert% (odelo56 Get Return (i(odelo End Get Set5:%2al 2alue6 (i(odelo K 2alue End Set End Pro"ert% Pu&lic Pro"ert% (arca56 Get Return (i(arca End Get Set5:%2al 2alue6 (i(arca K 2alue End Set End Pro"ert% Pu&lic Su& (ostrar56 #essae:o4.S)o'5(i(odelo6 #essae:o4.S)o'5(i(arca6 End Su& Pu&lic Overrida&le Su& i("ri(ir56 #essae:o4.S)o'5HO&/eto AvionH6 #essae:o4.S)o'5(i(odelo6 #essae:o4.S)o'5(i(arca6 End Su& End Class Pu&lic Class Aco(&ate In)erits Avion Private (isiles As Strin Pu&lic Pro"ert% (isil56 Get Return (isiles End Get Set5:%2al 2alue6 (isiles K 2alue End Set End Pro"ert% Pu&lic Overrides Su& i("ri(ir56 #essae:o4.S)o'5HO&/eto Avion Co(&ateH6 #essae:o4.S)o'5(isiles6 End Su& End Class Pu&lic Class Aes"ia In)erits Aco(&ate Private (icodio As Strin K HESPIAH Pu&lic Pro"ert% codio56 Get Return (icodio End Get Set5:%2al 2alue6 (icodio K 2alue End Set End Pro"ert% Pu&lic Overrides Su& i("ri(ir56 #essae:o4.S)o'5HO&/eto Avion Es"iaH6 #essae:o4.S)o'5(icodio6 End Su& End Class ACCESO A DATOS CON ADO .NET En los siuientes te(as va(os a tratar el acceso a datos desde 2:.NET! )aciendo uso del nuevo (odelo de acceso a datos incluido en la "lata$or(a .NET Fra(e'or., A=O .NET. #ostrare(os las tareas &+sicas "ara el acceso a datos desde a"licaciones &asadas en $or(ularios 0indo's! e("leando la tecnolo*a "ro"orcionada "or A=O .NET. A=O .NET es la nueva versin del (odelo de o&/etos A=O 5Active< =ata O&/ects6! es decir! la estrateia que o$rece #icroso$t "ara el acceso a datos. A=O .NET )a sido a("liado "ara cu&rir todas las necesidades que A=O no o$rec*a! % est+ diseXado "ara tra&a/ar con con/untos de datos desconectados! lo que "er(ite reducir el tr+$ico de red. A=O .NET utili3a <#L co(o $or(ato universal de trans(isin de los datos. A=O .NET "osee una serie de o&/etos que son los (is(os que a"arecen en la versin anterior de A=O! co(o "ueden ser el o&/eto Connection o Co((and! e introduce nuevos o&/etos tales co(o el o&/eto =ataReader! =ataSet o =ata2ie'. A=O .NET se "uede de$inir co(o, - Un con/unto de inter$aces! clases! estructuras % enu(eraciones que "er(iten el acceso a datos desde la "lata$or(a .NET de #icroso$t - La evolucin lica del API A=O tradicional de #icroso$t - Per(ite un (odo de acceso desconectado a los datos! los cuales "ueden "rovenir de (;lti"les $uentes de datos! de di$erente arquitectura de al(acena(iento Be,e@)%)os .e ADO .NET A=O .NET o$rece una &uena cantidad de (e/oras res"ecto a (odelos anteriores de A=O. Los &ene$icios los "ode(os aru"ar en las cateor*as descritas a continuacin. I,*eroAer!$)+).!. Las a"licaciones &asadas en A=O .NET o&tienen venta/a de la $le4i&ilidad % la (asiva ace"tacin del est+ndar <#L "ara el interca(&io de datos. Puesto que <#L es el est+ndar de env*o de in$or(acin entre ca"as! cualquier co("onente ca"a3 de Inter"retar los datos <#L "uede acceder a la in$or(acin de A=O .NET! se encuentre donde se encuentre! % "rocesarla. Ade(+s! "uesto que la in$or(acin se env*a en $lu/os de <#L! no i("orta la i("le(entacin e("leada "ara enviar o recoer la in$or(acin ]as* co(o la "lata$or(a e("leadaC. Si("le(ente se e4ie a los co("onentes que recono3can el $or(ato <#L e("leado "ara el "roceso! env*o % rece"cin de un =ataSet. M!,*e,)")e,*o En el ciclo de vida de una a"licacin los ca(&ios "oco sustanciales % (odestos son "er(isi&les. Pero cuando es necesario a&ordar un ca(&io estructural o arquitectnico del siste(a! la tarea se vuelve de(asiado co("le/a % a veces invia&le. Esto es una ran desventa/a de los siste(as actuales! "ues (uc)as veces se trata de una cuestin de actuali3acin de los "rocesos de la "ro"ia e("resa. Ade(+s! cuanto (+s se au(enta el "roceso de la o"erativa de la e("resa! las necesidades de "roceso crecen )asta des&ordar las (+quinas. Es "or ello que se se"ara la estructura de un "rora(a en varias ca"as. Una de esas ca"as es la de datos! que es $unda(ental desarrollar correcta(ente. Gracias a los =ataSets! la tarea de "ortar % au(entar los "rocesos de datos % de neocio ser+ (as sencillo, el interca(&io de in$or(acin a trav>s de <#L! )ace que sea (+s sencilla la tarea de estructurar en (+s ca"as la a"licacin! convirti>ndola en (+s (odular % $+cil de (antener. Pror!"!%)B, Los "rora(adores "ueden acceder a un API de "rora(acin estructurado! de $uerte ti"i$icado % que ade(+s se concentra en la correcta $or(a de "resentar los datos. Centra en la estructura del lenua/e lo que un "rora(ador necesita "ara diseXar los "rora(as sin dar (uc)os rodeos. El Cdio $uente (uestra un e/e("lo de cdio sin ti"i$icar, ^.... I$ CosteTotal D Ta&le5HClienteH65HLuisH6.Colu(n5HCredito=is"oni&leH6 T)en ^.... Co(o se "uede o&servar! a"arecen no(&res de o&/etos en>ricos del siste(a que co("lican la lectura del cdio! a la "ar que los o"eradores co("lican ta(&i>n la visin de la secuencia de acceso a los datos. Podr*a(os inter"retar lo que )ace racias a que a"arecen los no(&res "ro"ios de los datos que necesita(os. El Cdio $uente (uestra un e/e("lo un "oco (+s ti"i$icado, ^.... I$ CosteTotal D =ataSet?.Cliente5HLuisH6.Credito=is"oni&le T)en ^.... El e/e("lo es e4acta(ente iual al anterior! "ero en este caso! el cdio se centra (+s en los o&/etos reales que en el o&/eto del lenua/e en s*, las "ala&ras Table % Column %a no a"arecen. En su luar ve(os que a"arecen los no(&res de los o&/etos e("leados de la vida real! lo que )ace el cdio (+s lei&le. Si a esto uni(os que los entornos %a son ca"aces de a%udarnos a escri&ir el cdio! todav*a lo tene(os (+s sencillo! %a que "ode(os ver con nuestras "ala&ras el (odelo de o&/etos de datos que necesita(os en cada (o(ento. Incluso a nivel de e/ecucin nos ve(os res"aldado "or un siste(a de control de ti"os % errores que nos "er(itir+n "ro"orcionar una ro&uste3 innata! que antes no se ten*a sin "asar "or el uso de $unciones e4ternas. Re,.)")e,*o Puesto que tra&a/a(os con o&/etos de datos desconectados! todo el "roceso se acelera! %a que no tene(os que estar co(unic+ndonos "or #ars)allin con el servidor. Ade(+s! racias al (odelo de <#L la conversin de ti"os no es necesaria a nivel de CO#. Se reduce "ues el anc)o de &anda dis"oni&le! se inde"endi3a (+s el cliente del servidor! % se descara (+s a >ste! que "uede estar dedicado a otras tareas en lo que el cliente anali3a sus datos. Es%!+!$)+).!. Las a"licaciones 0e& tienen un n;(ero ili(itado de cone4iones "otenciales de&ido a la naturale3a de Internet. Los servidores son ca"aces de atender (u% &ien decenas % decenas de cone4iones. Pero cuando )a&la(os de (iles % (illones! los servidores %a no son ca"aces de reali3ar correcta(ente su tra&a/o. Esto es de&ido a que "or cada usuario se (antiene una (e(oria de "roceso % cone4in! un con/unto de &loqueos de recursos co(o "uedan ser ta&las! *ndices! etc.! % una co("ro&acin de sus "er(isos1 todo ello consu(e tie("o % recursos. A=O .NET $avorece la escala&ilidad! "uesto que su (odelo de cone4in O$$CLine evita que se (antenan los recursos reservados (+s tie("o del considerado necesario. Esto "er(ite que (+s usuarios "or unidad de tie("o "uedan acceder a la a"licacin sin "ro&le(as de tie("os. Ade(+s se "ueden (ontar servicios en Cluster de alta dis"oni&ilidad que ser+n &alanceados auto(+tica(ente "or el siste(a sin a$ectar a las cone4iones A=O. Lo cual aranti3a la a("liacin del servicio sin re"resentar un ca(&io de arquitectura de diseXo. Ar(u)*e%*ur! .e .!*os .es%o,e%*!.os A=O .NET est+ &asado en una arquitectura desconectada de los datos. En una a"licacin de datos se )a co("ro&ado que (antener los recursos reservados (uc)o tie("o! i("lica reducir el n;(ero de usuarios conectados % au(enta el "roceso del siste(a al (antener una "ol*tica de &loqueos % transacciones. Al (is(o tie("o! si la a"licacin (antiene (+s de un o&/eto si(ult+nea(ente! se encuentra con el "ro&le(a de tener que estar continua(ente conectando con el servidor "ara ali(entar las relaciones e4istentes entre a(&as! su&iendo % &a/ando in$or(acin v*a RPC. Con A=O .NET se consiue estar conectado al servidor slo lo estricta(ente necesario "ara reali3ar la o"eracin de cara de los datos en el =ataSet. =e esta (anera se reducen los &loqueos % las cone4iones a la (*ni(a e4"resin. Se "ueden so"ortar (uc)os (+s usuarios "or unidad de tie("o % dis(inu%en los tie("os de res"uesta! a la "ar que se aceleran las e/ecuciones de los "rora(as. Tradicional(ente! el recoer in$or(acin de una &ase de datos )a ido destinado a reali3ar un "roceso con dic)a in$or(acin, (ostrarla "or "antalla! "rocesarla o enviarla a al;n co("onente. Frecuente(ente! la a"licacin no necesita una ;nica $ila! sino un &uen con/unto de ellas. Ade(+s! ta(&i>n $recuente(ente! ese con/unto de $ilas "rocede no de una ta&la sino de una unin de (;lti"les ta&las 5/oin de ta&las6. Una ve3 que estos datos son carados! la a"licacin los trata co(o un &loque co("acto. En un (odelo desconectado! es invia&le el tener que conectar con la &ase de datos cada ve3 que avan3a(os un reistro "ara recoer la in$or(acin asociada a ese reistro 5condiciones del /oin6. Para solucionarlo! lo que se reali3a es al(acenar te("oral(ente toda la in$or(acin necesaria donde sea necesario % tra&a/ar con ella. Esto es lo que re"resenta un =ataSet en el (odelo A=O .NET. Un =ataSet es una cac)> de reistros recu"erados de una &ase de datos que act;a co(o un siste(a de al(acena(iento virtual! % que contiene una o (+s ta&las &asadas en las ta&las reales de la &ase de datos. Adicional(ente! al(acena las relaciones % relas de interidad e4istentes entre ellas "ara aranti3ar la esta&ilidad e interidad de la in$or(acin de la &ase de datos. #u% i("ortante es recalcar! que los =ataSets son al(acenes "asivos de datos! esto es! no se ven alterados ante ca(&ios su&%acentes de la &ase de datos. Es necesario recararlos sie("re que quera(os estar al da, en cuanto a datos se re$iere. Una de las (a%ores venta/as de esta i("le(entacin! es que una ve3 o&tenido el =ataSet! >ste "uede ser enviado 5en $or(a de $lu/o <#L6 entre distintos co("onentes de la ca"a de neocio! co(o si de una varia&le (+s se tratase! a)orrando as* co(unicaciones a trav>s de la &ase de datos. Una consecuencia lica de este ti"o de arquitecturas! es la de conseuir que los =ataSets sean inde"endientes de los or*enes de datos. Los drivers OLEC =: trans$or(ar+n la consulta S7L en un cursor re"resentado con una estructura <#L! que es inde"endiente del (otor de la &ase de datos. Esto nos "er(itir+ tra&a/ar con (;lti"les or*enes de datos! de distintos $a&ricantes e incluso en $or(atos que no "ertene3can a &ases de datos! "or e/e("lo! $ic)eros "lanos u )o/as de c+lculo! lo que re"resenta un i("ortante "unto de co("ati&ilidad % $le4i&ilidad. Si a esto uni(os el )ec)o de que dis"one(os de un (odelo consistente de o&/etos 54(l=O#6 que es inde"endiente del orien de datos! las o"eraciones de los =ataSets no se ver+n a$ectadas "or dic)o orien. La "ersistencia es un conce"to (u% interesante en el (undo del desarrollo. Es un (ecanis(o "or el cual un co("onente "uede al(acenar su estado 5valores de varia&les! "ro"iedades! datos...en un (o(ento concreto del tie("o6 en un so"orte de al(acena(iento $i/o. =e (anera! que cuando es necesario! se "uede recarar el co("onente tal % co(o qued en una o"eracin anterior. En un siste(a de tra&a/o O$$CLine co(o el que "lantea A=O .NET! la "ersistencia es un (ecanis(o $unda(ental. Pode(os cerrar la a"licacin % (antener "ersistentes todos los =ataSets necesarios! de (anera que al reiniciarla! nos encontra(os los =ataSets tal % co(o los de/a(os. A)orrando el tie("o que )u&iera sido necesario "ara recu"erar de nuevo toda esa in$or(acin del servidor. O"ti(i3ando todav*a (+s el rendi(iento del siste(a distri&uido. El $or(ato que e("lea A=O .NET "ara al(acenar su estado es <#L. Puesto que %a es un est+ndar de la industria! esta "ersistencia nos o$rece las siuientes cualidades, - La in$or(acin "uede estar accesi&le "ara cualquier co("onente del siste(a que entienda <#L. - Es un $or(ato de te4to "lano! no &inario! que lo )ace co("ati&le con cualquier co("onente de cualquier "lata$or(a! % recu"era&le en cualquier circunst LA CLASE CONNECTION En los e/e("los con datos que va(os a reali3ar! se )a utili3ado S7L Server 8999 co(o servidor de datos! % $unda(ental(ente! la &ase de datos Nort)'ind. El "ri(er "aso o&liado en un acceso a datos consiste en esta&lecer una cone4in con un al(ac>n de datos. Esto lo va(os a conseuir racias a las clases Connection de A=O .NET! que nos "er(itir+n conectarnos a un orien de datos 5%a sea una &ase de datos o no6 ! al iual que en A=O cl+sico e("le+&a(os el o&/eto Connection. En A=O se "od*a e/ecutar directa(ente una sentencia contra el al(ac>n de datos! o &ien a&rir un con/unto de reistros 5Recordset6! "ero en A=O .NET no va(os a reali3ar esta o"eracin con este ti"o de o&/etos. =e&e(os recordar que e4isten dos i("le(entaciones "ara alunos de los o&/etos de A=O .NET! cada uno es"ec*$ico del orien de datos con el que nos va(os a conectar. Esto ocurre con el o&/eto Connection! que tiene dos versiones! una co(o "roveedor de datos de S7L Server! a trav>s de la clase S%ste(.=ata.SqlClient.SqlConnection! % otra co(o "roveedor de datos OLE=:! a trav>s de la clase S%se(.=ata.Ole=&.Ole=&Connection. Por nor(a eneral! del o&/eto Connection utili3are(os los (>todos O"en5 6 % Close5 6! "ara a&rir % cerrar cone4iones res"ectiva(ente! con el al(ac>n de datos adecuado. Aunque tene(os el recolector de &asura que estiona de $or(a auto(+tica los recursos % o&/etos que no son utili3ados! es reco(enda&le cerrar las cone4iones de $or(a e4"l*cita utili3ando el (>todo Close5 6. Las cone4iones se a&rir+n de $or(a e4"l*cita utili3ando el (>todo O"en56! "ero ta(&i>n se "uede )acer de $or(a i("l*cita utili3ando un o&/eto =ataAda"ter! esta "osi&ilidad la vere(os (+s adelante. Cuando e/ecuta(os el (>todo O"en56 so&re un o&/eto Connection 5SqlConnection o Ole=&Connection6! se a&rir+ la cone4in que se )a indicado en su "ro"iedad ConnectionStrin! es decir! esta "ro"iedad indicar+ la cadena de cone4in que se va a utili3ar "ara esta&lecer la cone4in con el al(ac>n de datos corres"ondiente. El (>todo O"en56 no "osee "ar+(etros. El constructor de la clase Connection 5al decir clase Connection de $or(a en>rica nos esta(os re$iriendo en con/unto a las clases SqlConnection % Ole=&Connection de A=O .NET6 se encuentra so&recarado! % en una de sus versiones reci&e co(o "ar+(etro una cadena que ser+ la cadena de cone4in que se a"lique a su "ro"iedad ConnectionStrin. Si )ace(os uso de la clase SqlConnection! en la cadena de cone4in no "odre(os es"eci$icar una =SN de O=:C! %a que la cone4in se va a reali3ar en este caso directa(ente con S7L Server. W si utili3a(os la clase Ole=&Connection de&e(os es"eci$icar el "roveedor OLE=: que se va a utili3ar "ara esta&lecer la cone4in! una e4ce"cin es el "roveedor OLE=: "ara O=:C 5#S=AS7L6! que no "uede ser utili3ado! %a que el "roveedor OLE=: de .NET no so"orta el "roveedor de O=:C! en este caso de&ere(os reali3ar la cone4in utili3ando el "roveedor adecuado al al(ac>n de datos. Los "roveedores OLE=: que son co("ati&les con A=O .NET son, S7LOLE=:, #icroso$t OLE =: Provider $or S7L Server. #S=AORA, #icroso$t OLE =: Provider $or Oracle. #icroso$t.[et.OLE=:.O.9, OLE =: Provider $or #icroso$t [et. La sinta4is utili3ada "ara indicar la cadena de cone4in! con las "articularidades "ro"ias de cada "roveedor! vere(os que es (u% si(ilar a la utili3ada en A=O cl+sico. El Cdio $uente EEM (uestra un e/e("lo de cone4in con un servidor S7L Server 8999! % su "osterior descone4in! utili3ando un o&/eto SqlConnection. =e&e(os i("ortar el es"acio de no(&res =ata.SqlClient "ara "oder utili3ar el o&/eto. Este cdio lo "ode(os asociar a la "ulsacin de un &otn en un $or(ulario. I("orts S%ste(.=ata.SqlClient T.... Tr% T crear el o&/eto de cone4in =i( oCone4ion As Ne' SqlConnection56 T "asar la cadena de cone4in oCone4ion.ConnectionStrin K HserverK5local61H _ Hdata&aseKNort)'ind1uidKsa1"'dK1H T a&rir cone4in oCone4ion.O"en56 #essae:o4.S)o'5HConectadoH6 T cerrar cone4in oCone4ion.Close56 #essae:o4.S)o'5H=esconectadoH6 Catc) oE4ce" As SqlE4ce"tion T si se "roduce al;n error! T lo ca"tura(os (ediante el o&/eto T de e4ce"ciones "articular "ara T el "roveedor de S7L Server #essae:o4.S)o'5HError al conectar con datosH _ ControlC)ars.CrL$ _ oE4ce".#essae _ ControlC)ars.CrL$ _ oE4ce".Server6 End Tr% El Cdio $uente EE` (uestra la (is(a o"eracin "ero usando el o&/eto de cone4in "ara el "roveedor de OLE=:. O&serve el lector las di$erencias en las cadenas de cone4in % el o&/eto de e4ce"cin con res"ecto al anterior e/e("lo! as* co(o el es"acio de no(&res a i("ortar. I("orts S%ste(.=ata.Ole=& T.... Tr% T crear el o&/eto de cone4in =i( oCone4ion As Ne' Ole=&Connection56 oCone4ion.ConnectionStrin K HProviderKS7LOLE=:1H _ HServerK5local61=ata&aseKNort)'ind1uidKsa1"'dK1H T a&rir cone4in oCone4ion.O"en56 #essae:o4.S)o'5HConectadoH6 T cerrar cone4in oCone4ion.Close56 #essae:o4.S)o'5H=esconectadoH6 Catc) oE4ce" As Ole=&E4ce"tion T si se "roduce al;n error! T lo ca"tura(os (ediante el o&/eto T de e4ce"ciones "articular "ara T el "roveedor de OLE=: #essae:o4.S)o'5HError al conectar con datosH _ ControlC)ars.CrL$ _ oE4ce".#essae _ ControlC)ars.CrL$ _ oE4ce".Source566 End Tr% LA CLASE COMMAND Esta&lecida una cone4in con un al(ac>n de datos! la siuiente o"eracin lica consiste en enviarle sentencias "ara reali3ar los distintos ti"os de o"eraciones que )a&itual(ente reali3a(os con los datos. Las clases Co((and de A=O .NET ser+n las usare(os "ara reali3ar tales o"eraciones. SqlCo((and % Ole=&Co((and! son (u% si(ilares al o&/eto Co((and e4istente en A=O. El o&/eto Co((and nos va a "er(itir e/ecutar una sentencia S7L o un "rocedi(iento al(acenado so&re la $uente de datos a la que esta(os accediendo. A trav>s de un o&/eto Co((and ta(&i>n "odre(os o&tener un con/unto de resultados del al(ac>n de datos. En este caso! los resultados se "asar+n a otros o&/etos de A=O .NET! co(o =ataReader o =ataAda"ter1 estos dos o&/etos los co(entare(os (+s adelante. Un o&/eto Co((and lo va(os a crear a "artir de una cone4in %a e4istente! % va a contener una sentencia S7L "ara e/ecutar so&re la cone4in esta&lecida con el orien de datos. Entre las "ro"iedades que o$recen los o&/etos SqlCo((and % Ole=&Co((and! ca&en destacar las siuientes. Co""!,.TeC*. Contiene una cadena de te4to que va a indicar la sentencia S7L o "rocedi(iento al(acenado que se va a e/ecutar so&re el orien de los datos. Co""!,.T)"eou*. Tie("o de es"era en seundos que se va a a"licar a la e/ecucin de un o&/eto Co((and. Su valor "or de$ecto es de N9 seundos. Co""!,.T0Ae. Indica el ti"o de co(ando que se va a e/ecutar contra el al(ac>n de datos! es decir! indica co(o se de&e inter"retar el valor de la "ro"iedad Co((adTe4t. Puede tener los siuientes valores, StoredProcedure! "ara indicar que se trata de un "rocedi(iento al(acenado1 Ta&le=irect se trata de o&tener una ta&la "or su no(&re 5;nica(ente a"lica&le al o&/eto Ole=&Co((and61 % Te4t que indica que es una sentencia S7L. EL valor "or de$ecto es Te4t. Co,,e%*)o,. =evuelve el o&/eto SqlConnection o Ole=&Connection utili3ado "ara e/ecutar el o&/eto Co((and corres"ondiente. P!r!"e*ers. Coleccin de "ar+(etros que se "ueden utili3ar "ara e/ecutar el o&/eto Co((and! esta coleccin se utili3a cuando desea(os e/ecutar sentencias S7L que )acen uso de "ar+(etros! esta "ro"iedad devuelve un o&/eto de la clase SqlPara(eterCollection o un o&/eto de la clase Ole=&Para(eterCollection. Estas colecciones contendr+n o&/etos de la clase SqlPara(ter % Ole=&Para(eter! res"ectiva(ente! "ara re"resentar a cada uno de los "ar+(etros utili3ados. Estos "ar+(etros ta(&i>n son utili3ados "ara e/ecutar "rocedi(ientos al(acenados. Una ve3 vistas alunas de las "ro"iedades de las clases SqlCo((and % Ole=&Co((and! va(os a "asar a co(entar &reve(ente los "rinci"ales (>todos de estas clases. Cre!*eP!r!"e*er. Crea un "ar+(etro "ara el que des"u>s "odre(os de$inir una serie de caracter*sticas es"ec*$icas co(o "ueden ser el ti"o de dato! su valor! ta(aXo! etc. =evolver+ un o&/eto de la clase SqlPara(eter u Ole=&Para(eter. ECe%u*eNo,Quer0. E/ecuta la sentencia S7L de$inida en la "ro"iedad Co(andTe4t contra la cone4in de$inida en la "ro"iedad Connection. La sentencia a e/ecutar de&e ser de un ti"o que no devuelva un con/unto de reistros! "or e/e("lo U"date! =elete o Insert. Este (>todo devuelve un entero indicando el n;(ero de $ilas que se )an visto a$ectadas "or la e/ecucin del o&/eto Co((and. ECe%u*eRe!.er. E/ecuta la sentencia S7L de$inida en la "ro"iedad Co(andTe4t contra la cone4in de$inida en la "ro"iedad Connection. En este caso! la sentencia s* devolver+ un con/unto de reistros. El resultado de la e/ecucin de este ser+ un o&/eto de la clase Sql=ataReaderLOle=&=ataReader! que nos va a "er(itir leer % recorrer los resultados devueltos "or la e/ecucin del o&/eto Co((and corres"ondiente. ECe%u*eS%!+!r. Este (>todo se utili3a cuando desea(os o&tener la "ri(era colu(na de la "ri(era $ila del con/unto de reistros! el resto de datos no se tendr+n en cuenta. La utili3acin de este (>todo tiene sentido cuando esta(os e/ecutando una sentencia S7L del ti"o Select Count5U6. Este (>todo devuelve un o&/eto de la clase en>rica O&/ect. PreA!re. Este (>todo constru%e una versin co("ilada del o&/eto Co((and dentro del al(ac>n de datos. A continuacin (ostrare(os alunos e/e("los de uso de o&/etos Co((and. El Cdio $uente ilustra la insercin de un reistro utili3ando un o&/eto SqlCo((and. En "ri(er luar utili3a(os un constructor de la clase! que reci&e co(o "ar+(etro la sentencia a e/ecutar % la cone4in. Co(o va(os a e/ecutar una sentencia que no "roduce un con/unto de resultados! e("leare(os el (>todo E4ecuteNon7uer%5 6. O&serve ta(&i>n el lector en este e/e("lo! que la cone4in slo "er(anece a&ierta en el (o(ento de e/ecutar el co(ando1 esta es la t>cnica reco(enda&le que de&e(os utili3ar "ara todas las o"eraciones con datos, (antener a&ierta la cone4in el (enor tie("o "osi&le. T crear cone4in =i( oCone4ion As Ne' SqlConnection56 oCone4ion.ConnectionStrin K HServerK5local61H _ H=ata&aseKGestion1uidKsa1"'dK1H T crear sentencia S7L =i( sS7L As Strin sS7L K HINSERT INTO Clientes 5I=Cliente!No(&re!FInreso6 H _ H2ALUES5?9!TAl$redoT!T?MLQL8998T6H T crear co(ando =i( oCo(ando As Ne' SqlCo((and5sS7L! oCone4ion6 =i( iResultado As Inteer oCone4ion.O"en56 T a&rir cone4in iResultado K oCo(ando.E4ecuteNon7uer%56 T e/ecutar co(ando oCone4ion.Close56 T cerrar cone4in #essae:o4.S)o'5HReistros aXadidos,H _ iResultado6 En el Cdio $uente Ea? reali3a(os ta(&i>n la insercin con un SqlCo((and! "ero utili3ando en este caso "ar+(etros. En la cadena que tiene la sentencia S7L indicare(os los "ar+(etros con el $or(ato ^VNo(&rePar+(etrob. Para crear cada uno de los "ar+(etros utili3are(os la clase SqlPara(eter! (ientras que "ara aXadir los "ar+(etros usare(os la coleccin Par+(eters del o&/eto SqlCo((and % su (>todo Add5 6. Res"ecto a la creacin de los "ar+(etros! "ode(os o&servar que es (u% $le4i&le! %a que co(o ve(os en este e/e("lo! cada uno de ellos se crea de un (odo distinto! es"eci$icando el no(&re! ti"o de dato % valor. T crear cone4in =i( oCone4ion As Ne' SqlConnection56 oCone4ion.ConnectionStrin K HServerK5local61H _ H=ata&aseKGestion1uidKsa1"'dK1H T crear sentencia S7L "ara insertar un reistro con T "ar+(etros1 indica(os el no(&re del "ar+(etro con T VNo(&rePar+(etro =i( sS7L As Strin sS7L K HINSERT INTO Clientes 5I=Cliente!No(&re!FInreso6 H _ H2ALUES5VCodCli!VNo(&re!VFec)a6H T crear co(ando =i( oCo(ando As Ne' SqlCo((and5sS7L! oCone4ion6 T aXadir "ar+(etros al co(ando, T "ar+(etro "ri(er ca("o oCo(ando.Para(eters.Add5Ne' SqlPara(eter5HVCodCliH! Sql=&T%"e.Int66 oCo(ando.Para(eters5HVCodCliH6.2alue K 8E T "ar+(etro seundo ca("o oCo(ando.Para(eters.Add5Ne' SqlPara(eter5HVNo(&reH! HRaquelH66 T "ar+(etro tercer ca("o =i( oPara(etro As Ne' SqlPara(eter56 oPara(etro.Para(eterNa(e K HVFec)aH oPara(etro.Sql=&T%"e K Sql=&T%"e.=ateTi(e oPara(etro.2alue K H8EL?9L8998H oCo(ando.Para(eters.Add5oPara(etro6 =i( iResultado As Inteer oCone4ion.O"en56 T a&rir cone4in iResultado K oCo(ando.E4ecuteNon7uer%56 T e/ecutar co(ando oCone4ion.Close56 T cerrar cone4in #essae:o4.S)o'5HReistros aXadidos,H _ iResultado6 Si e("lea(os un o&/eto Ole=&Co((and! la sinta4is de la sentencia S7L ca(&ia! %a que los "ar+(etros de&ere(os indicarlos co(o )ac*a(os en A=O cl+sico! utili3ando el car+cter ^cb. 2ea(os un e/e("lo en el Cdio $uente . T crear el o&/eto de cone4in =i( oCone4ion As Ne' Ole=&Connection56 oCone4ion.ConnectionStrin K HProviderKS7LOLE=:1H _ HServerK5local61=ata&aseKGestion1uidKsa1"'dK1H T crear sentencia S7L "ara (odi$icar un reistro con T "ar+(etros1 indica(os el "ar+(etro con c =i( sS7L As Strin sS7L K HUP=ATE Clientes SET No(&re K c H _ H0AERE I=Cliente K 8H T crear co(ando =i( oCo(ando As Ne' Ole=&Co((and5sS7L! oCone4ion6 oCo(ando.Para(eters.Add5Ne' Ole=&Para(eter5HNo(&reCliH! Ole=&T%"e.2arC)ar! E966 oCo(ando.Para(eters5HNo(&reCliH6.2alue K H=avidH =i( iResultado As Inteer oCone4ion.O"en56 T a&rir cone4in iResultado K oCo(ando.E4ecuteNon7uer%56 T e/ecutar co(ando oCone4ion.Close56 T cerrar cone4in #essae:o4.S)o'5HReistros (odi$icados,H _ iResultado6 En el caso de que necesite(os e/ecutar un "rocedi(iento al(acenado! de&e(os indicarlo (ediante las "ro"iedades Co((andT%"e % Co((andTe4t del o&/eto Co((and que este(os utili3ando. En la "ri(era esta&lece(os el ti"o de co(ando 5"rocedi(iento al(acenado6 seleccionando el valor de la enu(eracin asociada a la "ro"iedad1 % en la seunda asina(os una cadena con el no(&re del "rocedi(iento al(acenado. El Cdio $uente EaN (uestra un e/e("lo! en el que "ode(os co("ro&ar que )e(os utili3ado un constructor de SqlCo((and sin "ar+(etros! "or lo que el o&/eto Connection lo asina(os des"u>s (ediante la "ro"iedad Connection. T crear cone4in =i( oCone4ion As Ne' SqlConnection56 oCone4ion.ConnectionStrin K HServerK5local61H _ H=ata&aseKGestion1uidKsa1"'dK1H T crear co(ando "ara e/ecutar "rocedi(iento al(acenado T que &orra un reistro =i( oCo(ando As Ne' SqlCo((and56 oCo(ando.Connection K oCone4ion oCo(ando.Co((andT%"e K Co((andT%"e.StoredProcedure oCo(ando.Co((andTe4t K H:orraCliH T aXadir "ar+(etro al co(ando oCo(ando.Para(eters.Add5Ne' SqlPara(eter5HVI=ClienteH! Sql=&T%"e.Int66 oCo(ando.Para(eters5HVI=ClienteH6.2alue K 8E =i( iResultado As Inteer oCone4ion.O"en56 T a&rir cone4in iResultado K oCo(ando.E4ecuteNon7uer%56 T e/ecutar co(ando oCone4ion.Close56 T cerrar cone4in #essae:o4.S)o'5HReistros &orrados,H _ iResultado6 Para o&tener el resultado de una $uncin del lenua/e S7L! "or e/e("lo Count5 6! e("leare(os el (>todo E4ecuteScalar5 6 del o&/eto Co((and. En el Cdio $uente EaO! la e/ecucin de este (>todo nos devuelve el n;(ero de $ilas de una ta&la de la &ase de datos! que (ostra(os en un (ensa/e. T crear cone4in =i( oCone4ion As Ne' SqlConnection56 oCone4ion.ConnectionStrin K HServerK5local61H _ H=ata&aseKGestion1uidKsa1"'dK1H T crear co(ando escalar =i( sS7L As Strin sS7L K HSELECT COUNT5U6 FRO# ClientesH T crear co(ando =i( oCo(ando As Ne' SqlCo((and5sS7L! oCone4ion6 =i( iResultado As Inteer oCone4ion.O"en56 T a&rir cone4in iResultado K oCo(ando.E4ecuteScalar56 T e/ecutar co(ando oCone4ion.Close56 T cerrar cone4in #essae:o4.S)o'5HN;(ero de reistros de clientes,H _ iResultado6 DATASET =iseXe el siuiente $or(ulario NO TIPADO3 Private Su& :utton?JClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles :utton?.Clic. T No ti"ado =i( 'cone4ion As Ne' SqlClient.SqlConnection5H=ata SourceK5local61interated securit%KSSPI1initial cataloKNort)'indH6 =i( 'S7L=A? As Ne' SqlClient.Sql=ataAda"ter5HSelect U $ro( custo(ersH! 'cone4ion6 =i( '=ataset As Ne' =ataSet 'S7L=A?.Fill5'=ataset! Hcusto(ersH6 =i( '$ila As =ataRo' For Eac) '$ila In '=ataset.Ta&les5HCusto(ersH6.Ro's List:o4?.Ite(s.Add5'$ila5HCo("an%Na(eH66 Ne4t End Su& TIPADO3 Private Su& :utton8JClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles :utton8.Clic. =i( 'cone4ion As Ne' SqlClient.SqlConnection5H=ata SourceK5local61interated securit%KSSPI1initial cataloKNort)'indH6 =i( 'S7L=A? As Ne' SqlClient.Sql=ataAda"ter5HSelect U $ro( custo(ersH! 'cone4ion6 =i( '=ataset As Ne' =sCusto(ers 'S7L=A?.Fill5'=ataset! HCusto(ersH6 =i( '$ila As =sCusto(ers.Custo(ersRo' For Eac) '$ila In '=ataset.Custo(ers List:o4?.Ite(s.Add5'$ila.Co("an%Na(e6 Ne4t End Su& CONCATENACIN =iseXe el siuiente $or(ulario Private Su& :utton?JClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles :utton?.Clic. =i( cnn As Ne' SqlClient.SqlConnection5H=ata SourceK5local61interated securit%KSSPI1initial cataloKNort)'indH6 =i( da As Ne' SqlClient.Sql=ataAda"ter5He4ec s"Jconcatenacion TH P Te4t:o4?.Te4t P HTH! cnn6 =i( ds As Ne' =ataSet da.Fill5ds! HconcatenacionH6 =i( '$ila As =ataRo' For Eac) '$ila In ds.Ta&les5HconcatenacionH6.Ro's List:o4?.Ite(s.Add5'$ila5HNo(&re Co("letoH6 P H H P Tri(5'$ila5HReion=escri"tionH66 P H H P '$ila5He(ailH66 Ne4t End Su& PROCEDIMENTO ALMACENADO CREATE PROCE=URE s"Jconcatenacion Vdesc nvarc)ar5E96 AS SELECT =ISTINCT LastNa(e P T! T P FirstNa(e as TNo(&re Co("letoT! Reion=escri"tion! SU:STRING5FirstNa(e!?!?6 P LastNa(e P HVcontinental.edu."eH as e(ail FRO# E("lo%ees e INNER [OIN E("lo%eeTerritories et ON e.E("lo%eeI= K et.E("lo%eeI= INNER [OIN Territories t ON t.Territor%I= K et.Territor%I= INNER [OIN Reion r ON t.ReionI= K r.ReionI= 0AERE Reion=escri"tionKVdesc OR=ER :W Reion=escri"tion! LastNa(e P T! T P FirstNa(e ADO.NET CON CLASES =iseXe el siuiente $or(ulario I("orts S%ste(.=ata.SqlClient Pu&lic Class For(? In)erits S%ste(.0indo's.For(s.For( Protected Const cone4ion As Strin K J HServerK5local61H _ J H=ata:aseKNort)'ind1H _ J HInterated Securit%KSSPIH =i( clientes As Ne' ClienteA=ONET Private Su& For(?JLoad5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles #%:ase.Load 0it) #e.lstCusto(ers .=is"la%#e(&er K HCo("an%Na(eH .2alue#e(&er K HCusto(erI=H .=ataSource K clientes.CrearClientes5cone4ion6.Ta&les5HClientesH6.=e$ault2ie'56 .SelectedInde4 K 9 End 0it) End Su& Private Su& :utton?JClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles :utton?.Clic.
clientes.Incluir5HaH! H&H! HcH! HdH! HeH! H$H! HaH! H)H! cone4ion6 0it) #e.LstCusto(ers .=is"la%#e(&er K HCo("an%Na(eH .2alue#e(&er K HCusto(erI=H .=ataSource K clientes.CrearClientes5cone4ion6.Ta&les5HClientesH6.=e$ault2ie'56 .SelectedInde4 K 9 End 0it) End Su& End Class CLASE CLIENTEADONET I("orts S%ste(.=ata.SqlClient Pu&lic Class ClienteA=ONET Pu&lic Function CrearClientes5:%2al cone4ion As Strin6 As =ataSet Tr% =i( conn As Ne' SqlConnection5cone4ion6 =i( sql As Strin K HSelect Custo(erI=! Co("an%Na(e FRO# Custo(ers OR=ER :W Co("an%Na(eH =i( dsCusto(ers As Ne' =ataSet =i( daCusto(ers As Ne' Sql=ataAda"ter5sql! conn6 daCusto(ers.Fill5dsCusto(ers! HClientesH6 Return dsCusto(ers Catc) err As SqlE4ce"tion T)ro' err Catc) err As E4ce"tion T)ro' err End Tr% End Function Pu&lic Su& Incluir5:%2al E("resaI= As Strin! :%2al E("resa As Strin! :%2al Contacto As Strin! J :%2al =ireccion As Strin! :%2al Ciudad As Strin! :%2al Tele$ono As Strin! :%2al Fa4 As Strin! :%2al Pais As Strin! :%2al cone4ion As Strin6 Tr% =i( conn As Ne' SqlConnection5cone4ion6 =i( c(d As SqlCo((and =i( sql:uilder As Ne' S%ste(.Te4t.Strin:uilder 0it) sql:uilder .A""end5HINSERT INTO Custo(ers H6 .A""end5H5Custo(erI=! Co("an%Na(e! ContactNa(e! Address! H6 .A""end5HCit%! P)one! Fa4! Countr%6 H6 .A""end5H 2ALUES 5TH6 .A""end5E("resaI= _ HT!TH6 .A""end5E("resa _ HT!TH6 .A""end5Contacto _ HT!TH6 .A""end5=ireccion _ HT!TH6 .A""end5Ciudad _ HT!TH6 .A""end5Tele$ono _ HT!TH6 .A""end5Fa4 _ HT!TH6 .A""end5Pais _ HT6H6 End 0it) conn K Ne' SqlConnection5cone4ion6 conn.O"en56 c(d K Ne' SqlCo((and5sql:uilder.ToStrin! conn6 c(d.E4ecuteNon7uer%56 conn.Close56 c(d.=is"ose56 conn.=is"ose56 Catc) err As E4ce"tion #essae:o4.S)o'5err.#essae6 End Tr% End Su& End Class ADO.NET CON CLASES E;ERCICIO 4 CREATE PROCE=URE s"Jinsertarcliente Vid as c)ar5E6! VE("resa as nvarc)ar5O96! VContacto as nvarc)ar5O96! V=ireccion as nvarc)ar5O96! Vciudad as nvarc)ar5O96! VTele$ono as nvarc)ar5O96! VFa4 as nvarc)ar5O96! VPais as nvarc)ar5O96 as INSERT INTO Custo(ers 5Custo(erI=! Co("an%Na(e! ContactNa(e! Address!Cit%! P)one! Fa4! Countr%6 2ALUES 5Vid!VE("resa!VContacto!V=ireccion!Vciudad!VTele$ono!VFa4!VPais6 Pu&lic Su& Incluir5:%2al E("resaI= As Strin! :%2al E("resa As Strin! :%2al Contacto As Strin! J :%2al =ireccion As Strin! :%2al Ciudad As Strin! :%2al Tele$ono As Strin! J :%2al Fa4 As Strin! :%2al Pais As Strin! :%2al cone4ion As Strin6 Tr% =i( conn As Ne' SqlConnection5cone4ion6 =i( c(d As SqlCo((and conn K Ne' SqlConnection5cone4ion6 conn.O"en56 c(d K Ne' SqlCo((and5He4ec s"Jinsertarcliente H _ HTH _ E("resaI= _ HT!TH _ E("resa _ HT!TH _ Contacto _ HT!TH _ =ireccion _ HT!TH _ Ciudad _ HT!TH _ Tele$ono _ HT!TH _ Fa4 _ HT!TH _ Pais _ HTH! conn6 c(d.E4ecuteNon7uer%56 conn.Close56 c(d.=is"ose56 conn.=is"ose56 Catc) err As E4ce"tion #essae:o4.S)o'5err.#essae6 End Tr% End Su& End Class ADO.NET CON CLASES E;ERCICIO 5 Pu&lic Class #icliente)i/o In)erits #icliente Pu&lic Overrides Function CrearClientes5:%2al cone4ion As Strin6 As =ataSet Tr% =i( conn As Ne' SqlConnection5cone4ion6 =i( sql As Strin K HSelect U FRO# e("lo%eesH =i( dsCusto(ers As Ne' =ataSet =i( daCusto(ers As Ne' Sql=ataAda"ter5sql! conn6 conn.O"en56 daCusto(ers.Fill5dsCusto(ers! HClientesH6 conn.Close56 Return dsCusto(ers Catc) err As SqlE4ce"tion #essae:o4.S)o'5err.#essae6 Catc) err As E4ce"tion #essae:o4.S)o'5err.#essae6 End Tr% End Function End Class Private Su& For(?JLoad5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles #%:ase.Load 0it) #e.List:o4? .=is"la%#e(&er K HCo("an%Na(eH .2alue#e(&er K HCusto(erI=H .=ataSource K clientes.CrearClientes5cone4ion6.Ta&les5HClientesH6.=e$ault2ie'56 .SelectedInde4 K 9 End 0it) 0it) #e.List:o48 .=is"la%#e(&er K HE("lo%eeI=H .=ataSource K )i/o.CrearClientes5cone4ion6.Ta&les5HClientesH6 .SelectedInde4 K 9 End 0it) =ataGrid?.=ataSource K )i/o.CrearClientes5cone4ion6.Ta&les5HClientesH6 End Su& DESARROLLO DE CASO PRACTICO DE FACTURACIN =iseXe el siuiente $or(ulario Private Su& FacturaJLoad5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles #%:ase.Load =i( i As Inteer conecta5Hselect idcliente $ro( ClientesH! HclientesH6 For i K 9 To ds.Ta&les5HclientesH6.Ro's.Count C ? c&ocodcliente.Ite(s.Add5ds.Ta&les5HclientesH6.Ro's5i6.Ite(5HidclienteH66 Ne4t =i( / As Inteer conecta5Hselect idarticulo $ro( ArticulosH! HarticulosH6 For / K 9 To ds.Ta&les5HarticulosH6.Ro's.Count C ?
#e.c&ocodarticulo.Ite(s.Add5ds.Ta&les5HarticulosH6.Ro's5/6.Ite(5HidarticuloH66 Ne4t =i( . As Inteer conecta5Hselect U $ro( e("leadoH! He("leadoH6 For . K 9 To ds.Ta&les5He("leadoH6.Ro's.Count C ?
#e.c&ocode("leado.Ite(s.Add5ds.Ta&les5He("leadoH6.Ro's5.6.Ite(5Hide("lea doH66 Ne4t Private Su& c&ocodclienteJSelectedInde4C)aned5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles c&ocodcliente.SelectedInde4C)aned conecta5Hselect U $ro( ClientesH! HClientesH6 =i( cod As Strin cod K c&ocodcliente.SelectedInde4 t4tno(cliente.Te4t K ds.Ta&les5HClientesH6.Ro's5cod65?6 t4tdircliente.Te4t K ds.Ta&les5HClientesH6.Ro's5cod6586 End Su& Private Su& c&ocodarticuloJSelectedInde4C)aned5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles c&ocodarticulo.SelectedInde4C)aned conecta5Hselect U $ro( ArticulosH! HArticulosH6 =i( cod? As Strin cod? K c&ocodarticulo.SelectedInde4 t4tno(articulo.Te4t K ds.Ta&les5HArticulosH6.Ro's5cod?6586 t4t"rearticulo.Te4t K ds.Ta&les5HarticulosH6.Ro's5cod?65O6 End Su& Private Su& &tnarearJClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles &tnarear.Clic. I$ #e.c&ocodarticulo.Te4t K HH Or #e.t4truc.Te4t K HH Or #e.c&ocode("leado.Te4t K HH Or #e.c&ocodcliente.Te4t K HH T)en #s:o45Hselecione todos los ca("os de la $actura "ara "roceder a arearH6 Else 0it) #e.lvdetalles 0it) .Ite(s.Add5.Ite(s.Count P ?6 .Su&Ite(s.Add5c&ocodarticulo.Te4t6 .Su&Ite(s.Add5t4tno(articulo.Te4t6 .Su&Ite(s.Add5t4t"rearticulo.Te4t6 .Su&Ite(s.Add5nudcantidad.Te4t6 .Su&Ite(s.Add52al5nudcantidad.Te4t6 U 2al5t4t"rearticulo.Te4t66 End 0it) #e.&tra&ar.Ena&led K True End 0it) End I$ End Su& Private Su& &tra&arJClic.5:%2al sender As S%ste(.O&/ect! :%2al e As S%ste(.EventArs6 Aandles &tra&ar.Clic. =i( $N As Ne' For(N56 =i( list As List2ie'Ite( Tr% I$ 2al5t4ttotal$actura.Te4t6 K 9 T)en #s:o45Harear a la lista antes de "roceder a ra&arH6 Else conecta5Hinsert into $acturas5id$actura!ruc!idcliente!$ec)a!ide("leado!total!iv!t"ao6 values5TH _ t4tnu($actura.Te4t _ HT!TH _ t4truc.Te4t _ HT!TH _ c&ocodcliente.Te4t _ HT!TH _ #icroso$t.2isual:asic.=ate2alue5dt"$ec)a.2alue6 _ HT!TH _ c&ocode("leado.Te4t _ HT!TH _ t4ttotal.Te4t _ HT!TH _ t4tiv.Te4t _ HT!TH _ t4ttotal$actura.Te4t _ HT6H! H$acturasH6 For Eac) list In lvdetalles.Ite(s conecta5Hinsert into detalles$act5id$actura!idarticulo!no(&re!"unitario!cantidad!stotal6 values5TH _ #e.t4tnu($actura.Te4t _ HT!TH _ list.Su&Ite(s5?6.Te4t _ HT!TH _ list.Su&Ite(s586.Te4t _ HT!TH _ list.Su&Ite(s5N6.Te4t _ HT!TH _ list.Su&Ite(s5O6.Te4t _ HT!TH _ list.Su&Ite(s5E6.Te4t _ HT6H! Hdetalles$actH6 Ne4t lvdetalles.Ite(s.Clear56 #e.&tra&ar.Ena&led K False Call li("iar56 End I$ Catc) 4 As SqlE4ce"tion #s:o454.#essae6 End Tr% lvdetalles.Ite(s.Clear56 End Su& CLASE Pu&lic Su& conecta5:%2al sql As Strin! :%2al ta&la As Strin6 Tr% cn K Ne' Ole=&Connection5H"roviderK(icroso$t./et.oled&.O.91data sourceKH _ A""lication.Startu"Pat) _ H\ventas.(d&H6 c( K Ne' Ole=&Co((and5sql! cn6 da K Ne' Ole=&=ataAda"ter5c(6 c& K Ne' Ole=&Co((and:uilder5da6 ds K Ne' =ata.=ataSet cn.O"en56 da.Fill5ds! ta&la6 cn.Close56 cn.=is"ose56 Tcn K Ne' SqlConnection5Hdata sourceK5local61initial cataloKventas1interated securit%KtrueH6 Tc( K Ne' SqlCo((and5sql! cn6 Tda K Ne' Sql=ataAda"ter5c(6 Tc& K Ne' SqlCo((and:uilder5da6 Tds K Ne' =ata.=ataSet Tcn.O"en56 Tda.Fill5ds! ta&la6 Tcn.Close56 Tcn.=is"ose56 Catc) e4 As E4ce"tion #essae:o4.S)o'5e4.#essae6 End Tr% End Su& MODELO M'LTIDIMENSIONAL D MODELO ENTIDAD/ RELACIN Para construir un =ata0are)ouse "ri(ero se de&e tener claro que e4iste una di$erencia entre la Estructura de la In$or(acin % la Se(+ntica de la In$or(acin! % que esta ;lti(a es (uc)o (+s di$*cil de a&arcar % que ta(&i>n es "recisa(ente con ella con la que se tra&a/a en la construccin de un =ata0are)ouse. R0OL``S Aqu* se encuentra la "rinci"al di$erencia entre los Siste(as O"eracionales % el =ata 0are)ouse % cada uno de ellos es sostenido "or un (odelo de datos di$erente. Los siste(as O"eracionales se sustentan en el #odelo Entidad Relacin 5#ER6 % =ata 0are)ouse tra&a/a con el #odelo #ultidi(ensional. / C!r!%*erEs*)%!s .e+ MER. a. #ane/a la redundancia $uera de los datos. Por lo tanto reali3ar un ca(&io en la &ase sini$ica tocarla en un solo luar. &. =ivide los datos en entidades! las que son re"resentadas co(o Ta&las en una &ase de =atos. c. Los #ER crecen $+cil(ente! )aci>ndose (+s % (+s co("le/os. d. Se "uede a"reciar la e4istencia de (uc)os ca(inos "ara ir de una Ta&la a otra. Ser*a natural "ensar que al tener diversos ca(inos "ara llear desde una ta&la a otra! cualquiera de ellos entrear*a el (is(o resultado! "ero la(enta&le(ente esto no sie("re sucede as*. e. El diara(a se visuali3a si(>trico! donde todas las ta&las se "arecen! sin distinuir a "riori la i("ortancia de unas res"ecto a otras. No es $+cil de entender tanto "ara usuarios co(o "ara los diseXadores. / C!r!%*erEs*)%!s .e+ Mo.e+o Mu+*).)"e,s)o,!+. En eneral! la estructura &+sica de un =ata 0are)ouse "ara el #odelo #ultidi(ensional est+ de$inida "or dos ele(entos, Esque(as % Ta&las. a. Ta&las =ata0are)ouse, co(o cualquier :ase de =atos Relacional! un =ata 0are)ouse se co("one de Ta&las. Aa% dos ti"os &+sicos de Ta&las en el #odelo #ultidi(ensional, C Ta&las de Aec)os, contienen los valores de las (edidas de neocios! "or e/e("lo, ventas "ro(edio en dlares! n;(ero de unidades vendidas! etc. C Ta&las =i(ensiones, contienen el detalle de los valores que se encuentran asociados a la ta&la de )ec)os. &. Esque(as =ata0are)ouse, la coleccin de ta&las en el =ata 0are)ouse se conoce co(o Esque(a. Los Esque(as caen dentro de dos cateor*as &+sicas, Esque(as Estrellas % Esque(as Sno'$la.e. R0OL``S Otros autores se re$ieren a las caracter*sticas de estas :ases de =atos de la siuiente $or(a, C Para la Revista Electrnica Inenier*a In$or(+tica , Puede considerarse que el #odelo Relacional en el cual se &asa OLTP 5Procesa(iento Transaccional en L*nea6! tiene co(o o&/etivo uardar la interidad de la in$or(acin necesaria "ara o"erar un neocio de la (anera (+s e$iciente. Sin e(&aro! este #odelo no corres"onde a la $or(a co(o el usuario "erci&e la o"eracin de un Neocio. R0OL``S Cre!%)B, .e+ Cu$o Mu+*).)"e,s)o,!+. Los Cu&os son su&con/untos de datos del al(ac>n de datos! orani3ados % resu(idos en estructuras (ultidi(ensionales % es el o&/eto OLAP &+sico. En las :ases de =atos #ultidi(ensionales se usan Cu&os de =atos! Ai"ercu&os de =atos o #ulticu&os de =atos! todas estas estructuras tienen la "ro"iedad que caracteri3a a estas :ases de =atos.Los res;(enes de =atos! "recalculados se;n $actores e("resariales seleccionados! "ro"orcionan el (ecanis(o "ara o&tener tie("os de res"uesta cortos % uni$or(es "ara las consultas co("le/as. Para de$inir un Cu&o! seleccione una Ta&la de Aec)os e identi$ique las #edidas 5colu(nas nu(>ricas de inter>s "ara los usuarios del Cu&o6 en la Ta&la de Aec)os. A continuacin! seleccione las di(ensiones! cada una de las cuales de&e estar co("uesta de una o (+s colu(nas e4tra*das de otra ta&la. Aunque el t>r(ino Cubo suiere tres di(ensiones! un Cu&o "uede tener )asta aO di(ensiones! incluida la =i(ensin #edidas. En la siuiente $iura se "uede a"reciar co(o cada "unto dentro del Cu&o es una interseccin de coordenadas de$inidas "or los lados de >ste 5=i(ensiones6. E/e("los de (edidas son, unidades "roducidas! unidades vendidas! costo de unidades "roducidas! anancias5d6 de unidades vendidas! etc. RGON`aS Fig. 1. Cubo Dimensional para la combinacin de Producto, Mercado Tiempo. Los diseXadores de "roductos #ultidi(ensionales 5OLAP! :ase de =atos6 utili3an varias estrateias "ara evitar la dis"ersin de los datos % "oder aru"arlos! "or lo que se "uede escoer una de las dos "rinci"ales (aneras de "resentar datos al usuario, A%"ercu&os o #ulticu&os1 estas o"ciones no son visuales 5cara al usuario6 sino que condicionan c(o los datos van a ser "rocesados % cu+ntos c+lculos se van a reali3ar.