Professional Documents
Culture Documents
ASP (acrnimo de Active Server Page) es una tecnologa desarrollada por Microsoft para ejecutar cdigo en un servidor web y generar pginas en forma dinmica. Hay que entender primero como funciona la solicitud de pginas en un navegador para comenzar a utilizar ASP. Comunicacin entre el cliente y el servidor sin ASP: 1 - Tipeamos en la barra del navegador la direccin y el archivo a solicitar. 2 - El web browser (navegador) enva el mensaje a travs de Internet a la computadora, por ejemplo www.lanacion.com/pagina1.htm solicitando la pgina (archivo) pagina1.htm 3 - El web server (servidor web, que puede ser el Apache, IIS, etc.) que es un programa que se ejecuta en la mquina www.lanacion.com, recibe el mensaje y lee el archivo solicitado desde el disco duro. 4 - El servidor web enva el archivo solicitado por el navegador tal cual est en el disco duro. 5 - El navegador muestra en pantalla el archivo que envi el servidor web. Este proceso siempre es el mismo cuando hablamos de pginas estticas (pginas que no cambian), cualquiera sea el cliente que solicita la pgina el contenido siempre ser el mismo. La nica forma que el contenido del archivo cambie es que el administrador de ese sitio web edite el contenido del archivo pagina1.htm y haga modificaciones. Comunicacin entre el cliente y el servidor con ASP: 1 - Tipeamos en la barra del navegador la direccin y el archivo a solicitar. 2 - El web browser (navegador) enva el mensaje a travs de Internet a la computadora llamada www.lanacion.com solicitando la pgina (archivo) pagina1.asp 3 - El web server (servidor web IIS, veremos luego que este servidor tambin es propiedad de Microsoft), recibe el mensaje y al ver que la extension es "asp" solicita al mdulo de ASP (que es otro programa que se ejecuta en el servidor web) que le enve el archivo. 4 - El mdulo ASP lee desde el disco el archivo pagina1.asp 5 - El mdulo ASP ejecuta los comandos contenidos en el archivo y eventualmente se comunica con un gestor de base de datos (ejemplos de ellos pueden ser SQL Server, Access etc.)
6 - Luego de ejecutar el programa contenido en el archivo enva ste al servidor web. 7 - El servidor web enva la pgina al cliente que la haba solicitado. 8 - El navegador muestra en pantalla el archivo que envi el servidor web. Para aquellas personas que conocen otros lenguajes de programacin (C - Java - C# Pascal etc.) la salida de los resultados normalmente es la pantalla, en ASP la salida es la pgina HTML (luego sta viaja por internet y llega al cliente que la solicit)
El servidor IIS (Internet Information Server) identifica que la extensin del archivo solicitado es asp por lo que pasa al mdulo ASP para procesar el programa contenido en su interior.
En este caso el programa contenido es muy sencillo, solo le pedimos que imprima dentro de la pgina la cadena "Hola Mundo". Es verdad que para este tipo de problemas conviene emplear una pgina esttica HTML ya que el contenido que genera el programa siempre es el mismo. Otra cosa que hay que tener bien en claro, cual es el contenido del archivo que recibe el navegador: pagina1.asp
<html> <head> <title>problema</title> </head> <body> Hola Mundo </body> </html>
Como podemos observar desaparece el programa codificado en VBScript y contiene el resultado de la ejecucin del mismo. Los programas que se encuentran en el servidor nunca sern visto por el visitante, ya que estos reciben el resultado de la ejecucin de los mismos. Para aquellas personas que no han utilizado otra tecnologa de pginas dinmicas puede ser inicialmente un poco complejo entender la programacin en el servidor. Si ya de antemano conocen otro lenguaje de escritorio (C - C++ - Java) el mtodo write del objeto response (response.write) remplaza al comando de impresin por pantalla. Como el programa se ejecuta en un servidor de Internet que se puede encontrar a miles de kilometros poco sentido tendra imprimir en el monitor de dicho servidor. Entonces la solucin es "imprimir" dentro del archivo html que se enviar al navegador que solicit dicha pgina.
Lo ms importante de este problema es entender la lgica y no la sintaxis completa. Lo primero que hacemos es obtener la fecha actual mediante la llamada a la funcin date():
fecha=date()
Luego de esto tenemos almacenado en esta variable la fecha (tener en cuenta que este programa se est ejecutando en el servidor y la fecha corresponde a esta computadora y no a la del navegador que solicit la pgina). Como solo necesitamos el nmero de da mediante la funcin day extraemos este valor:
dia=day(fecha)
Seguidamente con la instruccin if verificamos si el nmero almacenado en la variable dia es menor o igual a 10:
if dia<=10 then
No se preocupe si no entiende los conceptos de variables, estructura condicional etc. a lo largo de este curso veremos con detenimiento cada uno de ellos. Lo que s debe quedar en claro que lo que llega al navegador es el resultado de la ejecucin del programa contenido en la pgina ASP. En este caso las pginas posibles son:
<html> <head> <title>problema</title> </head> <body> sitio activo </body> </html>
Recordemos siempre que el navegador recibe siempre solo HTML. Dicho HTML puede ser el resultado de la ejecucin de un programa en el servidor.
4 - Lenguaje VBScript
Si todava no conoce ningn lenguaje de programacin ser mejor que desarrolle el curso de JavaScriptYa, este comienza desde cero. Partimos de que conoce los conceptos de variable, estructuras condicionales y repetitivas. El lenguaje VBScript es un dialecto del Visual Basic. Es un lenguaje interpretado. El VBScript no es sensible a maysculas o minsculas, es decir podemos escribir sus palabras claves con minsculas o maysculas en forma indistinta. Las variables se inicializan y definen su tipo en el momento de asignarle el valor. Podemos codificar los programas en las pginas utilizando programacin lineal, estructurada o planteando clases.
Primero mostramos un mensaje para saber que tipo de variable estamos imprimiendo, seguidamente en la segunda llamada al mtodo write imprimimos la variable y por ltimo procedemos a imprimir el elemento HTML <br> para que se efecte un salto de lnea en el navegador y cada variable aparezca en una lnea distinta. Para definir una variable real debemos utilizar el caracter .:
pi=3.1416
Las variables de tipo string se inicializan asignndole una cadena encerrada entre dobles comillas:
nombre="juan"
Una variable de tipo fecha debe estar encerrada entre los caracteres # y el orden de inicializacin es mes/da/ao:
fechahoy=#12/25/2008#
Por ltimo una variable lgica solo puede almacenar alguno de estos dos valores (true o false):
existe=true
Lo operadores matemticos para las variables enteras y reales son: + * / \ (retorna la parte entera de la divisin) mod (retorna el resto de una divisin) ^ (eleva un nmero a un determinado exponente)
Este programa no provoca error ya que cuando queremos imprimir la variable ed y el VBScript no la encuentra entre las definidas procede a crear una nueva variable. El lenguaje VBScript nos permite indicarle que nos obligue a definir todas las variables que utilizamos en el programa. Esto se logra indicando en la primer lnea el comando:
option explicit
Luego utilizamos la palabra dim seguida de las variables a definir. Veamos un ejemplo donde definimos tres variables con los nombres de personas:
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim nom1,nom2,nom3 nom1="ana" nom2="carlos" nom3="luis" response.write(nom1) response.write("<br>") response.write(nom2) response.write("<br>") response.write(nom3) %> </body> </html>
Luego todas las variables que utilizaremos debemos definirlas seguidas de la palabra clave dim:
dim nom1,nom2,nom3
Ahora bien si en alguna parte del programa nos equivocamos y tratamos de asignarle un valor a una variable inexistente (no definida) el programa se detiene y nos informa del error:
n1="ana"
Es muy conveniente la definicin de variables, nos evitan muchos problemas cuando un programa es ms grande y tenemos una gran cantidad de variables. Las nuevas tecnologas de Microsoft ASP.Net obligan por defecto la definicin de variables.
7 - Estructura condicional if
Cuando se pretende que el programa, una vez llegado a un cierto punto, tome un camino concreto en determinados casos y otro diferente si las condiciones de ejecucin difieren, se utiliza la instruccin if:
if Condicin Instruccin Instruccin else Instruccin Instruccin end if A1 A2 B1 B2
Si la condicin genera un valor verdadero se ejecutan luego todas las instrucciones seguidas al if:
Instruccin A1 Instruccin A2
En caso que la condicin genere un valor falso se ejecutan las instrucciones seguidas al else hasta encontrar el comando end if:
Instruccin B1 Instruccin B2
El bloque del else es opcional, es decir podemos hacer que ciertas instrucciones se ejecuten y en caso de ser falso la condicin del if no se ejecute nada:
if Condicin Instruccin Instruccin else Instruccin Instruccin end if A1 A2 B1 B2
Confeccionaremos una pgina que muestre un mensaje distinto si el da actual tiene un dgito o dos:
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim fecha,dia fecha=date() dia=day(fecha) response.write("Hoy es") response.write(dia) response.write("<br>") if dia<10 then response.write("El nmero de da tiene un dgito") else response.write("El nmero de da tiene dos dgitos") end if %> </body> </html>
Recordemos que lo primero que hacemos es indicar que verifique que todas las variables sean definidas:
<%option explicit%>
Imprimimos el da actual:
En caso de que la condicin se verifique verdadera procedemos a imprimir en la pgina HTML el siguiente mensaje:
response.write("El nmero de da tiene un dgito")
En caso que la condicin genere un valor falso procede a ejecutar las instrucciones indicadas despus del else:
response.write("El nmero de da tiene dos dgitos")
Para las condiciones tener en cuenta que disponemos de los siguientes operadores relacionales: = para ver si una variable es igual a otra. <> distinto. >= mayor o igual. > mayor. <= menor o igual. < menor.
pagina1.html
<html> <head> <title>problema</title> </head> <body> <form action="pagina1.asp" method="post"> Ingrese el primer valor: <input type="text" name="valor1"><br> Ingrese el segundo valor: <input type="text" name="valor2"><br> <input type="submit" value="sumar"><br> </form> </body> </html>
Lo ms importante es subrayar el valor que le asignamos al atributo name. Este identificador es el que utilizaremos en la pgina ASP para rescatar el valor. En el elemento form indicamos la pgina ASP que recibir los datos:
<form action="pagina1.asp" method="post">
La propiedad action indica la pgina ASP que recibir y procesar los datos en el servidor (es importante hacer notar que si bien los dos archivos tiene el mismo nombre difieren en las extensiones: pagina1.html y pagina1.asp) El control de tipo "submit" tiene por objetivo enviar los datos del formulario al servidor para que sean procesados:
<input type="submit" value="sumar">
Ahora veamos la pgina que contiene el cdigo VBScript que se ejecuta en el servidor y rescata los valores del formulario. pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim v1,v2,suma v1=request.form("valor1")
v2=request.form("valor2") suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma) %> </body> </html>
Definimos 3 variables donde almacenaremos los dos valores rescatados del formulario y un tercer donde guardaremos la suma de los mismos:
dim v1,v2,suma
Para rescatar el contenido de un control HTML debemos utilizar el objeto request y su mtodo form cumple dicho objetivo. Debemos pasar como parmetro al mtodo el nombre asignado al control en el formulario HTML, en nuestro caso valor1:
v1=request.form("valor1")
Luego de ejecutar esta lnea tenemos almacenado el valor en la variable v1. El mtodo form recupera el dato en formato string. Para sumar los dos valores enteros debemos convertirlos mediante la funcin cint:
suma=cint(v1)+cint(v2)
Es muy importante tener presente que el archivo que llega al navegador es semejante a este:
<html> <head> <title>problema</title> </head> <body> la suma de los dos valores es:17 </body> </html>
Es decir al navegador llega HTML puro y no llega el programa codificado en VBScript, no importa que la extensin que llega al navegador sea asp.
vemos que los dos tienen el mismo valor para la propiedad name (en nuestro caso el valor radio1) de esta forma el navegador puede identificar que los dos controles de tipo radio estn relacionados. La propiedad type la inicializamos con el valor radio. La propiedad value almacena el valor que se rescatar en la pgina ASP.
Veamos ahora la pgina que rescata los valores de los controles text y verifica que elemento radio se encuentra seleccionado: pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim v1,v2,suma,operacion,resta v1=request.form("valor1") v2=request.form("valor2") operacion=request.form("radio1") if (operacion="suma") then suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma) end if if (operacion="resta") then resta=cint(v1)-cint(v2) response.write("la diferencia de los dos valores es:") response.write(resta) end if %> </body> </html>
Para rescatar el valor del control radio seleccionado procedemos de la siguiente manera:
operacion=request.form("radio1")
Luego de esto tenemos almacenado en la variable operacion el atributo value del control radio seleccionado. Verificamos con un if si se encuentra seleccionado el primer radio:
if (operacion="suma") then suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma)
end if
Procedemos de la misma manera para verificar si el valor rescatado del control radio almacena el valor resta:
if (operacion="resta") then resta=cint(v1)-cint(v2) response.write("la diferencia de los dos valores es:") response.write(resta) end if
Podemos comentar tambin que pueden no estar seleccionado ningn control de tipo radio, por lo que las dos condiciones del if seran falsas y no mostrara valor alguno. Si queremos que uno de los controles de tipo radio aparezca seleccionado por defecto debemos agregarle la propiedad checked:
<input type="radio" name="radio1" value="suma" checked>sumar
</body> </html>
Es importante notar que la sintaxis es bastante distinta a los controles de tipo text y radio. El elemento select tiene definido la propiedad name mediante la cual rescataremos el valor seleccionado en el servidor. El elemento select contiene un conjunto de elementos option. Cada elemento option tiene definido la propiedad value. El que quede seleccionado el control select rescata su propiedad value. Ahora el algoritmo en la pgina ASP es igual al planteado para los controles radio: pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim v1,v2,suma,operacion,resta v1=request.form("valor1") v2=request.form("valor2") operacion=request.form("operacion") if (operacion="suma") then suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma) end if if (operacion="resta") then resta=cint(v1)-cint(v2) response.write("la diferencia de los dos valores es:") response.write(resta) end if %> </body> </html>
Ahora en la variable operacin tenemos el valor seleccionado en el control select. Mediante dos if detectamos la operacin seleccionada y procedemos a calcular e imprimir su resultado:
if (operacion="suma") then suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma) end if if (operacion="resta") then resta=cint(v1)-cint(v2) response.write("la diferencia de los dos valores es:") response.write(resta) end if
Con este simple cambio podemos seleccionar ms de un elemento del interior del control select. Confeccionaremos el mismo problema anterior, solo que ahora podremos seleccionar las dos operaciones en forma simultanea El archivo HTML ahora queda codificado de la siguiente manera: pagina1.html
<html> <head> <title>Problema</title> </head> <body> <form action="pagina1.asp" method="post"> Ingrese primer valor: <input type="text" name="valor1"> <br> Ingrese segundo valor: <input type="text" name="valor2"> <br> <select name="operacion" multiple> <option value="suma">Sumar</option> <option value="resta">Restar</option>
El nico cambio es el agregado de la propiedad multiple al elemento select. Esta propiedad no requiere que se le asigne un valor. Cuando ejecutamos la pgina para la seleccin mltiple debemos presionar la tecla Ctrl y con el mouse seleccionar la opcin, esto lo repetimos por cada elemento del select que queremos que quede seleccionada. En cuanto al programa ASP que procesa los datos del formulario es: pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim v1,v2,suma,operaciones,resta v1=request.form("valor1") v2=request.form("valor2") operaciones=request.form("operacion") if (instr(operaciones,"suma")<>0) then suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma) response.write("<br>") end if if (instr(operaciones,"resta")<>0) then resta=cint(v1)-cint(v2) response.write("la diferencia de los dos valores es:") response.write(resta) end if %> </body> </html>
se almacena en la variable operacin todos los contenidos de las propiedades value de las opciones seleccionadas. Cada valor est separado por una coma.
Esta forma de retornar todos los valores nos complica en el momento de verificar cual de las opciones est seleccionada. Una forma de verificar si una de las opciones est seleccionada es empleando la funcin intstr. Esta funcin tiene dos parmetros, el primero recibe la cadena completa a analizar y el segundo la cadena a buscar. Si esta funcin retorna un valor distinto a cero significa que se encuentra la cadena a buscar. Entonces tenemos:
if (instr(operaciones,"suma")<>0) then
Si el string "suma" se encuentra almacenada en alguna parte de la variable operacin la funcin instr retorna un valor distinto a cero por lo que la condicin del if se verifica verdadera y procedemos a efectuar la suma de los dos valores.
<input type="checkbox" name="check1" value="suma">sumar <br> <input type="checkbox" name="check2" value="resta">restar <br>
cada control de tipo checkbox define en la propiedad name un nombre distinto (check1 y check2) Es importante notar que definimos la propiedad value para cada checkbox, este valor se rescatar en caso que el checkbox est seleccionado. Veamos ahora el archivo que contiene el programa ASP. pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim v1,v2,suma,operacion,resta v1=request.form("valor1") v2=request.form("valor2") operacion=request.form("check1") if (operacion="suma") then suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma) response.write("<br>") end if operacion=request.form("check2") if (operacion="resta") then resta=cint(v1)-cint(v2) response.write("la diferencia de los dos valores es:") response.write(resta) end if %> </body> </html>
Si el primer checkbox est seleccionado la variable opcin almacena el contenido de la propiedad value, en caso de no estar seleccionado la variable operacin almacena una cadena vaca que es el valor retornado por la llamada al mtodo form del objeto request pasando como parmetro el name del primer checkbox. Con una estructura if verificamos si el valor devuelto corresponde al string "suma":
if (operacion="suma") then suma=cint(v1)+cint(v2) response.write("la suma de los dos valores es:") response.write(suma) response.write("<br>") end if
Luego hacemos la misma actividad para rescatar el valor del segundo checkbox y almacenamos el valor devuelto en la misma variable operacion (se pierde el valor anterior):
operacion=request.form("check2") if (operacion="resta") then resta=cint(v1)-cint(v2) response.write("la diferencia de los dos valores es:") response.write(resta) end if
Definimos las dos variables donde almacenaremos los datos rescatados del formulario:
dim nombre,comentarios
El operador & nos permite concatenar una cadena con una variable y resolver la impresin con una sola llamada al mtodo write.
Como podemos observar para definir un control de tipo password en HTML debemos inicializar la propiedad type con el valor "password":
<input type="password" name="clave">
La pgina ASP que rescata los valores ingresados y los imprime (pagina1.asp)
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim nombre,clave nombre=request.form("nombre") clave=request.form("clave") response.write("Nombre ingresado:" & nombre) response.write("<br>") response.write("Clave ingresada:" & clave) %> </body> </html>
Recordemos que en la primera lnea del archivo siempre ejecutamos el comando option explicit para obligar la definicin de variables:
<%option explicit%>
Hay situaciones donde por la rama del else podemos disponer otra estructura condicional y as sucesivamente. Para ver la sintaxis desarrollaremos un formulario donde ingresaremos un valor por teclado comprendido entre 1 y 1000. Luego mostraremos cuantos dgitos tiene. Emplearemos una serie de if anidados para ver la cantidad de dgitos. pagina1.html
<html> <head> <title>problema</title> </head> <body> <form action="pagina1.asp" method="post"> Ingresar un valor entre 1 y 1000: <input type="text" name="valor"><br> <input type="submit" value="calcular"> </form> </body> </html>
Definimos una variable y guardamos el contenido del control text en esta, previa conversin a tipo de dato entero:
dim v v=cint(request.form("valor"))
Nuevamente esta estructura condicional interna por la rama del else tiene otra estructura condicionas:
if v<1000 Then response.write("Tiene tres dgitos")
Finalmente por el else de esta estructura condicional tenemos una nueva estructura condicional:
if v<10000 Then response.write("Tiene cuatro dgitos") end if
Es importante notar que debemos cerrar con end if cada estructura condicional:
end if end if end if
La tcnica mas adecuada para no confundirse como cerrar cada estructura condicional es escribir inicialmente esto:
if v<10 Then response.write("Tiene un dgito") else end if
Es decir disponemos todo el cdigo que hay por la rama del verdadero, luego la palabra else y procedemos a cerrar el if. Como segundo paso procedemos a escribir la actividad del else:
if v<10 Then response.write("Tiene un dgito") else if v<100 Then response.write("Tiene dos dgitos") else end if end if
Nuevamente planteamos la estructura condicional sin indicar la actividad del else, pero cerramos correctamente con el end if. Repetimos el mismo proceso para la rama del else:
if v<10 Then response.write("Tiene un dgito") else if v<100 Then response.write("Tiene dos dgitos") else if v<1000 Then response.write("Tiene tres dgitos") else end if end if end if
Por ltimo disponemos el cdigo del else de la estructura if ms anidada, quedando el cdigo:
if v<10 Then response.write("Tiene un dgito") else if v<100 Then response.write("Tiene dos dgitos") else if v<1000 Then response.write("Tiene tres dgitos") else if v<10000 Then response.write("Tiene cuatro dgitos") end if end if end if end if
Esta estructura repetitiva inicializa un contador con el valor-inicial y hasta que no llegue al valor-final inclusive no detiene la ejecucin de las instrucciones contenidas. Cada vez que ejecuta las instrucciones incrementa en uno el contador, salvo que se encuentre definida la seccin del step que indica cual es el incremento del contador. Para ver su funcionamiento implementaremos una pgina que muestre los nmeros del 1 al 10 con un ciclo repetitivo for. Luego en la misma pgina mostraremos los valores del 1 al 10 pero avanzando de a dos (es decir 1,3,5 etc.) pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim x for x=1 to 10
response.write(x & "-") next response.write("<br>") for x=1 to 10 step 2 response.write(x & "-") next %> </body> </html>
Como no se requiere un formulario solo tenemos la pgina ASP. Definimos una variable llamada x (puede tener cualquier nombre)
dim x
Para mostrar los nmeros del 1 al 10 inicializamos la variable x con el valor 1 e indicamos luego de la palabra to el valor final al que debe llegar la variable x (como no tiene la seccin del step el incremento es de uno):
for x=1 to 10 response.write(x & "-") next
Como podemos ver dentro del for imprimimos el contenido de la variable x y concatenamos un guin para que los nmeros no salgan pegados. Insertamos el elemento HTML br (break) para que cada lista de valores aparezca en una lnea separada.
response.write("<br>")
La segunda estructura repetitiva inicializar a x con uno pero en la seccin del step indicamos que los incrementos sean de a dos:
for x=1 to 10 step 2 response.write(x & "-") next
Este tipo de estructura repetitiva la tienen casi todos los lenguajes de programacin. Las instrucciones se repiten mientras la condicin se verifique verdadera. La condicin se encuentra previo a las instrucciones, es decir que si la primera vez la condicin se verifica falsa el bloque de instrucciones no se ejecuta nunca. Finaliza con la palabra clave loop. Para probar esta estructura repetitiva confeccionaremos un formulario donde ingresaremos un valor y luego mostraremos todos los valores pares hasta el valor ingresado. pagina1.html
<html> <head> <title>problema</title> </head> <body> <form action="pagina1.asp" method="post"> Ingrese un valor entero: <input type="text" name="valor"><br> <input type="submit" value="sumar"> </form> </body> </html>
Inicializamos un contador en 2:
par=2
La condicin del do while se verifica verdadera mientras el contador par sea menor o igual al valor ingresado en el formulario:
do while par<=valor
La condicin se encuentra al final de la estructura repetitiva. Con este tipo de estructura repetitiva las instrucciones que contiene se ejecutan por lo menos una vez. Dependiendo de la situacin no puede resultar ms sencillo disponer la condicin al final que al principio. Para ver su funcionamiento ingresaremos por teclado un valor entero positivo y mostraremos dicho valor, luego lo decrementaremos en uno y lo mostraremos, esto mientras el valor sea mayor a cero. pagina1.html
<html> <head> <title>problema</title>
</head> <body> <form action="pagina1.asp" method="post"> Ingrese un valor entero positivo: <input type="text" name="valor"><br> <input type="submit" value="sumar"> </form> </body> </html>
pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim valor valor=cint(request.form("valor")) do response.write(valor & " - ") valor=valor-1 loop while valor>0 %> </body> </html>
El ciclo repetitivo:
do response.write(valor & " - ") valor=valor-1 loop while valor>0
Como podemos ver por lo menos se imprime el primer valor, luego de restarle uno verificamos si todava es mayor a cero, en caso afirmativo procede nuevamente a ejecutar las dos instrucciones del do.
19 - Parmetros en un hipervnculo
Habamos visto que podemos enviar datos al servidor mediante un formulario. En muchas situaciones necesitamos enviar datos al servidor al ser presionado un hipervnculo. Vamos a resolver un problema muy sencillo donde llamaremos a otra pgina envindole como parmetro un nmero. La pgina que lo recibe imprime la tabla de multiplicar de dicho valor. pagina1.html
<html> <head> <title>Problema</title> </head> <body> <a href="pagina1.asp?tabla=2">Tabla del 2</a> <br> <a href="pagina1.asp?tabla=3">Tabla del 3</a> <br> <a href="pagina1.asp?tabla=4">Tabla del 4</a> </body> </html>
Como podemos observar un parmetro en un hipervnculo se lo aade en la propiedad href y seguido al nombre de la pgina a llamar mediante el caracter de "?" interrogacin. Todo parmetro tiene un nombre y luego del caracter igual el valor del mismo.
<a href="pagina1.asp?tabla=2">Tabla del 2</a> <br>
Recordemos que para extraer el valor cargado en un control de un formulario HTML utilizamos el objeto request y el mtodo form. En cambio para recuperar el dato enviado en el hipervnculo empleamos el mtodo querystring del mismo objeto request:
num=request.querystring("tabla")
Una vez rescatado el valor procedemos a mostrar los primeros diez trminos de la tabla de multiplicar respectiva:
for f=num to num*10 step num response.write(f & "-") next
Es decir inicializamos el contador f con el valor rescatado del parmetro. En cada paso del for incrementamos el contador f en num. Por ltimo indicamos que el ciclo finalice cuando f llegue al valor num*10.
Si queremos pasar ms de un parmetro en un hipervnculo debemos separarlos empleando el caracter &. Por ejemplo:
<a href="pagina1.asp?inicio=5&fin=10">Mostrar los nmeros comprendidos entre 5 y 10</a>
Ahora presentaremos los dos archivos necesarios para efectuar la carga y registracin de datos en el servidor: pagina2.html
<html> <head> <title>problema</title> </head>
<body> <form action="pagina2.asp" method="post"> Ingrese su nombre: <input type="text" name="nombre"><br> Comentarios<br> <textarea name="comentarios" rows="10" cols="40"></textarea><br> <input type="submit" value="enviar"><br> </form> </body> </html>
Primero definimos cuatro variables e inicializamos dos de estas con los contenidos de los controles del formulario (text y textarea):
dim nombre,comentarios,archivo,ref nombre=request.form("nombre") comentarios=request.form("comentarios")
Creamos ahora un objeto de la clase FileSystemObject que nos permite acceder al sistema de archivos del servidor:
set archivo = CreateObject("Scripting.FileSystemObject")
El primer parmetro indica el nombre del archivo que se abrir para agregar, si no existe se crea ya que esto lo indica el tercer parmetro (True). El mtodo mappath del objeto server retorna el path donde se encuentra nuestra pgina ASP, que sera el mismo directorio donde se guardar el archivo de texto. Debemos utilizar siempre server.mappath ya que no sabemos la unidad y directorio donde se almacena nuestro sitio en el hosting contratado. El segundo parmetro indica cual es la forma de abrir el archivo (1-lectura 2-crea el archivo y lo abre para aadir (se borra si ya existe), 8-para aadir) en nuestro caso es 8 ya que grabaremos informacin en el archivo. Por ltimo el tercer parmetro si le pasamos el valor true crea el archivo si no existe. Para grabar datos en el archivo de texto el objeto devuelto por el mtodo opentextfile dispone de writeline. Este mtodo graba una cadena en el archivo de texto y aade un salto de lnea
ref.writeline("_____Comentario___________________________________________ ________") ref.writeline(now()) ref.writeline("") ref.writeline("Nombre: " & nombre) ref.writeline("") ref.writeline("Comentarios: " & comentarios)
Cuando finalizamos la grabacin de datos en el archivo de texto procedemos a cerrar el archivo con el objetivo de permitir que otro proceso del servidor leer o modificar el archivo:
ref.close()
set ref = archivo.OpenTextFile(server.mappath("comentarios.txt"), 1, True) do while not ref.atendofstream linea=ref.readline() response.write(linea & "<br>") Loop ref.close() %> <br> <a href="pagina1.html">Retornar</p> </body> </html>
Creamos ahora un objeto de la clase FileSystemObject que nos permite acceder al sistema de archivos del servidor como vimos en la pgina anterior:
set archivo = CreateObject("Scripting.FileSystemObject")
Ahora indicamos en el segundo parmetro el valor 1 ya que de esta forma se abre el archivo para lectura. Como pasamos True en el tercer parmetro si el archivo no existe se crea en forma automtica. Para proceder a la lectura de cada lnea del archivo de texto:
do while not ref.atendofstream linea=ref.readline() response.write(linea & "<br>") Loop
El mtodo atendofstream retorna true si lleg al fin de archivo, por eso mediante el operador lgico not invertimos el valor devuelto por esta funcin. Normalmente atendofstream retorna false ya que no se ha llegado al fin de archivo. Este while se repite mientras no se llegue al fin de archivo. En cada vuelta leemos una lnea del archivo de texto con el mtodo readline, procediendo a imprimirla en la pgina. Agregamos un br al final de cada lnea. Cuando finalizamos la lectura de datos del archivo de texto procedemos a cerrarlo:
ref.close()
Veamos ahora lo nuevo que es la conexin a la base de datos de SQL Server y la ejecucin del comando insert en la tabla artculos:
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Initial Catalog=wi630629_aspya" conexion.Open conexion.execute("insert into articulos(descripcion,precio)" & _ "values ('" & request.form("descripcion") & _
Veamos paso a paso como nos conectamos a la base de datos de SQL Server. Primero creamos un objeto "ADODB.Connection":
set conexion = Server.CreateObject("ADODB.Connection")
Seguidamente inicializamos la propiedad ConnectionString con la cadena de conexin a la base de datos respectiva:
conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Initial Catalog=wi630629_aspya"
Las propiedades que debemos inicializar en la cadena de conexin se separan por punto y coma y significan: Provider: Proveedor Data Source: con un punto indicamos que se ubica en localhost Integrated Security=SSPI: Seguridad integrada de windows Initial Catalog: Nombre de la base de datos a acceder, en nuestro caso "wi630629_aspya" Una vez que inicializamos la cadena de conexin procedemos a llamar al mtodo open para abrirla:
conexion.Open
Podemos ahora pasarle un comando SQL al SQL Server mediante el mtodo execute del objeto conexin:
conexion.execute("insert into articulos(descripcion,precio)" & _ "values ('" & request.form("descripcion") & _ "'," & request.form("precio") & ")")
Lo ms importante es poder generar una cadena con el comando insert correctamente formado para evitar que el SQL Server nos retorne un error, esto puede ser por algn error sintctico en la cadena del comando SQL. Hay que tener en cuenta que en VB Script cuando queremos seguir en la lnea siguiente debemos disponer al final de lnea el caracter _ (debe haber un espacio de separacin)
Con el operador & concatenamos las cadenas con informacin fija y los datos que rescatamos del formulario de carga. Finalmente cerramos la conexin:
conexion.close
Primero creamos un objeto "ADODB.Connection" y luego inicializamos la propiedad ConnectionString con la cadena de conexin como lo vimos en el concepto anterior. Lo nuevo comienza con la creacin de un objeto "ADODB.RecordSet"
set registros = Server.CreateObject("ADODB.RecordSet")
Un RecordSet representa un conjunto de registros que se recuperan a partir de la ejecucin del comando SQL Select. Al mtodo open le pasamos como parmetro el comando SQL y la referencia del objeto que estableci la conexin con la base de datos:
registros.open "select codigo,descripcion,precio from articulos",conexion
El resultado de este select puede generar 0,1,2,3 etc. filas de la tabla articulos, para recuperarlos debemos disponer una estructura repetitiva para recorrer todas las filas almacenadas en nuestro RecordSet:
do while not registros.eof response.write("Cdigo:" & registros("codigo")) response.write("<br>") response.write("Descripcin:" & registros("descripcion")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>") response.write("-----------------------------------------------------------") response.write("<br>") registros.movenext loop
El RecordSet tiene una propiedad llamada eof que almacena un valor boolean que indica si llegamos al ltimo registro almacenado. Es por ello que el while se repite mientras no (not) lleguemos al final. Si el comando Select retorna cero filas (por ejemplos esto ocurre si la tabla articulos se encuentra sin registros) la propiedad eof almacena un true y como le antecedemos el operador lgico not la condicin se valida como false y por lo tanto no ejecuta el contendio del while. En caso de haber por lo menos un registro en el RecordSet se ejecutar el bloque contenido en el while. El RecordSet tiene un puntero que inicialmente apunta al primer registro recuperado. Si queremos luego recuperar los datos de cada campo procedemos de la siguiente forma:
response.write("Cdigo:" & registros("codigo"))
Es decir mediante el objeto RecordSet (en nuestro caso se llama registros) le indicamos entre parntesis y doble comillas el nombre del campo a recuperar. El nombre del campo debe coincidir con el nombre indicado en el comando SQL Select Para avanzar el puntero del RecordSet llamamos al mtodo MoveNext:
registros.movenext
<body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select codigo,descripcion,precio from articulos where codigo=" _ & request.form("codigo") ,conexion if not registros.eof then response.write("Descripcin:" & registros("descripcion")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>") else response.write("No existe ningn artculo con dicho cdigo") end if conexion.close %> </body> </html>
El primer cambio que podemos observar con respecto al listado completo de la tabla es la clusula where en el select:
registros.open "select codigo,descripcion,precio from articulos where codigo=" _ & request.form("codigo") ,conexion
Es decir rescatamos el registro que coincide con el cdigo de artculo ingresado en el formulario. Como puede haber solo un registro con dicho cdigo disponemos un if para verificar si la propiedad eof del RecordSet almacena un false (en caso de almacenar un false significa que a rescatado un registro con dicho select, recordemos que eof almacena false si el puntero no a llegado al final de los registros recuperados):
if not registros.eof then
Procedemos a mostrar el registro si la condicin del if se verifica verdadera, de forma similar al listado completo del concepto anterior:
response.write("Descripcin:" & registros("descripcion")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>")
En caso que la condicin del if se verifique falsa procedemos a mostrar el mensaje de cdigo inexistente:
else response.write("No existe ningn artculo con dicho cdigo") end if
"Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select codigo,descripcion,precio from articulos where codigo=" _ & request.form("codigo") ,conexion if not registros.eof then conexion.execute("delete from articulos where codigo=" & request.form("codigo")) response.write("Los datos del artculo borrado son:<br>") response.write("Descripcin:" & registros("descripcion")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>") else response.write("No existe un artculo con dicho cdigo") end if conexion.close %> </body> </html>
En caso que la propiedad eof tenga almacenado un falso procedemos a ejecutar el comando SQL Delete e informamos los datos del registro borrado:
if not registros.eof then conexion.execute("delete from articulos where codigo=" & request.form("codigo")) response.write("Los datos del artculo borrado son:<br>") response.write("Descripcin:" & registros("descripcion")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>")
pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select codigo,descripcion,precio from articulos where codigo=" _ & request.form("codigo") ,conexion if not registros.eof then %> <form action="pagina2.asp" method="post"> Descripcion del articulo:
<input type="text" name="descripcion" size="30" value="<%response.write(registros("descripcion"))%>"><br> Precio: <input type="text" name="precio" size="10" value="<%response.write(registros("precio"))%>"><br> <input type="hidden" name="codigo" value="<%response.write(registros("codigo"))%>"> <input type="submit" value="Confirmar"><br> </form> <% else response.write("No existe ningn artculo con dicho cdigo") end if conexion.close %> </body> </html>
Esta pgina tiene varios conceptos nuevos. Como podemos ver podemos disponer distintos bloques de asp dentro de la misma pgina. Lo primero que hacemos en forma similar a conceptos anteriores es verificar si existe el cdigo de artculo ingresado por el operador:
registros.open "select codigo,descripcion,precio from articulos where codigo=" _ & request.form("codigo") ,conexion if not registros.eof then
En caso que la condicin if se verifique verdadera debemos disponer en la pgina un formulario HTML que muestre los datos actuales de dicho artculo. Lo ms adecuado es escribir el formulario en un bloque HTML clsico y agregarle a la propiedad value de cada control el dato rescatado de la base de datos:
<input type="text" name="descripcion" size="30" value="<%response.write(registros("descripcion"))%>">
Como podemos ver agregamos un trozo de cdigo ASP dentro del HTML. De igual forma procedemos a cargar la propiedad value para el precio:
<input type="text" name="precio" size="10" value="<%response.write(registros("precio"))%>">
Como el cdigo no se modifica procedemos a cargarlo en un control oculto, es decir de tipo hidden. Esto nos permite rescatarlo en la siguiente pgina donde procederemos a modificar la tabla de la base de datos propiamente dicha:
<input type="hidden" name="codigo" value="<%response.write(registros("codigo"))%>">
Tengamos en cuenta que este formulario llama a una tercer pgina llamada pagina2.asp. pagina2.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Initial Catalog=wi630629_aspya" conexion.Open conexion.execute("update articulos set descripcion='" & _ request.form("descripcion") & "'," & _ "precio=" & request.form("precio") & _ " where codigo=" & request.form("codigo")) conexion.close response.write("Los datos fueron modificados") %> </body> </html>
En esta pgina procedemos a rescatar los tres datos almacenados en el formulario (los dos que se ingresan por teclado y el del control oculto) y ejecutamos el comando Update:
conexion.execute("update articulos set descripcion='" & _ request.form("descripcion") & "'," & _ "precio=" & request.form("precio") & _ " where codigo=" & request.form("codigo"))
los ttulos del precio y descripcin del artculo. Al ser presionado llamaremos a la misma pgina y le pasaremos como parmetro por que campo queremos ordenar los registros en la consulta. pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim ordenado if request.querystring("ord") is nothing Then ordenado="" elseif request.querystring("ord")="descripcion" Then ordenado=" order by descripcion" elseif request.querystring("ord")="precio" Then ordenado=" order by precio" end if dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select descripcion,precio from articulos" & ordenado,conexion response.write("<table border=""1"">") response.write("<tr><th><a href=""pagina1.asp?ord=descripcion"">Descripcin</a></th><th><a href=""pagina1.asp?ord=precio"">Precio</a></th></tr>") do while not registros.eof response.write("<tr>") response.write("<td>") response.write(registros("descripcion")) response.write("</td>") response.write("<td>") response.write(registros("precio")) response.write("</td>") response.write("</tr>") registros.movenext loop response.write("</table>") conexion.close %> </body> </html>
Veamos las partes ms importantes de este algoritmo. Primero verificamos si llega algn parmetro en la llamada a la pgina:
dim ordenado if request.querystring("ord") is nothing Then ordenado="" elseif request.querystring("ord")="descripcion" Then ordenado=" order by descripcion" elseif request.querystring("ord")="precio" Then ordenado=" order by precio" end if
Es decir si llamamos a esta pgina sin pasar el parmetro ord el primer if se verifica verdadero y la variable ordenado se inicializa con una cadena vaca:
ordenado=""
En caso que llegue el parmetro ord debemos verificar si hay que ordenar por el campo precio o descripcin:
elseif request.querystring("ord")="descripcion" Then ordenado=" order by descripcion"
Si llega el valor descripcion en el parmetro ord procedemos a inicializar la variable ordenado con la cadena "order by descripcin". Al comando select se le aade al final el contenido de la variable ordenado:
registros.open "select descripcion,precio from articulos" & ordenado,conexion
Recordemos que la cadena ordenado puede tener alguno de los tres valores que se asignan al comienzo de este algoritmo. Otra parte importante de este algoritmo son los hipervnculos a la misma pgina pasando como parmetro la variable ord con el valor respectivo:
response.write("<tr><th><a href=""pagina1.asp?ord=descripcion"">Descripcin</a></th><th><a href=""pagina1.asp?ord=precio"">Precio</a></th></tr>")
Veremos ahora el algoritmo completo para dar de alta un registro en una tabla y rescatar un dato consultando otra tabla. pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <form action="pagina2.asp" method="post"> Descripcion del articulo: <input type="text" name="descripcion" size="30"><br> Precio: <input type="text" name="precio" size="10"><br> Rubro:<select name="codigorubro"> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open
dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select codigo,descripcion from rubros",conexion do while not registros.eof response.write("<option value=""" & registros("codigo") & """>" & _ registros("descripcion") & "</option>") registros.movenext loop conexion.close %> </select><br> <input type="submit" value="Confirmar"><br> </form> </body> </html>
Recordemos bien que como se requiere consultar la tabla rubros debemos hacer un archivo asp. Debemos disponer un control HTML de tipo select con todos los rubros con sus respectivos cdigos. Esta tarea la llevamos a cabo dentro de una estructura repetitiva:
do while not registros.eof response.write("<option value=""" & registros("codigo") registros("descripcion") & "</option>") registros.movenext loop & """>" & _
Es decir que nuestro control HTML select tendr tantos elementos HTML option como registros tenga la tabla rubros. Recordemos que un control HTML option retorna el valor almacenado en la propiedad value y muestra dentro del control el texto que dispongamos entre las marcas de comienzo y fin de option. Como podemos ver lo engorroso es generar el control HTML select con las descripciones y cdigos de todos los rubros. Ahora veamos el archivo que procede a efectuar el alta en la tabla articulos (pagina2.asp):
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Initial Catalog=wi630629_aspya" conexion.Open
conexion.execute("insert into articulos(descripcion,precio,codigorubro)" & _ "values ('" & request.form("descripcion") & _ "'," & request.form("precio") & ",'" & _ request.form("codigorubro") & "')") conexion.close response.write("Datos cargados") %> </body> </html>
Lo nico que vari con respecto al comando SQL insert que habamos visto es que debemos agregar el campo codigorubro que lo rescatamos del control HTML select:
conexion.execute("insert into articulos(descripcion,precio,codigorubro)" & _ "values ('" & request.form("descripcion") & _ "'," & request.form("precio") & ",'" & _ request.form("codigorubro") & "')")
Ahora veamos el archivo asp que hace la bsqueda en la base de datos (pagina1.asp)
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select ar.descripcion as descriarticulo, " & _ "precio,ru.descripcion as descrirubro " & _ "from articulos as ar " & _ "join rubros as ru on ru.codigo=ar.codigorubro " & _ "where ar.codigo=" & request.form("codigo") ,conexion if not registros.eof then response.write("Descripcin:" & registros("descriarticulo")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>") response.write("Rubro:" & registros("descrirubro")) response.write("<br>") else response.write("No existe ningn artculo con dicho cdigo") end if conexion.close %> </body> </html>
Analicemos la consulta de la pgina asp: - especificamos los campos que aparecern en el resultado en la lista de seleccin; - indicamos el nombre de la tabla luego del "from" ("articulos") y su alias;
- combinamos esa tabla con "join" y el nombre de la otra tabla ("rubros"); se especifica qu tablas se van a combinar y cmo; - cuando se combina informacin de varias tablas, es necesario especificar qu registro de una tabla se combinar con qu registro de la otra tabla, con "on". Se debe especificar la condicin para enlazarlas, es decir, el campo por el cual se combinarn, que tienen en comn. "on" hace coincidir registros de ambas tablas basndose en el valor de tal campo, en el ejemplo, el campo "codigorubro" de "articulos" y el campo "codigo" de "rubros" son los que enlazarn ambas tablas. Se emplean campos comunes, que deben tener tipos de datos iguales. Cuando rescatamos los datos de la consulta es importante notar que hacemos referencia a los alias creados para los campos:
if not registros.eof then response.write("Descripcin:" & registros("descriarticulo")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>") response.write("Rubro:" & registros("descrirubro")) response.write("<br>") else
Tengamos en cuenta que creamos alias para los campos que se llaman iguales en ambas tablas y que generan conflictos en el gestor de base de datos, al no saber que campo debe rescatar.
& request.form("codigo") ,conexion if not registros.eof then %> <form action="pagina2.asp" method="post"> Descripcion del articulo: <input type="text" name="descripcion" size="30" value="<%response.write(registros("descripcion"))%>"><br> Precio: <input type="text" name="precio" size="10" value="<%response.write(registros("precio"))%>"><br> Rubro: <select name="codigorubro"> <% dim registrosru set registrosru = Server.CreateObject("ADODB.RecordSet") registrosru.open "select codigo,descripcion from rubros" ,conexion do while not registrosru.eof if registrosru("codigo")=registros("codigorubro") then response.write("<option value=""" ®istrosru("codigo")& _ """ selected>" & registrosru("descripcion")& "</option>") else response.write("<option value=""" & registrosru("codigo")& _ """>" ®istrosru("descripcion")&"</option>") end if registrosru.movenext loop %> </select><br> <input type="hidden" name="codigo" value="<%response.write(registros("codigo"))%>"> <input type="submit" value="Confirmar"><br> </form> <% else response.write("No existe ningn artculo con dicho cdigo") end if conexion.close %> </body> </html>
Disponer distintos bloques de asp dentro de la misma pgina. Lo primero que hacemos en forma similar a conceptos anteriores es verificar si existe el cdigo de artculo ingresado por el operador:
registros.open "select codigo,descripcion,precio from articulos where codigo=" _ & request.form("codigo") ,conexion if not registros.eof then
En caso que la condicin if se verifique verdadera debemos disponer en la pgina un formulario HTML que muestre los datos actuales de dicho artculo. Lo ms adecuado es escribir el formulario en un bloque HTML clsico y agregarle a la propiedad value de cada control el dato rescatado de la base de datos:
Ahora debemos disponer en un select todos los rubros con sus respectivos cdigos y adems debemos mostrar seleccionado el rubro que pertenece el artculo a modificar. Para esto rescatamos todos los rubros de la tabla "rubros" y dentro de un while verificamos uno a uno si el cdigo de rubro rescatado coincide con el del artculo seleccionado. El if dentro del while permite disponer la propiedad selected al elemento option respectivo:
if registrosru("codigo")=registros("codigorubro") then response.write("<option value=""" ®istrosru("codigo")& _ """ selected>" & registrosru("descripcion")& "</option>") else response.write("<option value=""" & registrosru("codigo")& _ """>" ®istrosru("descripcion")&"</option>") end if
Tengamos en cuenta que el contenido del control HTML debemos cargarlos con todos los rubros de la tabla "rubros", pero adems debemos dejar seleccionado el que corresponde al artculo que estamos modificando. Por ltimo recordemos que almacenamos en un control oculto, es decir de tipo hidden, el cdigo de artculo. Esto nos permite rescatarlo en la siguiente pgina donde procederemos a modificar la tabla de la base de datos propiamente dicha. La ltima pgina (pagina2.asp) procede a la modificacin propiamente dicha de la tabla:
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Initial Catalog=wi630629_aspya" conexion.Open conexion.execute("update articulos set descripcion='" & _ request.form("descripcion") & "'," & _ "codigorubro=" & request.form("codigorubro") & "," & _ "precio=" & request.form("precio") & _ " where codigo=" & request.form("codigo")) conexion.close response.write("Los datos fueron modificados") %> </body> </html>
La funcin "count()" cuenta la cantidad de registros de una tabla. Tambin podemos utilizar esta funcin junto con la clusula "where" para una consulta ms especfica. La siguiente pgina muestra la cantidad de registros que contiene la tabla articulos (pagina1.asp):
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _ "Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select count(*) as cantidad from articulos",conexion response.write("Cantidad de artculos existentes:" & registros("cantidad")) conexion.close %> </body> </html>
Cuando imprimimos:
response.write("Cantidad de artculos existentes:" & registros("cantidad"))
no disponemos un if previo ya que siempre nos retornar un registro (aunque la tabla articulos no tenga registros) Es indispensable crear un alias para recuperar la cantidad de registros.
</html>
Como podemos ver la sintaxis SQL para agrupar por rubro es:
registros.open "select count(*) as cantidad,ru.descripcion as descrirubro " & _ " from articulos as ar " & _ "join rubros as ru on ru.codigo=ar.codigorubro " & _ " group by ru.descripcion",conexion
La instruccin anterior solicita que recupere el nombre del rubro y cuente la cantidad de registros que coinciden por el campo "descripcion" de la tabla "rubros". Como resultado aparecen los nombres de los rubros y la cantidad de registros para dicho rubro.
count: se puede emplear con cualquier tipo de dato. min y max: con cualquier tipo de dato. sum y avg: slo en campos de tipo numrico.
Para probar alguna de estas funciones implementaremos un algoritmo que muestre el precio mayor almacenado en la tabla articulos (pagina1.asp):
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim conexion set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "Provider=SQLOLEDB.1;" & _
"Data Source=.;" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=wi630629_aspya" conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select max(precio) as preciomay from articulos",conexion if not registros.eof then response.write("Precio mayor de la tabla artculos:" ®istros("preciomay")) else response.write("La tabla artculos est vaca") end if conexion.close %> </body> </html>
Cuando utilizamos alguna de las cuatro funciones presentadas en este concepto debemos necesariamente disponer el if para verificar que retorn un registro (no retorna si la tabla se encuentra vaca)
registros.open "select max(precio) as preciomay from articulos",conexion
Server.MapPath( "/aspya/usuarios/administracion.mdb") conexion.Open dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select codigo,descripcion from rubros",conexion do while not registros.eof response.write("Cdigo:" & registros("codigo")) response.write("<br>") response.write("Descripcin:" & registros("descripcion")) response.write("<br>") response.write("-----------------------------------------------------------") response.write("<br>") registros.movenext loop conexion.close %> </body> </html>
Inicializamos las dos variables de entorno DRIVER y DBQ. La forma ms conveniente de inicializar la variable DBQ es utilizando la ruta relativa donde se encuentra la base de datos "administracion.mdb". En este servidor todos los visitantes acceden a la misma base de datos que se encuentra en la carpeta aspya/usuarios/. El mtodo MapPath del objeto Server nos retorna la ruta absoluta de la base de datos (por ejemplo c:\inetpub\aspya\usuarios\administracion.mdb) En este problema como accedemos a caractersticas comunes a SQL Server y ACCESS el resto del algoritmo es idntico. Tengamos en cuenta que si almacenamos la base de datos de ACCESS en la misma carpeta donde guardamos nuestras pginas asp y html luego la cadena de conexin puede ser :
conexion.ConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & _ Server.MapPath( "administracion.mdb")
Por supuesto que hay que decir si utilizamos caractersticas propias de SQL Server no disponibles en el SQL de ACCESS se producir un error en tiempo de ejecucin. Es bueno conocer las caractersticas propias del SQL Server (SQL Server Ya) y ACCESS antes de comenzar a utilizar en profundidad el acceso a bases de datos mediante ASP.
response.write("Precio:" & registros("precio")) response.write("<br>") response.write("-----------------------------------------------------------") response.write("<br>") registros.movenext loop conexion.close %> </body> </html>
Primero creamos un objeto "ADODB.Connection" y luego inicializamos la propiedad ConnectionString con la cadena de conexin, teniendo en cuenta que se trata de una base de dato tipo ACCESS:
set conexion = Server.CreateObject("ADODB.Connection") conexion.ConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & _ Server.MapPath( "/aspya/usuarios/administracion.mdb")
El resto del algoritmo es idntico al concepto del SELECT accediendo a una base de datos de tipo SQL Server.
36 - Redireccionamiento (response.redirect)
Empleando ASP se puede implementar un pequeo programa que permita que cuando un usuario (navegador) solicita una pgina, la misma redireccione o otra pgina. Para probar el algoritmo implementaremos un formulario que solicite el ingreso por teclado de una direccin de internet.La segunda pgina redireccionar al sitio web cargado en el formulario. Es decir la segunda pgina nunca llega al cliente, sino que redirecciona a otra pgina. pagina1.html
<html> <head> <title>Problema</title> </head> <body> <form action="pagina1.asp" method="post"> Ingrese direccin de sitio web (ej www.google.com): <input type="text" name="direccion" size="30"><br> <input type="submit" value="Redireccionar"> </form> </body> </html>
Luego el archivo ASP que redirecciona al sitio indicado en el formulario es: pagina1.asp
<% response.redirect("http://" & request.form("direccion")) %>
Como vemos ni si quiera tiene la estructura de una pgina HTML ya que la misma no se enviar al navegador. El objeto response tiene un mtodo llamado redirect que nos permite indicar otra pgina a cargar, pudiendo como vemos redireccionar a un sitio distinto a nuestro servidor.
<html> <head> <title>Problema</title> </head> <body <% if request.cookies("color")<>"" then response.write(" style=""background-color:" & request.cookies("color") & """ ") end if %> > <form action="pagina2.asp" method="post"> Seleccione de que color desea que sea la pgina de ahora en ms:<br> <input type="radio" value="rojo" name="radio">Rojo<br> <input type="radio" value="verde" name="radio">Verde<br> <input type="radio" value="azul" name="radio">Azul<br> <input type="submit" value="Crear cookie"> </form> </body> </html>
Lo primero que tenemos que tener en cuenta que esta pgina es de tipo ASP ya que debemos verificar si la cookie existe para fijar el color de fondo. El objeto request tiene una propiedad llamada cookies que le pasamos como parmetro el nombre de la cookie que debe rescatar. Si la cookie no existe retorna una cadena vaca, en caso que exista retorna el valor de la cookie.
<body <% if request.cookies("color")<>"" then response.write(" style=""background-color:" &request.cookies("color") & """ ") end if %> >
En caso que exista la cookie procedemos a inicializar la propiedad de la hoja de estilo background-color con el color almacenado en la cookie. La primera vez que solicitamos esta pgina al servidor seguro que la cookie no existe por lo que el color de la pgina es blanca, que es el color por defecto para el fondo de una pgina HTML. El resto de la pgina contiene un formulario que nos permite seleccionar de un grupo de radios el color que queremos para el fondo de la pgina.
Ahora analicemos la pagina2.asp que contiene el cdigo donde se crea la cookie (recordemos que la cookie se almacena en la computadora que solicita la pgina.
pagina2.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim col col=request.form("radio") if col="rojo" then response.cookies("color")="#ff0000" response.cookies("color").expires = Date + 365 else if col="verde" then response.cookies("color")="#00ff00" response.cookies("color").expires = Date + 365 else if col="azul" then response.cookies("color")="#0000ff" response.cookies("color").expires = Date + 365 end if end if end if %> <a href="pagina1.asp">Ir a la otra pgina</a> </body> </html>
Definimos una variable y rescatamos la propiedad value del control radio seleccionado en el formulario de la pagina1.asp:
dim col col=request.form("radio")
Otra cosa importante es definir por cuanto tiempo la computadora que solicit la pgina debe almacenar la cookie, una forma sencilla es asignando a la propiedad expires de la cookie respectiva la fecha actual ms un valor entero que representa la cantidad de das:
response.cookies("color").expires = Date + 365
Los otros if solo tiene el objetivo de guardar otros valores a la cookie. Luego cuando retornemos a la pgina primera veremos como el color de fondo se modifica por el seleccionado. Podemos ver que si cerramos el navegador y ejecutamos nuevamente la pagina1.asp el color de fondo de la pgina toma el color que habamos seleccionado previamente.
Lo ms significativo de esta pgina se encuentra en la inicializacin de la propiedad value del control text:
<input type="text" name="mail" size="50" value= " <%
Como podemos observar si existe la cookie procedemos a extraer su contenido e imprimirlo dentro de la propiedad value del control text (es decir imprimimos el mail que est almacenado en la cookie del navegador que accedi al sitio) La segunda pgina tiene por objetivo crear la cookie o en su defecto borrarla (realmente lo que hacemos es fijar una fecha de caducidad menor a la actual) pagina2.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim mail,opcion mail=request.form("mail") opcion=request.form("opcion") if opcion="recordar" Then response.cookies("mail")=mail response.cookies("mail").expires = Date + 365 else response.cookies("mail").expires = Date - 1 end if %> <a href="pagina1.asp">Ir a la otra pgina</a> </body> </html>
Definimos dos variables y rescatamos los contenidos de los controles (text y el control radio seleccionado)
dim mail,opcion mail=request.form("mail") opcion=request.form("opcion")
Si est seleccionado "recordar" procedemos a crear la cookie e inicializarla con el mail ingresado. En caso que no est seleccionado "recordar" procedemos a borrar la cookie asignando una fecha menor a la actual a la propiedad expires.
39 - Variables de sesin
Es un mtodo para hacer que variables estn disponibles en mltiples pginas sin tener que pasarlas como parmetro. A diferencia de las cookies, las variables de sesin se almacenan en el servidor y tienen un tiempo limitado de existencia (por defecto 20 minutos) Para identificar al usuario que gener las variables de sesin, el servidor genera una clave nica que es enviada al navegador y almacenada en una cookie. Luego, cada vez que el navegador solicita otra pgina al mismo sitio, enva esta cookie (clave nica) con la cual el servidor identifica de qu navegador proviene la peticin y puede rescatar las variables de sesin que se han creado. Cuando han pasado 20 minutos sin peticiones por parte de un cliente (navegador) las variables de sesin son eliminadas automticamente (se puede configurar para variar este tiempo) Una variable de sesin es ms segura que una cookie ya que se almacena en el servidor. Otra ventaja es que no tiene que estar envindose continuamente como sucede con las cookies. Como desventaja podemos decir que ocupa espacio en el servidor y el procesamiento de la pgina es ms lento. Haremos un problema muy sencillo, cargaremos en un formulario el nombre de usuario y clave de un cliente, en la segunda pgina crearemos dos variables de sesin y en una tercera pgina recuperaremos los valores almacenados en las variables de sesin. pagina1.html
<html> <head> <title>Problema</title> </head> <body> <form action="pagina1.asp" method="post"> Ingrese nombre de usuario: <input type="text" name="usuario"><br> Ingrese clave: <input type="password" name="clave"><br> <input type="submit" value="confirmar"> </form> </body> </html>
Ahora veamos la pgina donde se crean las dos variables de sesin. pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% session.contents("usuario")=request.form("usuario") session.contents("clave")=request.form("clave") %> <a href="pagina2.asp">Ir a la tercer pgina</a> </body> </html>
Para crear las variables de sesin el objeto session tiene una propiedad llamada contents, la cual le indicamos como parmetro el nombre de variable a crear:
session.contents("usuario")=request.form("usuario") session.contents("clave")=request.form("clave")
Como vemos le asignamos a cada variable de sesin el valor extraido del formulario. Por ltimo la tercer pgina solo tiene por objetivo rescatar las variables de sesin e imprimir sus contenidos:
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% response.write("Nombre de usuario cargado:" & session.contents("usuario") & <br>") response.write("Clave cargada:" & session.contents("clave") & "<br>") %> </body> </html>
Un caso tpico donde se emplean variables de sesin es cuando un sitio necesita que el visitante se registre e ingrese por medio de su nombre de usuario y clave. Todas las pginas
que requieran que el visitante est registrado procede antes de mostrar la pgina a ver si las variables de sesin existen, en caso negativo no muestra el contenido de dichas pginas. Si queremos que las variables de sesin existan ms de 20 minutos o menos, debemos inicializar la propiedad timeout del objeto session. Imaginemos que desarrollamos una pgina que el usuario tiene hasta 30 minutos para completarla. Si el usuario cre una variable de sesin est se perder, salvo que dispongamos en la pgina:
session.timeout=30
Por ltimo si queremos cerrar una sesin debemos llamar al mtodo abandom del objeto session:
session.abandom
Para comenzar a entender esta nueva forma de organizar un algoritmo debemos ver ejemplos resueltos. Confeccionaremos una pgina que contenga tres procedimientos. El primero debe mostrar un ttulo en la cabecera de la pgina, el segundo debe mostrar el cuerpo de la pgina y finalmente un tercer procedimiento que muestre el pie de pgina.
pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% sub CabeceraPagina() response.write("<div " & _ "style=""background:#c3d9ff;text-align:center;font-size:40px"">") response.write("Cabecera de la pgina") response.write("</div>") end sub sub CuerpoPagina() response.write("<div " & _ "style=""background:#eeeeee;font-size:18px"">") dim f for f=1 to 50 response.write("Cuerpo de la pgina.<br>") next response.write("</div>") end sub sub PiePagina() response.write("<div " & _ "style=""background:#cdeb8b;text-align:center;font-size:13px"">") response.write("Pie de la pgina") response.write("</div>") end sub CabeceraPagina() CuerpoPagina() PiePagina() %> </body> </html>
Luego de la palabra clave sub indicamos el nombre del procedimiento, en nuestro caso lo llamamos CabeceraPagina, un nombre de procedimiento no puede tener caracteres en
blanco, comenzar con un nmero o utilizar caracteres especiales. Siempre conviene utilizar un nombre que nos indique que cual es su objetivo. Todo lo que est encerrado entre el bloque sub y end sub es el cuerpo del algoritmo. Dentro del cuerpo del algoritmo podemos definir variables locales a dicho procedimiento y utilizar todas los comandos propios de VBScript. Un procedimiento no se ejecuta en forma automtica. Para su ejecucin debemos llamarlo desde fuera del procedimiento por su nombre. En este ejemplo llamamos a los procedimientos :
CabeceraPagina() CuerpoPagina() PiePagina()
Es muy importante el orden de llamado a los procedimientos, de esto depende cual se ejecuta primero.
Luego cuando llamamos a dicho procedimiento debemos enviarle los datos que recibirn los parmetros:
[nombre del procedimiento] [datos]
Es importante notar que luego del nombre del procedimiento dejamos un espacio en blanco y seguidamente indicamos cada dato separado por una coma. Confeccionaremos un procedimiento que reciba dos valores enteros, luego mostraremos desde el primer valor hasta el segundo valor, de uno en uno. Por ejemplo si recibe un 5 y un 12, luego debe mostrar 5,6,7,8,9,10,11,12.
<head>
<title>problema</title> </head> <body> <% sub MostrarSerie(inicio,fin) dim f for f=inicio to fin response.write(f & "<br>") next end sub MostrarSerie 5,12 %> </body> </html>
Tenemos por un lado la codificacin del procedimiento que recibe los dos parmetros y muestra la serie de valores:
sub MostrarSerie(inicio,fin) dim f for f=inicio to fin response.write(f & "<br>") next end sub
Por otro lado tenemos la llamada al procedimiento que le enva los datos:
MostrarSerie 5,12
Hay que tener bien presente que si no llamamos al procedimiento nunca se ejecutar. Pruebe de borrar la lnea que llama al procedimiento y ver que no aparece nada en la pgina. Otra caracterstica importante de un procedimiento es que podemos llamarlo tantas veces como lo necesitemos con valores distintos en cada llamada, por ejemplo si queremos podemos llamarlo 3 veces:
MostrarSerie 1,10 MostrarSerie 100,110 MostrarSerie 1000,1010
Confeccionaremos un algoritmo que nos permita ingresar por teclado dos valores numricos. La carga se realiza en un formulario. Haremos una funcin que retorne true si los dos valores ingresados son numricos. Debemos mostrar los dos valores ingresados o un mensaje solicitando que se ingresen valores numricos.
<html> <head> <title>problema</title> </head> <body> <form action="pagina1.asp" method="post"> Ingrese el primer valor: <input type="text" name="valor1"><br> Ingrese el segundo valor: <input type="text" name="valor2"><br> <input type="submit" value="ok"><br> </form> </body> </html>
else response.write("Deben ingresarse dos valores numricos") end if %> </body> </html>
La funcin ValidarDatos:
function ValidarDatos() if isnumeric(request.form("valor1")) and isnumeric(request.form("valor2")) then ValidarDatos=true else ValidarDatos=false end if end function
Recupera el contenido de los dos controles HTML y mediante una funcin propia de VBScript (isnumeric) verifica si los dos valores ingresados son numricos. En caso que las dos condiciones simples del if se verifiquen verdadera procedemos a asignarle al nombre de la funcin el valor que retornar (en dicho caso true). La llamada a la funcin se hace en este caso directamente desde la condicin de un if ya que dicha funcin retorna true o false:
if ValidarDatos() Then response.write("Primer valor:" & request.form("valor1") & "<br>") response.write("Segundo valor:" & request.form("valor2") & "<br>") else response.write("Deben ingresarse dos valores numricos") end if
Implementaremos una funcin que le enviamos un valor entero y nos retorna todos los valores mltiplos de 3 hasta el valor que le enviamos. pagina1.asp
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% function MultiplosTres(valor) dim numeros,f numeros="" for f=3 To valor step 3 numeros=numeros & f & " - " next MultiplosTres=numeros end function response.write("Multiplos de 3 hasta el valor 100</br>") response.write(MultiplosTres(100)) %> </body> </html>
La funcin MultiplosTres recibe como parmetro un valor entero. El algoritmo de la funcin propiamente dicha inicializa una variable de tipo string con cadena vaca y cada repeticin del for se le concatena el nuevo mltiplo de tres, ms un guin. El contador del for se inicializa en 3 y se lo incrementa en cada vuelta en 3 (step 3) Previo a finalizar la funcin se le asigna al nombre de la funcin el string que retornar.
Como la funcin retorna un string podemos llamarla directamente desde el mtodo write del objeto response, con esto el resultado se imprime directamente en la pgina y no se almacena en otra variable:
response.write(MultiplosTres(100))
vec3(2)=30 response.write("Creacin de un vector en forma dinmica (redim)<br>") for f=0 to 2 response.write("Elemento de la posicion " & f & " es " & vec3(f)) response.write("<br>") next redim preserve vec3(4) vec3(3)=40 vec3(4)=50 response.write("Impresin del vector anterior redimensionado<br>") for f=0 to 4 response.write("Elemento de la posicion " & f & " es " & vec3(f)) response.write("<br>") next redim vec3(4) vec3(3)=40 vec3(4)=50 response.write("Impresin del vector anterior redimensionado ") response.write(" (sin preserve)<br>") for f=0 to 4 response.write("Elemento de la posicion " & f & " es " & vec3(f)) response.write("<br>") next %> </body> </html>
Estamos definiendo el vector llamado vec1 y le indicamos que tiene 4 elementos (4 porque las componentes se numeran desde cero) Para acceder a los elementos debemos indicar entre parntesis a cual de ellos queremos acceder:
vec1(0)=10 vec1(1)=20 vec1(2)=30 vec1(3)=40
Como podemos comprobar hay un solo nombre de variable (vec1) que almacena 4 elementos de tipo entero. Si queremos imprimir los cuatro elementos podemos disponer un for que se repita cuatro veces:
for f=0 to 3 response.write("Elemento de la posicion " & f & " es " & vec1(f)) response.write("<br>") next
Es decir la primer componente almacena un string, la segunda un entero y la tercera un valor real. Para imprimirlo en forma completo lo recorremos con un for:
for f=0 to 2 response.write("Elemento de la posicion " & f & " es " & vec2(f)) response.write("<br>") next
Otra posibilidad es la creacin de vectores dinmicos, es decir que puedan crecer o decrecer durante la ejecucin del algoritmo. Para definir este tipo de vectores tenemos que implementar la siguiente sintaxis:
dim vec3()
Es decir no indicamos ningn valor entre parntesis. Luego mediante el comando redim le indicamos dicho valor:
redim vec3(2) vec3(0)=10 vec3(1)=20 vec3(2)=30
Ahora nuestro vector puede almacenar 5 elementos. Adems si utilizamos la palabra clave preserve los elementos que ya existen en el vector se conservan. Si no queremos conservar los elementos originarios cuando redimensionamos un vector:
redim vec3(4) vec3(3)=40 vec3(4)=50
Hay una funcin llamada array que le pasamos una lista de valores y nos retorna un vector con dichos elementos:
dim vector vector=array(10,20,30)
Es importante notar que cuando definimos la variable vector no disponemos los parntesis de apertura y cerrado. La funcin array retorna un vector dinmico.
Otra funcin de gran utilidad cuando trabajamos con vectores es ubound, esta nos retorna el valor del ndice final del vector. Si queremos imprimir un vector luego con la funcin ubound tenemos:
for f=0 to ubound(vector) response.write("Elemento de la posicion " & f & " es " & vector(f)) response.write("<br>") next
Luego si cambiamos el tamao del vector no hay que modificar el for, ya que siempre mediante la funcin ubound obtendremos la posicin del ltimo elemento del vector.
for f=0 to ubound(matriz1,1) for c=0 to ubound(matriz1,2) response.write(matriz1(f,c) & "-") next response.write("<br>") next dim matriz2 redim matriz2(2,3) matriz2(0,0)=1 matriz2(0,1)=1 matriz2(0,2)=1 matriz2(0,3)=1 matriz2(1,0)=2 matriz2(1,1)=2 matriz2(1,2)=2 matriz2(1,3)=2 matriz2(2,0)=3 matriz2(2,1)=3 matriz2(2,2)=3 matriz2(2,3)=3 response.write("Matriz creada dinmicamente<br>") for f=0 to ubound(matriz2,1) for c=0 to ubound(matriz2,2) response.write(matriz2(f,c) & "-") next response.write("<br>") next redim preserve matriz2(2,2) response.write("Matriz despus de redimensionarla<br>") for f=0 to ubound(matriz2,1) for c=0 to ubound(matriz2,2) response.write(matriz2(f,c) & "-") next response.write("<br>") next %> </body> </html>
El primer subndice indica las filas (es decir tiene tres filas 0,1 y 2) y el segundo subndice indica las columnas. Para inicializar cada componente por asignacin:
matriz1(0,0)=1 matriz1(0,1)=1 matriz1(0,2)=1 matriz1(1,0)=2 matriz1(1,1)=2 matriz1(1,2)=2 matriz1(2,0)=3
matriz1(2,1)=3 matriz1(2,2)=3
Primero indicamos la fila y luego la columna. Podemos imprimir la matriz disponiendo un for dentro de otro:
for f=0 to 2 for c=0 to 2 response.write(matriz1(f,c) & "-") next response.write("<br>") next
La variable f nos indica la fila y la variable c indica la columna de la componente que queremos acceder. En forma ms genrica podemos preguntarle a la matriz mediante la funcin ubount el valor de la dimensin:
for f=0 to ubound(matriz2,1) for c=0 to ubound(matriz2,2) response.write(matriz2(f,c) & "-") next response.write("<br>") next
ubound(matriz2,1) retorna la cantidad de fila de la matriz y ubound(matriz2,2) retorna la cantidad de columnas. Podemos crear una matriz en forma dinmica:
dim matriz2 redim matriz2(2,3)
Este estructura repetitiva almacena en la [variable] los elementos del [vector], esto lo hace en forma ordenada desde el primero hasta el ltimo elemento del vector. Es decir dentro del ciclo for each tenemos acceso a todos los elementos del vector a travs de la variable que indicamos al principio del for. Confeccionemos una pgina que defina un vector dinmico y luego lo muestre utilizando la estructura repetitiva for each:
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim vec vec=array(10,20,30) dim valor for each valor in vec response.write(valor & "-") next %> </body> </html>
Primero definimos una variable y llamamos a la funcin array que retorna un vector dinmico:
dim vec vec=array(10,20,30)
Ahora disponemos la estructura for each para recorrer e imprimir el contenido de todas las componentes del vector previamente creado:
dim valor for each valor in vec response.write(valor & "-")
next
Debemos definir una variable (valor) donde se almacenarn en cada ciclo del for el contenido de un elemento del vector. Tengamos en cuenta que la variable (valor) almacenar en forma sucesiva cada elemento del vector, (valor) almacena un nmero por vez.
Como podemos observar nuestro archivo de inclusin tiene un bloque de cdigo ASP puro. Desde el navegador no tiene sentido llamar a la pgina: libreria.asp. El objetivo de este archivo es que forme parte de otro. para ver como lo aadimos a otro debemos ver el archivo (pagina1.asp):
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <!--#include file="libreria.asp"--> <% dim registros set registros = Server.CreateObject("ADODB.RecordSet") registros.open "select codigo,descripcion,precio from articulos",conexion do while not registros.eof response.write("Cdigo:" & registros("codigo"))
response.write("<br>") response.write("Descripcin:" & registros("descripcion")) response.write("<br>") response.write("Precio:" & registros("precio")) response.write("<br>") response.write("-----------------------------------------------------------") response.write("<br>") registros.movenext loop conexion.close %> </body> </html>
En la pagina1.asp necesitamos crear un objeto para la conexin a la base de datos, podemos como hasta ahora escribir todo el cdigo para la conexin o incluir el archivo que contiene dicho cdigo:
<body> <!--#include file="libreria.asp"--> <% dim registros set registros = Server.CreateObject("ADODB.RecordSet")
Como podemos ver utilizamos el comando #include y en la propiedad file le asignamos el nombre del archivo que debe incluirse. Luego previo a que se ejecute la pgina el contenido del archivo libreria.asp es aadido en este lugar. Podemos enunciar como ventajas:
Cuando hay que hacer modificaciones, solo se hacen en un archivo y se propagan a todos los archivos que lo incluyen. El cdigo queda mucho mas organizado. Facilita el mantenimiento de programas grandes.
Si el archivo se encuentra en otro directorio debemos indicar el path completo desde la raiz de nuestro sitio.
response.write("Los ltimos tres caracteres:<strong>" & temp &"</strong><br>") temp=mid(nom,2,3) response.write("A partir del segundo caracter tres caracteres:<strong>" & temp& "</strong><br>") temp=strreverse(nom) response.write("cadena invertida:<strong>" & temp&"</strong><br>") temp=trim(nom) response.write("cadena original suprimiendo los espacios blanco del principio y el final:<strong>" & temp &"</strong><br>") temp=ltrim(nom) response.write("cadena original suprimiendo los espacios blanco del principio: <strong>" & temp & "</strong><br>") temp=rtrim(nom) response.write("cadena original suprimiendo los espacios blanco del final:<strong>" & temp & "</strong><br>") temp=replace(nom," ","-") response.write("cadena remplazando los espacios en blanco por guin:<strong>" & temp & "</strong><br>") response.write("cadena dividida por los espacios en blanco<br>") dim vec,f vec=split(nom," ") for f=0 to ubound(vec) response.write("<strong>" & vec(f) &"</strong><br>") next if instr(nom,"juan")=0 then response.write("No se encuentra el nombre juan en la cadena<br>") else response.write("Si se encuentra el nombre juan en la cadena<br>") end if %> </body> </html>
1. entero=len(string) Retorna la cantidad de caracteres del string (tiene en cuenta los espacios en blanco ingresados al principio y al final) 2. string=ucase(string) Retorna un string con todos los caracteres convertidos a maysculas. 3. string=lcase(string) Retorna un string con todos los caracteres convertidos a minsculas 4. string=left(string,entero) Retorna un substring y los extrae del principio. Tantos caracteres como indica el segundo parmetro. 5. string=right(string,entero) Similar a la funcin left pero empieza a contar desde la derecha del string. 6. string=mid(string,entero,entero) Extrae un substring a partir de una determinada posicin indicada en el segundo parmetro y tantos caracteres como indica el tercero. 7. string=strreverse(string) Retorna el string invertido.
8. string=trim(string) Retorna un string eliminando los espacios en blanco del principio y el final. 9. string=ltrim(string) Retorna un string eliminando los espacios en blanco de la izquierda de la cadena. 10. string=rtrim(string) Retorna un string eliminando los espacios en blanco de la derecha de la cadena. 11. string=replace(string,string,string) Genera un string remplazando las coincidencias del segundo parmetro con respecto al primero. Se remplaza con el string del tercer parmetro. 12. vector=split(string,string) Genera un vector dividiendo los datos del primer parmetro segn el string indicado en el siguiente parmetro. El vector que se genera comienza a numerarse en cero. 13. integer=instr(string,string) Retorna la posicin del segundo parmetro dentro del string del primer parmetro. Si no lo encuentra retorna 0.
fechaactual=date() response.write("Fecha actual:" & fechaactual & "<br>") dim horaactual horaactual=time() response.write("Hora completa actual:" & horaactual & "<br>") dim hora hora=hour(horaactual) response.write("Hora actual:" & hora & "<br>") dim minuto minuto=minute(horaactual) response.write("Minuto actual:" & minuto & "<br>") dim segundo segundo=second(horaactual) response.write("Segundo actual:" & segundo & "<br>") dim diamas7 diamas7=dateadd("d",7,fechaactual) response.write("Fecha actual ms 7 das:" & diamas7 & "<br>") %> </body> </html>
1. 2. 3. 4.
day Retorna el nmero de da de una variable de tipo fecha. month Retorna el mes de una fecha. year Retorna el ao de una fecha. weekday Retorna el da de la semana de una variable de tipo fecha. 1 si es domingo, 2 si es lunes y as sucesivamente. 5. datediff Retorna la diferencia entre dos fechas que le pasamos como parmetro (el primer parmetro es un string que indicamos en que formato queremos esa diferencia: "d" das, "m" meses, "yyyy" aos) 6. date Retorna la fecha actual del servidor. 7. time Retorna la hora actual. 8. hour Retorna la parte de la hora. 9. minute Retorna la parte del minuto de una variable de tipo hora. 10. second Retorna la parte del segundo de una variable de tipo hora. 11. dateadd Retorna una fecha a partir de otra que le podemos sumar o restar una determinada cantidad de das, meses o aos (nuevamente el primer parmetro es un string que indica el formato que queremos esa suma: "d" das, "m" meses, "yyyy" aos) Si se quiere sumar variables de tipo hora u obtener la diferencia entre dos variables se pueden utilizar las funciones dateadd y datediff (indicando en el primer parmetro alguno de los tres siguientes string "h" horas, "n" minutos o "s" segundos)
51 - Funciones matemticas
VBScript dispone de un conjunto de funciones matemticas que las veremos en funcionamiento la siguiente pgina (pagina1.asp)
<%option explicit%> <html> <head> <title>problema</title> </head> <body> <% dim valor1 valor1=-5 response.write("El valor absoluto de -5 es " & abs(valor1) & "<br>") valor1=2.7 response.write("La parte entera de 2.7 es " & int(valor1) & quot;<br>") valor1=2.51 response.write("El redondeado de 2.51 es " & round(valor1) & "<br>") valor1=2.50 response.write("El redondeado de 2.50 es " & round(valor1) & "<br>") valor1=3 response.write("El resultado de la funcin sgn de 3 es " &sgn(valor1) & "<br>") valor1=-3 response.write("El resultado de la funcin sgn de -3 es " &sgn(valor1) & "<br>") valor1=0 response.write("El resultado de la funcin sgn de 0 es " &sgn(valor1) & "<br>") valor1=25 response.write("La raiz cuadrada de 25 es " & sqr(valor1) & "<br>") response.write("El valor aleatorio devuelto por rnd es " & rnd() & "<br>") randomize() response.write("El valor aleatorio devuelto por rnd, previo llamar " & _ "randomize es " & rnd() & "<br>") valor1=10 response.write("El valor hexadecimal de 10 es " & hex(valor1) & "<br>") valor1=9 response.write("El valor octal de 9 es " & oct(valor1) & "<br>") response.write("El seno de 0 es " & sin(0) & "<br>") response.write("El cos de 0 es " & cos(0) & "<br>") response.write("La tangente de 0 es " & tan(0) & "<br>") response.write("El arco tangente de 0 es " & atn(0) & "<br>") response.write("El logaritmo natural de 2 es " & log(2) & "<br>") response.write("El resultado de exp de 2 es " & exp(2) & "<br>") %> </body> </html>
1. abs Retorna el valor absoluto de una variable o valor numrico. 2. int Retorna la parte entera de una variable numrica (no redondea)
3. round Retorna un valor entero redondeando (si el valor el mayor a 0.50 redondea hacia arriba, en caso contrario redondea hacia abajo. 4. sgn Retorna 1,0 o -1 (1 si el valor es positivo, -1 si es negativo, 0 en caso que la variable almacene el valor cero. 5. sqr Retorna la raiz cuadrada de un valor numrico. 6. rnd Retorna un valor aleatorio comprendido entre 0 y 1 (sin incluir estos). Si llamamos previamente al procedimiento randomize la semilla de valores aleatorios ser distinta. 7. hex Retorna el valor hexadecimal del valor que le enviamos. 8. oct Retorna el valor octal del valor que le enviamos. 9. sin Retorna el seno de un valor numrico que le enviamos (debemos indicar el valor en radianes) 10. cos Retorna el coseno. 11. tan Retorna la tangente. 12. atn Retorna el arco tangente. 13. log Retorna el logaritmo natural de un nmero. 14. exp Retorna el resultado de elevar "e" al valor que le pasamos como parmetro.