Está en la página 1de 175

Creando Sitios de Comercio Electrónico

Presentación del Caso a Desarrollar


Objetivos
En este primer módulo se desarrollaran los siguientes puntos:

? Presentación del escenario de trabajo.


? El modelo de la base de datos.
? Tipos de archivo que compone el Proyecto.
? Sectorizando
? Hojas de Estilo
? Tecnologías disponibles
? ASP vs. PHP

1
Creando Sitios de Comercio Electrónico

Presentación del escenario de trabajo

Peru Adventure & Trips

Antecedentes
Peru Adventure Trips, es una empresa dedicada a la venta de paquetes turisticos
con cede en la capital. En la actualidad elabora y vende paquetes turisticos en
sociedad con empresas amigas (socios de negocio) en las principales ciudades del
Pais. Sus principales clientes son extranjeros y una minoria nacionales.

Sus contactos en otras ciudades del mundo se encargan de promocionar sus


paquetes turisticos.

Las operaciones de reserva, información y contactos lo realizan de forma


convencioinal usando un telefono.

El dueño de la empresa, don Guino Castillo, conocer de las ventajas del uso de las
tecnologias, decide cambiar a su Gerente General: Edgard Campos y decide
contratar a Cesar Suarez, un joven profesional desarrollador de Sites de Comercio
Electronico, quien a su vez sugiere contratar a una Profesional en Marketing y
Diseño Grafico: Tamara Fernandez.

El dueño le manifiesta, que por la recesion economica del Pais, el presupuesto


destinado a la promocion de los paquetes turisticos, asi como la cuenta por el uso
de telefono se debe reducir. Asi mismo le comenta que las comisiones obtenidas
por los contactos con sus socios en el extranjero es muy reducido y que tiene
intensiones de ser el mismo quien establezca contacto directo con los turistas.
Tamara sugiere cambiar los distintivos de la empresa, plantea elaborar una pagina
en Internet que refleje el espiritu de la empresa, usando el nombre de la empresa
como dominio (www.PeruAdventure.com) y asignar cuentas de correo con dicho
dominio a todos los empleados (Tamara@PeruAdventure.com,
Cesar@PeruAdventure.com), además para aplicar el Marketing directo y el realizar
las campañas de Mailing, señala que se requiere una conexión permanente a
Internet.

2
Creando Sitios de Comercio Electrónico

El presupuesto
Cesar, indica que puede iniciarse comprando el dominio PeruAdventure.com y
creando el Sitio en Internet y publicando en ella una Pagina Estatica presencial,
mientras se elabore la solucion final.

La inversion para la solucion en la parte tecnologica, asciende:

Acceso a Internet, 128 Kb de ancho de banda, las 24 horas del dia US$ 65 mes
Compra de Dominio en GrapPeru.com, incluye mantenimiento US$ 20 año
Servicio en Hosting en GrapPeru.com, 60 Mb US$ 180 año
soporte para ASP y Access o SQL Server
25 cuentas de correo POP3

La inversion por todo el año asciente a 980 dolares, lo que equivale a la mitad de
uno de los recibos de telefono que suele llegar a la empresa (llamadas
internacionales).

Cesar, propone que se debe crear una pagina que no solamente muestre una lista
de paquetes turisticos, sino un lugar inteligente que permita discretamente
almacenar el perfil de cada visitante y asi preparar paquetes turisticos
personalizados. Por ejemplo a muchos les agrada realizar canotaje, parapente, es
decir les agrada la aventura, otros prefieren algo mas conservador como visitar los
diversos centros arqueologicos y actividades culturales como el arte, la musica y las
danzas autoctonas. EN cambio otros buscan la parte mistica. Cesar dice que tratar
a todos los visitantes de la misma forma no seria conveniente, debemos buscar
tratar a cada visitante de una forma muy personalizada y tener para ellos paquetes
que vayan de acuerdo a sus gustos y preferencias (el pilar del CRM)

El Sitio a diseñar deberá cumplir con las condiciones señaladas, la información de


cada visitante deberá guardarse en una Base de Datos, en este caso usaremos
Access, la dinamicidad de la pagina la conseguiremos mediante ASP.

3
Creando Sitios de Comercio Electrónico

Descripción general

Peru Adventure & Trips

El Sitio a desarrollar debe ser capaz de:

? Registrar a cada visitante

Se debe almacenar como minimo su nombre, apellido, correo electronico y pais,


puede consignarse informacion adicional como fecha de nacimiento, y algunos
datos de su preferencia.

? Catalogo de Paquetes turisticos

Deberá mostrarse un catalogo general de paquetes turisticos organizado por


categorias, por ejemplo Turismo de aventura, Turismo ecologico, Turismo
mistico, etc. Posteriormente de acuerdo a las preferencias del visitante, la
pagina podria priorizar un catalogo de acuerdo a su perfil.

? Registrar una solicitud de reserva

Se deberá crear un modulo de reserva, por un determinado tiempo, con


posibilidad de reconfirmar o anular una reserva.

? Disponer de una pasarela de pago

Se dispondrá de una pasarela de pago, de manera que el visitante usando su


tarjeta de credito pueda cancelar el importe del paquete turistico.

? Disponer de un modulo de administracion del sitio

Para la empresa será necesario contar con un modulo de administracion del Sitio web, por
ejemplo para dar de alta a nuevos paquetes turisticos, para remover reservas, etc.

4
Creando Sitios de Comercio Electrónico

La Base de Datos

Descripcion de las tablas


Tabla: DESTINO
La tabla contiene la relacion de ciudades

Llave primaria: IdDestino


El Id del destino es un numero correlativo.

IDDESTINO Entero 4
CIUDAD Carácter 20

Tabla: PAQUETE
La tabla paquete contiene la descripcion de un paquete turistico, su costo, el inicio
y termino, la cantidad de cupos.

Llave primaria: IdPaquete


El Id del paquete tiene un prefijo “P” seguido de un numero correlativo, por
ejemplo: P0001, P0002.
Llave foránea: IdDestino

IDPAQUETE Carácter 5
IDDESTINO Entero 4
TIPO Carácter 1
NOMBRE Carácter 100
PRECIOCOSTO Monetario 8 4
PRECIOVENTA Monetario 8 4
FECHAINICIO DateTime 8
FECHATERMINO DateTime 8
CATEGORIA Carácter 1
FECHACONFIRMACION DateTime 8
CUPOS Entero 4
VIGENTE Entero 4

Tabla: ACTIVIDAD
Contiene las actividades que compone un paquete turistico: recojo del aeropuerto,
hospedaje, visitas guiadas, etc., para cada actividad habrá un proveedor.

Llave primaria: IdActividad


El Id de la actividad es un numero correlativo
Llaves foránea: IdProveedor, IdPaquete

IDACTIVIDAD Entero 4
IDPROVEEDOR Entero 4
IDPAQUETE Carácter 5
NOMBRE Carácter 100
PRECIOCOSTO Monetario 8 4
FECHA DateTime 8

5
Creando Sitios de Comercio Electrónico

Tabla: PROVEEDOR
Contiene la relacion de proveedores

Llave primaria: IdProveedor


El Id del proveedor es un numero correlativo

IDPROVEEDOR Entero 4
NOMBRE Carácter 50
CIUDAD Carácter 20
TIPO Carácter 2
EMAIL Carácter 40
URL Carácter 80

Tabla: CLIENTE
Contiene la lista de clientes suscritos

Llave primaria: IdCliente


El Id del cliente consta de un prefijo “C” y un numero correlativo, por ejemplo:
C0001, C0002

IDCLIENTE Carácter 5
APELLIDO Carácter 40
NOMBRE Carácter 40
EMAIL Carácter 40
CLAVE Carácter 20
FECHANAC DateTime 8
SEXO Carácter 1
PAIS Carácter 20
CIUDAD Carácter 20
TIPOS Carácter 10

Tabla: RESERVA
Contiene la reserva de paquete efectuado por un determinado cliente

Llave primaria: IdReserva


El Id de la reserva consta de un prefijo “R” y un numero correlativo, por ejemplo:
R0001, R0002

IDRESERVA Carácter 5
IDCLIENTE Carácter 5
IDPAQUETE Carácter 5
FECHA DateTime 8
CANTIDAD Entero 4
TIPOPAGO Carácter 1
TOTALVENTA Monetario 8 4
DESCUENTO Monetario 8 4
TOTALNETO Monetario 8 4
CONFIRMADO Lógico 1
ANULADO Lógico 1

6
Creando Sitios de Comercio Electrónico

Tabla: PARAMETRO
Contiene el ultimo numero correlativo usado en los Ids de las tablas.
El Campo CAMPO, contiene el nombre del campo y VALOR el ultimo numero usado

CAMPO Carácter 20
VALOR Carácter 20

? La BD en Access se adjunta al libro, en la siguiente edición se ampliará el tema de Base de Datos.


La aplicación PeruAdventure, lo hallará en:

www.LibrosDigitales.NET/PeruAdventure

7
Creando Sitios de Comercio Electrónico

Tipos de archivos que compone un


proyecto
Una aplicación web está compuesta por distintos tipos de archivos, los que pueden
ser:

.htm o .html Paginas HTML, pueden contener formularios y controles, texto


estatico, referencias a graficos e hipervinculos

.asp Archivo de tipo Active Server Page, contiene instrucciones HTML


dentro de los cuales se encuentran instrucciones VBScript que se
ejecutan en el servidor, los que interactuan con una Base de Datos

.css Hojas de Estilo, contienen informacion sobre como optimizar los


elementos de una pagina

.gif, .jpg Graficos que se mostrarán en la pagina

Global.asa Cada proyecto puede contener un archivo Global.asa, este archivo


contiene la definicion de variables globales, conecciones a bases de
datos, asi como el codigo de inicializacion y cierre

? Por comodidad, podemos crear carpetas para separar los distintos archivos de la aplicación

8
Creando Sitios de Comercio Electrónico

Sectorización

Antes de iniciar el proyecto, conviene definir los sectores que presentará nuestros
Sitio. La pantalla la podemos dividir en:

Encabezado:

En ella podemos situar el logotipo de la empresa, el nombre del site, una banda de
menu

Pie:

En ella podemos situar los datos de la empresa, los derechos, y quizas algunos
banners

Izquierda:

En ese sector podemos situar un menu de opciones, hipervinculos, y minibanners

Derecha:

Para mostrar informacion adicional o publicidad, mediante minibanners

En nuestro caso será:

? Sugerimos no usar Marcos (Frames), en su lugar usaremos Tablas

9
Creando Sitios de Comercio Electrónico

Definiendo Hojas de Estilo


Durante el desarrollo aun no estableceremos atributos de fuente o color, lo
dejaremos para el final, esto puede solucionarse facilmente, mediante el uso de
hojas de estilo, asi podemos definir:

Colores.css

H1 {font: 17pt “Arial”;


Font-weight: bold;
Color: Blue}

H2 {font: 13pt “Arial”;


Font-weight: bold;
Color: Green}
P {font: 17pt “Arial”;
Color: Yellow}

Asi el archivo Colores.HTM, será:

<HEAD>
<TITLE>Aquí no hay Hojas de Estilo</TITLE>
</HEAD>
<BODY>
<H1>Este es un ejemplo</H1>
<H2>del uso de hojas de estilo</H2>
<P>Personaliza cada uno de los elementos que forma
parte una pagina</P>
</BODY>

10
Creando Sitios de Comercio Electrónico

Una vez creada la hoja de estilo, agregue a la pagina el link en la seccion <HEAD>:

<LINK Rel=”stylesheet” TYPE=“text/css” HREF= “”colores.css>

La pagina debe quedar asi:

<HEAD>
<TITLE>Aquí si se usa Hojas de Estilo</TITLE>
<LINK Rel="stylesheet" TYPE="text/css" HREF= "colores.css">
</HEAD>
<BODY>
<H1>Este es un ejemplo</H1>
<H2>del uso de hojas de estilo</H2>
<P>Personaliza cada uno de los elementos que forma
parte una pagina</P>
</BODY>

Al colocar la referencia a la hoja de estilo y volver a ejecutar la pagina queda:

? En el presente libro no nos preocuparemos mucho por el aspecto de nuestra página, sino mas bien
incidiremos en la parte funcional, para la parte artistica dentro de muy poco estará disponible el libro “para
el WebMaster profesional”

11
Creando Sitios de Comercio Electrónico

Tecnologias para el diseño de Páginas


Las paginas en Internet las podemos dividir en grupos:

Tecnologías del lado del cliente: Paginas estáticas


Corresponde a las instrucciones que se ejecutarán en el Navegador, el codigo
HTML, scripts basadas en JavaScript o VBScript. Representan la primera generacion
de paginas en el web, por lo general de tipo presencial, a manera de un anuncio en
un periodico.

Caracteristicas:

? Estan basadas en HTML, JavaScript, VBScript, CSS.


? Son sencillas de crear, las podemos hacer incluso desde MS-Word, simplemente
grabando el documento como HTML.
? Para su construccion, como minimo necesitamos un editor de texto, claro que
existen productos que nos permiten diseñar paginas muy vistosas y nos ahorran
tiempo en diseño, tales como MS-FrontPage, Flash y DreamWeaver de
Macromedia.
? A pesar de utilizar tales programas es necesario tener conocimiento de las
instrucciones HTML y de JavaScript, para optimizar el codigo generado (en
muchos casos se inserta codigo innecesario que debe removerse a fin de
obtener un archivo ligero)
? Estas paginas no realizan gestion con Base de Datos.

Ejemplos:

Basado en solo HTML:

<HEAD>
<TITLE>Ejecutando HTML en el Cliente</TITLE>
</HEAD>

<BODY>
<H2>Usando HTML</H2>
<P>El dia de hoy es 18/02/2002
</BODY>

12
Creando Sitios de Comercio Electrónico

Usando JavaScript:

<HEAD>
<TITLE>Ejecutando un script JavaScript en el Cliente</TITLE>
</HEAD>

<BODY>
<H2>Usando JavaScript</H2>
<P>El dia de hoy es
<SCRIPT LANGUAGE=JavaScript RUNAT=Client>
<!--
dHoy = new Date();
document.write (dHoy);
//-->
</SCRIPT>
</BODY>

13
Creando Sitios de Comercio Electrónico

Usando VBScript:

<HEAD>
<TITLE> Ejecutando un script VBScript en el Cliente </TITLE>
</HEAD>

<BODY>
<H2>Usando VBScript</H2>
<P>El dia de hoy es
<SCRIPT LANGUAGE=VBScript RUNAT=Client>
<!--
Document.Write (Date)
-->
</SCRIPT>
</BODY>

14
Creando Sitios de Comercio Electrónico

15
Creando Sitios de Comercio Electrónico

Tecnologias del lado del Servidor: Páginas dinámicas

Son paginas mas inteligentes, actualmente la mayoria de sites son de este tipo.

El codigo, se almacena en un Servidor Internet. Cuando se accede desde un


navegador, el Servidor interpreta el código, lo ejecuta, y envía al navegador el
resultado en formato HTML. Esto hace un navegador independiente a la solución.

Caracteristicas:

? Estan basadas en ASP o en PHP


? Para su construccion solo se requiere un sencillo editor de texto, aunque existen
productos que alivian dicho trabajo como MS-Visual InterDev para ASP o
EditPlus (www.editplus.com) un pequeño pero gran editor de codigo ASP.
? Permite la creacion de paginas con contenido dinamico, por ejemplo podemos
crear sites que permitan realizar reservas de hoteles, controlar ventas en linea,
etc.
? Estas paginas hacen uso de una Base de Datos.

Basado en ASP:

<HEAD>
<TITLE> Ejecutando un script VBScript en el Servidor </TITLE>
</HEAD>

<BODY>
<H2>Usando VBScript </H2>
<P> El dia de hoy es:
<%Response.Write Date%>
</BODY>

16
Creando Sitios de Comercio Electrónico

Que debo usar ASP o PHP?


Para empezar ambos son gratuitos, es decir no necesita comprar licencia de uso a
ninguna empresa, claro Microsoft es quien a explorado mas y muchos de sus
productos estan basados en ASP, mientras que es la corriente Linux quien apuesta
por PHP.

Como entornos de trabajo, ambos son muy buenos y tienen mucho en comun. Lo
que los difieren es el sistema operativo sobre el que operan, Windows para ASP y
Linux para PHP.

EN cuanto a la gestion de Base de Datos, para el sistema operativo Windows,


podemos usar Access, SQL Server, Visual FoxPro, Oracle, que son gestores de
bases de uso comercial muy conocidos. En cambio por el lado de Linux podemos
usar MySQL, SQLPostgree que a diferencia de los productos Microsoft, son Bases de
Datos gratuitas. Hay que señalar que MySQL y SQLPostgree presentan ciertas
limitaciones para quienes estamos acostumbrados a las cosas faciles, por ejemplo
no permiten Procedimientos Almacenados ni Desencadentes , no siempre será asi,
la corriente Linux avanza rapidamente, quiza mas adelante contemos con un gestor
de Base de Datos mas potente, sin embargo hay que señalar que muchas
soluciones profesionales estan basadas en el uso de esta tecnologia, por tanto su
construccion ya es, ingenio del desarrollador.

17
Creando Sitios de Comercio Electrónico

Conceptos generales de ASP


Objetivos
En este segundo módulo se desarrollaran los siguientes puntos:

? ASP
? Que necesito para ejecutar ASP
? El modelo de objetos

18
Creando Sitios de Comercio Electrónico

Active Server Pages

? Active Server Pages (ASP) es el aporte de Microsoft, al desarrollo de páginas


dinámicas.
? CGI y Perl, son tecnologias predecesoras a ASP.
? Otras tecnologías que compiten con ASP son ColdFusion (Allaire), JavaServer
Pages (Sun Microsystems) y PHP (de libre distribución bajo Open System).
? ASP no es un lenguaje de programación, sino un marco de trabajo, donde se
puede construir la aplicación web.
? Con ASP podemos construir aplicaciones que accedan a Base de Datos como
Access, SQL Server u Oracle.

Ventajas

Las principales ventajas que ofrece ASP son:

? Permite acceder a bases de datos de una forma sencilla y rápida.


? Las páginas se generan dinámicamente.
? El código de script se ejecuta en el servidor, y no depende del navegador que se
use.
? Desde una página ASP se pueden ejecutar servidores OLE en el servidor de web
y filtros ISAPI: acceso a base de datos, acceso a ficheros, log en el sistema,
envío de correo, etc.
? La tecnología ASP se emplea principalmente para crear aplicaciones interactivas

Cómo funciona?

? Las páginas ASP comienzan a ejecutarse cuando un usuario solicita un archivo


.asp al servidor Web a través del explorador.
? El servidor web llama a ASP, que lee el archivo solicitado, ejecuta las secuencias
de comandos que encuentre y envía los resultados al explorador del cliente.
? Puesto que las secuencias de comandos se ejecutan en el servidor, y NO en el
cliente, es el servidor el que hace todo el trabajo necesario para generar las
paginas que se envían al explorador. Las secuencias de comandos quedan
ocultas a los usuarios, estos solo reciben el resultado de la ejecución en
formato HTML.
? Desaparece por tanto el problema de si el cliente puede o no ejecutar
sentencias de comandos, el servidor Web solo envía el resultado en código
HTML standard el cual puede ser interpretado por cualquier explorador.

19
Creando Sitios de Comercio Electrónico

Como se usa ASP?

Existen dos formas de incluir scripts en una página web:

1. Escribiéndolo entre las etiquetas <SCRIPT> y </SCRIPT>. En el atributo


LANGUAGE podemos indicar en que lenguaje se está programando. Para
distinguir el código de script que se ejecuta en el servidor del que se ejecuta en
el cliente, se emplea el atributo RUNAT=”Server”:

<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>


‘instrucciones
</SCRIPT>

2. Escribiéndolo entre los delimitadores <% y %>.

<% instrucciones %>

Ejemplo:

<HEAD>
<TITLE> Ejecutando un script VBScript en el Servidor </TITLE>
</HEAD>

<BODY>
<H2>Usando VBScript </H2>
<P> El dia de hoy es:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Response.Write Date
</SCRIPT>
</BODY>

Una forma mas practica es encerrar el codigo VBScript dentro <% y%>.

<HEAD>
<TITLE> Ejecutando un script VBScript en el Servidor </TITLE>
</HEAD>
<BODY>
<H2>Usando VBScript </H2>
<P> El dia de hoy es:
<%Response.Write Date%>
</BODY>

20
Creando Sitios de Comercio Electrónico

Que necesito para ejecutar un programas


en ASP?
Para el desarrollo de nuestras paginas podemos usar el PWS de Windows 95/98,
para la publicacion debemos usar el IIS en un Servidor Windows NT o 2000.

Veamos ambas opciones en detalle:

Personal Web Server (PWS)


Instalacion

? Windows 95: Primero debe actualizar Windows. Esta actualizacion está con el
Service Pack 1. Esta actualizacion se llama Windows Socket 2 (WinSock2), el
cual, puede bajar el WinSock2 de:

http://www.microsoft.com/windows/downloads/bin/w95ws2setup.exe

Esta actualizacion corrige los problemas con el protocolo TCP/IP de Windows 95.
Luego se podrá instalar el PWS correctamente.

? Windows 98: el PWS lo encontrará en el CD de instalacion de Windows 98 en


la carpeta PWS que se encuentra dentro de la carpeta Add-Ons, de no hallarse
puede obtener una copia de forma gratuita del sitio de descarga de
www.Microsoft.com.

Ejecución:

1. Una vez instalado, ejecute el PWS desde:

Botón Inicio
Programas
Microsoft Personal Web Server
Administrador personal de Web

Le mostrará el panel Principal, donde se muestra el nombre de la pagina


principal, en el ejemplo: http://Grap

Asi mismo indica el nombre del directorio local, que en este caso es
c:/InetPub/wwwroot

Si en esta carpeta situa los archivos de su proyecto, entonces bastará que en el


navegador anote:

http://Grap

y se iniciará (el archivo que de inicio al proyecto debe llamarse Default.asp o


Default.htm)

21
Creando Sitios de Comercio Electrónico

2. Para registrar una carpeta distinta, vaya a a la opcion Avanzada

22
Creando Sitios de Comercio Electrónico

3. Luego haga click en Agregar.

El dialogo Agregar directorio, asocie el directorio donde se encuentra su


proyecto con un alias, en el ejemplo Capitulo3.

4. Para ejecutar el proyecto deberá anotar:

http://Grap/Capitulo3

Siempre que el proyecto empiece con Default.asp o Default.htm, en su caso


debera anotar:

http://Grap/Capitulo3/ejemplo.asp

23
Creando Sitios de Comercio Electrónico

Internet Information Server (IIS)


? Presente en las versiones 3.0/4.0/5.0 para Windows NT 4.0 o Windows 2000
? IIS es el entorno de desarrollo y ejecución de las páginas ASP para servidores
web de Microsoft.
? En Windows NT, IIS significaba Internet Information Server, en Windows 2000,
IIS opera como un servicio, recibiendo el nombre de Internet Information
Services.
? La ultima version de Internet Information Server fue 4.0, la reciente version 5.0
aparece como parte de la plataforma Windows 2000, la version 4.0 se sigue
utilizando debido a su gran estabilidad y tiempo que se lleva funcionando y es
utilizada en servidores NT.

La ultima version de IIS 5.0 aparece formando parte de la nueva version de


sistema operativo de Microsoft, Windows 2000, se encuentra completamente
integrado con el sistema operativo y supone una mejora de IIS 4.0, no presenta un
salto radical como de la version 3.0 a la 4.0.

? En conclusion:
Si vamos a rentar un servicio de hosting será suficiente con Windows 98 (por razones de costo de
licencia). Concluida la labor de desarrollo, podemos colocar la aplicación en el espacio rentado en el
servicio de hosting, via FTP o mediante la consola que el servicio de hosting nos provea.

