Sei sulla pagina 1di 18

Programacin VBScript

Programacin con VBScript (I)


Introduccin
Como habris visto, un grandsimo porcentaje de todos los ejemplos sobre ASP tanto en este como en otros sitios Web estn escritos utilizando Visual Basic Script, normalmente referido como VBScript. Este es un tutorial de introduccin para aprender a utilizar VBScript, orientado casi al 100% a su uso con el entorno ASP por lo que obviaremos su utilidad en la programacin en el lado del cliente (como sustituto de Javascript).

Por qu VBScript?
Los motivos que han motivado el uso extendido de VBScript para programar las pginas Active Server son principalmente: Su parecido con Visual Basic. Aunque parezca mentira, la gran mayora de desarrolladores ASP, especialmente los primeros, no venan del entorno Web sino del de programacin. Era ms normal que un programador Visual Basic hiciese la programacin de un sitio Web, utilizando por tanto VBScript por ser un subconjunto de lo que ya saba. Su sencillez, tanto en sintaxis como en funcionamiento. VBScript (y cualquiera de los lenguajes de la familia Visual Basic) son probablemente los lenguajes de programacin ms cercanos al lenguaje natural (ingls, claro) que existen. Esto hace ms sencillo su aprendizaje: si queremos hacer algo mientras ocurra tal cosa, utilizamos una instruccin while, para que os hagis una idea. Todas las instrucciones terminan con alguna de cierre, como if..end if, lo que hace que el cdigo sea mucho ms sencillo que leer que utilizando, por ejemplo, la sintaxis de corchetes de C o Javascript. Me es imposible no pensar en una treta de Microsoft para extender su lenguaje: puesto que ASP es una tecnologa de Microsoft, parece lgico que la propia empresa favoreciese este lenguaje en detrimento de Javascript, probablemente utilizndolo desde el principio en los primero ejemplos, tutoriales y libros sobre ASP.

Por supuesto, no es en absoluto obligatorio utilizar VBScript para las pginas ASP. De hecho, si se est familiarizado con Javascript o se es programador de C y no de Visual Basic, es mucho mejor utilizar JScript. Tiene prcticamente las mismas posibilidades y su sintaxis es muy cercana (por no decir exacta) a la de estos dos lenguajes.

Qu es VBScript?
Aunque suene a perogrullada, VBScript es un lenguaje de script. Estos lenguajes, que en castellano se denominan en teora lenguajes de secuencias de comandos o tambin de automatizacin, se caracterizan por depender de una aplicacin anfitriona: VBScript no puede crear un programa que enve texto al usuario; depende de la aplicacin anfitriona. En el caso de utilizarlo para escribir pginas ASP, depender de los objetos intrnsecos de ASP para recibir y enviar datos. En el caso de utilizarlo en el cliente, Internet Explorer se encargar de "entenderle" y suministrarle los medios que necesita.

ActiveX Scripting
La aplicacin anfitriona (vamos a hablar a partir de ahora del servidor Web) utiliza ActiveX Scripting para ejecutar cdigo VBScript. ActiveX Scripting (o Active Scripting) es un motor de script reutilizable que se puede usar en cualquier aplicacin, en este caso en ASP (o Internet Explorer). Por defecto, viene con dos lenguajes integrados: VBScript y JScript. Sin embargo, se pueden desarrollar plugins independientes para que admita otro tipo de lenguaje, como Perl o Python. ASP funciona extrayendo todo el cdigo VBScript de la pgina, instanciando ActiveX Scripting y pidindole que ejecute el cdigo. Adems, ASP le pasa al motor de script el contexto, que no son ms que referencias a los objetos ASP (Response, Request...) para que el cdigo pueda ejecutarse: cuando pone Response.Write, tiene que escribir el texto para que sea enviado como HTML, por ejemplo. Eso no es problema de VBScript, sino de ASP.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 1

Programacin VBScript
Por defecto, el lenguaje de script de las pginas ASP es VBScript, as que si no definimos nada, ActiveX Scripting pensar que el cdigo es VBScript e intentar ejecutarlo como tal. Si queremos que ejecute cdigo JScript, tendremos que indicarlo en la pgina ASP as: <%@LANGUAGE = "JScript"%> O establecerlo por defecto en la configuracin del servidor Web.

Caractersticas generales de VBScript


VBScript slo utiliza un nico tipo de datos: Variant. Este es un tipo especial que permite contener diferentes tipos de informacin. Tambin es el nico tipo de datos que puede aceptar y devolver en funciones. Un tipo Variant puede contener tanto un nmero como una cadena de texto. VBScript deducir el tipo de datos que se quiere utilizar dependiendo del contexto: si se trabaja con datos que parecen nmeros, VBScript asumir que son nmeros y viceversa. Se puede obligar a que un dato sea una cadena de texto escribindola entre comillas simples ("cadena"). Adems de dividir entre nmeros y cadenas, el tipo Variant se divide en varios subtipos o categoras de informacin. Estos son los disponibles: Empty (vaco): un Variant sin inicializar. Es un 0 para variables numricas y una cadena vaca ("") para variables de texto. Esto significa que si sumo 5 + var y la variable var no tiene nada, el resultado ser 5, al tomarse la variable como 0. Null: es un Variant que no contiene datos vlidos intencionadamente. Boolean (booleano) es un Variant que solo puede tener el valor lgico de verdadero o falso. Es True o False (-1 y 0). Byte (octeto): contiene un entero entre 0 y 255. Integer (entero): contiene un nmero entre -32.768 y 32.767. Currency (moneda): -922.337.203.685.477,5808 a 922.337.203.685.477,5807. Long (entero largo): contiene un entero entre -2.147.483.648 y 2.147.483.647. Single (precisin simple): contiene un nmero en coma flotante entre 3,402823E38 y -1,401298E-45 para valores negativos, y entre 1,401298E-45 y 3.402823E38 para valores positivos. Double (doble precisin): contiene un nmero en coma flotante entre -1,79769313486232E308 y 4,94065645841247E-324 para valores negativos, y entre 4,94065645841247E-324 y 1,79769313486232E308 para valores positivos. Date (Time) (fecha): Contiene un nmero que representa una fecha (y una hora) entre el 1 de Enero del ao 100 y el 31 de Diciembre de 9999. String (cadena): contiene una cadena de longitud variable, de hasta 2 mil millones de caracteres de longitud. Object (objeto): contiene un objeto. Error: contiene un nmero de error. Estos son los subtipos que nos devuelven o que requieren determinadas funciones. Por ejemplo, la funcin Date, que devuelve la fecha actual, la devuelve siempre como un tipo fecha (Date). Se puede pasar entre estos subtipos utilizando las funciones de conversin (cast) como CInt(expresin) que convierte a un valor de tipo entero.