Si vamos a implementar un Servidor Web en nuestra oficina, conviene adquirir una licencia de Windows
2000 Advanced Server.

A efectos de crear los programas ASP, será suficiente un simple editor de textos como el Bloc de notas de
Windows, o adquirir un Editor mas practico como el EditPlus (www.editplus.com), por unos 30 dolares.

24
Creando Sitios de Comercio Electrónico

Ahora si se puede adquiera MS-Visual InterDev (no crea que lo hará todo, de todos
modos hay que echarle mano al codigo).

Si se quiere acceder a una base de datos, se puede usar una conexión ODBC, una
conexión OLE-DB, o una ruta física. Como plataforma de bases de datos, una
simple base de datos hecha en Microsoft Access puede ser suficiente.

Hay diversos recursos en el web que son gratuitos y nos ayudarán a crear
soluciones muy profesionales, a lo largo del texto se irá indicando.

25
Creando Sitios de Comercio Electrónico

Modelo de Objetos en ASP


ASP consta de seis objetos, entre estos no existe una relacion jerarquica, sino una
relacion logica, a continuacion se hace una descripcion general de cada una de
ellas:

El Objeto Response
Este objeto se usará para enviar información a mostrar en el navegador o para
redireccionar a un URL diferente.

Ejemplo:

Response.Write "Hola a todos”

Esto imprimirá en el navegador "Hola a todos".

También puede incluirse instrucciones HTML como para indicar el salto de linea.

<HEAD>
<TITLE> Un saludo </TITLE>
</HEAD>