Variables
Qu es una variable? Una variable es en realidad un puntero a una posicin de la memoria donde un programa (el script) puede almacenar, leer y modificar valores durante su ejecucin. Por ejemplo, podemos utilizar una variable nombre para guardar el nombre de un visitante. Dnde se encuentra guardado realmente el nombre no nos importa, lo importante es que podemos recuperarlo simplemente por el nombre de la variable (nombre). En VBScript, como es lgico, todas las variables son de tipo Variant.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 2

Programacin VBScript
Declarar variables No es obligatorio declarar las variables que utilicemos en VBScript. Adems, como es un lenguaje sin tipo, declararla se limita a "avisar" de que vamos a utilizar tal variable con tal nombre: Dim nombre Se pueden declarar varias en la misma lnea: Dim nombre, apellido, URL Si no declaramos la variable, podremos utilizarla de todas formas en el primer momento en que hagamos referencia a ella. Esto, sin embargo, no es muy aconsejable, puesto que podramos escribirla incorrectamente y obtener errores difciles de encontrar. De hecho, es muy recomendable incluir la instruccin Option Explicit al principio del script, que obliga a tener todas las variables que utilicemos declaradas antes de su uso, devolviendo un error en caso contrario. As sabremos si en lugar de nombre hemos puesto por error nimbre y por esto no funcionaba el script. Nombres de variable Las variables pueden llamarse de cualquier forma, si cumple estos requisitos: Debe comenzar con un carcter alfabtico. No puede contener un punto. No debe superar los 255 caracteres. Debe ser nica en su mbito. No puede llevar tildes o acentos o cualquier otro carcter no anglosajn :-( El mbito o alcance de una variable es la zona donde se declara. Si declaramos la variable nombre al principio de la pgina, no podemos declararla otra vez a no ser que sea dentro de una funcin o un procedimiento. La primera tiene mbito de pgina y la segunda de procedimiento: la primera se destruye cuando termina la ejecucin de la pgina o el script y la segunda cuando termina la funcin. Nombres vlidos: nombre, cadena, oConn, rs, SQL, cadena_de_conexion Nombres invlidos: _nombre, rbol, 234casa. Guardar datos en variables B = 200 nombre = "Carlos" guarda el nmero 200 en la variable B. guarda la cadena "Carlos" en la variable nombre.

Variables escalares y vectoriales Una variable escalar es una variable que slo guarda un valor, como las dos anteriores. Una variable vectorial, una variable de matriz o simplemente un vector (array en ingls) es un tipo especial de variable que puede contener una serie de valores en lugar de uno solo. Se declara de la misma forma, excepto en que hay que definir cuntos valores vamos a guardar en ella. Constantes Las constantes son como las variables en cuanto que se referencian mediante el nombre pero, a diferencia de stas, su valor nunca cambia. VBScript adems define sus constantes intrnsecas o constantes de VBScript. Se crean con la instruccin Const, asignando a continuacin un valor: Const PI = 3.1416 Const web = http://www.aspfacil.com Const fecha = #20-6-78#
Fijate como las comillas denotan una cadena y las almohadillas (#) denotan una fecha. Las constantes slo pueden recibir valores constantes, que no pueden variar. No pueden crearse con el resultado de una funcin, por ejemplo.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 3

Programacin VBScript
Comentarios
Los comentarios son fragmentos de texto que podemos incluir en el script y que no se ejecuta, de forma que slo son visibles cuando leemos el cdigo del script. Son muy tiles y recomendables, puesto que pueden ayudar a clarificar ciertas partes de cdigo que no es muy clara. Para escribir comentarios utilizamos la apstrofe (') o comilla simple al comienzo de la lnea. El resto de la lnea es un comentario:

Operadores
Un operador es un smbolo de VBScript que efecta una operacin. Hay aritmticos, de comparacin, de concatenacin y lgicos. La lista completa puede verse en la documentacin oficial. Incluyo aqu los ms significativos y ms utilizados: Descripcin Aritmticos Suma Resta Multiplicacin Divisin entera Divisin (con decimales) + * \ / 4+5 10 - 3 5*4 10 \ 2 9/2 9 Mod 2 2 ^ 3 (dos elevado a tres) Smbolo Ejemplo

Mdulo (resto de la divisin) Mod Potencia Concatenacin Concatenar cadenas Comparacin Igual que Distinto de Menor que Mayor que Menor o igual que Mayor o igual que Lgicos Negacin (No lgico) Conjuncin (Y lgico) Disyuncin ( lgico) not and or = <> < > <= => & ^

"Hola" & " mundo"

3=3 3 <> 8 2<5 10 > 2 2 <= 3 3 >= 2

a not b c and d x or y

Flujo del programa


Un seor conocido con Von Neumann dijo hace ms de 50 aos tres cosas que establecieron el mundo de la informtica que conocemos hoy en da (le debemos que t ests leyendo esto ahora). Una de ellas fue que la ejecucin de programas se haca de forma secuencial: una instruccin detrs de otra. Nos parece muy obvio ahora pero fue un autntico hito. El siguiente programa: Dim a, b, c 'Declaramos unas variables Profesor: Jos Luis Sifuentes Quijada Pg. # 4

Programacin VBScript
a = 4 b = 4 c = a + b a = 2 b = 10 c = a + b
Se ejecuta de arriba a abajo. Por esto, c valdr la primera vez 8 y la segunda 12. Podemos controlar el flujo del programa haciendo que determinadas partes se repitan o haciendo que slo se ejecute una parte entre varias posibles.

If.. Then... Else


La instruccin if..then...else se utiliza para comprobar si una condicin es verdadera (si... entonces... en otro caso) y ejecutar cierto cdigo slo cuando esto ocurre, y otro distinto en el caso de que no sea verdadera. La rama else no es obligatoria, en cuyo caso slo se ejecuta el cdigo cuando se da la condicin, y no se ejecuta nada en caso de que no se d.

<% Dim a, b a = 5 b = 2 if a > b then Response.Write("a es mayor que b.") else Response.Write("b es mayor o igual que a.") end if if a > 0 then Response.Write("a es mayor que 0.") end if %> Esto ya es cdigo ASP para incluirlo en una pgina y probarlo. Notar que Response.Write no tiene nada que ver VBScript: es un objeto ASP que necesitamos para poder mostrar datos en la pantalla (recordad que VBScript, como lenguaje de script que es, necesita una aplicacin anfitriona). Los dos if simplemente comprueban, en el primer caso, si a es mayor que b para imprimir un texto u otro y, en el segundo, que a es mayor que cero para imprimir un texto. Veamos el cdigo ms atentamente: en la primera lnea declaramos dos variables. En la segunda guardamos el nmero 5 en la variable a y en la tercera guardamos 2 en la variable b. Despus, comprobamos que a es mayor que b utilizando el operador de comparacin > (mayor que). Si es verdadero, se ejecuta el cdigo que va despus de then. En otro caso (else), es decir cuando a no es mayor que b, se ejecuta el cdigo que va despus de else. El segundo if...then... no tiene rama else, as que solo se imprimir a es mayor que 0 cuando efectivamente, a sea mayor que 0. En ambos casos, debe cerrarse la instruccin con end if. Por supuesto, en ambas ramas pueden ejecutarse varias instrucciones, no una como en este ejemplo. Simplemente aadirlas cada una en una nueva lnea funcionar.

Select... Case
Aunque podemos escribir un if y un if dentro del primero y as sucesivamente, para elegir entre varias posibilidades, la instruccin Select... Case ofrece sto de forma mucho ms cmoda. Esta instruccin selecciona entre varios casos posibles para ejecutar un determinado cdigo.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 5

Programacin VBScript
Veamos un ejemplo. Este cdigo guarda en la variable numero el nombre del nmero que contiene la variable a: Dim a, numero a = 5 select case a case 1 numero case 2 numero case 3 numero case 4 numero case 5 numero case else numero end select

= "uno" = "dos" = "tres" = "cuatro" = "cinco" ="no me lo s"

select case a lo que dice es "vamos a elegir entre los valores de a". Despus, cada case define un caso. En el caso 1 (case 1) guardamos uno en la variable numero y as sucesivamente.

Bucles
Los bucles (loop en ingls) permiten que una o varias instrucciones se repitan varias veces, estando escritas una sola vez en el cdigo. Cada repeticin se denomina iteracin.

Do...Loop
La instruccin Do...Loop (haz... vuelve) repite una serie de instrucciones que se encuentran entre do y loop. Se puede utilizar con la palabra clave while para indicar que siga iterando (repitiendo las instrucciones) mientras se d una condicin, as: <% Dim a, cuantas a = 1 cuantas = 0 do while a < 100 a = a + 1 cuantas = cuantas + 1 loop Response.Write("La variable ahora vale:" & a & "<br>") Response.Write("El bucle se ha repetido " & cuantas ) %> Dos instrucciones, que suman 1 a las variables a y cuantas, se repiten mientras que a valga menos de 100. Cuando a llegue a 100, la condicin que hay despus de while ser falsa y el bucle termina, ejecutndose despus los dos Response.Write que imprimen los valores de a y cuantas en la pgina. Y tambin la instruccin Do...Loop puede utilizarse para repetir varias instrucciones hasta que se d una condicin, con la palabra clave until (hasta) as: <% Dim a, cuantas a = 1 cuantas = 0 do until a = 100 a = a + 1 cuantas = cuantas + 1 loop

Profesor: Jos Luis Sifuentes Quijada

Pg. # 6

Programacin VBScript
Response.Write("La variable ahora vale:" & a & "<br>") Response.Write("El bucle se ha repetido " & cuantas ) %> El cdigo dice: "haz hasta que a valga 100... vuelve". As que en cada iteracin se suma 1 a la variable y se vuelve a repetir. Cuando a llegue a 100, se saldr del bucle y se imprimirn los valores. Se puede salir de un bucle con la instruccin Exit Do, forzando a que se deje de repetir y siga la ejecucin normal del script: <% Dim a a = 1 do until a = 100000 a = a + 1 if a > 100 then exit do end if loop Response.Write("La variable ahora vale:" & a & "<br>") Response.Write("El bucle se ha repetido " & cuantas ) %> El bucle esta preparado para repetirse hasta que a llegue a 1000000, pero la instruccin if de dentro del bucle hace que se detenga cuando a sea mayor que 100.

While...Wend
Esta instruccin, un clsico dentro de los lenguajes de programacin, est un poco fuera de uso en VBScript debido a que funciona exactamente igual que do while...loop: while a < 100 a = a + 1 cuantas = cuantas + 1 wend ... Funciona exactamente de la misma forma que el primer ejemplo de do...loop anterior.

For...Next
Si bien los bucles anteriores son muy poderosos, muchas veces es necesario repetir un nmero de instrucciones un nmero fijo de veces. La instruccin For...Next hace exactamente eso. Necesitamos una variable que vaya contando el nmero de iteraciones que llevamos. <% Dim a, I a = 0 for I=1 to 100 a = a + 1 next Response.Write("La variable ahora vale:" & a & "<br>") %> Se puede traducir, para entendernos, como: "desde que I vale 1 hasta que I valga 100, suma 1 a a". La instruccin a = a + 1 se repite por tanto 99 veces (no 100, porque I empieza valiendo 1). Utilizando la palabra clave step se puede definir en cunto hay que incrementar el contador en cada iteracin. Si en el ejemplo anterior, sustituimos for I = 1 to 100 por: for I = 0 to 100 step 2 Profesor: Jos Luis Sifuentes Quijada Pg. # 7

Programacin VBScript
en cada paso I se incrementar en 2. Se repetir el bucle, por tanto, 50 veces en lugar de 100. Podemos tambin hacer que el contador decrezca en lugar de crecer utilizando un step negativo: For I = 100 to 1 step -1 Y por ltimo podemos salir de un bucle utilizando Exit For: <% Dim a, I a = 0 for I=1 to 100 a = a + 1 if a = 50 then exit for end if next Response.Write("La variable ahora vale:" & a & "<br>") %> Lo cual hara que el bucle se ejecutase solo 50 veces: hasta que llegue a 50.

For Each... Next


Esta variante es muy parecida a las anteriores. En lugar de repetir un grupo de instrucciones un nmero de veces, repite el grupo de instrucciones para cada elemento de un vector o una coleccin. Es til cuando no nos importa el nmero de elementos. El siguiente ejemplo imprime todas las variables de entorno enviadas por el navegador al servidor Web. No sabemos cules ni cuntas va a haber, as que: <% Dim variable for each variable in Request.ServerVariables Response.Write(variable & " = ") Response.Write(Request.ServerVariables(variable)) next %>

Procedimientos y funciones
Adems de poder interrumpir la ejecucin secuencial mediante todas estas instrucciones de control de flujo y bucles, podemos ejecutar una serie de instrucciones desde varios puntos del programa, agrupndolas en un procedimiento (subprograma) o en una funcin.

Procedimientos (Sub)
Un Sub es una serie de instrucciones, escritas entre Sub y End Sub que ejecutan acciones pero que no devuelven ningn valor. El procedimiento tiene un nombre para llamarlo despus. Puede recibir argumentos (o parmetros) para utilizarlos en las instrucciones que contiene. Si no recibe ningn argumento su declaracin tiene que incluir parntesis vacos.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 8

Programacin VBScript
Ejemplo de procedimiento sin argumentos: Sub ImprimeFecha() Response.Write("Hoy es " & Date) End Sub Fjare que separamos las instrucciones del resto del script con la cabecera Sub ImprimeFecha(). Esto indica a VBScript que estamos escribiendo un procedimiento con nombre ImprimeFecha, que no recibe argumentos y que lo que hace es imprimir la fecha actual (Date) en la pgina. Ahora, cuando queramos utilizar estas instrucciones, simplemente llamamos al procedimiento: ImprimirFecha Ejemplo de procedimiento con argumentos: Sub Fuera ( texto ) Response.Write(texto) End Sub Este procedimiento recibe un argumento, texto y lo imprime en la pantalla utilizando el objeto Response de ASP. Dentro del cdigo del Sub podemos utilizar los argumentos como si fueran variables, como en este caso. Vamos a ver un ejemplo que utilice estos dos procedimientos (deben estar en la misma pgina claro!): <% Dim granfrase granfrase = "Hola mundo!" 'Imprimo la fecha ImprimeFecha() 'Y ahora imprimo la gran frase Fuera granfrase %> Fijos en que a llamar a Fuera no utilizamos parntesis: si se prefiere, se puede utilizar Call, seguido del nombre del procedimiento y su(s) argumento(s) entre parntesis: call Fuera(granfrase).

Funciones (Function)
Las funciones son un grupo de instrucciones entre Function y End Function que se ejecutan y pueden devolver valores. Tambin pueden recibir argumentos, que se colocan detrs del nombre entre parntesis. Si no tiene argumentos, se incluyen los parntesis vacos. Para devolver un valor, se escribe el nombre la funcin seguido de igual (=) y el valor que se quiere devolver. El siguiente ejemplo recibe dos valores y devuelve el nmero mayor de ellos. Function Max ( a, b ) if a >= b then Max = a else Max = b end if End Function Veamos cmo llamar a esta funcin: <% Dim num1, num2 num1 = 7 num2 = 13 Response.Write("El mayor es: " & Max(num1, num2) ) %> Fjate que como Max devuelve un valor, lo incluimos en la cadena que vamos a imprimir mediante el Response.Write utilizando el operador de concatenacin &. Profesor: Jos Luis Sifuentes Quijada Pg. # 9

Programacin VBScript
Una funcin siempre devuelve un dato Variant que puede utilizarse directamente en otra expresin: if Max(num1, num2) > 5 then ...

Convenciones
Aunque como ves la sintaxis es bastante sencilla y las variables pueden tomar casi cualquier nombre, se suelen seguir una serie de convenciones para hacer el cdigo ms legible: 1. Se suelen nombrar las variables con un prefijo que indica el subtipo que va a almacenar. As, bOK podra indicar con un valor boolean si una operacin es cierta o no, iPosicion podra indicar un valor Integer, strSQL puede contener una cadena de texto que representa una instruccin SQL, etc. Las ms utilizadas son: o o o o b o bln para Boolean, como en bOK, bFinal. i para enteros, como iEdad. d o dtm (Date/DateTime) para fechas o fechas y horas, como en dFechaInicio. obj u o para un objeto, como en objConn u oConn.

2. Se suelen utilizar nombres descriptivos tanto para los procedimientos y funciones como para las variables. Tambin, un comentario cerca de la declaracin de la variable puede indicar para qu sirve cada una. No hay que caer en ningn extremo: escoger nombres para las variables como bEncuentroFinDeFicheroEnA hace que el cdigo sea pesadsimo de leer y escribir, por ejemplo. 3. Se suelen separar las funciones y los procedimientos del resto del cdigo mediante una lnea comentada, como: '======================, as como describir el propsito del subprograma y qu argumentos recibe o devuelve. 4. Se suele formatear el cdigo como habis visto en este artculo (y mucho mejor tambin) para facilitar su lectura, indentando (con una pulsacin de Tabulador o de la barra espaciadora) las instrucciones, declarando las variables todas juntas al comienzo del script o de cada procedimiento, comentando exhaustivamente las partes de cdigo que lo necesiten, etc. Cada maestrillo tiene su librillo, pero en general un cdigo bien comentado y formateado es mucho ms fcil de mantener, actualizar y revisar que uno que no lo est.

Y ahora?
Bien, estas son las herramientas bsicas que tenemos en VBScript para hacer pginas ASP. Adems, disponemos de tres objetos: FileSystemObject, Dictionary y RegExp. De los dos primeros tenis sendos artculos aqu: Utilizar el objeto Dictionary El objeto FileSystemObject

El tercero sirve para emplear expresiones regulares. VBScript desde la versin 5.0 soporta el uso de clases, de las cuales tambin tenis un artculo: Utilizar clases en VBScript.

Dnde conseguirlo?
Podis descargar VBScript y JScript de Tecnologas de Microsoft Scripting. A la hora de escribir estas lneas, la ltima versin era la 5.5. La descarga incluye VBScript, JScript y Windows Script Host. La documentacin oficial en espaol la tenis disponible en esta pgina. Eso es todo por el momento, seguiremos vindonos por aqu...

Profesor: Jos Luis Sifuentes Quijada

Pg. # 10

Programacin VBScript

Utilizar clases en VBScript


Las clases en VBSCript (o JScript) permiten crear objetos hechos de cdigo VBScript 100% natural. Estos objetos son tiles para encapsular cdigo y agrupar operaciones y funciones, accesibles mediante propiedades y mtodos, como si se tratase de un objeto COM corriente, que encapsula nuestro cdigo y oculta los detalles para su reutilizacin.

Introduccin
Uno de los problemas de desarrollar programas (nuestras pginas son programas al fin y al cabo) con ASP es el hecho de tener que hacer muchas veces las mismas rutinas. Esto puede aliviarse en parte utilizando #includes para agrupar rutinas, pero no soluciona el hecho de tener que crear los objetos necesarios en cada pgina, etc. Adems, el otro problema es que no podemos abstraernos habitualmente del funcionamiento de nuestro cdigo, sino que tenemos que programar a bajo nivel todas las funcionalidades. El lenguaje VBScript, desde su versin 5.0, permite utilizar clases. Qu es una clase? Digamos que las clases en VBScript son una versin relajada de las clases en un lenguaje orientado a objetos como C++. Las clases permiten escribir una "plantilla" que puede ser utilizada para crear un objeto. Por ejemplo, si escribimos una clase como: Class miObjeto ... End Class Podramos utilizar este objeto crendolo as: Dim Mobj set Mobj = New miObjeto ... set Mobj = nothing Es similar al uso de un objeto COM, pero en lugar de utilizar CreateObject, utilizamos la instruccin New. Despus, podemos utilizar el objeto casi, casi, como si fuera un objeto COM, as: Mobj.Propiedad = valor Mobj.Metodo ( valor1, valor2 ) ... Interesante eh? Lo bueno es que podemos combinar las clases y las inclusiones para, aislando la clase en un archivo e incluyndolo en la pgina en que queramos, instanciar este objeto como si de un componente COM se tratara.

Cmo crear una clase


La sintaxis, como ya habis visto, para comenzar una clase, es: Class NombreClase Y se termina con: End Class Dentro, podemos incluir declaraciones de variables de forma corriente, con Dim, y adems, declaraciones de "mtodos" y propiedades. Para declarar un "mtodo" (en realidad es un Sub) utilizamos: Class clase Dim var1, var2 Public Sub Metodo ( texto ) Response.Write ( texto & VbCrLf ) End Sub Tambin podemos utilizar Function en lugar de Sub, en caso que queramos devolver algn valor.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 11

Programacin VBScript
Este mtodo, al ser invocado, imprimira la cadena pasada como argumento con un retorno de carro al final. No es muy til, pero estamos empezando, tranquilos... Qu es eso de Public? Delante de la declaracin de un mtodo (o propiedad), debemos incluir una de estas palabras clave: Public o Private. La primera significa que el procedimiento es pblico, es decir, est expuesto para ser utilizado como un mtodo del objeto. As, en el ejemplo anterior, podramos hacer: Dim obj set obj = New clase obj.Metodo ("Hola Mundo!") set obj = nothing
puesto que Metodo es una subrutina pblica.

La otra opcin, Private, indica... lo adivinis? Que el procedimiento es privado para la clase. Es decir, son rutinas que slo pueden ser llamadas desde dentro de la clase. Por ejemplo: Class clase Public Sub Metodo ( texto ) Response.Write ( Negritas(texto) ) End Sub Private Function Negritas ( txt ) Negritas = "<b>"& txt & "</b>" End Function End Class Y las propiedades? Pues se definen utilizando tambin Public o Private y adems Let, que indica que la propiedad acepta argumentos, o Get, que indica que la propiedad devuelve argumentos, en ambos casos seguidos del nombre de la propiedad. Por ejemplo: Class ... Dim color Public Property Let Color ( valor ) color = valor End Property Public Property Get ColorElegido ColorElegido = color End Property End Class Y utilizaramos estas propiedades as: objeto.Color = "red" color = objeto.ColorElegido Con estas armas, ya podemos hacer nuestras clases.

Cundo utilizo mtodos y cundo propiedades?


Aunque este tema es uno de los ms interesantes cuando se desarrollan objetos COM, para nuestras clases de VBScript, no hay una regla clara. En general, como explico en Introduccin a COM para programadores ASP, las propiedades definen o devuelven datos acerca del estado de un objeto. As, si queremos un objeto (me refiero siempre a objetos

Profesor: Jos Luis Sifuentes Quijada

Pg. # 12

Programacin VBScript
derivados de las clases de VBScript) que abra un fichero para trabajar con l, podramos incluir una propiedad Modo, que especificara el modo en que abrimos el fichero: slo lectura, escritura al final, etc. Los mtodos con Function se utilizan cuando queremos devolver cosas, y los mtodos con Sub los podemos utilizar para efectuar operaciones "internas", o escribir directamente en la pgina, etc.

Una clase de ejemplo


Para terminar, os incluyo el cdigo de una pequea clase, que nos abstrae un poco del objeto Response. Tenis el cdigo disponible para descargarlo al final del archivo, y una pgina de ejemplo para demostrar su uso. <% Class Escribir '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'Declaramos una variable para utilizarla en todos los Subs Dim iEstilo '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Property Let DefEstilo ( valor ) 'Define el estilo HTML del texto. 'Acepta: '0 para escribir normal '1 para escribir en negrita <b></b> '2 para escribir en cursiva <i></i> '3 para escribir subrayado <u></u> select case CInt(valor) case 1 iEstilo = 1 case 2 iEstilo = 2 case 3 iEstilo = 3 case else '0 u otros valores iEstilo = 0 end select End Property 'DefEstilo '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Sub Escribir ( cadena ) 'Escribe una cadena con el estilo actual Response.Write ( DarFormato(cadena) ) End Sub 'Escribir '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Sub EscribirLinea ( cadena ) 'Escribe una cadena con un <BR> y un retorno de carro al final 'Util para generar cdigo HTML "bonito" :-) 'Llama al procedimiento anterior Response.Write ( DarFormato(cadena) & "<br>" & VbCrLf ) End Sub 'EscribirLinea '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Function DarFormato ( cadena ) 'Funcion privada, que aade las marcas HTML 'correspondientes al estilo actual select case iEstilo case 1 DarFormato = "<b>" & cadena & "</b>" case 2 DarFormato = "<i>" & cadena & "</i>" case 3 Profesor: Jos Luis Sifuentes Quijada Pg. # 13

Programacin VBScript
DarFormato = "<u>" & cadena & "</u>" case else DarFormato = cadena end select End Function 'DarFormato '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End Class 'Escribir '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ %> Y para utilizar esta clase, hacemos: Dim oEsc 'Instancio un objeto de la clase set oEsc = New Escribir 'Escribo texto normal oEsc.DefEstilo = 0 oEsc.EscribirLinea ("Hola mundo! ") oEsc.DefEstilo = 1 oEsc.Escribir( "<P>Texto de ejemplo. ") oEsc.DefEstilo = 2 oEsc.EscribirLinea (" No olvides echar un ojo a ... ") oEsc.DefEstilo = 3 oEsc.EscribirLinea ("Aunque no sea un objeto increble, no?") oEsc.DefEstilo = 0 oEsc.Escribir("<hr>") Que imprime en la pgina:
Hola mundo!

es

didctico

Texto de ejemplo. No olvides echar un ojo a respclase.asp para ver el cdigo. Aunque no sea un objeto increble, es didctico no?

Y con esto se termina el artculo. En el prximo sobre el tema, os presentar una clase VBScript que manipula cadenas y fechas para utilizarlas en una sentencia SQL, y adems proporciona una forma para censurar cadenas de texto, sustituyendo las palabras que queramos por otras, tambin configurables, o por cadenas de asteriscos.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 14

Programacin VBScript

Introduccin a COM para programadores ASP


Introduccin
Si alguna vez has programado un script ASP, entonces has utilizado un objeto COM. Sin embargo, sin los conocimientos necesarios acerca de COM, no podrs utilizar la amplia gama de objetos COM disponibles para las pginas ASP, ni podrs desarrollar tu propio objeto COM. Lo bueno de COM es que una vez se entienden los estndares, las restricciones, se puede utilizar este conocimiento para implementar otros objetos COM. Los objetos COM se suelen llamar tambin componentes, y se suelen almacenar como una DLL (Dynamic Link Library).

A quin le interesa este artculo?


Este artculo est especialmente pensado para aquellos desarrolladores que quieran saber algo acerca de COM desde el punto de vista de un programador de scripts, en este caso de ASP. En concreto, para aquellos que duden, por ejemplo: 1. La diferencia entre mtodo y propiedad. 2. Qu es una propiedad de slo lectura. 3. Qu es una coleccin o un objeto coleccin, y cuales son sus propiedades estndar.

Qu es COM?
COM (Component Object Model), es un estndar para la interfaz de objetos. La interfaz es la forma en que un programa, por ejemplo nuestra pgina ASP, se comunica con un objeto, para hacer operaciones determinadas. Por definicin, un objeto COM slo utiliza propiedades y mtodos, no hay ninguna otra interfaz. Aunque desde el punto de vista del programador no hay mucha diferencia entre propiedad y mtodo (los mtodos pueden recibir argumentos, las propiedades no verdad?), desde el punto de vista del diseador del objeto y de la funcionalidad del objeto, hay una gran diferencia. Las propiedades suelen representar algn aspecto del estado del objeto. Los mtodos, en cambio, implican llevar a cabo alguna operacin, tenga o no que ver con el estado del objeto. Como esto se est poniendo un poco tcnico, vamos a ilustrarlo con un ejemplo: Todos hemos utilizado un objeto Recordset para extraer datos de una base de datos. Utilizamos, por ejemplo, la propiedad de slo lectura EOF para detectar si el Recordset est apuntando al final del conjunto de registros, y en plan prctico, si hemos terminado de recorrerlo. Estamos obteniendo informacin del estado de nuestro Recordset. Estamos al final? Para traer los registros, en cambio, utilizamos el mtodo Open, que requiere varios argumentos, como la sentencia SQL, un objeto Connection con la conexin abierta, etc. Este mtodo ejecutar la sentencia SQL sobre la base de datos a travs de la conexin abierta y recoger en el objeto Recordset los registros que devuelva la base de datos. Hemos hecho, por lo tanto, una operacin con el objeto.

Propiedades
Como hemos dicho, las propiedades se utilizan para obtener informacin acerca del estado de un objeto, o bien para cambiar el estado de un objeto. Todas las propiedades devuelven un valor, aunque existen propiedades de slo lectura, y propiedades de lectura/escritura. Para leer una propiedad, utilizamos: valor = objeto.propiedad Mientras que para establecer una propiedad, utilizamos: objeto.propiedad = valor Fjate en que no hay parntesis de ningn tipo, ni es necesario ningn espacio en blanco.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 15

Programacin VBScript
Mtodos
Los mtodos se utilizan para iniciar alguna operacin o evento en el objeto, y pueden devolver valores y recibir argumentos. Tambin pueden establecer valores, pero slo pasando el valor en la lista de argumentos. La sintaxis de un mtodo que nos devuelve un valor pero que no recibe argumentos es: valor = objeto.mtodo() Si recibe argumentos, en cambio, sera: valor = objeto.mtodo( argumentos ) Hemos hecho esto multitud de veces, por ejemplo en: nombre = Request.QueryString("Nombre") Los mtodos que no devuelven ningn valor, no tienen parntesis, como el mtodo Close del objeto Connection: oConn.Close

Argumentos
Los argumentos son los valores que recibe un mtodo para, en funcin de ellos, efectuar una operacin. Un mtodo puede o no recibir argumentos y, en caso de recibirlos, pueden ser obligatorios (requeridos) u opcionales. Para que esta sintaxis no sea un caos, cuando un argumento es opcional, todos los dems son opcionales tambin. Es decir, si el argumento 3 es opcional, el argumento 4 y el argumento 5 son tambin opcionales siempre. Un buen ejemplo de mtodo con argumentos opcionales es el mtodo Open del objeto Connection. Los tres primeros se utilizan para establecer la conexin con una base de datos y, si es necesario, para dar la informacin de login y contrasea. As: oConn.Open "DSN" ordena conectarse a travs del DSN "DSN". Tambin puedes llamar al mtodo as: oConn.Open "Driver={Microsoft Access DBQ=C:\MisBases\base.mdb", "usuario", "contrasea" Driver (*.mdb)};

que ordena en cambio conectarse a la base de datos indicada en la cadena de conexin, con nombre de usuario "usuario" y contrasea "contrasea". Cuando no utilizamos los argumentos opcionales, estos toman un valor por defecto. En cambio, si utilizamos comas para delimitarlos y dejamos los argumentos en blanco, stos toman valor nulo, que no tiene por qu ser el valor por defecto. Por ejemplo: oConn.Open "DSN", "usuario", "contrasea", , , ,

Colecciones
Las colecciones son objetos en s que representan un conjunto de objetos. Todas las colecciones tienen mtodos y propiedades predefinidos: el mtodo Item, la propiedad Count y el mtodo _NewEnum. Por definicin, una coleccin tambin tiene la capacidad de crear objetos del mismo tipo que la coleccin. En otras palabras, si un objeto puede ser englobado en un conjunto de objetos iguales, ese objeto tiene un objeto coleccin que puede instanciar otros objetos dentro de la coleccin. Parece un lo, pero es as. :-) Por ejemplo, para los que hayis utilizado algo el objeto FileSystemObject. Un objeto coleccin Drives contiene un conjunto de objetos que representan todas las unidades de un computador. Sigamos con las propiedades y mtodos por defecto: la propiedad Count devuelve un valor de tipo LONG que especifica cuntos objetos hay en la coleccin. Pasando un valor LONG al mtodo Item, ste nos devolver el objeto que ocupa esa posicin dentro del conjunto. Lgicamente, necesitamos un valor entre uno y el que devuelve la propiedad Count. No hay que confundir las colecciones con los vectores (arrays), donde el orden empieza en 0. El mtodo _NewEnum es un poco especial, puesto que no se utiliza explcitamente. Permite al programdor recorrer o iterar sobre la coleccin en un bucle For ... Next. Por ejemplo:

Profesor: Jos Luis Sifuentes Quijada

Pg. # 16

Programacin VBScript
For Each objecto in Coleccion ... Next Fijos que el mtodo _NewEnum no est por ninguna parte. Sin embargo, es el mtodo que se utiliza en los For each. Esto es debido a que el lenguaje, por ejemplo Visual Basic, detecta un ndice especial en el mtodo que interpreta para ser utilizado en la sentencia For Next. Todos los mtodos y propiedades de un objeto COM estn indexados, y ciertos ndices se utilizan para tareas concretas. En concreto, el ndice 0 se reserva para la propiedad o mtodo por defecto.

La propiedad/mtodo por defecto


La propiedad o mtodo por defecto (en ingls, default property), es aqul o aquella cuyo ndice es 0, como hemos dicho. Visual Basic permite al programador una sintaxis especial al referirse a la propiedad por defecto, como vemos aqu: set Objeto = Coleccion.Item(2) Y, como el mtodo Item es el mtodo por defecto de las colecciones, podemos escribir: set Objeto = Coleccion(2) sin el punto y el nombre del mtodo, simplemente con el argumento.

Instanciar un objeto
Para crear una instancia de un objeto COM en ASP, utilizis, como ya sabis: set Objeto = Server.CreateObject("SKSH.Slash.1") El nico argumento que recibe el mtodo CreateObject del objeto Server es el ProgID, es decir la identificacin del objeto. El ProgID es asignado por el desarrollador del objeto para identificarlo de forma nica, y por lo tanto para instanciar un objeto COM es indispensable saber su ProgID. Y cmo sabemos el ProgID? El vendedor o desarrollador del objeto COM debe suministrar esa informacin. Hay que hacer notar que no tiene por qu dar el ProgID de todos los objetos, puesto puede haber muchos que no estn preparados para ser creados directamente. Por ejemplo, instanciar un objeto ADO Field sin un Recordset detrs no tiene mucho sentido... Por eso no sabemos el ProgID del objeto Field. Es sta la nica forma de instanciar un objeto de nuestra ASP? No! Si habis estado atentos al artculo, habris ledo que, por ejemplo, el mtodo Item de una coleccin devuelve otro objeto. Por tanto, otra forma de instanciar un objeto es que un objeto ya existente lo cree para nosotros. Cuando un objeto COM es creado por otro objeto COM, hay que anteponer siempre set delante de la sentencia, como en: set rs=oConn.Execute(SQL) Si no pusiramos set, cualquier intento posterior de utilizar el objeto rs, nos dara el error "Se necesita un objeto". Nuestra pgina ASP no lo reconoce como objeto COM. Como el objeto Server es un objeto COM, el primer ejemplo para instanciar un objeto es exactamente igual que el segundo: un objeto COM nos crea otro. Pero quin crea al objeto Server? Nadie, es uno de los objetos COM integrados en ASP (en ingls, built-in COM objects).

Objetos COM integrados en ASP


En el entorno Active Server Pages hay 6 objetos integrados, que podemos utilizar sin tener que instanciarlos:
Server Request Response Session

Profesor: Jos Luis Sifuentes Quijada

Pg. # 17

Programacin VBScript

Application Error

Adems, tenemos ObjectContext, que utilizamos desde otros lenguajes de programacin para hacer objetos COM para utilizar en nuestras pginas ASP. Para terminar, un breve apunte sobre la sintaxis que se utiliza en la documentacin de cualquier objeto COM.

Documentacin
Propiedades de lectura/escritura: objeto.Propiedad[=valor]

Propiedades de slo lectura: objeto.Propiedad

Mtodos con argumentos opcionales: objeto.Mtodo ( arg1, arg2, [arg3, [arg4]])

Los nicos argumentos requeridos son arg1 y arg2, el resto son opcionales.

En resumen...
Si habis entendido todo lo que he intentado explicaros en este artculo, tendris una base slida acerca de los objetos COM, y en especial de su interfaz. Ahora, cuando leis que tal o cual objeto es una coleccin, sabres que podis utilizar un For each ... Next para recorrerla, entenderis que es la propiedad por defecto de un objeto, y sabris cuando leis cualquier documentacin de un objeto COM de qu os estn hablando simplemente echando un ojo. Por si os sigue sonando todo esto como lejano, echad un ojo a la tpica documentacin que hemos mirado miles de veces... La documentacin de ASP del PWS, de los objetos de ADO, del ASPEmail que bajsteis ayer... :-) En un prximo artculo, veremos cmo crear nuestro propio objeto COM, y qu ventajas nos aporta a nuestras aplicaciones Web.

Profesor: Jos Luis Sifuentes Quijada

Pg. # 18

Potrebbero piacerti anche