<BODY>
<H2>Hola a todos</H2>
<% Response.Write ("Esta cadena <BR> ha sido generada en el
<B>Servidor. </B>") %>
</BODY>

26
Creando Sitios de Comercio Electrónico

El Objeto Request
El Objeto Request se usará para obtener la información incluida en un formulario
HTML o a partir de los datos enviados mediante la instrucción QueryString.

Un ejemplo del uso del Objeto Request es recuperar un valor de un formulario html.
El nombre de la variable viene del dispositivo de entrada de html.

<HEAD>
<TITLE>Formulario entrada de datos </TITLE>
</HEAD>
<BODY>
<FORM ACTION="VerDatos.asp" METHOD="POST">
<INPUT TYPE=Text NAME=txtNombre>
<INPUT TYPE=Text NAME=txtDireccion>
<INPUT TYPE="Submit" VALUE="Ver">
<INPUT TYPE="Reset" VALUE="Borrar">
</FORM>
</BODY>

Ahora haremos que el valor de "txtNombre" sea asignado a una variable:

VerDatos.asp

<HEAD>
<TITLE> Visualizando resultados </TITLE>
</HEAD>
<BODY>

<%
strNom = Request.Form ("txtNombre")
strDir = Request.Form ("txtDireccion")

Response.Write ("Nombres: " & strNom & “<BR>” )


Response.Write ("Direccion: " & strDir )
%>
</BODY>

? Ahora podemos usar la variable, por ejemplo para almacenar el contenido en una Base de Datos,
realizar alguna calculo, imprimirla como parte de un mensaje, etc.

27
Creando Sitios de Comercio Electrónico

El Objeto Application
El Objeto Application se usa para guardar la información que deba ser compartido
simultáneamente por todos los usuarios de la aplicación.

Un ejemplo de esto podria la cadena de conexión a una Base de Datos, el nombre


de los directorios comunes, etc.

Application("Impuesto") = 0.18

El Objeto Session
El Objeto Session se usa para conservar datos durante una sesion.

Puede almacenarse en un Objeto Session, el Id del usuario, y asi poder verificar sus
datos y filtrar la informacion.

Session("autorizado") = "sí"

Cuando el usuario acceda a una pagina interior, para verificar si tiene permiso, solo
tendriamos que acceder y verificar que el valor de la variable de sesion “autorizado”
sea “si”.

? Hay un Objeto Application para todos los usuarios, y un Objeto Session para cada usuario

El Objeto Server
El Objeto Server se usa para definir la cantidad máxima de tiempo que se esperará
para realizar una escritura, crear instancias a componentes COM y poder usarlas en
nuestras paginas ASP, etc.

Por ejemplo podemos usar este objeto para crear una instancia del objeto de
ADODB.Connection y establecer una conexión a una Base de Datos.

Cn = Server.CreateObject ("ADODB.Connection")

En el código anterior se define "Cn" como una instancia del objeto de


ADODB.Connection. Luego se invocaria al método Open de este objeto, para
pasarle los parámetros apropiados (el nombre de fuente de datos, id del usuario, la
contraseña, etc) y establecer una conexión a una Base de Datos.

28
Creando Sitios de Comercio Electrónico

Variables de Memoria
Objetivos
En este módulo se desarrollaran los siguientes puntos:

? Que es una variable de memoria?


? Subtipos
? Cómo verificar los subtipos
? Funciones de conversión

29
Creando Sitios de Comercio Electrónico

Variables
? En ASP (VBScript) hay sólo un tipo de variable: Variant.
? Todas las variables son del tipo Variant.
? Cada variable puede tener un subtipo diferente.
? Hay 10 subtipos diferentes del tipo Variant (que se describe mas adelante).

Cómo declarar las variables:

Dim miVar

? Cuando se declara una variable no es necesario especificar el subtipo.


? Se puede convertir una variable a un subtipo especifico.

Nombrando variables
Al dar un nombre a una variable debe tener en cuenta:

? Debe empezar con un caracter alfabético


? No debe usarse nombres de comandos
? Debe ser único dentro del mismo alcance
? La longitud del nombre debe ser menor a 255 carácteres o menos

Sugerencias para nombrar variables:

? Una convencion es usar un prefijo de 3 letras que indiquen el tipo de datos,


como strNombre para las cadenas, intEdad para los enteros, etc.
? Puede usted definir un estilo propio usando prefijos que le guste y le sea
practico. La idea de usar prefijos es facilitar la lectura de sus programas.

Usando variables
Simplemente asigne valores a las variables:

Num1 = 3.4142
Num2 = FormatNumber(Num1, 2)
strFrase = "Bienvenido..."
strNombre = “Cesar”
strSaludo = strFrase + strNombre

? Una variable tiene por alcance el modulo donde fue definido. Es decir si define una variable en una
función, sólo en esa función se podrá usar dicha variable. Para que la variable esté disponible a nivel de
toda la página, debe definirla al principio y fuera de cualquier función o subprogramas.

30
Creando Sitios de Comercio Electrónico

Cuando se asigna un valor numerico a una variable y usted no le ha asignado un


subtipo especifico, sera considerada como cadena al intentar sumar. Así al realizar
2+2 y querer obtener 4, se conseguiría 22 (cancatenación), salvo sea una
operación de multiplicación o división, donde automáticamente el valor será
convertido a número.

Suma.asp

<HEAD>
<TITLE>Intentando sumar numeros </TITLE>
</HEAD>
<BODY>

<FORM ACTION="Neto.asp" METHOD="POST">


<INPUT TYPE=Text NAME=txtSueldo> <BR>
<INPUT TYPE=Text NAME=txtBoni> <BR>
<INPUT TYPE="Submit" VALUE="Calcular Neto">
</FORM>

</BODY>

Neto.asp

<HEAD>
<TITLE>Deberia sumar, pero concatena </TITLE>
</HEAD>
<BODY>

<%
strSueldo = Request.Form ("txtSueldo")
strBoni = Request.Form ("txtBoni")

Response.Write ("Neto: " & strSueldo+strBoni )


%>
</BODY>

Al ejecutar obtenemos:

31
Creando Sitios de Comercio Electrónico

32
Creando Sitios de Comercio Electrónico

Veamos otro ejemplo, donde se calcula impuestos:

<HEAD>
<TITLE>Declarando Variables</TITLE>
</HEAD>
<BODY>
<%
Dim intMonto, intIGV, intTotal
intMonto = 900
intIGV = 18
intTotal = intMonto - ((intMonto/100)*intIGV)
%>
<P>Monto inicial <% = intMonto %> soles</P>
<B><P>El total es <% = intTotal %> soles</B></P>
</BODY>

33
Creando Sitios de Comercio Electrónico

Option Explicit
Las variables en ASP no necesitan ser declaradas, sin embargo es un buen hábito
declarar las variables que usemos, una forma de forzar su definición es mediante la
orden Option Explicit, la cual debe insertarse al principio del código ASP de cada
pagina.

<%Option Explicit
Dim a,b,c

..
%>

Documentando
Es bueno documentar las secciones de codigo con cierta complejidad, nos sera de
ayuda a nosotros (en el futuro), como a los otros desarrolladores del equipo de
trabajo.

Para ubicar un comentario use

En VBScript: el apóstrofe, ( ' )


En JavaScript: la doble ( // )
En HTML: <!-- comentario -->

Se puede comentar en cualquier lado. Arriba de la linea o al final.

<HEAD>
<TITLE>Declarando Variables</TITLE>
</HEAD>
<BODY>
<%
Dim intMonto, intIGV, intTotal ‘Declaramos variables
intMonto = 900 ‘Monto en soles
intIGV = 18 ‘Impuesto
intTotal = intMonto - ((intMonto/100)*intIGV)
%>
<!—Imprimimos los resultados ?
<P>Monto inicial <% = intMonto %> soles</P>
<B><P>El total es <% = intTotal %> soles</B></P>
</BODY>

34
Creando Sitios de Comercio Electrónico

La funcion TypeName
Esta funcion devuelve el tipo de dato, de una variable o expresion.

<HEAD>
<TITLE>Usando TypeName</TITLE>
</HEAD>
<BODY>
<%Dim dblPi, TipoPi, datFNac, TipoFNac, strFrase, TipoFrase
dblPi = 3.142
TipoPi = TypeName(dblPi)

datFNac = #11/08/02#
TipoFNac = TypeName(datFNac)

strFrase = "Esta es una frase"


TipoFrase = TypeName(strfrase)

Dim emp
emptyVar = TypeName(emp) %>

<P>dblPi devuelve <%= TipoPi %></P>


<P>datToday devuelve <%= TipoFNac %></P>
<P>strText devuelve <%= TipoFrase %></P>
<P>emp devuelve <%= emptyVar %></P>

</BODY>

Al ejecutar obtenemos:

35
Creando Sitios de Comercio Electrónico

Los Subtipos
Veamos un resumen de los subtipos disponibles:

Subtipo Rango
Byte 0-255

Integer -32,768 a 32,767

Long -2,147,483,648 a 2,147,483,647

Single -3.402823E38 a-1.401298E-45 para valores negativos;


1.401298E-45 a 3.402823E38 para valores positivos

Double -1.79769313486232E308 a -4.94065645841247E-324


para valores negativos;

4.94065645841247E-324 a 1.79769313486232E308
para valores positivos

Currency -922,337,203,685,477.5808 a 922,337,203,685,477.5807

Date 1 de enero de 100 al 31 de diciembre de 9999

String De 0 a 2 mil millones caracteres

Boolean True o False

Objeto Cualquier referencia del Objeto

Los subtipos mas usados son String, Integer, y Boolean.

36
Creando Sitios de Comercio Electrónico

Funciones de conversión
Las siguientes funciones se acostumbrar usar para convertir las variables a un
subtipo específico:

Funcion Convierte un dato al tipo:


Cbool Boolean
Cbyte Byte
Ccur Currency
Cdate Date
CDbl Double
Cint Int
CSng Sigle
CStr String

Todas estas funciones toman como parámetro una variable, y devuelven el subtipo
pedido que puede luego ser retenida en la misma variable, por ejemplo:

var1 = CStr(var1)

37
Creando Sitios de Comercio Electrónico

<HEAD>
<TITLE>Definiendo SubTipos</TITLE>
</HEAD>
<BODY>

<%
Dim strPi, dblPi, intPi, strPi2
Dim TipoPi1, TipoPi2, TipoPi3, TipoPi4

strPi = "3.142"
TipoPi1 = TypeName(strPi)
dblPi = CDbl(strPi)
TipoPi2 = TypeName(dblPi)
intPi = CInt(dblPi)
TipoPi3 = TypeName(intPi)
strPi2 = CStr(intPi)
TipoPi4 = TypeName(strPi2)
%>

<P>Pi es <%= TipoPi1 %> y Pi retorna <%= strPi %> </P>


<P>Pi es <%= TipoPi2 %> y Pi retorna <%= dblPi %> </P>
<P>Pi es <%= TipoPi3 %> y Pi retorna <%= intPi %> </P>
<P>Pi es <%= TipoPi4 %> y Pi retorna <%= strPi2 %> </P>
</BODY>

38
Creando Sitios de Comercio Electrónico

Verificando los Subtipos


Hay seis funciones diferentes que ayudarán a determinar si una variable
corresponde a un Subtipo específico.

IsArray(var)
IsDate(var)
IsEmpty(var)
IsNull(var)
IsNumeric(var)
IsObject(var)

Estas funciones retornan un valor lógico (verdadero o falso). Veamos el uso de cada
uno de ellos:

IsEmpty(var)
Esta función indica si una variable está vacía. Una variable está vacía cuando la
variable se ha creado, pero no se ha asignado aún un valor. Esto es distinto a una
cadena vacía ("") o a un valor NULO.

IsNull(var)
Esta funcion determina si el contenido de una variable contiene un valor numol.
Una variable es nula cuando se iguala a un valor nulo.

IsNumeric(var)
Devolverá verdadero si la variable contiene un valor numerico.

Ejemplo:

<HEAD>
<TITLE>Averiguando si es un numero</TITLE>
</HEAD>
<BODY>
<%
miVar = "Hola"
If IsNumeric(miVar) Then
Response.Write ("la Variable es numérica".)
Else
Response.Write ("la Variable no es numérica".)
End If
%>
</BODY>

39
Creando Sitios de Comercio Electrónico

La función VarType()
Otra manera de determinar el Subtipo es usando la funcion VarType ()

La sintaxis:

VarType(var)

La función anterior devolverá un número que representa los distintos subtipos.

Subtipo Valor Descripcion


vbEmpty 0 no asignaron un valor
vbNull 1 Contiene valor nulo
vbInteger 2 Entero
vbLong 3 Largo
vbSingle 4 Single
vbDouble 5 Double
vbCurrency 6 Currency
vbDate 7 Date
vbString 8 String
VbObject 9 Object
VbError 10 Error
VbBoolean 11 Boolean
vbVariant 12 Variant
vbDataObject 13 Acceso de los Datos
vbDecimal 14 Decimal
vbByte 17 Byte
vbArray 8192 Arreglo

40
Creando Sitios de Comercio Electrónico

Analizando las cadenas


Hay 7 funciones disponibles en ASP que le ayudara a analizar las cadenas:

InStr(CadenaDondeBuscar, CadenaABuscar)
La funcion retorna:

0 si la CadenaDondeBuscar es de longitud cero


0 si la CadenaABuscar no se encuentra en la CadenaDondeBuscar
Nulo, Si la CadenaABuscar y la CadenaDondeBuscar es nulo.

Ejemplo:

str1 = "Hola"
str2 = "ol"
If InStr(str1,str2)> 0 Then
Response.Write ("str1 contiene a str2")
Else
Response.Write ("str2 no está contenido en str1")
End If

Se imprimirá:

str1 contiene a str2"

Left(Cadena,num)
Extrae caracteres por la izquierda

strProd = "Active Server Page"


Response.Write ("Los primeros seis carácteres son" &
Left(strProd,6))

Se mostrará:

Los primeros seis carácteres son Active

41
Creando Sitios de Comercio Electrónico

Right(Cadena,num)
Extrae caracteres por la derecha

strProd = "Active Server Page"


Response.Write("Las 4 últimas letras son"&Right(strProd,4))

Se mostrará:

Las 4 últimas letras son Page

Mid(Cadena, NumInicio[, NumCantidad])


Extrae cierta cantidad de caracteres (NumCantidad) de una cadena, a partir de la
posicion NumInicio. Si se omite NumCantidad, extrae los caracteres desde la
posicion NumInicio hasta el final de la cadena

Ejemplo:

strProd = "Active Server Page"


Response.Write ( Mid(strProd, 1, 1) & Mid(strProd, 8, 1) &
Mid(strProd,15,1))

El resultado:

ASP

Replace(Cadena, BuscarEsto, ReemplazaCon


[, Inicio])
Reemplaza los caracteres (ReemplazaCon) buscados (BuscarEsto), dentro de una
cadena desde la posicion indicada en Inicio. Si omite Inicio, la busqueda comienza
desde el carácter inicial

Ejemplo:

str1 = "Cesar-Augusto-Bustamante-Gutierrez"
Response.Write ("con espacios :" & Replace(str1," -",""))

Se imprimirá:

42
Creando Sitios de Comercio Electrónico

Con espacios: Cesar Augusto Bustamante Gutierrez

Len(cadena)
Devuelve la longitud de una cadena

strProd = "Active Server Page"


Response.Write (Left(strProd, Len(strProd)-5))

El resultado:

Active Server

43
Creando Sitios de Comercio Electrónico

Convirtiendo a mayúsculas y minúscula

Las funciones: LCase() y UCase(), convierte una cadena a masyúsculas y


minúsculas respectivamente.

Ejemplo:

miNomr= "CESAR"
Response.Write(LCase(miNom))

Se imprimirá:

Cesar

miApe = "bustamante"
Response.Write(UCase(Left(miNom,1)) & LCase(Mid(miNom,2)))
Response.Write(UCase(Left(miApe,1)) & LCase(Mid(miApe,2)))

Se imprimirá:

Cesar Bustamante

44
Creando Sitios de Comercio Electrónico

Buscando dentro de una cadena

Instr(Comienzo, Cadena1, Cadena2, Comparacion)


Devuelve la posicion de la ocurrencia de una cadena dentro de otra.
El argumento Comienzo indica la posicion a partir de la cual se iniciará la búsqueda
(por defecto desde el primer carácter).
Cadena2 es el argumento que se va a buscar en la Cadena1.
Comparacion, es opcional indica si la comparacion será:

0 vbBinaryCompare (por defecto)


1 vbTextCompare, realiza comparacion textual

Por ejemplo:

Response.Write( InStr(7, “Cesar Bustamante”, “m”) )

Se imprimirá: 12

InstrRev(Comienzo, Cadena1, Cadena2,


Comparacion)
Hace lo mismo que la funcion anterior, solo que en lugar de contar la ocurrencia por
la izquierda lo efectuara contando por la derecha.

45
Creando Sitios de Comercio Electrónico

Manipulando Fechas y Horas

Definiendo el formato de Fecha y Hora


Para establecer el formato de fecha y hora utilice la función: FormatDateTime ().

FormatDateTime(Fecha[,Formato])

El parámetro del formato puede tener uno de los valores siguientes:

0 vbGeneralDate Formato normal.


1 vbLongDate Formato de fecha largo
2 vbShortDate Formato de fecha corta
3 vbLongTime Hora en formato largo
4 vbShortTime Hora en formato de 24 horas(el hh:mm)

Ejemplo:

dHoy = Now()
Response.Write ("dHoy antes de estructurar: " & dHoy &" <BR>")
Response.Write ("dHoy estructurado en 0 =" &
FormatDateTime(dHoy,0) &" <BR>")
Response.Write ("dHoy estructurado 1 =" & FormatDateTime(dHoy,1)
&" <BR>")
Response.Write ("dHoy estructurado 2 =" & FormatDateTime(dHoy,2)
&" <BR>")
Response.Write ("dHoy estructurado 3 =" & FormatDateTime(dHoy,3)
&" <BR>")
Response.Write ("dHoy estructurado 4 =" & FormatDateTime(dHoy,4)
&" <BR>")

El resultado:

dHoy antes de estructurar: 26/02/2002 11:47:18 AM


dHoy estructurado en 0 =26/02/2002 11:47:18 AM
dHoy estructurado 1 =Martes 26 de Febrero de 2002
dHoy estructurado 2 =26/02/2002
dHoy estructurado 3 =11:47:18 AM
dHoy estructurado 4 =11:47

? En los servidores con Windows en ingles, la funcion: <%=FormatDateTime(Now, vbLongDate)%> la


fecha en inglés. Puede solucionar el problema, colocando antes:

<% @LCID = 1034 %>

46
Creando Sitios de Comercio Electrónico

Extrayendo partes de una fecha


DatePart(Parte, Fecha [, PrimerDiaSemana, PrimerDiaAño])

Esta funcion devuelve una parte de una fecha

PrimerDiaSemana, es un parámetro opcional devuelve uno de los valores


siguientes:

1 - domingo (valor predefinido)


2 - lunes
3 - martes
4 - miércoles
5 - jueves
6 - viernes
7 - sábado

El parámetro de Parte, puede tomar uno de los valores siguientes:

yyyy - Año
q - Cuarto
m - Mes
y - Día del año
d - Día
w - Día de la semana
ww - Semana de año
h - Hora
n - Minuto
s - Segundo

El argumento PrimerDiaAño, es una valor opcional, especifica la primera semana


del año, por defecto considera la primera semana del año. Los argumentos que se
puede pasar son:

Constante Valor Descripcion


VbUseSystem 0 Utiliza el soporte de Lenguaje Nacional (NLS), señalada
en la API
VbFirstJan 1 Inicia la semana el 1 de enero (por defecto)
VbFirstFourDays 2 Comienza con la semana que tiene al menos, cuatro dias
en la primera semana.
VbFirstFullWeek 3 Comienza con la primera semana completa del año

? Por lo general, se obvian los parametros opcionales: PrimerDiaSemana y PrimerDiaAño, por tanto se
asume que el primer dia de la semana es domingo y el año comienza con el 1ro de enero

47
Creando Sitios de Comercio Electrónico

Ejemplo:

dHoy = Now()
Response.Write ("dHoy =" & dHoy &" <BR>")
Response.Write ("yyyy =" & DatePart ("yyyy", dHoy) &" <BR>")
Response.Write ("m =" & DatePart ("m", dHoy) &" <BR>")
Response.Write ("q =" & DatePart ("q", dHoy) &" <BR>")
Response.Write ("y =" & DatePart ("y", dHoy) &" <BR>")
Response.Write ("d =" & DatePart ("d", dHoy) &" <BR>")
Response.Write ("w =" & DatePart ("w", dHoy) &" <BR>")
Response.Write ("ww =" & DatePart ("ww", dHoy) &" <BR>")
Response.Write ("h =" & DatePart ("h", dHoy) &" <BR>")
Response.Write ("n =" & DatePart ("n", dHoy) &" <BR>")
Response.Write ("s =" & DatePart ("s", dHoy) &" <BR>")

Al ejecutar se mostraria:

dHoy =26/02/2002 11:42:43 AM


yyyy =2002
m =2
q =1
y =57
d =26
w =3
ww =9
h =11
n =42
s =43

48
Creando Sitios de Comercio Electrónico

Agregando valores a una Fecha u Hora


DateAdd(Parte, Cantidad, Fecha)

Con esta función puede agregar o substraer una cantidad a una fecha o tiempo.

Cantidad, es el número que se quiere añadir o restar a una fecha (1, -4, 10, etc).

Ejemplo:

dHoy = Now()
Response.Write ("dHoy =" & dHoy &" <BR>")
Response.Write ("dHoy más 10 días =" & DateAdd ("d", 10, dHoy) &
" <BR>")
Response.Write ("dHoy menos 10 días =" & DateAdd ("d", -10,
dHoy) &" <BR>")
Response.Write ("dHoy más 3 meses =" & DateAdd ("m", 3, dHoy) &"
<BR>")
Response.Write ("dHoy menos 3 meses =" & DateAdd ("m", -3, dHoy)
& " <BR>")
Response.Write ("dHoy más 2 horas =" & DateAdd ("h", 2, dHoy) &"
<BR>")
Response.Write ("dHoy menos 2 horas =" & DateAdd ("h", -2, dHoy)
&" <BR>")

Al ejecutar se obtiene:

dHoy =26/02/2002 11:44:59 AM


dHoy más 10 días =08/03/2002 11:44:59 AM
dHoy menos 10 días =16/02/2002 11:44:59 AM
dHoy más 3 meses =26/05/2002 11:44:59 AM
dHoy menos 3 meses =26/11/2001 11:44:59 AM
dHoy más 2 horas =26/02/2002 01:44:59 PM
dHoy menos 2 horas =26/02/2002 09:44:59 AM

49
Creando Sitios de Comercio Electrónico

Calculando la cantidad de tiempo entre dos fechas


DateDiff(Parte, Fecha1, Fecha 2 [, PrimerDiaSemana, PrimerDiaAño])

Esta función es útil para encontrar la cantidad de tiempo entre una fecha y otra.

Parte es la cantidad de tiempo entre las dos fechas

Ejemplo:

var1 = #30/08/1970#
var2 = Date

Response.Write ("var1 =" & var1 &" <BR>")


Response.Write ("var2 =" & var2 &" <BR>")
Response.Write ("var1 al var2 es" & DateDiff ("d", var1, var2)
&" días <BR>")
Response.Write ("var1 al var2 es" & DateDiff ("m", var1, var2)
&" meses <BR>")
Response.Write ("var1 al var2 es" & DateDiff ("yyyy", var1,
var2) &" el año(s) <BR>")

Los resultados:

var1 =30/08/1970
var2 =26/02/2002
var1 al var2 es 11503 días
var1 al var2 es 378 meses
var1 al var2 es 32 el año(s)

50
Creando Sitios de Comercio Electrónico

Generando fechas validas

DateSerial(año, mes, dia)


Devuelve una fecha, a partir del año, mes y dia especificado.
El Año puede ser un numero de 100 a 9999
El mes un numero de 1 a 12
El dia un numero de 1 a 31

Response.Write ( DateSerial(1970,08,10) )
Response.Write ( DateSerial(2002,02,31) )

Muestra como resultado:

10/08/1970
03/03/2002

Dado que en el mes de enero del 2002 hay solo 28 dias, y se ha especificado 31, la
funcion adaptara los dias restantes al mes siguiente, es decir 3 de marzo.

DateValue(Fecha)
Devuelve una fecha, pasada como argumento en formato de fecha larga.

Ejemplo:

Response.Write ( DateValue(“10”,”Setiembre”,”2002”) )

Muestra como resultado:

10/09/2002

51
Creando Sitios de Comercio Electrónico

Obteniendo las partes de una fecha

Hay cinco funciones que le permitirá obtener una determinada parte de una fecha:

Day(Fecha)
Retorna el dia de una fecha, un número entre 1 y 31,

Month(Fecha)
Retorna el numero del mes de una fecha, un número entre 1 y 12,

Year(Fecha)
Retorna el numero del año de una fecha, un número como 2002

Weekday(Fecha)
Retorna el numero del dia en la semana, un numero entre 1-7, dónde 1 es domingo

MonthName(mes, abreviado)
Devuelve el mes en forma abreviada o larga

WeekDayName(DiaSemana, Abrevie, PrimerDia)


DiaSemana, es un número que representa el día de la semana (1-7)
Abrevie es un valor logico que indica si la función retornará el nombre abreviado o
no
PrimerDia, si es 1 corresponde a domingo

Ejemplo:

var1 = "30/08/1970"
Response.Write ("var1 =" & var1 &" <BR>")
Response.Write ("Para var1 el día es" & Day(var1) &" <BR>")
Response.Write ("Para var1 el mes es" & Month(var1) &" <BR>")
Response.Write ("Para var1 el año es" & Year(var1) &" <BR>")
Response.Write ("Para var1 el día de la semana es" &
WeekDay(var1, 1) &" <BR>")
Response.Write ("Para var1 el nombre del dia es" &
WeekDayName(WeekDay(var1), falso, 1) &" <BR>")

52
Creando Sitios de Comercio Electrónico

Al ejecutar se obtiene:

var1 =30/08/1970
Para var1 el día es 30
Para var1 el mes es 8
Para var1 el año es 1970
Para var1 el día de la semana es 1
Para var1 el nombre del dia es Domingo

53
Creando Sitios de Comercio Electrónico

Obteniendo la hora, minuto, segundos

Time()
Devuelve la hora del sistema

Hour(Hora)
Devuelve la hora

Minute(Hora)
Devuelve los minutos

Second(Hora)
Retorna los segundos de la Hora especificada en el argumento.

Timer()
Devuelve el numero de segundos transcurridos desde las 12 horas (medianoche)

TimeSerial(Horas, Minutos, Segundos)


Genera un dato Hora, con las Horas, Minutos y Segundos especificados

TimeValue(Hora)
Devuelve un dato tipo fecha

54
Creando Sitios de Comercio Electrónico

Ejemplo:

<%
Dim hora
hora = Hour(Time())
'Empezamos la comprobaciones de tiempo.
If hora > 6 and hora < 13 then
Response.Write ("<B>Buenos Dias</B>, son las: " & Time())
ElseIf hora > 12 and hora < 20 then
Response.Write ("<B>Buenas Tardes</B>, son las: "& Time())
ElseIf hora > 19 and hora < 24 then
Response.Write ("<B>Buenas Noches</B>, son las: "& Time())
ElseIf hora >= 0 and hora < 7 then
Response.Write ("<B>Buenas Noches</B>, son las: "& Time())
End If
%>

Al ejecutar obtenemos:

Buenos Dias, son las: 12:00:11 PM

55
Creando Sitios de Comercio Electrónico

Generando números aleatorios

Rnd()
La funcion Rnd(), genera un número aleatorio entre 0 y 1. Requiere que en nuestro
código pongamos la instrucción Randomize.

<%
Dim aleatorio
Randomize
' Generamos un numero entre 1 y 10.
Aleatorio = Int (Rnd*10) + 1
response.write "Numero aleatorio "& numero_azar
%>

56
Creando Sitios de Comercio Electrónico

Dando formato a un numero

Numeros enteros
FormatNumber(Numero[, Decimal, CeroInicial, Parentesis])

El primer parámetro es el único que se requiere, a menos que sea necesario indicar
el numero de cifras decimales mediante el segundo parámetro.
Con CeroInicial, puede indicar si se incluira cero, si el valor es fraccionario menor a
uno.
Mediante Parentesis, puede indicar si se encerrará con parentesis si el valor
numerico es negativo

Ejemplo:

var1 = 5443.354
var2 = -877743.2345
Response.Write ("var1 con formato=" & FormatNumber(var1, 2, -1,
-1) &" <BR>")
Response.Write ("var2 con formato =" & FormatNumber(var2, 1, -1,
-1))

Al ejecutar se obtiene:

var1 con formato = 5,443.35


var2 con formato = (877,743.2)

Valores monetarios
FormatCurrency(Numero[, Decimal, CeroInicial, Parentesis])

Agrega al valor numerico el simbolo $ al inicio, la descripcion de los parametros son


los mismos de la funcion antes citada.

Ejemplo:

var1 = 5443.354
var2 = -877743.2345
Response.Write ("var1 con formato =" & FormatCurrency(var1, 2, -
1, -1) &" <BR>")
Response.Write ("var2 con formato =" & FormatCurrency(var2, 1, -
1, -1))

57
Creando Sitios de Comercio Electrónico

El resultado:

var1 con formato = $5,443.35


var2 con formato = ($877,743.2)

Porcentajes
FormatPercent(Numero[, Decimal, CeroInicial, Parentesis])

Agrega el simbolo % a una cantidad numerica.

Ejemplo:

var1 = 5.4333
var2 = .823
Response.Write ("var1 con formato =" & FormatPercent(var1, 2, -
1, -1) &" <BR>")
Response.Write ("var2 con formato =" & FormatPercent(var2, 1, -
1, -1))

Ejecutando se obtiene:

var1 con formato = 543.33%


var2 con formato = 82.3%

58
Creando Sitios de Comercio Electrónico

Arreglos

Un arreglo está compuesto por un conjunto de elementos, que tienen un nombre


comun, pero un subindice distinto.

Si es unidimensional, corresponde a la representacion de un vector y si es


bidimensional a una matriz.

El elemento inicial de un arreglo inicia en cero, es decir el primer elemento seria


miArreglo(0).

Los arreglos son dinámicos, es decir puede cambiarse el tamaño luego de haberse
creado el arreglo.

Dim miArray(1)
miArray(0) = "Jose"
miArray(1) = "Gustavo"

ReDim Preserve miArray(2)


miArray(2) = "Cesar"

Incialmente de crea el arreglo miArray con dos elementos, luego se redimensiona a


3 elementos.

Para crear el arreglo use:

Dim miArray(20)

Para redimensionar el arreglo use:

ReDim Preserve miArray(3)

59
Creando Sitios de Comercio Electrónico

Ejemplo:

<HEAD>
<TITLE>Usando arreglos</TITLE>
</HEAD>
<BODY>

<%
Dim aLista()
Redim aLista(4)
aLista(0) = "Pilar"
aLista(1) = "Karen"
aLista(2) = "Tamara"
aLista(3) = "Gabriela"
Response.Write "<P>"
For n = 0 to 3
Response.Write aLista(n) & "<BR>"
Next

Response.Write "<P>Falta Claudia... </P>"


Redim Preserve aLista(4)
aLista(5) = "Claudia"
Response.Write "<P>"

For n = 0 to 4
Response.Write aLista(n) & "<BR>"
Next
%>
</BODY>

NOTA: Si es un arreglo pequeño, puede crealo de la forma siguiente:

Dim aColores
aColores = Array("Azul", "Verde", "Rojo")

60
Creando Sitios de Comercio Electrónico

Funciones para el tratamiento de arreglos

LBound(Arreglo [,Dimension])
Esta función retorna el menor valor contenido en uno de los elementos de un
arreglo.
Dimension (por defecto 1), es un parámetro opcional, especifica la dimensión del
arreglo donde se quiere encontrar el más bajo valor.

UBound(ArrayName [, ArrayDimension])
Esta función retorna el mayor valor contenido en uno de los elementos de un
arreglo.
Dimension (por defecto 1), es un parámetro opcional, especifica la dimensión del
arreglo donde se quiere encontrar el más alto valor.

Split(CadenaElementos[, Delimitador, Cantidad])


CadenaElementos, es una cadena que contiene una lista de elementos
Delimitador, es el carácter usado para separar los elementos en CadenaElementos.
Cantidad, es el número de elementos que sea convertir a arreglo.

Ejemplo:

Dim miString, miArray,


miString = "naranjas,manzanas,platanos"
miArray = Split(miString,",")

Al ejecutar se obtiene, un arreglo con 3 elementos.

61
Creando Sitios de Comercio Electrónico

Los arreglos multi-dimensionales


Para crear un arreglo multi-dimensional simplemente especifique el número de
columnas y filas.

miArray(2,3) tendría 2 columnas y 3 filas, esto generaria un arreglo con 3 filas (de
0 a 2) con 4 columnas (de 0 a 3), es decir con 12 elemntos (3x4)

0,0 1,0 2,0


0,1 1,1 2,1
0,2 1,2 2,2
0,3 1,3 2,3

Ejemplo:

Dim miArray(2,3)
miArray(0,0) = "electrodomesticos"
miArray(1,0) = "lustradora"
miArray(2,0) = "10"
miArray(0,1) = "electrodomesticos "
miArray(1,1) = "tostador"
miArray(2,1) = "12"
miArray(0,2) = "perfumes"
miArray(1,2) = "Carolina Herrera"
miArray(2,2) = "40"
miArray(0,3) = "perfumes"
miArray(1,3) = "Aqua Brava"
miArray(2,3) = "23"

Response.Write (" <Table border=2 >")


Response.Write (" <tr><td>Fila </td><td>linea</td>")
Response.Write (" <td>Item</td><td>Cantidad</td></tr>")

For i = 0 To UBound(miArray, 2)
Response.Write (" <tr><td> #" & i &" </td>")
Response.Write (" <td>" & miArray(0,i) &" </td>")
Response.Write (" <td>" & miArray(1,i) &" </td>")
Response.Write (" <td>" & miArray(2,i) &" </td></tr>")
Next

Response.Write (" </table>")

Al ejecutar se obtiene:

Fila Linea Item Cantidad


0 electrodomesticos lustradora 10
1 electrodomesticos tostador 12
2 electrodomesticos Carolina Herrera40
3 electrodomesticos Aqua Brava 23

62
Creando Sitios de Comercio Electrónico

Instrucciones condicionales

Instrucción condicional simple


Esta instrucción presenta dos formas:

La forma simple, indica que el Bloque de instrucciones se ha de ejecutar si la


condicion es Verdadera

If (condición) Then
' Bloque de instrucciones
End If

La otra forma, indica que uno de los Bloques de instrucciones se ha de ejecutar


dependiendo de la validez de la condicion.

If (condición) Then
' Bloque de instrucciones 1
Else
' Bloque de instrucciones 2
End If

Una tercera forma indica, el uso de ElseIf a fin de discriminar otras posibilidades:

If (condición) Then
' Bloque de instrucciones 1
ElseIf (condición) Then
' Bloque de instrucciones 2
ElseIf (condición) Then
' Bloque de instrucciones 3
ElseIf (condición) Then
' Bloque de instrucciones 4
End If

Ejemplo:

If Num1> Num2 Then


Response.Write ("Num1 es mayor que num2...")
Else
Response.Write ("Num2 es mayor que num1...")
End If

63
Creando Sitios de Comercio Electrónico

Tambien puede anidarse instrucciones, una dentro de otra, por ejemplo:

If Num1> Num2 Then


If num3> num1 Then
Response.Write ("Num3 es mayor que num1 y num2...")
Else
Response.Write ("Num3 es menor que num1...")
End If
Else
If num3> num2 Then
Response.Write ("Num3 es mayor que num2 y num1...")
Else
Response.Write ("Num3 es menor que num2...")
End If
End If

? Se sugiere evitar ordenes If anidades, en su lugar procure usar la orden condicional Select Case.
En el caso de anidamiento, no olvide cerrar correctamente cada orden If.

Ejemplo:

Mediante el ejemplo siguiente se toma como ingreso el nombre y contraseña de un


usuario, en base a ello se realiza la validación.

<HEAD>
</HEAD>

<BODY>
<FORM ACTION="Verificar.asp" METHOD="post">
Ingrese su login:<BR>
<INPUT TYPE="text" NAME="Login"><P>
Ingrese su contraseña:<BR>
<INPUT TYPE="text" NAME="Clave">
<BR>
<BR>
<INPUT TYPE="submit">
</FORM>
</BODY>

64
Creando Sitios de Comercio Electrónico

El contenido de Verificar.asp, sería:

<HEAD>
<TITLE>Verificando la contraseña </TITLE>
</HEAD>
<BODY>
<%
strLogin = Request.Form("Login")
strClave = Request.Form("Clave")

Response.Write "<H1>Verificando al usuario </H1>"

If strLogin = "Gustavo" and strClave = “gato” Then


Response.Write "Bienvenido Gustavo"
Else
If strLogin = "Cesar" and strClave = “coyote” Then
Response.Write "Bienvenido Cesar"
Else
Response.Write "Usted es un usuario normal"
End If
End If
%>
</BODY>

65
Creando Sitios de Comercio Electrónico

Instrucción condicional múltiple


Esta orden resulta util, cuando se presenta mas de dos alternativas, para una
determinada condicion.

Es la solucion cuando se presenta ordenes If anidadas.

Por ejemplo la secuencia:

If miVar = "1" Then


Response.Write ("miVar =1")
ElseIf miVar = "2" Then
Response.Write ("miVar =2")
ElseIf miVar = "3" Then
Response.Write ("miVar =3")
ElseIf miVar = "4" Then
Response.Write ("miVar =4")
End If

Podria sustituirse por:

Select Case miVar


Case "1"
Response.Write ("miVar =1")
Case "2"
Response.Write ("miVar =2")
Case "3"
Response.Write ("miVar =3")
Case "4"
Response.Write ("miVar =4")
Case Else
Response.Write ("es mas que cuatro...")
End Select

Ejemplo:

Veamos otra forma de envio de datos, al mismo que vemos la solucion usando la
orden condicional multiple.

66
Creando Sitios de Comercio Electrónico

<HEAD>
</HEAD>

<BODY>
<H1>Registro</H1>
<FORM ACTION="DiaSeleccionado.asp" METHOD="post">
Elija un dia<BR>
<SELECT NAME="Dia">
<OPTION VALUE="Lu">Lunes</OPTION>
<OPTION VALUE="Ma">Martes</OPTION>
<OPTION VALUE="Mi">Miercoles</OPTION>
<OPTION VALUE="Ju">Jueves</OPTION>
<OPTION VALUE="Vi">Viernes</OPTION>
<OPTION VALUE="Sa">Sabado</OPTION>
<OPTION VALUE="Do">Domingo</OPTION>
</SELECT>
<BR><BR>
<INPUT TYPE="submit">
<INPUT TYPE="reset">
</FORM>
</BODY>

DiaSeleccionado.asp

<HEAD>
</HEAD>
<BODY>
<%
varMes = Request.Form("Mes")
Select Case varMes
Case "Lu"
Response.Write "Ha seleccionado Lunes"
Case "Ma"
Response.Write " Ha seleccionado Martes"
Case "Mi"
Response.Write " Ha seleccionado Miercoles"
Case "Ju"
Response.Write " Ha seleccionado Jueves"
Case "Vi"
Response.Write " Ha seleccionado Viernes"
Case "Sa"
Response.Write " Ha seleccionado Sabado"
Case "Do"
Response.Write " Ha seleccionado Domingo"
End Select
%>
</BODY>

67
Creando Sitios de Comercio Electrónico

Instrucción repetitiva Do… Loop

Esta orden repite un bloque de instrucciones cierta cantidad de veces dependiendo


de la validez de una condicion.

La orden puede presentar dos formas:

La primera forma, evalua primero la condicion, de ser valida procedera a ejecutar el


bloque de instrucciones, en su caso continuara con las instrucciones siguientes a
dicha orden.

Do {While <Condición> | Until <Condición>}


' Bloque de instrucciones
Loop

La otra forma ejecuta el bloque de instrucciones al menos una vez, su posterior


ejecucion dependera de la validez de la condicion:

Do
' Bloque de instrucciones
Loop {While <Condición> | Until <Condición>}

Ejemplo:

i = 0
Do While i <5
Response.Write ("i =" & i &" <BR>")
i = i + 1
Loop

El resultado sería:

i=0
i=1
i=2
i=3
i=4

68
Creando Sitios de Comercio Electrónico

Ejemplo:

Un simple calculo de los dias transcurridos a la fecha:

<HEAD>
</HEAD>
<BODY>
<%
varInicio = 1
varDiaHoy = Day(Now())
varNum = 0
Do While varInicio <= varDiaHoy
varNum = varNum + 1
Loop
Response.Write "Total dias " & varNum & “Transcurridos”
%>
</BODY>

69
Creando Sitios de Comercio Electrónico

Instrucción repetitiva While… Wend

Muy similar a la instrucción repetitiva DO. Ejecuta un grupo de instruccioes


mientras la condición sea verdadera.

While { Condición}
' Bloque de instrucciones
Wend

Esta instrucción resulta muy practica cuando se desea recorrer el contenido de una
tabla:

While not rs.EOF


Response.Write ("Nombre =" & rs("NomCliente") &"," &
rs("ApeCliente") &" <BR>")
rs.MoveNext
Wend

La instrucción repetitiva For… Next


Esta orden repite un bloque de instrucciones una cantidad especifica de veces

For var = Inicio To Fin


Bloque de instrucciones
Next

Ejemplo:

For i = 1 To 7
Response.Write(i = & i &" <BR>")
Next

Tambien podemos usar la forma:

For each x in Request.ServerVariables


Response.Write(x &" =" & Request.ServerVariables(x) &" <BR>")
Next

Para ver por ejemplo el estado de las variables del servidor

70
Creando Sitios de Comercio Electrónico

<HEAD>
</HEAD>
<BODY>

<FORM ACTION=Calculos.asp METHOD = post>


<P>Fecha inicial: (mm/dd/yy) <BR>
<INPUT TYPE=text NAME="FNac">
<P>Confirme la fecha actual<BR>
<INPUT TYPE=text NAME="FHoy"><BR>
<INPUT TYPE=submit>
<INPUT TYPE=reset>
</FORM>

</BODY>

Calculos.asp

<HEAD>
</HEAD>

<BODY>
<%
varFNac=Request.Form("FNac")
varFHoy=Request.Form("FHoy")
varFNac = CDate(varFNac)
varFHoy = CDate(varFHoy)

varDias=(varFNac-varFHoy)
varTotal = 0
For x = 0 to varDias
varTotal = varTotal + 20
Next
Response.Write "Total" & varTotal
%>
</BODY>

71
Creando Sitios de Comercio Electrónico

Los Objetos Request y Response

Objetivos
En este primer módulo se desarrollaran los siguientes puntos:

? Las tecnicas de envio de datos mediante Response


? El redireccionamiento a otras paginas
? La recepcion de datos desde formularios mediante Request
? La recepcion de datos mediante QueryString

72
Creando Sitios de Comercio Electrónico

El objeto Response

Tiene por funcion enviar datos al cliente, es decir al navegador que ha cargado la
paginas ASP. A traves de este objeto podremos escribir en la pagina que visualizara
el usuario e incluso podremos redirigir al usuario a otra direccion en Internet.

Metodos basicos:

Write
Escribe en el navegador del cliente

<%Response write( instrucciones HTML)%>


<%Response write( “<H1>Hola </H1>”)%>
<%Response write( “<H1>Hoy es <B> “ & <% Now%> &” </H1>”)%>

Ejemplo:

ServIntel.asp

<HEAD>
<TITLE>Pagina inteligente</TITLE>
</HEAD>
<BODY>
El servidor le informa que son las <% = Time %>
del día <% = Date %> <P>
<%If Hour(Now) < 8 Then %>
Estas no son horas de conectarse, estoy durmiendo!
<% ElseIf Hour(Now) < 15 Then %>
Estoy trabajando, no moleste.
<% Else %>
La tarde es para descansar, ver la tele, dormir, ...
<% End If
Response.Write("<BR><BR>")
Randomize
i = Int(Rnd * 4)
Select Case i
Case 0
Response.Write("Hace buen día, ¿ verdad ?")
Case 1
Response.Write("Me parece que hoy lloverá.")
Case 2
Response.Write("Esta tarde llueve seguro.")
Case 3
Response.Write("Que sol mas espléndido.")
End Select%>
</BODY>

73
Creando Sitios de Comercio Electrónico

Redirect
Redirecciona al navegador web del cliente a la direccion que se le pasa como
argumento

Response.redirect(“http://www.librosdigitales.net”)

Ejemplo:

Selección.htm

<HEAD>
<TITLE>Redireccionando</TITLE>
</HEAD>
<BODY>

<H2>Elija la pagina que desea ver</H2>


<FORM ACTION="VerPagina.asp" METHOD="POST">
<INPUT TYPE="Radio" NAME="opcion" VALUE="Pagina1"
CHECKED>Pagina 1<BR>
<INPUT TYPE="Radio" NAME="opcion" VALUE="Pagina2">Pagina 2<P>
<INPUT TYPE="Submit" VALUE="Escoja una pagina">
</FORM>

</BODY>

VerPagina.asp

<% Dim opc


opc = Request.Form("opcion")
If opc = "Pagina1" Then
Response.Redirect "Pagina1.htm"
Else
Response.Redirect "Pagina2.htm"
End If %>

? Mejore la velocidad de presentación de su página, usando Response, solo para ejecutar expresiones
en el Servidor, vea el siguiente ejemplo:

74
Creando Sitios de Comercio Electrónico

Esto puede que no sea tan rapido

<HEAD>
</HEAD>

<BODY>
<%
Response.Write "Son las: "
Response.Write Time
Response.Write "horas en la ciudad de Lima"
%>
</BODY>

Lo siguiente es mejor:

<HEAD>
</HEAD>

<BODY>
Son las: <%= Time %> horas en la ciudad de Lima
</BODY>

75
Creando Sitios de Comercio Electrónico

El problema de las comillas


Uno de los problemas usuales es el uso de las comillas al formar la expresion a
presentar mediante la orden Response.Write. Una solucion sencilla es usar el
Chr(34):

<%
Dim com
'Ahora asignamos la comilla a nuestra variable.
com = Chr(34)
Response.Write "Esta"&com&"está en código ASP"
%>

Al ejecutar tenemos:

Esta " está en código ASP

76
Creando Sitios de Comercio Electrónico

Averiguando si el usuario está conectado con


Response.IsClientConnected
Para comprobar si un cliente está conectado podemos usar la propiedad
IsClientConnected, la cual retorna verdadero si el cliente está en línea caso
contrario falso.

De esta manera podemos ejecutar cierto proceso verfificando previamente si el


usuario está conectado.

Ejemplo:

<%
' Procesamiento muy largo en el tiempo
...
if not Response.IsClientConnected then
Response.End
end if
...
' Procesamiento muy largo
%>

77
Creando Sitios de Comercio Electrónico

El objeto Request

Es utilizado para obtener informacion del usuario, por tanto hace las funciones
contrarias a Response.

Cuando un navegador cliente se comunica con el servidor web, el navegador envia


una gran numero de información ademas de la pagina que se quiere cargar, esta
informacin puede ser: variables, formularios, etc. ASP hace las funciones de
extraer, decodificar y organizar toda esta informacion a traves de formularios.

Request.colección(variable)

colección puede ser un formulario y variable un objeto de formulario

Form es una coleccion que contiene todos los elementos de un formulario (<form>)
pasado al archivo ASP con el metodo POST (<form method='post'>), la forma de
acceder a el valor de un elemento del formulario es la siguiente...

<%=Request.Form("nombre_elemento")%>

Recepcion de datos usando Request.form


El ejemplo, presenta un formulario de entrada de datos, cuyo contenido luego se
envia a una pagina ASP a fin de que sea procesado:

FormDatos.htm

<HEAD>
<TITLE>Formulario de entrada</TITLE>
</HEAD>
<BODY>
<FORM NAME="Formulario" ACTION=”Recibir.asp" METHOD="POST">
Nombre: <INPUT TYPE="TEXT" NAME="nombre" SIZE="20"><BR>
Apellidos: <INPUT TYPE="TEXT" NAME="apellidos"
SIZE="40"><BR>
Sexo:<BR>
H <INPUT TYPE="RADIO" NAME="sexo" VALUE="varon">
M <INPUT TYPE="RADIO" NAME="sexo" VALUE=”mujer">
<BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
</FORM>
</BODY>

78
Creando Sitios de Comercio Electrónico

El formulario Recibir.asp:

<HEAD>
<TITLE>Datos obtenidos del formulario</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
Su nombre es <% = Request.Form("nombre") %>
<BR>
Sus apellidos son <% = Request.Form("apellidos") %>
<BR>
Su sexo es <% = Request.Form("sexo") %>
</BODY>

79
Creando Sitios de Comercio Electrónico

Una forma recursiva


El formulario de entrada de datos y el procesamiento del contenido puede
efectuarse en un solo archivo, por ejemplo

Destino.asp

<HEAD>
</HEAD>
<BODY>
<%If Request.Form = “” Then%>
Seleccione un destino:
<FORM ACTION="Destino.asp" METHOD=POST>
<SELECT SIZE=3 NAME="Destino" MULTIPLE>
<OPTION>Iquitos</OPTION>
<OPTION>Cusco</OPTION>
<OPTION>Arequipa</OPTION>
<OPTION>Trujillo</OPTION>
<OPTION>Lima</OPTION>
</SELECT>
<INPUT TYPE="SUBMIT">
</FORM>
<%else
If Request.Form("Destino").Count=0 then
Response.Write "No ha seleccionado un destino"
Else
Response.Write "El destino que ha seleccionado
es: "
Response.Write Request.Form("Destino")
End If
End If%>
</BODY>

80
Creando Sitios de Comercio Electrónico

Recepcion de datos usando Request.QueryString


Si se usa el metodo Get, en el formulario, debera usarse el metodo QueryString en
el formulario donde se desea recuperar el valor.

Veamos un ejemplo:

FormCiudad.htm

<HEAD>
</HEAD>
<BODY>
Seleccione un destino:
<FORM ACTION="Mostrar.asp" METHOD=GET>
<SELECT SIZE=3 NAME="Destino" MULTIPLE>
<OPTION>Iquitos</OPTION>
<OPTION>Cusco</OPTION>
<OPTION>Arequipa</OPTION>
<OPTION>Trujillo</OPTION>
<OPTION>Lima</OPTION>
</SELECT>
<INPUT TYPE="SUBMIT">
</FORM>
</BODY>

Mostrar.asp

<HEAD>
</HEAD>
<BODY>
<%
If Request.QueryString("Destino").Count=0 then
Response.Write "No ha seleccionado un destino"
Else
Response.Write "El destino que ha seleccionado es: "
Response.Write Request.QueryString("Destino")
End If
%>
</BODY>

81
Creando Sitios de Comercio Electrónico

Envio de valores de una pagina a otra

Para pasar las variables de una página a otra lo podemos hacer introduciendo dicha
variable en la dirección URL de la página destino dentro del enlace hipertexto. La
sintaxis sería la siguiente:

<a href="destino.asp?variable1=valor1&variable2=valor2&..."></a>

Para recoger la variable en la página destino lo hacemos por medio del objeto
Request con el método Querystring:

Request.querystring("variable1")
Request.querystring("variable2")

Veamos un ejemplo:

Origen.htm

<HTML>
<HEAD>
<TITLE>De aquí se envia valores</TITLE>
</HEAD>
<BODY>
<a href="destino.asp?saludo=hola&usuario=cesar">
Haga clic para enviar los valores
</a>
</BODY>
</HTML>

Destino.asp

<HEAD>
<TITLE>destino.asp</TITLE>
</HEAD>
<BODY>
<%
texto = Request.Querystring("saludo")
nombre = Request.Querystring("usuario")
%>
Variable saludo: <%Response.Write(texto& " " & nombre)%>
</BODY>

82
Creando Sitios de Comercio Electrónico

Redireccionando a otra pagina


Podemos decir que pagina mostrar, redirigiendola mediante el metodo Redirect del
objeto Response.

Ejemplo:

<HEAD>
</HEAD>
<BODY>
<H2>Escoja la pagina que desea ver</H2>
<FORM ACTION="VerPagina.asp" METHOD="POST">
<INPUT TYPE="Radio" NAME="optPagina" VALUE="Pag1"
CHECKED>Pagina 1<BR>
<INPUT TYPE="Radio" NAME="optPagina" VALUE="Pag2">Pagina
2<P>
<INPUT TYPE="Submit" VALUE="Ver pagina">
<INPUT TYPE="RESET">
</FORM>
</BODY>

VerPagina.asp

<%
Option Explicit
Dim strRpta

strRpta = Request.Form("optPagina")

If strRpta = "Pag1" Then


Response.Redirect "pagina1.html"
Else
Response.Redirect "pagina2.html"
End If
%>

83
Creando Sitios de Comercio Electrónico

Usando formularios con valores ocultos

Puede usarse el control Hidden de HTML, para almacerar en ella un valor, la sintaxis
de la orden es la siguiente:

<Input type=hidden name=proceso value=true>

Podemos recuperar el valor asociado desde otro formulario mediante una


instrucción Request:

If Request.Form ("proceso") Then


‘Ejecutar proceso 1
Else
‘Ejecutar proceso 2
End If

Esta tecnica podria resultar util, para almacenar informacion que la pagina genere
(como un nuevo id del usuario, etc), y poder enviarlo a otra pagina, evitando el uso
de variables de sesion.

84
Creando Sitios de Comercio Electrónico

Problemas con Redirect


Hasta aquí ya sabemos la funcion de Redirect: redirigir la página ASP a la URL
especificada.

<% Response.Redirect ("http://yahoo.com") %>

Sin embargo puede presentarse ciertas complicaciones al usarla.

La redirección se implementa mediante cabeceras HTTP que son distintas que las
enviadas cuando se muestra una página web. Eso significa que si se utiliza
Response.Write o se intercala cualquier código HTML, ya no funcionará un posterior
Response.Redirect porque se habrán enviado las cabeceras de mostrar una página
web, no las de redirección. No obstante, existe una solucion y enviar un comando
de redirección tras haber enviado comandos write. Esto implica el uso de la
propiedad Buffer como se explica a continuación.

Response object error 'ASP 0156 : 80004005'


Header Error
The HTTP headers are already written to the client browser. Any
HTTP header modifications must be made before writing page
content.

Hay dos soluciones.

La primera:

Y la más fácil es agregar en la primer linea :

<% Response.Buffer = True% >.

La segunda:

La otra solucion, es no escribir en la página antes de hacer un Redirect o crear una


Cookie. Hacer las comprobaciones pertinentes al comienzo de la página, y luego
escribirla.

Este error se debe a alguna de esas dos cosas. No se puede escribir en el


navegador y luego redireccionar o crear cookies.

El siguiente ejemplo, con response.buffer en true, funciona perfectamente porque,


aunque ya hemos escrito cosas en la página, no las hemos mandado al cliente,
porque están en el buffer.

85
Creando Sitios de Comercio Electrónico

<% response.buffer = true


for i=0 to 1000
response.write "Taller de ASP "
next
response.clear
response.cookies ("ppepe") = "pqpqpqpqpqpqpqpqpq"
response.write request.cookies ("ppepe")
%>

Con response.buffer a false el mismo script va a dar un error porque no se pueden


leer o escribir cookies si ya hemos escrito algo en la página y se ha mandado al
cliente.

86
Creando Sitios de Comercio Electrónico

Usando el Buffer de la página


Las páginas ASP se procesan en el servidor web, quien devuelve al cliente puro
código HTML. Este procesamiento se contruye en el Buffer. Si estamos usando el
IIS 5 (Internet Information Server 5) que viene en Windows 2000, el método Buffer
del objeto Response viene por defecto en valor True. Quiero decir que viene
Response.Buffer = True. En el IIS 4 o PWS esta en False. Pero la podemos poner a
True cuando queramos.

Se estarán preguntando que es lo que cambia... Bueno, si el Buffer esta en True, el


servidor procesará toda la pagina ASP, creará la página para el cliente en HTML y
cuando finalice todo ese trabajo, enviará todo junto. Con el Buffer en False, el
servidor va enviando la información que ya proceso, mientras continua trabajando
con el resto.

Seguramente notaron que en algunos sitios, nos baja toda la información de un


solo golpe (texto, imagenes, sonido), en cambio lo más comun hoy en día es que
baje a medida que se carga. Esto se puede manejar a nuestro gusto.
Veamos a continuación como podemos trabajar con el Buffer y como se usa
correctamente:

Propiedad Buffer:

Puede estar True o False. Si está en True el servidor procesa todo y luego lo envia.
Si está en False va enviando a medida que procesa.

Método Flush:

Se puede utilizar solamente cuando el Buffer está en True. ¿Para que sirve? Dijimos
que cuando el Buffer está en true, toda la información se envia cuando es
procesada completamente. Con Response.Flush pediremos todo lo que está
procesado hasta ese momento.

Es útil para usarlo después de fragentos "pesados" (imagenes, menues), porque de


esta manera será enviado el menu y luego seguirá con el resto de la página.

<%
Response.Buffer = True
'parte pesada de la página...
....
Response.Flush
'Continuamos con la página.
...
%>

Método Clear:

Se utiliza para borrar todo el Buffer. Su sintaxis es simple <% Response.Clear %>

87
Creando Sitios de Comercio Electrónico

Método End:

Se utiliza para terminar la ejecución de un Script. Su uso más comun es para


detener cualquier página si detectamos que el usuario no está más. Eso lo hacemos
de este modo:

<%
'parte pesada de la página.
...
'comprobamos si el cliente sigue activo.
If not Response.IsClientConnected then
Response.End
end if
%>

Ejemplo:

<% Response.Buffer = true %>


<HEAD>
</HEAD>

<BODY>
Este texto se envia al navegador<P>
Está esperando a ser mostrada<P>
<% Response.Flush %>
Esto puede enviarse al cliente<P>
Sin embargo será borrado<P>
<% Response.Clear %>
<%
Response.Write "Podemos tener control en la salida<P>"
Response.Flush
%>
Se supone que aquí termino todo<P>
<% Response.End %>
Esto creo que no aparecerá
</BODY>

88
Creando Sitios de Comercio Electrónico

Evitando la Caché
El navegador guarda una copia de las páginas visitadas en la caché. Cuando retorna
al mismo sitio lo que hace es verificar si ya visitó esa página y cuál es la fecha del
archivo. Si la fecha de modificación concuerda con la del servidor, la página se
carga desde la caché. Si no, baja del server. Veremos a continuacion como evitar
eso, y que siempre baje el archivo desde el servidor, evitando la caché del
navegador.

Método Response.Expires:

Con este método definimos los minutos que se usará la caché. Si ponemos 3
significa que a los 3 minutos dejará de usar la caché, y pedirá la página al servidor.
Obviamente si ponemos 0, se evita totalmente la caché, ya que pedirá
directamente la página al server. Algo importante es que debemos ubicarlo antes
de los encabezados HTTP. Su forma de usarlo es el siguiente.

<% Response.Expires = 0 %>

Método Response.ExpiresAbsolute:

Se utiliza si queremos que cierta página caduque un día determinado. A partir de


ese día no se cargará desde la caché sino desde el servidor directamente.

<% Response.ExpiresAbsolute = #4/12/2000 10:00:00# %>

Método Response.AddHeader:

Tiene varias funciones, pero sólo comentaremos la siguiente que sirve para no
llegar a guardar la caché de la página en cuestión.

<% Response.AddHeader "PRAGMA", "NO-CACHE" %>

89
Creando Sitios de Comercio Electrónico

Ejercicio
Dada las paginas:

oficina.asp
juegos.asp
tareas.asp

Crear una pagina inicial que muestre una de las paginas citadas, dependiendo de la
hora.
En horario de oficina: oficina.asp
En horario de refrigerio: juegos.asp
El resto del dia: tareas.asp

90
Creando Sitios de Comercio Electrónico

Procedimientos y funciones
Objetivos
En este módulo se desarrollaran los siguientes puntos:

? Procedimientos
? Funciones
? Archivos Include
? Tratamiento de errores
? Alcance de las variables

91
Creando Sitios de Comercio Electrónico

Procedimientos

? Esta constituido por un grupo de instrucciones que realizan una tarea especifica.
? Un Procedimiento no devuelve valores.
? Los procedimientos pueden aceptar argumentos. Los argumentos son variables
que se pueden enviar al procedimiento y utilizarlas para realizar las acciones.
Los procedimientos contienen una serie de comandos o instrucciones en
VBScript, encerrados entre las instrucciones

Sub NombreSubPrograma(parametro1, parametro2)


' Bloque de instrucciones...
End Sub

Ejemplo:

<%
Sub Saludo()
Response.Write "Bienvenido <BR>"
End Sub
%>

<%
'llamamos al procedimiento:
Saludo
%>

Al ejecutar se mostraria:

Bienvenido

El mismo ejemplo pero usando argumentos:

<%
Sub Saludo(nombre)
Response.Write "Bienvenido “ & nombre & “<BR>"
End Sub
%>

<%
'llamamos al procedimiento:
Saludo(“Cesar”)
%>

92
Creando Sitios de Comercio Electrónico

Al ejecutar obtenemos:

Bienvenido Cesar

El procedimiento... generalmente se usa para ejecutar algún código donde no sea


necesario devolver un valor. Su uso correcto simplifica el modulo de programa, asi
como permite la reutlizacion y facilita la depuracion.

93
Creando Sitios de Comercio Electrónico

Funcion de usuario

Esta constituido por un grupo de instrucciones que realizan una tarea especifica.
Una función de usuario devuelve valores.

Function NombreFuncion(parametro1, parametro2)


' Bloque de instrucciones
NombreFuncion = "valor retornado"
End Function

NOTA:
Para devolver un valor en una función, debe asignar el valor que se desea devolver
al nombre de la función.

Ejemplo:

Function ChequeaEspacio(x)
If InStr(x,"")> 0 Then
ChequeaEspacio = True
Else
ChequeaEspacio = False
End If
End Function

La funcion recibe un parametro; una cadena. Luego evalua si la cadena es vacia.

La función de usuario... ademas de ejecutar un bloque de instrucciones, puede


determinar un resultado y devolver al programa dicho resultado.

Destino.htm

<HEAD>
</HEAD>
<BODY>

<FORM ACTION = "Presupuesto.asp" METHOD = post>


Seleccione la localización: <BR>
<SELECT NAME="localizacion">
<OPTION VALUE="Lima">Lima</OPTION>
<OPTION VALUE="Provincia">Provincia</OPTION>
</SELECT>
<BR><BR>
<INPUT TYPE = submit>
</FORM>
</BODY>

94
Creando Sitios de Comercio Electrónico

Presupuesto.asp

<HEAD>
</HEAD>
<BODY>
<%
Function CostoLima(NumDias)
varHotel = NumDias*175
varViaticos = NumDias*75
varTransporte = 85
CostoLima = varHotel +varViaticos+varTransporte
End Function

Function CostoProvincia(NumDias)
varHotel= NumDias*85
varTaxi = NumDias*45
varViaticos = NumDias*75
CostoProvincia = varHotel +varTaxi + varViaticos
End Function

varUbicacion=Request.Form("localizacion")
%>

<H3>Presupuesto para <%=varUbicacion%>.<BR>


costo estimado:</H3>
<%
Select Case (varUbicacion)
Case "Lima"
varCosto = CostoLima(2)
Response.Write "por dos dias S/. " & varCosto & "<br>"
varCosto = CostoLima (4)
Response.Write "por cuatro dias S/. " & varCosto & "<br>"
varCosto = CostoLima (6)
Response.Write "por seis dias S/. " & varCosto & "<br>"
Case "Provincia"
varCosto = CostoProvincia(2)
Response.Write "por dos dias S/. " & varCosto & "<br>"
varCosto = CostoProvincia (4)
Response.Write "por cuatro dias S/. " & varCosto & "<br>"
varCosto = CostoProvincia (6)
Response.Write "por seis dias S/. " & varCosto & "<br>"
End Select
%>
</BODY>

95
Creando Sitios de Comercio Electrónico

Usando archivos Include


Cuando se ha escrito un grupo de líneas de código que realiza una tarea específica,
y éstas deben ejecutarse en distintas partes de una aplicación, la solución es
encapsular el codigo. Es decir poner pedazos del código reuseable en funciones o
procedimientos para que éstos puedan reusarse en un archivo por separado.

Por otra parte con esto obtiene la ventaja de simplificar el codigo.

Hay dos tipos de Include: virtual y absoluto. Cada uno se demuestra debajo:

Virtual:

<!--#include virtual =" /includes/common.asp"-->

Absoluto:

<!--#include file = "d:\inetpub\wwwroot\includes\common.asp"-->

¿Cuál es mejor? Puede ser el virtual. Si el archivo Include se mueve a otro website,
o servidor y se mantiene la misma ruta, no inmplica modificaciones en el codigo de
mi programa.

Recuerde poner este código al iniio y fuera de los bloques ASP.

Creamos el archivo menu.asp con el menu. En nuestro ejemplo un "menu"


horizontal para el comienzo de una página cualquiera.

General.asp

<%
'Abrimos un Sub.
Sub menu
%>
<TABLE BORDER="0" ALIGN="center" WIDTH="90%">
<TR>
<TD>Home Page</TD>
<TD>Ejemplos</TD>
<TD>Historia>/TD>
<TD>Contactate</TD>
</TR>
</TABLE>
<%
'Cerramos el Sub.
End Sub
%>

96
Creando Sitios de Comercio Electrónico

HomePage.asp

<!-- #include file="general.asp" -->


<%
'Llamamos al Sub.
Call Menu
%>
Resto de la página general.asp

Ejemplos.asp

<!-- #include file="general.asp" -->


<%
'Llamamos al Sub.
Call Menu
%>
Resto de la página de ejemplos.

¿Qué logramos con esto?

La cosa más importante es que cuando modificamos el archivo general.asp,


cambiaran todas las páginas. Es lógico, ya que todas llaman a ese archivo.
Entonces cuando necesitemos cambiar algo en el menu, sólo tenemos que cambiar
una página y no todas.

Sub y Call:

Habrán visto que en el archivo general.asp se abría un Sub llamado menu y luego
se cerraba. Podemos crear varios Sub en el mismo archivo y luego llamar a cada
uno por separado con la instrucción Call. Después de Call se debe poner el nombre
de la Sub. Fijense bien como se usa y ahorrarán lineas y lineas de código.

Algo muy importante:

Si no usamos los Subs, también se puede llamar al archivo directamente con la


línea de #Include Virtual, pero no se podría usar código ASP en el archivo llamado.
Lo que quiero decir es que si no usamos Subs, no pueden escribir ASP, en cambio si
creamos un Sub si podremos.

Consejos de seguridad

Por un tema de seguridad, no es recomendable poner la extensión .inc a los


archivos que vamos a incluir, ya que en estos podemos incluir código ASP cómo
conexiones a bases de datos o cualquier otra información que no queremos que
nadie vea, los archivos .inc son puro texto, es decir, que pueden ser bajados del
sitio en forma directa y ver todo el código por el cual está compuesto. Por eso la
mayoría utilizamos la extensión .asp que nunca va a tener este problema.

97
Creando Sitios de Comercio Electrónico

Forzando el termino de un procedimiento o funcion


Usando el termino End se puede forzar el termino una funcion o procedimiento

Ejemplo:

<%
Function Cuadrado(numero)
If numero <= 0 Then
Cuadrado –1
End Function
Else
Cuadrado = numero * numero
End If
End Function

Rpta = Cuadrado(3)
If Rpta = -1 Then
Response write (“No acepta valores negativos”)
Else
Response write (“El cuadrado de 3 es ”& Rpta)
Endif
%>

98
Creando Sitios de Comercio Electrónico

Tratamiento de errores
Cuando se genera un error, los datos del error de almacenan en el objeto Err, asi
se deseamos ver el error, podemos usar:

If Err.Number> 0 Then
' tratamiento en caso de error
End If

Podemos forzar a que ocurra un error, por ejemplo:

aLista = Array("uno", "dos", "tres")


Response.Write ("Elemento 3 es" & aLista(3) &" < br>")

Provocaria el error:

Microsoft el VBScript runtime error ' 800a0009 '


El subíndice fuera de rango: ' [el número: 3] '
/test.asp, line 2

Podemos presentar un mensaje de error, personalizado de la forma siguiente:

aLista = Array("uno", "dos", "tres")


Response.Write ("Elemento 3 es" & aLista(3) &" < br>")

If Err.Number> 0 Then
Response.Write ("Error #" & Err.Number &" < br>")
Response.Write ("Fuente del Error: " & Err.Source &" < br>")
Response.Write ("Descripción del Error: " & Err.Description &" < br>")
End If

El resultado:

Error #9
La Fuente del error: Microsoft el VBScript runtime error
La Descripción del error: El subíndice fuera de rango

El resultado es más fácil de leer. Puede aplicar esto a cualquier código que escriba.
De esta manera podemos ayudar a explicar mejor el error a los usuarios.

99
Creando Sitios de Comercio Electrónico

Alcance de las variables

Variables Locales
? Toda variable declarada en una funcion o procedimiento es de tipo Local.
? Una variable local conserva su valor solo dentro de la funcion o procedimiento

Ejemplo:

<HEAD>
</HEAD>

<BODY>

<%
Sub Procedure_1
strCadena = "Esta es una frase"
Response.Write strCadena
End Sub

Sub Procedure_2
strCadena = "Esta es una frase distinta"
Response.Write strCadena
End Sub
%>

<P> Ejecutando Procedure 1...<I><%Procedure_1()%></I></P>


<P> Ejecutando Procedure 2...<I><%Procedure_2()%></I></P>
<P> Ejecutando Procedure 1...<I><%Procedure_1()%></I></P>
</BODY>

100
Creando Sitios de Comercio Electrónico

Variables Globales
Si se desea preservar el valor de una variable, debe declararla al inicio del modulo,
fuera de cualquier funcion o precedimiento.

<HEAD>
</HEAD>

<BODY>
<%
strCadena = "Esta es la frase inicial"
Response.Write strCadena

Sub Procedure_1
strCadena = "Esta es una frase"
Response.Write strCadena
End Sub

Sub Procedure_2
strCadena = "Esta es una frase distinta"
Response.Write strCadena
End Sub
%>

<P> Llamando Procedure 1 ...<I><%Procedure_1()%></I></P>


<P> Llamando Procedure 2 ...<I><%Procedure_2()%></I></P>
<P> Llamando Procedure 1 ...<I><%Procedure_1()%></I></P>
</BODY>

101
Creando Sitios de Comercio Electrónico

Los objetos Session y Application


Objetivos
En este módulo se desarrollaran los siguientes puntos:

? Tratamiento de sesiones
? Manejo de aplicaciones
? Archivos Include
? Tratamiento de errores
Alcance de las variables

102
Creando Sitios de Comercio Electrónico

El Objeto Session
El objeto Session es, un objeto intrínseco de ASP (que no tenemos que crear o
instanciar) que almacena el estado a nivel de usuario. A cada usuario se le es
asignado un objeto Session. Puesto que cada usuario tiene su propio objeto, su
propio conjunto de datos puede ser mantenido.

Una sesión empieza cuando el usuario ingresa a su website. Una sesión ha acabado
cuando un usuario cierra el navegador o cuando ésta espira a un determinado
tiempo.

Hay dos propiedades en el Objeto Session:

Session.SessionID:

Devuelve un identificador único de la sesión.

Session.TimeOut

Indica la cantidad de tiempo que durará una sesión. Es el tiempo, en minutos,


durante el cual sus variables de sesión serán accesibles. A menos que el usuario
cierra su navegador, entonces todas las variables de la sesión se limpiarán

Podemos ver el ID de sesión de un usuario, escribiendo este código:

Response.Write(Session.SessionID)

El servidor Web garantiza que este valor es único para cada visitante mientras esté
corriendo. Sin embargo, si el servidor es reiniciado ya no se puede garantizar que
siga siendo único para cada visitante que hayamos tenido en la vida de nuestro
sitio Web. Puesto que el contenido de cada objeto Session de cada visitante se
guarda en la memoria del servidor, éste tiene que poder recuperarla eliminando las
sesiones de los visitantes que han abandonado el sitio. Esto se consigue de dos
formas: la primera, automática, cuando caduca el tiempo de sesión (Session
TimeOut) que tiene un valor por defecto (20 minutos históricamente) y que
representa el tiempo que ha estado el usuario sin hacer ninguna petición (supone
que tras 20 minutos sin pedir ninguna página, se habrá ido a otro sitio); la
segunda, llamando desde una página ASP al método Abandon del objeto Session,
así:

<% Session.Abandon %>

El tiempo de sesión puede cambiarse, bien para todo el sitio Web desde el
Administrador de IIS, o bien para una única sesión, especificándolo en una página
ASP así:

<% Session.TimeOut = 5 %>

103
Creando Sitios de Comercio Electrónico

El valor por defecto para el Session.TimeOut es 30 minutos.

Las Variables de sesión le permitirá asignar un valor en una variable en una página
y poder usarla en otra página. Un ejemplo de su uso, seria que mantener en una
variable el Id del visitante, asi si desea ingresar a otra pagina simplemente
verificamos si inicio una sesion, y no tener que pedir que escriba su username y
contraseña nuevamente.

Para crear una variable de sesion usamos:

<%
Session("Nombre") = "Carlos"
%>

Y para recuperar el valor, utilizamos:

<%
Dim nombre
nombre = Session("Nombre")
%>

Ejemplo:

fechahora.asp

<% Response.Write("<p>Hola visitante")


'Si ha elegido no mostrar la hora le presento la opcion para
volver a hacerlo
if Session("noHora") = True then
Response.Write("<a href=""nohora.asp"">Mostrar la
hora</a>")
else
'le muestro la hora
Response.Write("<p>Son las " & Time & ".<br>")
'Le permito ocultar la hora
Response.Write("<a href=""nohora.asp"">Ocultar la
hora</a><br>")
end if
Response.Write("Hoy es " & Date() & ".<br>") %>

Veamos el código de nohora.asp:


<% 'Invierto el valor de Session("noHora")
if Session("noHora") = True then
Session("noHora") = False
else
Session("noHora") = True
end if
Response.Redirect("fechahora.asp") %>

104
Creando Sitios de Comercio Electrónico

Ejercicio
Diseñe una pagina que solicite los datos de usuario, los guarde en una variable
sesion, para luego poder ser usadas en alguna consulta

Desventajas
? Evite el uso excesivo de variables de sesion, ya que puede bajar el rendimiento
del servidor.
? No usarla para almacenar datos: por cada visitante que entra el sitio web recibe
su objeto Session personal. Los objetos ocupan una gran cantidad de memoria
del servidor. Almacenarlos en una variable de sesión significa que rápidamente
el servidor se va a quedar sin memoria y va a correr mucho más lentamente
? Otro de los errores más comunes es guardar en variables de sesión cosas que
no son específicas para cada usuario, como cadenas de conexión a bases de
datos, algún HTML que imprimimos siempre, como pie de página... Las variables
de sesión no están pensadas para eso.

105
Creando Sitios de Comercio Electrónico

El objeto Application
? El objeto Application, es único para todo el sitio Web.
? Todos los visitantes comparten el mismo objeto Application.
? El objeto Application se usa para compartir la información con todos los usuarios
de su aplicación.
? Una Variable de la Aplicación, es accesible a lo largo de la aplicación.

El objeto Application, se guardan en la memoria del servidor Web. Esto significa


que si lo cargamos mucho, el servidor comenzará a ver su rendimiento degradado.

Los fragmentos de información que guardamos en este objeto se llaman variables


de aplicación (application variables) y se leen y escriben de la forma siguiente:

<% Application("var") = valor


variable = Application("var") %>

Un caso donde podria usarse el Objeto Application, seria para guardar la direccion
web de la aplicación. Por ejemplo si la aplicación se esta desarrollando y hay
necesidad de modificar continuamente el site, simplemente modificariamos la
direccion almacenada en la variable redireccionandola hacia otro lugar sin
necesidad de detener la aplicación.

Aquí un ejemplo de cómo definir una variable de Aplicación:

Application("urlEureka ") = "http://www.servidor1.com/eureka/index.htm"

Puede llamarse a la variable, por ejemplo para incluirse como parte de un


hipervinculo:

<A HREF =" <% =Application ("urlEureka")%>" >Pagina Principal:


EUREKA!</A>

Otro caso donde podria usarse una variable Application seria para almacenar la
acdena de conexión a la Base de Datos:

Application("ConnStr") = "DRIVER={Microsoft Access (* .mdb)}


;DBQ=C:\path\miBD.mdb";

Para abrir la Base de Datos, luego se usaria:

Cn.Open Application("ConnStr")

106
Creando Sitios de Comercio Electrónico

Suele almacenarse tambien en Variables de la Aplicación información normalmente


usada (los path, el url común, etc).

El contenido del objeto Application es global, y compartido por todos los usuarios
del sitio Web, por tanto podria ocurrir un problema de concurrencia.

Veamos el siguiente caso: tenemos una página ASP que suma 1 a una variable de
aplicación, y otra que resta 1 a la misma variable.

Esta es la primera:

<% Application("Num") = Application("Num") + 1 %>

Y esta la segunda:

<% Application("Num") = Application("Num") - 1 %>

Supongamos que dos visitantes visitan a la vez la primera página. En teoría,


debería aumentarse en 2 el número, pero si lo hacen exactamente a la vez, no
podemos garantizar que no lean el mismo valor, sumen 1 y por tanto sólo se sume
1 al final. Peor aún, podría llegar otro visitante a la página que resta exactamente
al mismo tiempo, restar 1 y que se quede como está.

Solucion: usar los métodos del objeto Application: Lock y Unlock (cerrar y abrir).
Estos dos métodos simplemente digamos que restringen el uso del objeto
Application en ese momento.

<%
Application.Lock
Application("Num") = Application("Num") + 1
Application.Unlock
%>

Desventajas
Evita guardar objetos en variables de aplicación. Además de ocupar mucha
memoria, casi nunca ofrecen el supuesto incremento del rendimiento que en
principio puede parecer.

El único escenario en que es más lógico utilizar una variable de aplicación es aquel
en que lo que guardamos sea susceptible de cambiar muy a menudo, como el
número de visitantes, o la fecha del último mensaje en un foro, etc

107
Creando Sitios de Comercio Electrónico

El archivo Global.asa
Este archivo debe colocarse en el directorio raíz de publicación Web. Así, cuando el
servidor sea iniciado, el evento Application_OnStart se dispara y el código que
escribamos en su procedimiento correspondiente se ejecuta. Cuando un nuevo
visitante llega al sitio Web, el evento Session_OnStart se dispara y su código se
ejecuta. Cuando la sesión de cada visitante termina, Session_OnEnd se dispara y el
código escrito en ese procedimiento se ejecuta. Por último, cuando el servidor Web
es detenido o reiniciado, Application_OnEnd se ejecuta.

¿Para qué utilizamos GLOBAL.ASA? Los eventos de inicio (los OnStart) deben
utilizarse para inicializar las variables de sesión y aplicación que pretendamos
utilizar. Así mismo, los eventos de fin (los OnEnd) deben utilizarse para limpiar
estas variables.

Ejemplo: Contador de visitas

Global.asa

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">


Sub Application_OnStart
Application.Lock
Application("Activos") = 0
Application.Unlock
End Sub

Sub Session_OnStart
Application.Lock
Application("Activos") = Application("Activos") + 1
Application.Unlock
End Sub

Sub Session_OnEnd
Application.Lock
Application("Activos") = Application("Activos") - 1
Application.Unlock
End Sub

Sub Application_OnEnd
'Cualquier código
End Sub
</SCRIPT>

¿Por qué funciona esto? Muy sencillo: cuando el servidor Web es iniciado (o el
archivo GLOBAL.ASA es añadido), el primer Sub se ejecuta y la variable de
aplicación Activos se inicializa a cero. Cada vez que un nuevo visitante entra en la
Web, Session_OnEnd se ejecuta y, utilizando Lock y Unlock para garantizar la
atomicidad, se suma 1 a la variable. Cuando el tiempo de sesión de cada visitante
termina, Session_OnEnd se ejecuta y se resta uno de la variable. De esta forma,
podemos imprimir en cualquier página el número aproximado de usuarios que están
en ese momento en el sitio Web así:

108
Creando Sitios de Comercio Electrónico

Response.Write("Hay " & Application("Activos") & " usuarios


activos.")

Se ha visto que los objetos Session y Application como un buen lugar para
mantener datos que utilicemos multitud de veces a lo largo del sitio Web.

Siguiendo esta lógica de pensamiento, muchos desarrolladores tienden a pensar


que almacenar, por ejemplo, un objeto Connection para que todas las páginas lo
utilicen aumentará mucho el rendimiento. Vamos a ver por qué no es así.

Contador de visitas a nuestra aplicación

utilizaremos para llevar el control de visitas una variable del objeto application.
Esta variable la inicializaremos a cero en global.asa cuando iniciemos la aplicación
(application_onstart) y la iremos incrementando en uno cada vez que un nuevo
visitante entre en la aplicación , capturaremos esta entrada en el evento
session_onstart tambien en globla asa.

Luego simplemente en nuestras páginas mostraremos el numero almacenado en la


variable de aplicación.

global.asa

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub Application_OnStart
application("visitas")=0
application("fecha")=date()
End Sub

Sub Application_OnEnd

End Sub

Sub Session_OnStart
application.lock
application("visitas")=application("visitas")+1
application.unlock
End Sub

Sub Session_OnEnd

End Sub

</SCRIPT>

109
Creando Sitios de Comercio Electrónico

mipagina.asp

Eres el visitante nº :<%=application("visitas")%>


desde el dia <%=application("fecha")%>

El uso correcto
La forma más efectiva de trabajar con bases de datos es usando JIT activation (Just
In Time activation) o activación justo en el momento, y ASAP Deactivation (As Soon
As Posible Deactivation) o desactivación tan pronto como sea posible. Esto significa
que no debemos crear (Server.CreateObject) y utilizar componentes hasta que los
necesitemos, y debemos cerrarlos y destruirlos (set obj = nothing) tan pronto como
hayamos terminado con ellos y no al final de la página ASP siempre.

De esta forma, las reservas de objetos funcionarán de forma óptima y nuestro


servidor Web tendrá memoria disponible para atender peticiones al no tener objetos
en variables de sesión o aplicación.

Lo que sí se puede hacer es almacenar la cadena de conexión a la base de datos en


una variable de aplicación, y utilizarla para conectaros. Como es texto simple no
daña el rendimiento y las páginas se simplifican mucho. Añadimos la inicialización
al archivo GLOBAL.ASA y ya está.

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">


Sub Application_OnStart
Application("CadenaConexion") = ”DSN=… ; UID=… ; PWD=..."
End Sub
</SCRIPT>

En cualquier página en que necesitemos conectarnos, escribimos:

<%
Dim oConn, rs, SQL
set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open Application("CadenaConexion")
oConn.Close
set oConn = nothing
%>

Ejemplo:

Diseñando un chat

110
Creando Sitios de Comercio Electrónico

Tratamiento de Bases de Datos


Objetivos
En este módulo se desarrollaran los siguientes puntos:

? La tecnologia ADO OLEDB


? Los objetos ADO
? Conexion
? Manejo de resultados
? Transact SQL

111
Creando Sitios de Comercio Electrónico

Acceso a Base de Datos

ADO OLEDB
Presenta tres componentes
Proveedores de datos
(Data Providers)

Receptores de Datos
(Data Consumers)

Componentes de Servicio
(Service Components)

Objetos ADO
Consta de tres componentes principales:

el objeto Connection,
el objeto Command y
el objeto RecordSet

112
Creando Sitios de Comercio Electrónico

La Conexión
La conexion con DSN es la más cómoda, pero sólo se puede utilizar si tenemos
acceso al Panel de Control del Servidor.

Si simplemente estamos aprendiendo ASP y usamos el PWS (Personal Web Server)


o el IIS 4 de NT tambien disponemos de esta comodidad.

Veamos como se realiza la conexion a una base de datos de Microsoft Access:

? Creamos nuestra base de Datos en Microsoft Access y la guardamos.


? Luego en el Panel de Control ubicamos el icono Fuentes de Datos ODBC
? En la solapa DSN de Sistema presionamos el boton Agregar.
? Luego seleccionamos Microsoft Access Driver (*.mdb) y presionamos Finalizar.
? Ahora se hará la conexión ODBC, presionamos el boton Seleccionar y elegimos
nuestra Base de Datos e ingresamos el nombre de la base en el primer campo.
Por último el boton Aceptar

Si todo salió bien debería aparecer el nombre de nuestra Base de Datos en la


solapa DSN de Sistema y ya tendremos hecha nuestra conexion ODBC.

Ahora debemos conectar la base de datos en la pagina ASP

<%
'Definimos la variable para la conexión.
Dim cn
Set cn = Server.CreateObject ("ADODB.Connection")

'Ya estamos conectados a nuestra base de datos.


cn.Open "DSN=NombreDSN"

'aqui abrimos la tabla. ...


%>

Como se ve es muy facil. Sin embargo si vamos a optar por un servicio de hosting,
debemos averiguar si alli podemos crear un DSN en todo caso debera obtarse por
otra alternativa de conexion.

113
Creando Sitios de Comercio Electrónico

Conexión sin DSN


En este caso debemos usar una cadena de conexión, cabe señalar que ésta es la
forma mas directa de acceder a una Base de Datos, nos permite asi mismo acceder
de forma mas directa a los distintos elementos de la Base de Datos y por cierto es
mas rápido y seguro que una conexión basada en un DSN. La mayoria de los
servicios de hosting sugieren el uso de cadenas de conexión.

Veamos las distintas cadenas de conexión para diferentes modelos de Base de


Datos:

Para Access usando ODBC:

<%
Dim Cn
'Creamos el objeto de conexion ahora...
Set Cn = Server.CreateObject ("ADODB.Connection")
Cn.open "DRIVER={Microsoft Access Driver (*.mdb)};
DBQ=C:\misitio\db\miBase.mdb;"
%>

Para Access 97 usando OLEDB:

<%
Dim Cn
'Creamos el objeto de conexion ahora...
Set Cn = Server.CreateObject ("ADODB.Connection")
Cn.Open "Provider=Microsoft.Jet.OLEDB.3.51; Data
Source=C:\misitio\db\miBase.mdb;"
%>

Para Access 2000 usando OLEDB:

<%
Dim Cn
'Creamos el objeto de conexion ahora...
Set Cn = Server.CreateObject ("ADODB.Connection")
Cn.open "Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=C:\misitio\db\miBase.mdb;"
%>

114
Creando Sitios de Comercio Electrónico

Para SQL Sever:

<%
Dim Cn
'Creamos el objeto de conexion ahora...
Set Cn = Server.CreateObject ("ADODB.Connection")
Cn.Open "driver={SQL Server};server=miServidor; database=miBase;
uid=sa;pwd="
%>

Para ORACLE

<%
Dim Cn As New ADODB.Connection
Dim cadena As String
cadena = "Driver={Microsoft ODBC Driver for Oracle};" & _
"Server=miServidor; Uid=Usuario; Pwd=Clave"
con.Open cadena
%>

En los 3 primeros ejemplos, referidos todos a conexiones con bases de datos


Access, se ha usado un path fijo. Generalmente se hace uso de la funcion
Server.MapPath() la cual devuelve el path donde ejecutamos el script:

<%
Dim path
'guardamos en la variable path lo que devuelve la función
path = Server.MapPath("./")
Response.Write path
%>

El código ejecutado, muestra el contenido de la variable path

C:\InetPub\WWWRoot\directorio_actual

Como ven la variable path contiene el directorio donde se ejecuta el script.


Entonces esto se podría usar para indicar el path a la base de datos.

115
Creando Sitios de Comercio Electrónico

Asegurando la Base de Datos


¿Cómo impedir que extraños puedan bajarse nuestra Base de Datos simplemente
tecleando el url? Una alternativa sería asociandole una contraseña.

Si la Base de Datos tiene asignada una contraseña, deberá agregar


"PWD=miPassword" a la cadena de conexión:

<%
Dim Cn, cadena
'Creamos el objeto de conexion ahora...
Set Cn = Server.CreateObject ("ADODB.Connection")
cadena = "DRIVER={Microsoft Access Driver (*.mdb)}";
cadena = cadena & Server.MapPath("./") & "miBase.mdb";
cadena = cadena & "PWD=miPassword"
Cn.Open(cadena)
%>

116
Creando Sitios de Comercio Electrónico

Manejo de Resultados
Usará el objeto Recordset.
En términos sencillos, un objeto Recordset es una tabla que contiene los datos que
manejará nuestra aplicación ASP. Esta tabla almacena el resultado obtenido por las
consultas realizadas sobre la base de datos a la que nos encontremos conectados
mediante el objeto Connection. Un Recordset se encuentra formado por filas
(registros) y columnas (campos), a las que deberemos hacer referencia para poder
acceder a sus datos.

Tipos de resultado

adOpenForwardOnly 0 Es el cursor por defecto y nos permite recorrer


el Recordset en forma secuencial.

adOpenKeySet 1 Permite movernos hacia delante y atrás.


Permite observar las modificaciones en los
datos del Recordset , no así si existen
ingresos de nuevos registros.

adOpenDynamic 2 Permite movernos en cualquier sentido, viendo


cualquier modificación, ingreso o eliminación
de datos del Recordset.

adOpenStatic 3 Permite movernos en cualquier sentido, pero


no se verá ningún cambio ocurrido en la tabla.

Una de las formas de utilizar un tipo de cursor puede ser la siguiente:

rs.Open SQL, oConn, tipoCursor

Donde rs y oConn corresponden a objetos Recordset y Connection respectivamente,


y SQL corresponde a la sentencia que contendrá la consulta a la base de datos.
Otra forma de definir el tipo de cursor de un Recordset sería utilizando la propiedad
CursorType, de la siguiente forma:

rs.CursorType = tipoCursor

117
Creando Sitios de Comercio Electrónico

Propiedades

BOF y EOF, Indican la posición del registro

RecordCount, Determinar el número de registros que tiene el objeto Recordset

MoveFirst, MoveLast, MoveNext y MovePrevious, Lleva el puntero al primer, último,


siguiente o anterior registro

Ejemplo:

<HEAD>
<TITLE>Acceso a base de datos</TITLE>
</HEAD>
<BODY>
<%
'Abre la conexion con la base de datos
Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open "dsnLista"
'Ejecuta un sentencia SQL de consulta
sql = "SELECT * FROM Usuario"
Set Rs = Cn.Execute(sql)
%>

Lista de Clientes
<BR>
<TABLE>
<TR>
<TD><B>Nombre</B></TD>
<TD><B>Apellidos</B></TD>
</TR>
<%
'Recorre todas las filas del resultado
Do While Not Rs.EOF
' Muestra la fila actual
Response.Write("<TR>")
Response.Write("<TD>" & Rs("Nombre") & "</TD>")
Response.Write("<TD>" & Rs("Direccion") & "</TD>")
Response.Write("</TR>")
'Pasa a la siguiente fila
Rs.MoveNext
Loop
'Libera variables de memoria
Rs.Close
Set Rs = Nothing
Cn.Close
Set Cn = Nothing
%>
</TABLE>
</BODY>

118
Creando Sitios de Comercio Electrónico

Instrucciones SQL
Generando consultas
La instrucción que permite recuperar información de una Base de Datos se llama
SELECT. La sintaxis más breve es la siguiente:

SELECT * FROM tabla


[WHERE condición]

El símbolo asterisco, señala que se recuperarán todos los campos de la tabla, por
ejemplo para recuperar los datos de todos las ciudades anotaríamos:

SELECT * FROM Ciudad

La selección de todas las columnas no es muy adecuada debido a que


innecesariamente se estaría procesando campos. Estas dificultades pueden evitarse
si se precisa los campos necesarios en la orden SELECT, para esto contamos con la
sintaxis siguiente:

SELECT campos FROM tablas


[WHERE condición]

Las columnas resultado de la sentencia SELECT por lo general son campos, aunque
también puede ser: una constante, especificando que el mismo valor constante va a
aparecer en todas las filas de los resultados de la consulta o una expresión SQL,
indicando la orden SQL que debe calcular el valor a colocar en los resultados, según
el estilo especificado por la expresión. Por ejemplo si sólo se requiere el nombre y
el Id de cada Vendedor, anotaría:

SELECT IdReserva, Fecha FROM Reserva

Veamos un ejemplo, donde se transfiere el contenido de un campo a una lista


desplegable:

<Select Name="Ciudad">
<%Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open "DSN=Pruebas"
SQL = "SELECT * FROM Ciudad"
Set rs = Cn.Execute(SQL)
While Not rs.EOF %>
<option
value="<%=rs("IdCiudad")%>"><%=rs("NomCiudad")%>

119
Creando Sitios de Comercio Electrónico

</option>
<%
rs.MoveNext
Wend
rs.Close
%>
</Select>

120
Creando Sitios de Comercio Electrónico

Creación de expresiones
Las expresiones se utilizan para calcular valores que son de una base de datos y
para calcular valores utilizados en la búsqueda de la base de datos. Por ejemplo
para mostrar el Id de un Articulo y el precio venta mas IGV, anotaría:

SELECT IdArticulo, PreVenta*1.18 FROM Articulo

Puede crear expresiones haciendo uso de cualquiera de las siguientes cuatro


operaciones aritméticas: suma (X+Y), resta (X-Y), multiplicación (X*Y) y
división(X/Y). También pueden utilizar paréntesis para formar expresiones más
complicadas, como la siguiente: (PreVenta * 1.18) - (Factor / 0.5). En este caso,
los paréntesis no son necesarios, ya que la multiplicación y la división tienen una
precedencia superior a la suma y la resta. Sin embargo, deberían utilizarse siempre
paréntesis para lograr que las expresiones no sean ambiguas. Además los
paréntesis incrementa la legibilidad de la sentencia y hacen que sea más fácil de
mantener.

121
Creando Sitios de Comercio Electrónico

Usando funciones
También puede incluir funciones en la construcción de expresiones, por ejemplo
para mostrar el número de comprobante y el mes de las ventas realizadas hoy:

SELECT IdReserva, DATENAME(month, Fecha)


FROM Reserva
WHERE Fecha = GETDATE()

Cuando se incluye columnas calculadas en un resultado, conviene asignarle un


nombre, asi podremos llamarlo desde nuestro programa

SELECT IdReserva, Mes=DATENAME(month, Fecha)


FROM Reserva
WHERE Fecha = GETDATE()

Las funciones internas también suelen utilizarse para reformatear los datos. Por
ejemplo, podemos mostrar el igv de las ventas con redondeo a una cifra decimal:

SELECT IdReserva, IGV = STR(ROUND(SubTotal*0.18,1),7,1)


FROM Reserva

La siguiente instrucción muestra la diferencia en meses de la fecha de venta


respecto a la fecha actual:

SELECT Fecha, dias = DATEDIFF(month, Fecha, GETDATE())


FROM Reserva

Aquí tenemos una consulta donde se muestra la fecha incrementado en 2 días

SELECT Fecha,
en_dos_dias=DATEADD(day, 2, Fecha)
FROM Reserva

Ahora se muestra la fecha en caracteres:

SELECT Fecha,
en_letras = DATENAME(dw, Fecha)+','
+ STR(DATEPART(dd, Fecha),2)+
' de ' + DATENAME(mm, Fecha)+
' de '+ STR(DATEPART(yy, Fecha),4)
FROM Reserva

122
Creando Sitios de Comercio Electrónico

Falta de datos
Puesto que una Base de Datos es generalmente un modelo de una situación del
mundo real, ciertos datos pueden inevitablemente faltar, ser desconocidos o no ser
aplicables. Suponga que al emitir una Reserva no se insertó la fecha, la Reserva
quedaría registrado, pero la columna Fecha quedaría vacío, aquí es donde podemos
aplicar el valor nulo.

Un valor nulo es un indicador que nos indica que el dato falta o no es aplicable. Por
conveniencia, un dato que falta normalmente se dice que tiene el valor NULL, pero
el valor NULL no es un valor de dato real como 0 o “”. En vez de ello, es una señal,
o un recordatorio de que el valor de datos falta o es desconocido.

SELECT *
FROM Reserva
WHERE Fecha ISNULL()

Como averiguar si un campo es nulo?

Si se prueba con averiguar la longitud de la variable (Len <1) provcar un erro.


Si se prueba con averiguar si el dato = “”tambien generara un error
Si intenta convertir una variable nula a a cadena con CStr () usted conseguirá el
error siguiente:

Microsoft el VBScript runtime error ' 800a005e '


El uso inválido de Nulo: ' CStr'
/path/file.asp, linee 55

Lo cual puede generar confusion, que hacer?, puede usar la funcion isNull()

Veamos un ejemplo:

strCiudad = rs(“Ciudad”)
If IsNull(strCiudad) Then
strCiudad =""
Else
strCiudad = Trim(strCiudad)
If Len(strCiudad) <1 Then
strCiudad =""
End If
End If
If strCiudad ="" Then
Response.write(“No ingreso Ciudad”)
Else
Response.write(“Ciudad ” % strCiudad)
End If

123
Creando Sitios de Comercio Electrónico

Condicionando el resultado

SELECT campos FROM tabla WHERE condición

La cláusula WHERE incluye una condición de búsqueda que especifica las filas a
recuperar. Conceptualmente, SQL recorre cada fila de la tabla, una a una, y aplica
la condición de búsqueda a la fila. Cuando aparece un nombre de columna en la
condición de búsqueda. Por cada fila, la condición de búsqueda puede producir uno
de tres resultados:

? Si la condición de búsqueda es TRUE (Verdadera), la fila se incluye en los


resultados de la consulta.
? Si la condición de búsqueda es FALSE (Falsa), la fila se excluye de los resultados
de la consulta.
? Si la condición de búsqueda tiene un valor NULL(desconocido), la fila se excluye
de los resultados de la consulta.

Básicamente, la condición de búsqueda actúa como un filtro para las filas de la


tabla. Las filas que satisfacen la condición de búsqueda atraviesan el filtro y forman
parte de los resultados de la consulta. Las filas que no satisfacen la condición de
búsqueda son atrapadas por el filtro y quedan excluidas de los resultados de la
consulta.

Por ejemplo para obtener la lista de artículo con precio menor a 100 soles
anotaríamos:

SELECT DesArticulo, PreVenta FROM Articulo


WHERE PreVenta<100

Los operadores que se pueden usar para especificar la condición son:

=, <, >, SQL calcula y compara los valores de dos expresiones SQL por cada fila
>=, >=, de datos. Las expresiones pueden ser tan simples como un nombre de
<>, !=, columna o una constante, o pueden ser expresiones aritméticas más
!<, !> complejas.

BETWEEN Examina si el valor de una expresión cae dentro de un rango


especificado de valores

IN Comprueba si el valor de una expresión se corresponde con uno de un


conjunto de valores

LIKE Comprueba si el valor de una columna que contiene datos de cadena


de caracteres se corresponde a un patrón especificado

ISNULL Comprueba si una columna tiene un valor NULL

AND Y lógico
OR O lógico
NOT Negación

124
Creando Sitios de Comercio Electrónico

Si la comparación se da en una tabla primaria y la condición se aplica a la columna


que es una clave primaria, el test aísla una sola fila de la tabla, produciendo una
sola fila de resultados, por ejemplo: recupera los datos del Vendedor con Id
“V00005”:

SELECT IdVendedor, NomVendedor FROM Vendedor


WHERE IdVendedor = 'V00005'

Este tipo de consulta es el fundamento de los programas de recuperación de base


de datos basadas en formularios. El usuario introduce un número de cliente en el
formulario, y el programa utiliza el número para construir y ejecutar una consulta.
Luego visualiza los datos recuperados en el formulario.

Muestra los Id de los Vendedores que han emitido documentos antes del
06/01/2000

SELECT IdVendedor, Fecha


FROM Documento
WHERE fecha <= ? 06/01/2000?

Una lista de los documentos que no las haya emitido el Vendedor E00005

SELECT IdDocumento, IdVendedor


FROM Documento
WHERE IdVendedor != 'E00005'

Como averiguar si un registro existe

sql = "SELECT * FROM Ciudad Where Id= '001"


RS = Conn.Execute(sql)

' Haga esta prueba


If RS.BOF and RS.EOF Then
' Ningún archivo fue vuelto
Else
' La vuelta a través de para mostrar los archivos
End If

125
Creando Sitios de Comercio Electrónico

Caracteres comodín
En el parámetro LIKE puede incorporar caracteres comodín que sustituyan a un
caracter o a grupo de ellos, estos son:

% Sustituyen a un grupo de caracteres

_ (subrayado) Sustituye un carácter simple

[] Algún carácter de los especificado en un rango

[ˆ] Algún carácter menos el especificado en el rango

Los caracteres comodines pueden aparecer en cualquier lugar de la cadena patrón y


puede haber varios caracteres comodines dentro de una misma cadena.

Para obtener una lista de Vendedores cuyo nombre comience con ‘


L’:

SELECT IdVendedor, NomVendedor


FROM Vendedor
WHERE NomVendedor LIKE 'L%'

Una lista de vendedores donde la inicial del nombre comience con ‘


le’
:

SELECT IdVendedor, NomVendedor


FROM Vendedor
WHERE NomVendedor LIKE 'le%'

Una lista de artículos, donde la cadena ‘


ro’ estada contenida como parte de la
descripción:

SELECT DesArticulo
FROM Articulo
WHERE DesArticulo LIKE '%ro%'

Una lista de vendedores, donde la segunda letra del nombre sea ‘


A’:

SELECT NomVendedor
FROM Vendedor
WHERE NomVendedor LIKE '_A%'

Una lista de Vendedores, donde la primera letra del nombre pueda ser J, K o L y la
segunda ‘ A’:

126
Creando Sitios de Comercio Electrónico

SELECT NomVendedor FROM Vendedor


WHERE NomVendedor LIKE '[JL]A%'

Una lista de Vendedores, donde la primera letra del nombre sea ‘


J’y la segunda no
sea ‘
U’ :

SELECT NomVendedor FROM Vendedor


WHERE NomVendedor LIKE 'J[^U]%'

En algunos casos los resultados de la consulta pueden ser un único valor, como en
el siguiente ejemplo: ¿A cuanto asciende las ventas realizadas por el vendedor
V00005?

SELECT SUM (SubTotal) FROM Documento


WHERE IdVendedor='V00005'

Este resultado sigue siendo una tabla, aunque sólo conste de una fila y una
columna. Finalmente, es posible que una consulta produzca cero filas de resultados,
como en este ejemplo: Liste los artículos cuyo precio sea mayor a S/ 5000

SELECT IdArticulo, DesArticulo FROM Articulo


WHERE PreVenta > 5000

Incluso en esta situación, el resultado de la consulta sigue siendo una tabla. Se


trata de una tabla vacía con dos columnas y cero filas.

127
Creando Sitios de Comercio Electrónico

Evitando filas repetidas


Si una consulta incluye la clave primaria de una tabla en su lista de selección,
entonces cada fila de resultados será única (ya que la clave primaria tiene un valor
diferente en cada fila). Si no se incluye la clave primaria en los resultados, pueden
producirse filas duplicadas. Por ejemplo, supongamos que se hace la siguiente
petición: muestre los Id de los Vendedores que emitieron comprobantes

SELECT IdVendedor
FROM Documento

El resultado tiene filas repetidas ya que hay comprobantes donde figura un


Vendedores mas de una vez. Se pueden eliminar las filas duplicadas de los
resultados de la consulta insertando la palabra clave DISTINCT en la sentencia
SELECT justo antes de la lista de selección. He aquí una versión de la consulta
anterior que produce los resultados deseados:

SELECT DISTINCT IdVendedor


FROM Documento

128
Creando Sitios de Comercio Electrónico

Parámetro de rango (Between)


El parámetro de rango comprueba si un valor de dato se encuentra entre dos
valores especificados.

Observe el siguiente ejemplo: Se desea la lista de comprobantes emitidos entre el


10 de enero al 10 de febrero anotaríamos:

SELECT IdDocumento, Fecha FROM Documento


WHERE Fecha BETWEEN '10/01/2000' AND '10/02/2000'

El parámetro BETWEEN incluye los valores extremos del rango, por ejemplo si el
campo de búsqueda es Fecha, luego de BETWEEN deberá anotar el valor inferior,
luego AND seguido del valor superior.

SELECT IdDocumento, SubTotal


FROM Documento
WHERE SubTotal BETWEEN 1000 AND 2000

Para negar esta expresión sólo debe anteponer el operador NOT a BETWEEN, por
ejemplo:

SELECT IdDocumento, SubTotal


FROM Documento
WHERE SubTotal NOT BETWEEN 1000 AND 2000

La expresión especificada en BETWEEN puede ser cualquier expresión SQL válida,


pero en la práctica generalmente es tan sólo un nombre de columna, como en los
ejemplos anteriores.

Para el caso de campos que contienen valores NULL, se define las siguientes reglas
en la cláusula BETWEEN:

? Si la expresión de la condición produce un valor NULL, o si ambas expresiones


definitorias del rango producen valores NULL, la condición BETWEEN devuelve
un resultado NULL.
? Si la expresión que define el extremo inferior del rango produce un valor NULL,
la condición BETWEEN devuelve FALSE si el valor de la condición es superior al
límite superior, y NULL en caso contrario.
? Si la expresión que define el extremo superior del rango produce un valor NULL,
la condición BETWEEN devuelve FALSE si el valor de la condición es menor que
el límite inferior, y NULL en caso contrario.

129
Creando Sitios de Comercio Electrónico

Parámetro de pertenencia (IN)


Examina si un valor de dato coincide con uno de una lista de valores objetivo. Vea
los siguientes ejemplos:

Lista los comprobantes emitidos por los Vendedores V00004 y V00002

SELECT IdDocumento, IdVendedor


FROM Documento
WHERE IdVendedor IN ('V00004','V00002')

Halla todos los comprobantes emitidos un lunes, miercoles o viernes.

SELECT IdDocumento, Fecha, DATENAME(dw,Fecha)


FROM Documento
WHERE DATEPART(dw,Fecha) IN (1,3,5)

Se puede comprobar si el valor del dato no corresponde a ninguno de los valores


objetivos utilizando la forma NOT IN del test de pertenencia a conjunto. La
expresión condición indicada en IN puede ser cualquier expresión SQL, pero
generalmente es tan sólo un nombre de columna, como en los ejemplos
precedentes. Si la expresión de condición produce un valor NULL, la expresión IN
devuelve NULL.

Todos los elementos en la lista de valores objetivo deben tener el mismo tipo de
datos, y ese tipo debe ser comparable al tipo de datos de la expresión de la
condición. Al igual que el caso BETWEEN, el caso IN no añade potencia expresiva a
SQL, ya que la condición de búsqueda.

X IN (A, B, C)

Es completamente equivalente a:

(X =A) OR (X=B) OR (X=C)

Sin embargo, la cláusula IN ofrece un modo mucho más eficiente de expresar la


condición de búsqueda, especialmente si el conjunto contiene más que unos pocos
valores. La cláusula IN no especifica un límite máximo al número de elementos que
pueden aparecer en la lista de valores, y la mayoría de las implementaciones
comerciales tampoco establecen un límite superior explícito.

Cuando deba especificar múltiples condiciones en una consulta, tendrá que usar los
operadores lógicos AND, OR y NOT, las siguientes tablas le serán de mucha ayuda:

Caso AND:
AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE NULL
NULL NULL NULL NULL

130
Creando Sitios de Comercio Electrónico

Caso OR:
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL

Caso NOT:
NOT TRUE FALSE NULL
FALSE TRUE NULL

Un ejemplo: Listar los comprobantes emitidos por los vendedores V00003, V00007,
que hayan hecho ventas entre abril y julio o los días martes, jueves, sabado:

SELECT IdDocumento, IdVendedor,


DATENAME(dw,Fecha), DATENAME(mm, Fecha)
FROM Documento
WHERE IdVendedor IN (‘V00003’, ‘V00007’) AND
( DATEPART(dw,Fecha) IN(2,4,6) OR
DATEPART(mm, Fecha) BETWEEN 4 AND 7 )

131
Creando Sitios de Comercio Electrónico

Ordenando el resultado de una Consulta

SELECT * FROM tabla [WHERE condición] [ORDER BY campo]

Al igual que las filas en una tabla en la base de datos las filas de los resultados de
una consulta no están dispuestas en ningún orden particular. Se puede pedir a SQL
que ordene los resultados de una consulta incluyendo la cláusula ORDER BY en la
sentencia SELECT. La cláusula ORDER BY, seguidas de una lista de especificaciones
de ordenación separadas por comas. Por ejemplo, podemos ordenar los
comprobantes según el id del vendedor y luego por la fecha:

SELECT IdVendedor, Fecha, IdDocumento FROM Documento


ORDER BY IdVendedor, Fecha

La primera especificación de ordenación (IdVendedor) es la clave de ordenación


mayor; las que le sigan (Fecha, en este caso) son progresivamente claves de
ordenación menores, cuando dos filas de resultados tienen los mismos valores para
las claves mayores. Utilizando la cláusula ORDER BY se puede solicitar la
ordenación en secuencia ascendente o descendente, y se puede ordenar con
respecto a cualquier elemento en la lista de selección de la consulta.

Por omisión, SQL ordena los datos en consecuencia ascendente, también puede
incluir la palabra clave ASC para especificar el orden ascendente. Para solicitar
ordenación en secuencia descendente, se incluye la palabra clave DESC en la
especificación de ordenación, como en este ejemplo:

SELECT IdArticulo, DesArticulo, PreVenta FROM Articulo


ORDER BY PreVenta DESC, DesArticulo

Si la columna de resultados de la consulta utilizada para ordenación es una


columna calculada, no tiene nombre de columna que se pueda emplear en una
especificación de ordenación. En este caso, debe especificarse un número de
columna en lugar de un nombre, como en este ejemplo:

SELECT IdDocumento, DATEDIFF(mm,fecha,GETDATE())FROM Documento


ORDER BY 2

Estos resultados están ordenados por la segunda columna. Combinando números


de columna, nombres de columna, ordenaciones ascendentes y ordenaciones
descendentes, se pueden especificar ordenaciones bastante complejas de los
resultados de una consulta, como el siguiente ejemplo final:

SELECT IdDocumento, IdVendedor, igv=STR( SubTotal*0.18,7,2)


FROM Documento ORDER BY IdVendedor ASC, 3 DESC

132
Creando Sitios de Comercio Electrónico

Usando funciones de columna


SQL permite efectuar una serie de cálculos en las tablas de una base de datos,
mediante un conjunto de funciones de columna. Una función de columna SQL
acepta una columna entera de datos como argumentos y produce un único dato
resultado del calculo sobre la columna. Para realizar cálculos con columnas puede
usar las siguientes funciones:

Función Descripción
AVG([ALL/DISTINCT] Retorna el promedio de una expresión columna
exp) numérica

COUNT([ALL/DISTINCT] Número de valores que hay en una expresión columna


exp)
COUNT(*) Número de filas seleccionadas

MAX(exp) El valor mas alto que hay en una expresión columna

MIN(exp) El menor valor que hay en una expresión columna

SUM([ALL/DISTINCT] Devuelve la suma de la expresión columna numérica


exp)

Para que SQL elimine valores duplicados de una columna antes de aplicarle una
función de columna use la palabra clave DISTINCT.

Por ejemplo para averiguar cual es el artículo más caro anotaríamos:

SELECT MAX(PreVenta)
FROM Articulo

El resultado será un cursor con un sólo registro.

Para calcular el total por las ventas realizadas por el vendedor “V00002”
anotaríamos:

SELECT SUM( SubTotal ) FROM Documento


WHERE IdVendedor = 'V00002'

Para averiguar cuantos artículos hay en la tabla Artículos anotaríamos:

SELECT COUNT(*)
FROM Vendedor

Para averiguar a cuantas empresas diferentes se ha vendido algun articulo,


anotaríamos:

133
Creando Sitios de Comercio Electrónico

SELECT COUNT(DISTINCT IdEmpresa)


FROM Documento

Cualquiera de las ordenes siguientes indican cuantos Vendedores tienen teléfono

SELECT COUNT(TelVendedor)
FROM Vendedor
WHERE TelVendedor IS NOT NULL

SELECT COUNT(*)
FROM Vendedor
WHERE TelVendedor IS NOT NULL

Aclaremos el ejemplo anterior, determinaremos cuantos comprobantes se han


emitido en el mes de febrero:

SELECT COUNT (IdDocumento) FROM Documento


WHERE DATEPART(mm,Fecha) = 2

Observe que la función COUNT( ) ignora los valores de los datos en la columna;
simplemente cuenta cuántos datos hay. En consecuencia, no importa realmente
que columna se especifica como argumento de la función COUNT( ). El último
ejemplo podría haberse escrito igualmente:

SELECT COUNT (IdVendedor)


FROM Documento
WHERE DATEPART(mm,Fecha) = 2

Resulta mas practico solucionar el ejemplo anterior mediante la función COUNT (*)
que cuenta filas en lugar de valores de datos. He aquí la misma consulta, reescrita
una vez utilizar la función COUNT (*):

SELECT COUNT (*)


FROM Documento
WHERE DATEPART(mm,Fecha) = 2

134
Creando Sitios de Comercio Electrónico

Consultas Agrupadas
Las consultas anteriores que incluyen funciones de columna en una expresión,
generan un simple número para una tabla como un total al final de informe. Puede
ampliar la capacidad de estas funciones realizando el cálculo sobre grupos
específicos de datos al igual que los subtotales de un informe.

SELECT campos FROM tablas WHERE condicion


GROUP BY expresion

La cláusula WHERE excluye los registros que no cumplen con la condición. La


cláusula GROUP BY genera grupos para un único valor de acuerdo a la expresión
especificada, si ha incluido en la lista de campos funciones de columna, la acción de
estos será sobre los grupos formados.

Cuál es el total por ventas efectuadas?

SELECT SUM(SubTotal)
FROM Documento

Cuál es el total de ventas realizado por cada Vendedor?

SELECT IdVendedor, total = SUM(SubTotal)


FROM Documento
GROUP BY IdVendedor

La primera consulta es una consulta sumaria simple como la de los ejemplos


anteriores. La segunda produce varias filas sumarias una fila por cada grupo,
sumarizando el total por cada Vendedor

Cuántas comprobantes ha emitido cada Vendedor?

SELECT IdVendedor,
Emitidos = COUNT (*)
FROM Documento
GROUP BY IdVendedor

Cuántos comprobantes ha emitido cada vendedor en el mes de enero?

SELECT IdVendedor,
NumComprobantes = COUNT (*)
FROM Documento
WHERE DATEPART(mm,Fecha) = 1
GROUP BY IdVendedor

135
Creando Sitios de Comercio Electrónico

SQL puede agrupar los resultados de consulta en base a contenidos de dos o más
columnas. Por ejemplo, supongamos que se desea agrupar los comprobantes por
cada mes y por cada Vendedor. Esta consulta agrupa los datos basándose en
ambos criterios:

SELECT Mes=DATEPART(mm,Fecha), IdVendedor,


Cantidad=COUNT (*)
FROM Documento
GROUP BY IdVendedor, DATEPART(mm,Fecha)

En muchas implementaciones SQL, la cláusula GROUP BY tendrá automáticamente


el efecto lateral de ordenar los datos, pero puede obviar esta ordenación con una
cláusula ORDER BY, como se muestra aquí:

SELECT Mes=DATEPART(mm,Fecha), IdVendedor,


Cantidad=COUNT (*)
FROM Documento
GROUP BY IdVendedor, DATEPART(mm,Fecha)
ORDER BY IdVendedor

136
Creando Sitios de Comercio Electrónico

Condiciones de búsqueda en los grupos


Al igual que la cláusula WHERE puede ser utilizada para seleccionar y rechazar filas
individuales que participan en una consulta, la cláusula HAVING puede ser utilizada
para seleccionar y rechazar grupos de filas. El formato de la cláusula HAVING es
análogo al de la cláusula WHERE, consistiendo en la palabra clave HAVING seguida
de una condición de búsqueda. La cláusula HAVING especifica por tanto una
condición de búsqueda para grupos.

Averiguaremos el total por cada una de los comprobantes emitidos donde el total
sea menor a S/. 2000

SELECT IdDocumento,
'Total por Documento',
SUM(SubTotal)
FROM Documento
GROUP BY IdDocumento
HAVING SUM(SubTotal) < 2000

137
Creando Sitios de Comercio Electrónico

Consultas a partir de múltiples tablas


A partir del diseño de una Base de Datos, para muchas consultas se requieren
datos procedentes de dos o más tablas como por ejemplo para obtener:

Una lista de las Documento y su respectivo importe (tablas Documento y Detalle)


Una lista de los Vendedores y su comisión (tablas Vendedor, Documento y Detalle)
Una lista de las Documento emitidas en este mes, mostrando el nombre del cliente,
el nombre del artículo solicitado y el importe de la factura (tablas Vendedor,
Articulo, Documento y Detalle).

SQL permite recuperar datos que responden a estas peticiones mediante consultas
multitabla que componen (JOIN) datos procedentes de dos o más tablas.

Para efectuar combinaciones de tablas puede usar la sintaxis SQL estandar o la de


SQL Server, veamos las variantes:

La sintaxis del SQL estándar (ANSI) sugiere la sintaxis siguiente:

SELECT tabla.campo,
tabla.campo, …
FROM tabla [Tipo_Join] JOIN tabla ON condicion
[WHERE condicion]

Mientras que la sintaxis de SQL Server es:

SELECT tabla.campo,
tabla.campo, …
FROM tablas
WHERE tabla.campo Operador_Join tabla.campo

Puede usar cualquiera de las formas.

Si va a usar la sintaxis SQL ANSI:

SELECT tabla.campo,
tabla.campo, …
FROM tabla [Tipo_Join] JOIN tabla ON condicion
[WHERE condicion]

Puede hacer uso de los siguientes tipos de combinación:

Tipo Join Descripción


INNER JOIN Incluye sólo las filas que satisface la condición de combinación.
CROSS JOIN Incluye todas las combinaciones posibles entre las filas de las
tablas
OUTER JOIN Incluye las filas que satisface la condición de combinación y las
filas restantes de una de las tablas

138
Creando Sitios de Comercio Electrónico

Si va a usar la sintaxis de SQL Server:

SELECT tabla.campo,
tabla.campo, …
FROM tablas
[WHERE tabla.campo Operador_Join tabla.campo

Puede usar los siguientes operadores de combinación:

Operador de Descripción
combinación
= Igual a
> Mayor que
> Menor que
>= Mayor e igual que
<= Menor e igual que
<> Diferente que

Veamos un ejemplo:

Para comprender mejor las facilidades que SQL proporciona para consultas
multitabla lo mejor es comenzar con una petición simple que combina datos de dos
tablas diferentes: Obtenga una lista de las Documento emitidas con su respectivo
total e igv (tablas Documento y Detalle)

Usando la sintaxis de SQL ANSI:

SELECT Detalle.IdDocumento,
SubTotal=STR(PreVenta*Cantidad,7,2),
igv = STR(PreVenta*Cantidad*0.18,7,2)
FROM Documento INNER JOIN Detalle
ON Documento.IdDocumento = Detalle.IdDocumento

Usando la sintaxis de SQL Server:

SELECT Detalle. IdDocumento,


SubTotal=STR(PreVenta*Cantidad,7,2),
igv = STR(PreVenta *Cantidad*0.18,7,2)
FROM Documento, Detalle
WHERE Documento. IdDocumento = Detalle. IdDocumento

Las consultas multitabla más comunes implican a dos tablas que tienen una
relación natural padre-hijo. La consulta referente a Documento y Detalle del
ejemplo anterior es un ejemplo de tal tipo de consulta. Cada línea de Detalle (hijo)
tiene un Documento asociado (padre), y cada Documento (padre) puede tener

139
Creando Sitios de Comercio Electrónico

varias líneas de Detalle asociados (hijos). Los pares de filas que generan los
resultados de la consulta son combinaciones de fila padre-hijo.

Las claves foráneas y las claves primarias crean relaciones padre-hijo en una base
de datos SQL. La tabla que contiene la clave foránea es el hijo en la relación; la
tabla con la clave primaria es el padre. Para ejercitar la relación padre-hijo en una
consulta debe especificarse una condición de búsqueda que compare la clave
foránea y la clave primaria. Veamos otro ejemplo:

Listar el nombre de los Vendedores, la fecha de atención y el número de


Documento para las ventas realizadas en este mes.

En SQL ANSI:

SELECT NomVendedor, Fecha, IdDocumento


FROM Vendedor INNER JOIN Documento
ON Vendedor.IdVendedor = Documento.IdVendedor
WHERE DATEPART(mm,Fecha) = 2

Usando SQL Server:

SELECT NomVendedor, Fecha, IdDocumento


FROM Vendedor, Documento
WHERE Vendedor.IdVendedor=Documento.IdVendedor
AND DATEPART(mm,Fecha) = 2

La tabla Vendedor (hijo) contiene IdVendedor, una clave foránea para la tabla
Documento (padre).

SQL puede combinar datos de tres o más tablas utilizando las mismas técnicas
básicas utilizadas para las consultas de dos tablas.

He aquí un sencillo ejemplo de una composición con tres tablas: Listar los
comprobantes emitidas en el mes de Julio, incluyendo el nombre del Vendedor y el
nombre de la empresa:

SELECT Documento.IdDocumento,
Vendedor=Vendedor.NomVendedor,
Empresa =Empresa.NomEmpresa,
Documento.Fecha
FROM Documento , Vendedor, Empresa
WHERE Documento.IdVendedor = Vendedor.IdVendedor
AND Documento. IdEmpresa = Empresa.IdEmpresa
AND DATEPART(mm, Documento.Fecha) = 2

Esta consulta utiliza dos claves foráneas en la tabla Documento, la columna


IIdEmpresa es una clave foránea para la tabla Empresa, que enlaza cada

140
Creando Sitios de Comercio Electrónico

Documento con la Empresa, la columna IdVendedor es una clave foránea para la


tabla Vendedores, que liga cada Documento con el vendedor.

He aquí otra consulta de tres tablas que utiliza una disposición diferente de las
relaciones padre- hijo: Listar el nombre de los Vendedores, el numero de factura, y
el subtotal por sus compras efectuadas.

SELECT Vendedor.NomVendedor,
Documento.IdDocumento,
SubTotal = SUM(Detalle.PreVenta*Detalle.Cantidad)
FROM Detalle, Documento, Vendedor
WHERE Detalle.IdDocumento = Documento.IdDocumento
AND Documento.IdVendedor = Vendedor.IdVendedor
GROUP BY Vendedor.NomVendedor, Documento.IdDocumento

La primera relación utiliza la columna IdDocumento de la tabla Detalle como clave


foránea para la tabla Documento. La segunda utiliza la columna IdVendedor de la
tabla Documento como la clave foránea para la tabla Vendedor.

141
Creando Sitios de Comercio Electrónico

Otro tipo de casos


La inmensa mayoría de las consultas multitabla se basan en relaciones padre-hijo,
pero SQL no exige que las columnas de emparejamiento estén relacionadas como
clave primaria y la clave foránea. Cualquier par de columnas de dos tablas pueden
servir como columnas de emparejamiento, siempre que tengan tipos de datos
comparables. He aquí un ejemplo de una columna que utiliza un par de fechas
como columnas de emparejamiento:

Muestre los comprobantes emitidas en los días en que un nuevo Vendedor fue
contratado (se asume la presencia del campo FecIng de tipo fecha en la tabla
Vendedor).

SELECT Documento.IdDocumento,
Documento.Fecha,
Vendedor.NomVendedor
FROM Documento, Vendedor
WHERE Documento.Fecha = Vendedor.FecIng

Los resultantes de esta consulta provienen de los pares de filas de las tablas
Documento y Vendedor en donde el valor en la columna Documento.Fecha coincide
con el valor en la columna Vendedor.FecIng para el Vendedor.

Ninguna de estas columnas es una clave foránea o una clave primaria, y la relación
entre los pares de filas es ciertamente una relación extraña la única cosa que los
comprobantes y Vendedores correspondientes tienen en común es que resultan
tener las mismas fechas. Sin embargo, SQL compone las tablas felizmente.

Las columnas de emparejamiento como las de este ejemplo generan una relación
de muchos a muchos entre las dos tablas. Puede haber muchos comprobantes que
compartan una única fecha de contrato del vendedor, y más de un vendedor puede
haber sido contratado en la fecha de Documento de un determinado Documento.
En la consulta:

SELECT *
FROM Documento, Vendedor
WHERE Documento.IdVendedor = Vendedor.IdVendedor

Obtendria un resultado con todos los campos de todas las tablas. Esto no es
frecuente por cierto.

Asi mismo puede usar el * de manera parcial:

SELECT Vendedor.*, Documento.Fecha, Documento.IdDocumento


FROM Documento, Vendedor
WHERE Documento.IdVendedor = Vendedor.IdVendedor

142
Creando Sitios de Comercio Electrónico

Ahora, si una consulta se refiere a la tabla de otro usuario, o si el nombre de una


tabla es muy largo, puede ser tedioso de escribir el nombre de la tabla, la solucion
seria usando un alias, observe su definicion:

SELECT C.NomVendedor,
F.Fecha,
F.IdDocumento
FROM Documento F, Vendedor C
WHERE F.IdVendedor = C.IdVendedor

Las operaciones que se pueden efectuar a partir de una sola tabla se puede
extender a multiples tablas, veamos algunos ejemplos:

Calcular el total de ventas, el igv y el total por comisiones (se asume el 10% del
total):

SELECT
Ventas = SUM(Detalle.PreVenta*Detalle.Cantidad),
IGV = SUM(Detalle. PreVenta *Detalle.Cantidad)*0.18,
Comision=SUM(Detalle.PreVenta*Detalle.Cantidad)*0.1
FROM Documento, Detalle, Vendedor
WHERE Documento.IdDocumento = Detalle.IdDocumento AND
Documento. IdVendedor = Vendedor.IdVendedor

En la siguiente consulta obtendremos el total que vendió cada Vendedor, ademas


de la comision y el neto (descontando la comision):

SELECT E.NomVendedor,
Vendio=SUM(D.PreVenta*D.Cantidad),
Comision = SUM(D.PreVenta*D.Cantidad)*0.1,
Neto= SUM(D. PreVenta *D.Cantidad) -
SUM(D. PreVenta *D.Cantidad)*0.1
FROM Documento F, Detalle D, Vendedor E
WHERE F.IdDocumento = D.IdDocumento AND
F.IdVendedor = E. IdVendedor
GROUP BY E.NomVendedor

143
Creando Sitios de Comercio Electrónico

Utilizando Subconsultas
Una subconsulta es una consulta que aparece dentro de la cláusula WHERE o
HAVING de otra sentencia SQL. Las subconsultas proporcionan un modo eficaz y
natural de manejar las peticiones de consultas que se expresan en términos de los
resultados de otras consultas. He aquí un ejemplo de tal tipo de petición.

“Listar aquellos articulos cuyo precio sea mayor o igual al precio promedio de los
articulos vendidos”

La solucion de la primera parte podria ser mas o menos asi:

SELECT DesArticulo, PreVenta FROM Articulo

Ahora:

SELECT DesArticulo,
PreVenta
FROM Articulo
WHERE PreVenta >= ???

Lo que falta (???), es determinar cual es el precio promedio de los articulos


vendidos.

Podemos calcular el precio promedio de los articulos vendidos mediante la orden:

SELECT AVG(Detalle.PreVenta)
FROM Detalle

Lo que da ahora es solo sustituir el resultado de la ultima orden en lugar de ???:

SELECT DesArticulo, PreVenta


FROM Articulo
WHERE PreVenta >=
(SELECT AVG(Detalle.PreVenta)
FROM Detalle)

La subconsulta esta siempre encerrada entre paréntesis, pero por otra parte tiene
el formato familiar de una sentencia SELECT, con una cláusula FROM y cláusulas
opcionales WHERE, GROUP BY y HAVING. El formato de estas cláusulas en una
subconsulta es idéntico al que tienen en una sentencia SELECT, y efectúan sus
funciones normales cuando se utilizan dentro de una subconsulta. Sin embargo,
hay unas cuantas diferencias entre una subconsulta y una sentencia SELECT real:

Una subconsulta debe producir una única columna de datos como resultados. Esto
significa que una subconsulta siempre tiene un único elemento de selección en su
cláusula SELECT.

144
Creando Sitios de Comercio Electrónico

La cláusula ORDER BY no puede ser especificada en una subconsulta. Los


resultados de la subconsulta se utilizan internamente por parte de la consulta
principal y nunca son visibles al usuario, por lo que tiene poco sentido ordenarlas
de ningún modo.

Una subconsulta no puede ser la UNION de varías sentencias SELECT diferentes;


sólo se permite una única SELECT.

Los nombres de columna que aparecen en una subconsulta pueden referirse a


columnas de tablas en la consulta principal.

En el siguiente ejemplo vamos a averiguar que Empresas fueron atendidos por


Vendedores que trabajaron un dia martes

Primero hay que averiguar que Vendedores trabajaron un dia martes:

SELECT Vendedor.IdVendedor
FROM Documento, Vendedor
WHERE Documento. IdVendedor = Vendedor. IdVendedor
AND DATEPART(dw,Fecha) = 3
GROUP BY Vendedor. IdVendedor

Ahora presentaremos la lista de Empresas que fueron atendidos por los Vendedores
antes seleccionados:

SELECT Documento.IdVendedor, Empresa.NomEmpresa,


FROM Empresa, Documento
WHERE Empresa.IdEmpresa = Documento.IdEmpresa
AND Documento. IdVendedor IN (
SELECT Vendedor.IdVendedor
FROM Documento, Vendedor
WHERE Documento. IdVendedor = Vendedor. IdVendedor
AND DATEPART(dw,Fecha) = 3
GROUP BY Vendedor. IdVendedor)

Como se ve la subconsulta cumple con el requesito especificado: solo de contener


una columna, claro que en este caso la columna presenta multiples filas, las que
luego se usan como parte de la condicion IN de la consulta principal.

Si desearamos una lista de los Vendedores que no fueron atendidos por vendedores
que trabajaron un dia martes, solo tendriamos que anteponerle a IN el operador de
negacion NOT

145
Creando Sitios de Comercio Electrónico

Ahora vamos a obtener el porcentaje de ventas mensuales:

SELECT Mes = DATENAME(mm,Documento.Fecha),


Porcentaje = ( SUM(PreVenta*cantidad)/
(SELECT SUM(PreVenta *cantidad)
FROM Documento,Detalle
WHERE Documento.IdDocumento=Detalle.IdDocumento)
)*100
FROM Documento, Detalle
WHERE Documento.IdDocumento = Detalle.IdDocumento
GROUP BY DATENAME(mm,Documento.Fecha)

Finalmente si fuera necesario guardar el resultado de una consulta solo debe


agregar a la orden SELECT el parametro INTO #archivo:

SELECT Mes = DATEPART(mm, Documento.Fecha),


Total =
SUM(Detalle.PreVenta*Detalle.Cantidad)
INTO #Totales
FROM Documento, Detalle
WHERE Documento.IdDocumento = Detalle.IdDocumento
GROUP BY DATEPART(mm, Documento.Fecha)

146
Creando Sitios de Comercio Electrónico

Operaciones de Mantenimiento
Las principales operaciones son las de agregar registros, borrar y actualizar datos

Agregando registros
La adicion de un nuevo registro a una tabla se efectua mediante el comando:

INSERT INTO Tabla(lista_campos) VALUES (lista_datos)

Por ejemplo, para agregar los datos de un nuevo vendedor anotariamos:

INSERT INTO Vendedor


VALUES
( 'E0001', 'Fernández Rodriguez', 'Mariela', '440-1222' )

Tambien se puede tomar una lista de filas, resultado de una selección y trasladarlas
a otra tabla, por ejemplo se asumimos la existencia de la tabla FacJulio con campos
similares a la tabla Documento, trasladariamos las Documento emitidas en julio de
la siguiente forma:

INSERT INTO FacJulio


(IdDocumento, Fecha, IdVendedor)
SELECT IdDocumento, Fecha, IdVendedor
FROM Documento
WHERE DATEPART(mm,Fecha) = 2

147
Creando Sitios de Comercio Electrónico

Ejemplo de inserción de registros

Agrega.asp

<HEAD>
<TITLE>Agregando registros</TITLE>
</HEAD>
<BODY>
<%If request.form = “” Then %>
<FORM NAME="Formulario" ACTION=”Agregar.asp”
METHOD="POST">
<TABLE BORDER=0>
<TR><TD>Nombre: <INPUT TYPE="TEXT" NAME="nombre"
SIZE="20"></TD></TR>
<TR><TD>Apellidos: <INPUT TYPE="TEXT"
NAME="apellidos" SIZE="40"></TD></TR>
<TR><TD>Email: <INPUT TYPE="TEXT" NAME=”email"
SIZE="2" MAXLENGTH="2"></TD> </TR>
</TABLE>
<INPUT TYPE="SUBMIT"
VALUE="Enviar">&nbsp;&nbsp;<INPUT TYPE="RESET" VALUE="Borrar">
</FORM>
<%Else
nom = Request.Form("nombre")
ape = Request.Form("apellidos")
email = Request.Form(”email")
Set con = Server.CreateObject("ADODB.Connection")
con.Open ”CadenaConexion"
sql = "INSERT INTO Cliente (Nombre, Apellido, Email)
VALUES('" & nom& "','" & ape& "','" & email& "')"
con.Execute(sql)
If Err = 0 Then
Response.Write "Inserción correcta."
Else
Response.Write "Error en Inserción."
End If
con.Close
Set con = Nothing
End If%>
</BODY>

148
Creando Sitios de Comercio Electrónico

Borrando registros
La instruccion DELETE elimina filas de una tabla.

DELETE FROM Tabla WHERE condicion

Si deseamos eliminar los datos del Empresa Jose Perez anotariamos:

DELETE FROM Vendedor


WHERE NomVendedor = ‘ Jose Perez’

Si deseamos borrar los registros de los articulo 'COM00001', 'BEB00004', podemos


usar:

DELETE FROM Articulo


WHERE IdArticulo IN ('COM00001', 'BEB00004')

Podemos borrar tambien varios registros al mismo tiempo, por ejemplo los
Vendedores que atendieron hace mas de 5 años atrás:

DELETE FROM Vendedor WHERE IdVendedor IN


( SELECT IdVendedor FROM Documento
WHERE DATEDIFF(yy, Fecha, GETDATE()) > 5

Si desea borrar todo el contenido de la tabla Documento:

DELETE FROM Documento

Esta ultima orden no borra la tabla, sino solo el contenido.

149
Creando Sitios de Comercio Electrónico

Actualizando cambios en un registro


Para actualizar los cambios en un registro de una tabla se usará el comando
siguiente:

UPDATE tabla SET campo = expresion


WHERE condicion

Por ejemplo para renovar el telefono del Empresa 'E0004' por el de 2257896,
anotaria:

UPDATE Vendedor SET Telefono = ‘2257896’


WHERE IdVendedor = 'V00004'

Para incrementar el precio de los articulos en un 10%, si es que su precio es mayor


a S/. 100, anotaria:

UPDATE Articulo SET PreVenta = PreVenta *1.1


WHERE PreVenta > 100

150
Creando Sitios de Comercio Electrónico

La aplicación Peru Adventure

Definicion de las variables de Aplicación y de Sesion


Usaremos una variable de aplicación para almacenar la cadena de conexión a la
Base de Datos (StrConn), luego necesitaremos dos variables de sesion: para
almacenar el Id del cliente (IdCliente) y el nombre (NomCliente)

Global.asa

<SCRIPT LANGUAGE='VBScript' RUNAT='Server'>

Sub Application_OnStart()
Application("StrConn") =
"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\Libros\Libro
ASP\PeruAdventure/bd/PeruAdv.mdb"
End Sub

Sub Session_OnStart()
Session("IdCliente") = ""
Session("NomCliente") = ""
End Sub
</SCRIPT>

151
Creando Sitios de Comercio Electrónico

El archivo que inicia la aplicación


El archivo Default.asp, muestra la pagina principal, consta de una lista de ciudades,
para donde Peru Adventure tiene formado paquetes turisticos. Las iconos de las
ciudades se muestran como hipervinculos hacia otras paginas que muestra
informacion turisca de ellos.

A la izquierda tenemos el area de suscripcion, donde el usuario nuevo puede


suscribirse o en su caso ingresar al site, se ha incluido tambien la opcion que
recuerda la contraseña en caso que el usuario la haya olvidado.

Falta Grafico

152
Creando Sitios de Comercio Electrónico

A efectos de permitir una facil insercion de elementos en el encabezado , barra de


menus y pie de la pagina, se ha definido para tales areas a manera de
procedimientos: Cabecera(), Barra(), Piepagina(), los que se hallan en el archivo
Util.asp.

Asi mismo se hace referencia a un archivo ADOVBS.INC que contiene las serie de
constantes para el tratamiento del objeto ADO.

Default.asp

<%@ Language=VBScript %>


<% option explicit
Response.Expires = -1 %>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->
<HEAD>
<TITLE>Peru Travel</TITLE>
</HEAD>
<BODY>
<% Cabecera() %>
<%Barra("Fecha")%>
<TABLE width="750" border=0 bordercolor=#4b0082>
<TR>
<TD width=200 bgcolor=#deb887 valign=top>
<A title="Registro de Nuevo Cliente"
href="Nuevocliente.asp" >Nuevo</A>
<FORM action=RegistraCliente.asp method=post>
<TABLE>
<TR>
<TD>Email</TD>
<TD><INPUT name=Email maxlength=40
style="WIDTH: 110px" width=110></TD>
</TR>
<TR>
<TD>Contraseña</TD>
<TD><INPUT type=password name=Password
maxlength=20 style="WIDTH: 110px"
width=110></TD>
</TR>
</TABLE>
<INPUT type=submit value=Conectar name=submit1>
</FORM>
<A title="Envia su clave a su email"
href="EnviarClave.asp" >Olvide mi clave</A>
</TD>
<TD width=500 bgcolor=#fafad2 valign=top>
<% MostrarCiudades() %>
</TD>
</TR>
</TABLE>
<%Barra("Visitantes")%>
<% PiePagina() %>
</BODY>

153
Creando Sitios de Comercio Electrónico

Procedimiento de usuario
Los procedimientos al que hace referencia el archivo Default.asp se encuentran en
Util.asp y son los siguientes:

Procedimiento Write

Se ha creado para facilitar la escritura en el navegador, en lugar de anotar


Response.write, bastara con Write:

<%
Private Sub Write( Cadema )
Response.Write(Cadema)
End Sub

Procedimiento Cabecera

Si aun no tenemos definido que poner en el encabezado, de forma temporal


podemos situar un texto o alguna imagen, posteriormente incluiremos en ella el
encabezado definitivo sin necesidad de estar modificando cada archivo asp.

Private Sub Cabecera()%>


<TABLE width=""750"" border=0>
<TR>
<TD><IMG Src='Recursos\PeruAdventure.jpg'></TD>
<TD><IMG Src='Recursos\PeruPubli.jpg'></TD>
</TR>
</TABLE>
<%End Sub

Procedimiento PiePagina

Se elabora siguiendo los mismos criterios del procedimiento Cabecera.

Private Sub PiePagina()%>


<BR>
<TABLE width=""750"" border=0 align="center">
<TR>
<TD><IMG Src='Recursos\PeruPie.jpg'><HR>
<B><CENTER>GrapPeru SAC - Derechos Reservados – 2001
</CENTER></B></TD>
</TR>
</TABLE>
<%End Sub

154
Creando Sitios de Comercio Electrónico

Procedimiento Barra

Inicialmente mostraremos la fecha y la hora, luego en esta misma area podemos


mostrar el nombre del usuario en linea, los enlaces para ver sus reservas, etc.

Private Sub Barra(Tipo)%>


<TABLE width="750" border=0 bgcolor=#ffdead>
<TR>
<%Select Case Tipo
Case "Fecha" %>
<TD width=550 valign=center>
<%Write FechaChr(now)%>
</TD>
<TD width=200 valign=center align=right>
<%Write "Hora:"&HoraChr(now)%>
</TD>
<%Case "Visitantes" %>
<TD width=750 valign=center>
<CENTER>Hemos recibido visitantes</CENTER>
</TD>
<%Case "Carrito" %>
<TD width=550 valign=center>
Bienvenido: <%Write (Session("NomCliente")) %>
</TD>
<TD width=200 valign=center align=right>
<A href="VerReservas.asp">Ver Reservas</A>
</TD>
<%Case "Continuar" %>
<TD width=550 valign=center>
Bienvenido: <% Write(Session("NomCliente")) %>
</TD>
<TD width=200 valign=center align=right>
<A href="Sesion.asp?tipo=Perfil">Continuar</A>
</TD>
<%Case "Vacia" %>
<TD width=750 valign=center>
<CENTER>.</CENTER>
</TD>
<%End Select %>
</TR>
</TABLE>
<%End Sub

155
Creando Sitios de Comercio Electrónico

Funcion FechaChr

Uno de los problemas que se presenta con las fecha es cuando se desea mostrarlas
en forma de texto, una alternativa que funciona ya sea en un servidor Windows
NT/2000 en ingles o español es la siguiente:

Function FechaChr(fecha)
Dim aDia, aMes
aDia = Array ("","Lunes","Martes","Miércoles","Jueves",
"Viernes","Sábado","Domingo")
aMes = Array ("","Enero","Febrero","Marzo","Abril","Mayo",
"Junio","Julio","Agosto", "Septiembre","Octubre",
"Noviembre","Diciembre")
FechaChr = aDia (weekday (fecha, 2)) & ", " & Day (fecha) & "
de " & aMes(Month(fecha)) & " de " & Year(fecha)
End function

Funcion HoraChr

Una solucion similar tenemos para el caso de las horas:

Function HoraChr(fecha)
Dim cHora, cMinutos
cHora = Hour(fecha)
cMinutos = Minute(fecha)
If (cHora < 10) then
cHora = "0" & cHora
End If
If (cMinutos < 10) then
cMinutos = "0" & cMinutos
End If
HoraChr= cHora & ":" & cMinutos
End Function
%>

156
Creando Sitios de Comercio Electrónico

Procedimiento MostrarCiudades

Este procedimiento, accede a la tabla Destino y recupera el campo Ciudad, para


mostrar luego, el icono que le corresponde y el hipervinculo hacia donde se dirigirá.
Para que funcione correctamente debera mantenerse la siguiente estandarizacion:

b_NombreCiudad.gif, para la imagen, por ejemplo b_Lima.gif


NombreCiudad.htm, para la descripcion de la ciudad, por ejemplo Lima.htm

Ademas estos archivos deben estar ubicados dentro de la carpeta Contenido.

Private Sub MostrarCiudades()


dim cn, rs
set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")
Set rs = cn.Execute( "SELECT * FROM Destino" )%>
<TABLE>
<%Do Until rs.EOF%>
<TR>
<TD width=100>
<A href='Contenido\<%=rs.Fields("Ciudad")%>.htm'>
<IMG SRC='Contenido\b_<%=rs.Fields("Ciudad")%>.gif'
border=0></A>
</TD>
<TD valign=top>
<%=rs.Fields("Ciudad")%>
</TD>
</TR>
<%rs.MoveNext
loop%>
</TABLE>
<%rs.Close
set rs=nothing
cn.Close
set cn = nothing
End Sub

157
Creando Sitios de Comercio Electrónico

Registro de nuevo cliente


A partir de la pagina de inicio, un usuario podra registrarse, presentamos un
formulario sencillo, el que luego de ser llenado se almacenara como un registro en
la tabla de Cliente.

Dado que cada Cliente deberá tener un Id propio y unico, se ha decidido


autogenerarlo bajo el formato C0001, C0002, etc. Para la autogeneracion se usa la
tabla Parametro la que contiene el ultimo numero usado en la generacion del Id.

Nuevocliente.asp

<%@ Language=VBScript %>


<%Response.Buffer = True
Response.Expires = -1
dim cn, SQL%>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->

<HEAD>
<TITLE>Peru Travel - Nuevo Cliente</TITLE>
</HEAD>

<BODY>
<% Cabecera()

158
Creando Sitios de Comercio Electrónico

if Request.Form <> "" Then


set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")

'Creamos el Id correlativo
sql = "Update Parametro Set Valor = Valor + 1 " &
"Where Campo = 'Cliente'"
cn.Execute(sql)

sql = "SELECT Valor FROM Parametro Where " &


"Campo = 'Cliente'"
Set rs = cn.Execute(sql)
Id = "C" + Right("0000" & rs.Fields("Valor"),4)

'Insertamos el cliente
Ape = Request.Form("Ape")
Nom = Request.Form("Nom")
EMail = Request.Form("Email")
Clave = Request.Form("Clave")
FN = Request.Form("FN")
Sexo = Request.Form("Sexo")
Pais = Request.Form("Pais")
Ciudad = Request.Form("Ciudad")
Tipo = " "
sql = "Insert Into Cliente (IdCliente, Apellido, Nombre,
EMail, Clave, FechaNac, Sexo, Pais, Ciudad, Tipos) Values( '"&
id &"','"& Ape&"','"& Nom&"','"& Email&"','"& Clave&"',#"&
FN&"#,'"& Sexo&"','"& Pais&"','"& Ciudad&"','"& Tipo &"')"
cn.Execute(sql)

' Codigo de Retorno


Session("IdCliente") = Id
Session("NomCliente") = Request.Form("Nom") & " " &
Request.Form("Ape")
' Eliminar Objetos
cn.Close
Set cn = Nothing
' Iniciar Sesion
Response.Redirect "Sesion.asp?tipo=Perfil"
Else %>

<h1>Registro de Clientes</h1>

<FORM action="Nuevocliente.ASP" method=post>


<TABLE BORDER=0>
<TR>
<TD>Apellidos</TD>
<TD><INPUT id=text1 name=Ape maxLength=40></TD>
</TR>
<TR>
<TD>Nombres</TD>
<TD><INPUT id=text2 name=Nom maxLength=40></TD>
</TR>

159
Creando Sitios de Comercio Electrónico

<TR>
<TD>Sexo (M o F)</TD>
<TD><INPUT id=text3 name=Sexo maxLength=1></TD>
</TR>
<TR>
<TD>Fecha de Nacimiento</TD>
<TD><INPUT id=text6 name=FN maxLength=15></TD></TR>
<TR>
<TD>Email</TD>
<TD><INPUT id=text4 name=Email maxLength=40></TD>
</TR>
<TR>
<TD>Contraseña</TD>
<TD><INPUT type=password id=password1 maxLength=20
name=Clave></TD>
</TR>
<TR>
<TD>País</TD>
<TD><INPUT id=text7 name=Pais maxLength=20></TD>
</TR>
<TR>
<TD>Ciudad</TD>
<TD><INPUT id=text8 name=Ciudad maxLength=20>
</TD>
</TR>
</TABLE>
<INPUT id=submit1 type=submit value=Aceptar name=submit1>
</FORM>
<% End If %>

<%Barra("Vacia")%>
<% PiePagina() %>
</BODY>
</HTML>

160
Creando Sitios de Comercio Electrónico

Verificando datos del cliente


Si el cliente ya está inscrito, éste podrá ingresar a nuestra página usando su email
y una contraseña.

RegistraCliente.asp

<%@ Language=VBScript%>
<% Option Explicit
Response.Expires = -1
Response.Buffer = True
dim cn
dim rs%>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->

<HEAD>
<TITLE>Peru Travel - Conectar</TITLE>
</HEAD>
<BODY bgColor=#ffffff >
<% Cabecera()
If Request.Form="" Then
Write( "Ingrese sus datos para iniciar una sesión<BR><BR>")
Write("<A href=Default.asp>Continuar</A>")
Else
set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")
Set rs = Server.CreateObject("ADODB.RecordSet")
With rs
.ActiveConnection = cn
.CursorType = adopenstatic
.CursorLocation = aduseclient
.Source = "SELECT * FROM Cliente Where Email = '" & _
Request.Form("Email") & "' And Clave = '" & _
Request.Form("Password") & "'"
.Open
End With
if rs.RecordCount > 0 Then
Session("IdCliente") = rs.Fields("IdCliente")
Session("NomCliente") = rs.Fields("Nombre") & " " &
rs.Fields("Apellido")
Set rs = Nothing
set cn = Nothing
Response.Redirect "Sesion.asp?tipo=Perfil"
End If
Error("Conexion")
Set rs = Nothing
set cn = Nothing
End If
PiePagina() %>
</BODY>

161
Creando Sitios de Comercio Electrónico

Inicio de la sesion
Una vez que un cliente se haya inscrito o haya ingresado a la pagina, deberá
mostrarse el catalogo de paquetes turisticos.

Si el usuario no ha iniciado una sesion correctamente, presentaremos el mensaje


de error correspondiente.

La primera vez se mostrará el catalogo general de paquetes, se dispondrá de un


menu a fin de presentar los paquetes por categorias.

Sesion.asp

<%@ Language=VBScript %>


<% option explicit
Response.Expires = -1000
Dim Tipo%>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->

<HEAD>
<TITLE>Peru Travel - Catalogo</TITLE>
</HEAD>
<BODY >
<%
Tipo=Request.QueryString("Tipo")

162
Creando Sitios de Comercio Electrónico

If Tipo="" Then
Tipo="Error"
end if
Cabecera()
Barra("Carrito")
%>

<TABLE width="750" border=0 cellspacing=0>


<TR>
<TD width=150 bgcolor=#deb887 valign=top>
<P><BR>Tipos de Paquetes
<P><A href=sesion.asp?Tipo=A >Aventura</A>
<P><A href=sesion.asp?Tipo=C >Cultura</A>
<P><A href=sesion.asp?Tipo=E >Ecológico</A>
<P><A href=sesion.asp?Tipo=M >Místico</A>
</TD>
<TD width=550 bgcolor=#fafad2 valign=top>
<% MostrarCatalogo( Tipo ) %>
</TD>
</TR>
</TABLE>

<% Barra("Vacia")
PiePagina() %>

</BODY>

El procedimiento Error y MostrarCatalogo se encuentran en Util.asp

Procedimiento Error

Contiene la consistencia a los errores posibles.

Private Sub Error( Tipo )%>


<CENTER>
<%Select Case Tipo
Case "Conexion"%>
Sus datos no son correctos<BR><BR>
<A href=Default.asp>Continuar</A>
<%Case "Sesion"%>
Debe iniciar una sesion<BR><BR>
<A href=Default.asp>Iniciar sesion</A>
<%Case "Paquete"%>
No a seleccionado un paquete<BR><BR>
<A href=sesion.asp>Continuar</A>"
<%End Select%>
</CENTER>
<%End Sub

163
Creando Sitios de Comercio Electrónico

Procedimiento MostrarCatalogo

Para generar el Catalogo de paquetes se usará una Consulta, al que se ha llamado


V_Catalogo, se considera todo el contenido para el catalogo general y basado en
una condicion para los paquetes según categoria.

Por cada paquete se mostrará el tipo al que pertenece, la categoria, el precio y la


duracion. Desde esta pagina se podra iniciar con la reserva de un paquete,
haciendo click en el enlace Reservar.

Private Sub MostrarCatalogo( Tipo )


Dim cn, rs, rsRes
If Tipo="Error" then
Error("Sesion")
exit sub
End If
Set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")
If tipo = "Perfil" then
Write( "<H1>Catalogo General</H1>" )
Set rs = cn.Execute("SELECT * FROM V_Catalogo" )
Else
Write( "<H1>Catalogo del tipo: " & TipoPaquete( Tipo )&
"</H1>")
Set rs = cn.Execute("SELECT * FROM V_Catalogo Where tipo
= '" & tipo & "'")
end if%>
<TABLE>
<%Do Until rs.EOF %>
<TR>
<TD width=130 align=center>
<IMG SRC='Recursos\<%=rs.Fields("IdPaquete")%>.jpg'
WIDTH="120" HEIGHT="100" BORDER=0><BR>
<%Set rsRes = cn.Execute("SELECT * FROM Reserva
Where IdPaquete = '" & rs.Fields("IdPaquete") & "'
AND IdCliente = '" &Session("IdCliente") & "'
AND Anulado=0")
IF rsRes.eof Then%>
<A href="Reservar.asp?IdPaquete=
<%=rs.Fields("IdPaquete")%>"> Reservar</A>
<%Else
IF rsRes.Fields("Confirmado")=-1 Then%>
Reservado
<%Else%>
Por confirmar
<%End If
End If%>
<BR>
</TD>
<TD valign=top>
<B> <%=rs.Fields("Nombre")%> </B><BR>
<FONT FACE = "Arial" SIZE=-8>
Destino: <% =rs.Fields("Ciudad") %> <BR>

164
Creando Sitios de Comercio Electrónico

Tipo: <% =rs.Fields("Tipo") %> <BR>


Categoria: <% =rs.Fields("Categoria") %> <BR>
Cupos Disponibles: <% =rs.Fields("Cupos")%> <BR>
Costo: $. <% =rs.Fields( "PrecioVenta" ) %> <BR>
Del <% =rs.Fields("FechaInicio") %>
Al <% =rs.Fields("FechaTermino")%>
</FONT>
</TD>
</TR>
<%rs.MoveNext
loop%>
</TABLE>
<%rs.Close
set rs=nothing
cn.Close
set cn = nothing
End Sub

165
Creando Sitios de Comercio Electrónico

Reserva de paquetes
Mediante éste módulo el cliente podrá realizar la reserva de un paquete, la
obtensión de los paquetes se realiza con ayuda de una consulta: V_Catalogo.

Reservar.asp

<%@ Language=VBScript%>
<%
Option Explicit
Response.Expires = -1
Response.Buffer = True
Dim IdPaquete, cn, rs
%>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->

<HEAD>
<TITLE>Peru Travel - Reservar</TITLE>
</HEAD>
<BODY bgColor=#ffffff >
<%
Cabecera()
IdPaquete = Request.QueryString("IdPaquete")
If Session("NomCliente") = "" Then
Error("Sesion")
ElseIf IdPaquete = "" Then
Error("Paquete")
Else
Barra("Carrito")
set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")
Set rs = Server.CreateObject("ADODB.RecordSet")
With rs
.ActiveConnection = cn
.CursorType = adopenstatic
.CursorLocation = aduseclient
.Source="SELECT * FROM v_Catalogo Where IdPaquete='"&_
IdPaquete & "'"
.Open
End With %>
<TABLE width="750" border=0 cellspacing=0>
<TR>
<TD width=150 valign=middle align=center>
<BR>
<IMG SRC="Recursos\
<%=rs.Fields("IdPaquete")%>.jpg"
WIDTH=130 HEIGHT=130>
</TD>
<TD width=500 bgcolor=#fafad2 valign=top>
<BR><B><%Write(rs.Fields("Nombre"))%></B><BR>
<FONT SIZE="-8" Face="Arial">

166
Creando Sitios de Comercio Electrónico

Destino: <%=rs.Fields("Ciudad")%><BR>
Tipo: <%=rs.Fields("Tipo")%><BR>
Categoria: <%=rs.Fields("Categoria")%><BR>
Cupos: <%=rs.Fields("Cupos")%><BR>
Costo US$: <%=rs.Fields("PrecioVenta")%><BR>
Del <%=rs.Fields("FechaInicio")%>
Al <%=rs.Fields("FechaTermino")%>
</FONT>
<BR><BR>
</TD>
<TD width=100 valign=middle align=center>
<FORM action="GrabaReserva.ASP" method=post>
<INPUT type="hidden" name=IdPaquete
value=<%Write(IdPaquete)%> >
<INPUT type="hidden" name=IdCliente
value=<%Write(Session("IdCliente"))%> >
Número de Cupos<BR><BR>
<INPUT type="text" name=Cupos value=1 width=10>
<BR><BR>
<INPUT type="submit" value="Reservar"
name=submit1>
</FORM>
</TD>
</TR>
</TABLE>
<%End If
Barra("Vacia")
PiePagina() %>
</BODY>

167
Creando Sitios de Comercio Electrónico

168
Creando Sitios de Comercio Electrónico

Grabando un reserva

GrabaReserva.asp

<%@ Language=VBScript %>


<% Response.Expires = -1
Response.Buffer = True
dim IdPaquete, IdCliente, Cupos, cn, sql, rs %>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->

<HEAD>
<TITLE>Perú Travel - Cargar Reserva</TITLE>
</HEAD>
<BODY bgColor=#ffffff >
<% Cabecera()
Barra("Carrito")
If Session("NomCliente") = "" Then
Error("Sesion")
ElseIf Request.Form = "" Then
Error("Paquete")
Else
' Captura los datos
IdPaquete = Request.Form("IdPaquete")
IdCliente = Request.Form("IdCliente")
Cupos = Request.Form("Cupos")
' Establecer la conexion
set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")

'Generar numero de reserva


sql = "Update Parametro Set Valor = Valor + 1
Where Campo = 'Reserva'"
cn.Execute(sql)
sql = "SELECT Valor FROM Parametro
Where Campo = 'Reserva'"
Set rs = cn.Execute(sql)
Id = "R" & Right( "0000"& rs("Valor"), 4 )

'Obtiene el precio del paquete


sql = "Select PrecioVenta From Paquete
Where IdPaquete = '" & IdPaquete &"'"
Set rs = cn.Execute(sql)
Precio = rs.Fields("PrecioVenta")

'Graba la reserva
sql="Insert Into Reserva(IdReserva,IdCliente,IdPaquete,
Fecha,Cantidad,TotalVenta,Confirmado,Anulado)
Values('" & Id&"','"&IdCliente&"','"&IdPaquete&"',#"&
Now&"#,"&Cupos&","&Cupos*Precio&",0,0)"
cn.Execute(sql)

169
Creando Sitios de Comercio Electrónico

' Eliminar Objetos


Set cmd = Nothing
cn.Close
Set cn = Nothing
' Iniciar Sesion%>
<CENTER>
<BR><BR><A href=Sesion.asp?tipo=Perfil>Continuar</A>
</CENTER>
<%End If
PiePagina() %>
</BODY>

170
Creando Sitios de Comercio Electrónico

Mostrando las reservas realizadas


La opcion Ver reservas, que se muestra en la parte superior derecha de la barra,
mostrará las reservas realizadas por el cliente, para obtener las reservas
efectuadas se usará una Consulta: V_Reservas

VerReserva.asp

<%@ Language=VBScript%>
<% Option Explicit
Response.Expires = -1
Response.Buffer = True
Dim IdPaquete, cn, rs %>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->

<HEAD>
<TITLE>Peru Travel - Reservas</TITLE>
</HEAD>
<BODY bgColor=#ffffff >
<% Cabecera()
If Session("NomCliente") = "" Then
Error("Sesion")
Else
Barra("Continuar")
set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")
Set rs = Server.CreateObject("ADODB.RecordSet")
With rs
.ActiveConnection = cn
.CursorType = adopenstatic
.CursorLocation = aduseclient
.Source="SELECT * FROM v_Reservas Where IdCliente='"&_
Session("IdCliente") & "'"
.Open
End With%>
<TABLE width="750" border=0 cellspacing=0>
<% do while not rs.EOF %>
<TR>
<TD width=150 valign=middle align=center>
<IMG SRC="Recursos\
<%Write(rs.Fields("IdPaquete"))%>.jpg"
WIDTH=120 HEIGHT=100>
</TD>
<TD width=500 bgcolor=#fafad2 valign=top>
<B><%Write(rs.Fields("Nombre"))%></B><BR>
<FONT SIZE="-8" Face="Arial">
Nro. Reserva:&nbsp;
<%Write(rs.Fields("IdReserva"))%><BR>
Destino:&nbsp;<%Write(rs.Fields("Ciudad"))%><BR>
Tipo:&nbsp;<%Write(rs.Fields("Tipo"))%><BR>
Categoria:&nbsp;
<%Write(rs.Fields("Categoria"))%><BR>

171
Creando Sitios de Comercio Electrónico

Cupos:&nbsp;<%Write(rs.Fields("Cupos"))%><BR>
Costo:&nbsp;$.&nbsp;
<%Write(rs.Fields("PrecioVenta"))%><BR>
Total Venta:&nbsp;$.&nbsp;
<%Write(rs.Fields("TotalVenta"))%><BR>
Del <%=rs.Fields("FechaInicio")%>
Al <%=rs.Fields("FechaTermino")%>
</FONT>
<BR><BR>
</TD>
<TD width=100 valign=middle align=center>
<A href=ProcesaReserva.asp?IdReserva=
<%=rs.Fields("IdReserva")%>&Accion=Pagar>
Pagar</A>
<BR>
<A href=ProcesaReserva.asp?IdReserva=
<%=rs.Fields("IdReserva")%>&Accion=Anular>
Anular</A>
</TD>
</TR>
<% rs.MoveNext
loop %>
</TABLE>
<% Set rs = Nothing
cn.Close
Set cn = Nothing
End If
PiePagina() %>
</BODY>

172
Creando Sitios de Comercio Electrónico

173
Creando Sitios de Comercio Electrónico

Procesando una reserva

Una reserva puede ser pagada o anulada, tal accion podrá realizarla el cliente
mediante los vinculos que se muestran a la derecha.

ProcesaReserva.asp

<%@ Language=VBScript %>


<% Response.Expires = -1
Response.Buffer = True
dim IdReserva, Accion, cn, sql, rs %>
<!--#include file="ADOVBS.INC"-->
<!--#include file="Util.ASP"-->

<HEAD>
<TITLE>Perú Travel - Cargar Reserva</TITLE>
</HEAD>
<BODY bgColor=#ffffff >
<% Cabecera()
Barra("Carrito")
IdReserva = Request.QueryString("IdReserva")
Accion = Request.QueryString("Accion")
If Session("NomCliente") = "" Or IdReserva = "" Then
Error("Sesion")
Else
' Establecer la conexion
set cn=Server.CreateObject("ADODB.Connection")
cn.Open Application("StrConn")
If Accion = "Anular" Then
sql="Update Reserva Set Anulado = -1, Confirmado=0
Where IdReserva = '"&IdReserva&"'"
cn.Execute(sql)
End If

If Accion = "Pagar" Then


sql="Select IdPaquete from Reserva
Where IdReserva ='"& IdReserva &"'"
Set rs = cn.Execute(sql)
IdPaquete = rs.Fields("IdPaquete")
sql="Update Reserva Set Confirmado = -1, Anulado = 0
Where IdReserva ='"& IdReserva &"'"
cn.Execute(sql)
sql="Select Cantidad from Reserva
Where IdReserva ='"& IdReserva &"'"
Set rs = cn.Execute(sql)
Cant = rs.Fields("Cantidad")
sql = "Update Paquete Set Cupos = Cupos - "& Cant &"
Where IdPaquete = '"& IdPaquete&"'"
cn.Execute(sql)
End If
cn.Close
Set cn = Nothing%>

174
Creando Sitios de Comercio Electrónico

<CENTER>

<%If Accion = "Anular" Then%>


<BR>Su reserva fué anulada

<%Elseif Accion = "Pagar" Then%>


<BR>Su reserva fue confirmada
<BR>Lo estaremos esperando
<%End if%>
<BR><BR><A href=Sesion.asp?tipo=Perfil>Continuar</A>
</CENTER>
<%End If

PiePagina() %>
</BODY>

175