Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web

"" Tutorial de ASP "

Objetos integrados de ASP

 

 

 

 

Objeto Application

El objeto Application se utiliza para compartir información entre todos los usuarios de una aplicación (entendemos por una aplicación ASP todos los archivos .asp de un directorio virtual y sus subdirectorios. Como varios usuarios pueden compartir un objeto Application, existen los métodos Lock y Unlock para asegurar la integridad del mismo (varios usuarios no puedan modificar una misma propiedad al mismo tiempo).

Lock

El método Lock asegura que sólo un cliente puede modificar o tener acceso a las variables de Application al mismo tiempo.

Sintaxis

ApplicationLock

Unlock

El método Unlock desbloquea el objeto Application para que pueda ser modificado por otro cliente después de haberse bloqueado mediante el método Lock. Si no se llama a este método de forma explícita, el servidor Web desbloquea el objeto Application cuando el archivo .asp termina o transcurre su tiempo de espera.

Sintaxis

Application.Unlock

 

Ejemplo

<% Application.Lock

Application("visitas") = Application("visitas")+1

Application.Unlock %>

Eres el visitante numero <%= Application("visitas") %>

En el ejemplo anterior el método Lock impide que más de un cliente tenga acceso a la variable Visitas al mismo tiempo. Si la aplicación no se hubiera bloqueado, dos clientes podrían intentar incrementar simultáneamente el valor de la variable Visitas. El método Unlock libera el objeto bloqueado de forma que el próximo cliente puede incrementar la variable.

 

Nota Importante:

En el objeto Application pueden almacenarse matrices, pero estas son almacenadas como un objeto, es decir, no podemos almacenar o recuperar un solo elemento de la matriz, si no que cargaremos o recuperaremos la variable con la matriz completa

Ejemplo

<%Dim parametros(2)
parametros(0) = "verde"
parametros(1) = 640
parametros(2) = 480
Application.Lock
Application("Param") =parametros%>
Application.UnLock

con estas instrucciones almacenaríamos TODA la matriz en la variable de aplicación "Param"

Para recuperar los valores de la matriz primero recuperamos esta en una variable normal

<%Apliparam=Application("Param")%>

Ahora podremos operar con los valores de la tabla en las variables Apliparam(0), Apliparam(1) y Apliparam(2) 

Objeto Request

El Objeto Request recupera los valores que el cliente pasa al servidor durante una petición HTTP.

Dependiendo de la forma en que enviemos los datos al servidor tendremos que utilizar una u otra de las diversas colecciones del objeto Request. Las mas típicas son:

·        FORM   recupera datos enviados desde un formulario mediante el método POST.

·        QUERYSTRING  recupera datos enviados como cadena de consulta HTTP.

·        COOKIES  recupera los valores de las Cookies.

Sintaxis General:

Request.coleccion(elemento)

Ejemplos:

FORM

Supongamos que enviamos la información desde el siguiente formulario:

<form method="POST" action="recibir.asp">

<p>Nombre: <input type="text" name="Nombre" size="20"></p>

<p>Nacionalidad: <input type="text" name="Nacionalidad" size="20"></p>

<p><input type="submit" value="Enviar" name="Enviar"></p>

</form>

En nuestra página "recibir.asp" podriamos usar la siguiente secuencia:

Hola Sr/a <%=request.form("nombre")%> <br>

Asi que usted es de nacionalidad <%=request.form("nacionalidad")%>

Con lo que el resultado seria:

Hola Sr/a Julian

Asi que usted es de nacionalidad francesa

 

QUERYSTRING

Supongamos que enviamos la información en forma de cadena de consulta (Notar que una cadena de consulta HTTP esta especificada por las parejas de valores que siguen al signo "?"):

<a href="recibir.asp?nombre=Julian&nacionalidad=francesa">

En nuestra página "recibir.asp" podriamos usar la siguiente secuencia:

Hola Sr/a <%=request.querystring("nombre")%> <br>

Asi que usted es de nacionalidad <%=request.querystring("nacionalidad")%>

Con lo que el resultado seria:

Hola Sr/a Julian

Asi que usted es de nacionalidad francesa

 

COOKIES



Cookies

Las cookies son el mecanismo que nos permite guardar información relativa a un usuario a lo largo de sus distintos accesos a nuestras páginas.

Nos permite integrar funcionalidades como:

o      Personalización de opciones de cliente

o      Personalización en función de las características del cliente

o      Cestas de compra

o      Etc.

Las cookies se almacenan en los equipos de los clientes, esto hay que tenerlo en cuenta por las posibles faltas de integridad de datos que pudieran ocurrir.

ASP implementa la posibilidad de usar cookies para crear o destruir información que se almacena en los equipos de los clientes.

Las cookies se transmiten en las cabeceras cuando se realiza la comunicación http y es el navegador el encargado de almacenarlas.

Las cookies se implementan como una colección y se usan mediante los objetos integrados Request y Response.

 

Tiempo de vida de una cookie

Por defecto una cookie tiene un ámbito de sesión, es decir, tiene de vida el tiempo en que esta activo el navegador.

Podemos variar el tiempo de vida de una cookie mediante el atributo expires

 

Sintaxis: 

Response.Cookies(cookie)[(clave)|.atributo] = valor

Request.Cookies(cookie)(clave)

 

Ejemplos:

Enviar una cookie simple

<% Response.cookies("color")="morado" %>

Recuperar el valor de esa cookie 

<% ColorFavorito=Request.cookies("color")%>

Enviar una cookie con claves 

<% Response.cookies("color")("fondo")="morado"%>

<% Response.cookies("color")("texto")="blanco"%>

 

Recuperar  una cookie con claves 

<% Request.cookies("color")("fondo")%>

 Nos recuperaría el valor morado

<% Request.cookies("color")("texto") %>

Nos recuperaría el valor blanco

 

Nota: Cuando usamos Response para escribir una cookie, si esta ya existía se sobreescribe.

 

 

Atributos:

Expires

Establece el día de caducidad de una cookie

Ejemplos:

Hacer que una cookie caduque inmediatamente

 

<% Response.cookies(cookie).expires="1/1/1990"%>

 

Hacer que una cookie caduque cierto día

 

<% Response.cookies(cookie).expires="12/12/2000"%>

Componentes ActiveX

Los componentes ActiveX se han diseñado para que se ejecuten en el servidor Web como parte de las aplicaciones Web, proporcionan funcionalidad a las aplicaciones, como el acceso a ficheros, Bases de datos, etc.

Existen componentes ActiveX para tareas muy diversas, en esta páginas mostraremos como operar con algunos de los que se incluyen por defecto en la instalación de ASP.

 

Adrotator

Inserción de publicidad rotatoria

FileSystemObject

Acceso a ficheros en el servidor

TextStream

Acceso a ficheros en el servidor

ActiveX Data Object

Acceso a bases de datos 

Componente ADRotator

El componente ADRotator automatiza la rotación de imágenes de anuncio en una  página Web. Cada vez que un cliente abre o recarga la página este componente presenta una nueva imagen según las definiciones especificadas en un archivo.

Archivos necesarios:

 

Creación del objeto AdRotator

 

<% Set Rotacion=Server.CreateObject("MSWC.AdRotator") %>

 

Propiedades:

Border

Permite especificar si los anuncios se presentan enmarcados.

<% objeto.border=tamaño %>

 

Clickable

Permite especificar si los anuncios se presentan como hipervinculos.

<% objeto.clickable= True o False %>

 

TargetFrame

Permite especificar el marco de destino del hipervinculo.

<% objeto.TargetFrame= nombre del marco destino %>

 

 

Metodos:

GetAdvertisement

Recupera el siguiente anuncio del fichero Schedule.

Sintaxis

Objeto.GetAdvertisement (url del fichero Shedule)

 

Estructura del fichero Schedule

El fichero Schedule esta dividido en 2 secciones separadas por un asterisco "*". La primera sección es la especifica los parámetros comunes para todas las imágenes que se muestren; la segunda los ficheros , localizaciones y parametros propios de cada una de las imagenes.

Sintaxis de la primera sección:

REDIRECT

Especifica la url que se encargara de hacer la redirección, generalmente  una página .asp.

WIDTH

Ancho en píxel del anuncio

HEIGHT

Alto en píxel del anuncio

BORDER

Ancho en píxel del borde del anuncio

Sintaxis de la segunda sección:

Url de la imagen a mostrar

Url de la pagina a redireccionar

Texto alternativo de la imagen

Ponderación de apariciones del anuncio con respecto del total

 

Ejemplo: 

REDIRECT

/util/redirect.asp

WIDTH

300

HEIGHT

50

BORDER

2

*

 

/imagenes/logo1.gif

http://www.transcontinental.com

El viaje de tus sueños

20

/imagenes/logo5.jpg

http://www.pastelito.fr

Dulces de calidad

30

 

 

Ejemplo de fichero de redirección

<% response.redirect (request.querystring("url")) %>

 

 

Ejemplo de una página completa

<html>

<head><title>Uso de AdRotator</title></head>

<body><h2>Uso de AdRotator</h2>

<% Set Rotacion=Server.CreateObject("MSWC.AdRotator") %>

<%= Rotacion.GetAdvertisement("adrot.txt") %>

</body>

</html>

Componente FileSystemObject

El componente FSO nos permite abrir y crear ficheros de texto en el servidor.

Este componente consta de 22 métodos, de los cuales podemos seleccionar 2 que son los que nos van a permitir leer o escribir en archivos de texto existentes en el servidor o crear dichos archivos.

Para crear un objeto FSO la sintaxis es la misma que para cualquier otro componente ActiveX

<% Set MiFSO=Server.CreateObject("Scripting.FileSystemObject") %>

Cuando abrimos o creamos un fichero de texto mediante FSO este nos devuelve una instancia del objeto TextStream que es la que representa el archivo físico y con la cual trabajaremos.

 

Metodos:

CreateTextFile


Crea un archivo físico y devuelve la instancia de TextStream con la cual trabajaremos.

Sintaxis

<% Set MiFichero=MiFSO.CreateTextFile("Nombre Fichero",Sobreescribir") %>

 

Nombre Fichero 

Nombre del fichero a crear.

Sobreescribir 

Admite los valores TRUE o FALSE, si el fichero ya existe y el valor dado es TRUE se crea de nuevo, si no , devuelve un error.

 

OpenTextFile


Abre un archivo físico y devuelve la instancia  de TextStream con la cual trabajaremos.

Sintaxis

<% Set MiFichero=MiFSO.OpenTextFile("Nombre Fichero",modo,crear") %>

 

Nombre Fichero 

Nombre del fichero a abrir.

Modo 

Indica si queremos abrir el fichero para lectura (1) , para escritura (2) o para escribir nuevos registros al final del fichero(8)

Crear 

Admite los valores TRUE o FALSE, si el fichero no existe y el valor dado es TRUE se crea.

 

Ejemplo:

Apertura de fichero para lectura:

 

<% Set MiFichero=MiFSO.OpenTextFile("c:\Fichero_nuevo.txt",1,true") %>

Objeto TextStream

El objeto TextStream nos sirve para manejar ficheros de texto en el servidor. La creación de este objeto se realiza a partir de un objeto FileSystemObject  y gracias a alguno de sus métodos. 

Una vez creado, disponemos de un objeto TextStream que representa un archivo físico abierto, ya sea para lectura o escritura.

Este objeto dispone de 9 métodos:

 

Metodos:

Close


Cierra el archivo.

Sintaxis

<% MiFichero.close%>

 

Read


Lee y devuelve un numero especifico de caracteres.

Sintaxis

<% MiFichero.read(numero de caracteres) %>

 

ReadAll


Lee y devuelve un archivo completo.

Sintaxis

<% MiFichero.ReadAll %>

 

ReadLine


Lee y devuelve una línea completa de un archivo de texto.

Sintaxis

<% MiFichero.ReadLine%>

 

Skip


Salta un numero determinado de caracteres al leer un archivo.

Sintaxis

<% MiFichero.Skip(numero de caracteres) %>

 

SkipLine


Salta una línea al leer un archivo.

Sintaxis

<% MiFichero.SkipLine %>

 

Write


Escribe una cadena de caracteres en un archivo.

Sintaxis

<% MiFichero.Write("texto_entre_comillas") %>

 

WriteLine


Escribe una cadena de caracteres en un archivo añadiendo al final un carácter de fin de linea.

Sintaxis

<% MiFichero.WriteLine("texto_entre_comillas")  %>

 

WriteBlankLines


Escribe un numero especifico de caracteres de nueva línea.

Sintaxis

<% MiFichero.WriteBlankLines(numero_de_lineas)  %>

 

 

Ejemplo de escritura en un archivo

<HTML>

<HEAD><TITLE>Ejemplo de FSO y TextStream</TITLE></HEAD>

<BODY>

<%

Set Mfso=Server.CreateObject("Scripting.FileSystemObject")

Set MArchivo=Mfso.OpenTextFile("c:\fecha.txt",2,true)

MArchivo.writeline "Hola Mundo, hoy es:"

MArchivo.write date()

MArchivo.close

%>

Creado archivo  en C:\fecha.txt con la fecha de hoy

</BODY>

</HTML>

Componente Browser Capabilities

Para crear un objeto Browser Capabilities la sintaxis es la misma que para cualquier otro componente ActiveX

<%Set cliente=Server.CreateObject("MSWC.BrowserType")%>

Propiedades

Descripción

Propiedad

Soporte de ActiveX

ActiveXcontrols

Musiquilla de fondo

Backgroundsounds

Nombre del Navegador

Browser

Soporte de Cookies

Cookies

Soporte de Frames

Frames

Soporte de JScript

JScript

Plataforma de ejecución

Platform

Soporte de tablas

Tables

Soprte de VBScript

VBScript

Version del Navegador

Version


Ejemplo de código mostrando todas las propiedades

browsercapabilities.asp

<html>
<head>
<title>Browser Capabilities</title>
</head>

<body>
<%
'instanciamos el objeto
Set cliente=Server.CreateObject("MSWC.BrowserType")
%>


<table border>
<tr>
<td>Soporte de ActiveX</td><td><%=cliente.ActiveXControls%></td></tr>
<tr>
<td>Musiquilla de fondo</td><td><%=cliente.Backgroundsounds%></td>
</tr>
<tr>
<td>Nombre del Navegador</td><td><%=cliente.Browser%></td>
</tr>
<tr>
<td>Soporte de Cookies</td><td><%=cliente.Cookies%></td>
</tr>
<tr>
<td>Soporte de Frames</td><td><%=cliente.Frames%></td>
</tr>
<tr>
<td>Soporte de JavaScript</td><td><%=cliente.JavaScript%></td>
</tr>
<tr>
<td>Plataforma de ejecución</td><td><%=cliente.Platform%></td>
</tr>
<tr>
<td>Soporte de tablas</td><td><%=cliente.Tables%></td>
</tr>
<tr>
<td>Soporte de VBScript</td><td><%=cliente.Vbscript%></td>
</tr>
<tr>
<td>Version del navegador</td><td><%=cliente.Version%></td>
</tr>
</table>
</body>
</html>

Con lo que obtendriamos el siguiente resultado:

Soporte de ActiveX

True

Musiquilla de fondo

True

Nombre del Navegador

IE

Soporte de Cookies

True

Soporte de Frames

True

Soporte de JavaScript

True

Plataforma de ejecución

WinNT

Soporte de tablas

True

Soporte de VBScript

True

Version del navegador

5.0

 

Ejemplos de nivel Básico e Intermedio

  1. Calculo de números primos
  2. Probando las variables de formularios
  3. Probando el objeto Response (escribiendo en pantalla y redirigiendo el navegador a otra página)
  4. Jugando con  los Objetos Application y Session
  5. Como imprimir desde un enlace
  6. Bloquear la pulsación del boton derecho del raton
  7. Envio de email con asp (Objeto CDO)
  8. Variables del servidor (La coleccion ServerVariables)

Calculo de números primos

Este pequeño ejemplo nos permite saber si un numero introducido por pantalla es o no primo.

Consta de 2 páginas:

  1. Primos.html       página html normal que contiene un formulario para introducir el numero a evaluar.
  2. Primos.asp          página asp que recibe el numero introducido y devuelve al usuario una página en la que dice si el numero es primo o no.

 

Primos.html

<html>
<head>
<title>Calculo de numeros primos</title>
</head>
<body>
<h2 align="center">Calculo de numeros primos</h2>
<center>
<table border="1" width="30%">
  <tr>
    <td width="100%"><p align="center">Introduce un numero</p>
    <form method="POST" action="primos.asp">
      <p><input type="text" name="numero" size="20"></p>
      <center><p><input type="submit" value="Enviar" name="B1">
      <input type="reset" value="Restablecer" name="B2"></p>
      </center>
    </form>
    </td>
  </tr>
</table>
</center>
</body>
</html>

 

Primos.asp

<%option explicit%>
<html>
<% dim numero,contador,primo,result,doble
numero=request.form("numero")
%>

<head>
<title>Calculo de numeros primos</title>
</head>
<body>
<hr>
<%if isnumeric(numero) then
doble = cdbl(numero)
numero=clng(numero)
if numero <> doble or numero > 30000000 then
%>

<p align="center">
el numero no puede tener decimales ni ser mayor de 30000000
<%else
contador = 2
primo=true
   do while contador < numero-1 and primo = true
         if numero mod contador = 0 then
               primo=false
         else
           contador=contador+1  
  end if
         
   loop
   if primo then 
      response.write  "el numero "&numero &" es primo"
   else
      response.write "el numero "& numero& " no es primo, es divisible por " &contador 
end if
end if
else
%>
 El campo de consulta debe ser numerico
<%end if%>
 </p>

<hr align="center">

<p align="center"><a href="primos.html">Otra vez</a></p>
</body>
</html>

Página de pruebas de formularios

Este código nos va a servir para comprobar el buen funcionamiento de cualquier formulario que diseñemos.

Dirigiremos la salida de nuestro formulario a la página vfor.asp y esta nos dará un listado de todos las parejas nombre-valor recibidas

Vfor.asp

<html>

<head>
<title>Visualización de datos enviados por formulario </title>
</head>

<body>

<h4 align="center">Variables recibidas del formulario</h4>

<%for each v_entrada in request.form
for indice=1 to request.form(v_entrada).count
response.write v_entrada&"="&request.form(v_entrada)(indice)&"<br>"
next
next%>


<hr>
<div align="center"><center>

<table border="1" width="44%">
<tr>
<td width="100%"><p align="center"><a href="javascript:window.history.back()">Volver a la
pagina anterior</a></td>
</tr>
</table>
</center></div>
</body>
</html>

Ejemplo de código de formulario

 

<form method="POST" action="vfor.asp">

<p>Nombre: <input type="text" name="Nombre" size="20"></p>

<p>Nacionalidad: <input type="text" name="Nacionalidad" size="20"></p>

<p><input type="submit" value="Enviar" name="Enviar"></p>

</form>

Escribiendo en la pantalla: Bucle sencillo que muestra en pantalla todos los caracteres ASCII


       
ascii.asp

<html>

<head>
<title>Tabla de caracteres Ascii</title>
</head>

<body>
<%
For i=1 to 255
response.write "chr(" & i & ")" & " = " & chr(i) & "<br>"
next
%>

</body>
</html>



Redirigiendo el navegador a otra página: 

Nota importante: si deseamos redirigir el navegador a otra página no debemos de escribiri antes nada en pantalla, ni siquiera los tag de html <html><head><body>... etc.


        redirect.asp

<%
response.redirect
"http://www.otrositio.com"

%>

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>

mipagina.asp

<html>

........

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

.....

</html>

Contador de visitantes activos

Utilizaremos para llevar el control de visitantes activos 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.

Reduciremos en uno el numero de vistante cada vez que uno de ellos abandone nuestra aplicación, esto lo sabremos gracias al evento session_onend 

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("vactivos")=0
application("fecha")=date()
End Sub

Sub Application_OnEnd

End Sub


Sub Session_OnStart
application.lock

application("vactivos")=application("vactivos")+1
application.unlock
End Sub

Sub Session_OnEnd
application.lock
application("vactivos")=application("vactivos")-1
application.unlock

End Sub

</SCRIPT>

 

mipagina.asp

<html>

........

Sois actualmente <%=application("vactivos")%> visitantes concurrentes

.....

</html>

 

Imprimir desde un enlace en la página

No se si alguno tendréis alguna vez la necesidad de imprimir desde un enlace en la página, si es así, aquí tenéis unos ejemplos de como hacerlo.

Antes de nada, tenemos que averiguar que tipo de explorador tiene el cliente ( como es "normal", cada uno funciona de forma distinta).

Si el cliente es Netscape o Explorer 5.x, es facil solo hay que hacer una llamada a la función print() de Javascript

Ejemplo IE5.x Netscape:

<a href="javascript:print()"><font color="#0000FF">Imprimir
</font></a>

Si el cliente es Explorer 4.x la cosa es un poco mas complicada, esta versión hace la impresión por medio de un componente ActiveX que reside en la maquina del cliente, por lo cual nos toca hacer una instancia de dicho componente y luego llamarlo

Ejemplo IE4.x:

Declaración del objeto en IE4.x

<OBJECT ID="WB" WIDTH="0" HEIGHT="0" CLASSID="clsid:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>
<SCRIPT LANGUAGE="VBScript">
<!--
Function window_onunload
On Error Resume Next
Set WB = nothing
End Function

Sub vbPrintPage()

OLECMDID_PRINT = 6
OLECMDEXECOPT_DONTPROMPTUSER = 6
OLECMDEXECOPT_PROMPTUSER = 1
On Error Resume Next
WB.ExecWB OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER
End Sub
-->
</SCRIPT>

 

LLamada al objeto declarado:

<a href="#" onclick="vbPrintPage()"><font color="#0000FF">Imprimir
</font>

 

Como averiguar cual es el explorador cliente

Existen varias formas de averiguarlo usando Javascript,  la forma que os muestro a continuación es usando ASP (ya que estas páginas van sobre ASP, ¿no?).

Esta información la podemos encontrar en examinando:

Request.ServerVariables("HTTP_USER_AGENT")

 

Un ejemplo completo

Nota: como en IE5.x y Netscape se imprime de la misma forma, lo que nos interesa averiguar es la excepción, o sea, IE4.x

 

<html>

<head>

<title>xxxxxxxxx</title>
</head>
<%nav=Request.ServerVariables("HTTP_USER_AGENT")
cadenabuscada="MSIE 4"
for i = 1 to len(nav)
if mid(nav,i,1)= "M" then
xx=mid(nav,i,(len(cadenabuscada)))
if xx=cadenabuscada then
nav="IE4"
exit for
end if 
end if 
next
if nav="IE4" then 
%>

<OBJECT ID="WB" WIDTH="0" HEIGHT="0" CLASSID="clsid:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>
<SCRIPT LANGUAGE="VBScript">
<!--
Function window_onunload
On Error Resume Next
Set WB = nothing
End Function

Sub vbPrintPage()

OLECMDID_PRINT = 6
OLECMDEXECOPT_DONTPROMPTUSER = 6
OLECMDEXECOPT_PROMPTUSER = 1
On Error Resume Next
WB.ExecWB OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER
End Sub
-->
</SCRIPT>
<%end if%>
<body>

<%if nav="IE4" then%>
<a href="#" onclick="vbPrintPage()"><font color="#0000FF">Imprimir
</font></a></td>

<%else%>
<a href="javascript:print()"><font color="#0000FF">Imprimir
</font></a></td>

<%end if%> 



</body>

</html>

Como bloquear el boton derecho del raton

No suelo poner ejemplos de javascript, pero esta utilidad puede venir bien si queremos desactivar el boton derecho del raton sobre alguna de nuestras páginas.

<SCRIPT type="text/javascript">

function click(e) {
// Explorer
if (IE)
if (event.button == 2){
accion() ;
return false ;
}

// Netscape
if (NS)
if (e.which == 3) {
accion() ;
return false ;
}
}

function accion() {
window.status = 'Pulsación de botón no permitida' ;
if (IE) alert('Pulsación de botón no permitida');
return ;
}



var NS = (document.layers) ;
var IE = (document.all) ;
if (NS) document.captureEvents(Event.MOUSEDOWN) ;
document.onmousedown = click ;


</SCRIPT>

Uso del objeto CDO (Envio de e-mails con asp)

Existen varios objetos ActiveX para enviar e-mail desde asp, en nuestro caso vamos a usar CDO, que es el objeto que nos proporciona Microsoft con NT e IIS4.

Lo primero que necesitamos es un formulario que llame a nuestra página asp con los datos necesarios para mandar el e-mail (a estas alturas ya no voy a daros los fuentes HTML de un formulario, quiero suponer que si has llegado hasta aquí eso ya te lo sabes).

En nuestra página asp recibiremos esos datos mediante el objeto request y se los pasaremos a una instancia del objeto CDO.

Las principales propiedades del objeto CDO son:

From

Origen del e-mail

To

Destino del e-mail

Subject

Asunto del e-mail

Body

Texto del e-mail

Cc

Con copia a ...

Bcc

Con copia oculta a ...

Importance

Urgencia 0=Baja, 1=Normal, 2=Alta

AttachFile

Fichero anexado

Los principales métodos del objeto CDO son:

Send

Envía el mensaje

 

Ejemplo:

<%

'Asignamos los valores recibidos del formulario a las variables
Origen = Request.Form("Origen")
Destino = Request.Form("Destino")
Asunto = Request.Form("Asunto")
Mensaje = Request.Form("Mensaje")

'

'Hasta aqui los datos fundamentales, si ademas necesitamos enviar ficheros
'  copias usaremos el resto de las propiedades

Copiaa = "smaug@metropoli2000.com;pepe@uscom.com
'copias a otros usuarios separados por ;

Anexo = "c:\documentos\archivo.txt"
'ficheros anexados


'Creamos una instancia del objeto CDO
Set ObjetoCDO = Server.CreateObject("CDONTS.NewMail")

'Asignamos las propiedades al objeto
ObjetoCDO.From = Origen 
ObjetoCDO.To = Destino
ObjetoCDO.Subject = Asunto
ObjetoCDO.Body = Mensaje
ObjetoCDO.Cc = Copiaa
ObjetoCDO.AttachFile  Anexo


'Enviamos el e-mail
ObjetoCDO.Send

'Destruimos el objeto
Set ObjetoCDO = Nothing

%>

La colección ServerVariables

La coleccion ServerVariables nos da acceso a variables de entorno del servidor y del cliente.

Esta colección contiene una gran cantidad de datos, algunos de ellos tan interesantes como la dirección IP del visitante, del servidor, el nombre del servidor, etc

ServerVariables forma parte del objeto Request, por lo cual para consultar estas variables recurriremos a el.

Ejecutando el siguiente codigo tendremos un listado de todos los valores de la colección.

servervar.asp

<html><body>
<table border=1>
<%for each name in request.servervariables%>
<tr><td>
<%=name%>
</td><td>
<%=request.servervariables(name)%>
</td></tr>
<%next%>
</table></body></html>

 
Con lo que obtendriamos el siguiente resultado:

ALL_HTTP

HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */* HTTP_ACCEPT_LANGUAGE:es HTTP_HOST:www.websamba.com HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) HTTP_VIA:HTTP/1.0 numancia.renfe.sir (IBM HTTP Server) HTTP_ACCEPT_ENCODING:gzip, deflate

ALL_RAW

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */* Accept-Language: es Host: www.websamba.com User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Via: HTTP/1.0 numancia.renfe.sir (IBM HTTP Server) Accept-Encoding: gzip, deflate

APPL_MD_PATH

/LM/W3SVC/6/Root

APPL_PHYSICAL_PATH

F:\members\

AUTH_PASSWORD

 

AUTH_TYPE

 

AUTH_USER

 

CERT_COOKIE

 

CERT_FLAGS

 

CERT_ISSUER

 

CERT_KEYSIZE

 

CERT_SECRETKEYSIZE

 

CERT_SERIALNUMBER

 

CERT_SERVER_ISSUER

 

CERT_SERVER_SUBJECT

 

CERT_SUBJECT

 

CONTENT_LENGTH

0

CONTENT_TYPE

 

GATEWAY_INTERFACE

CGI/1.1

HTTPS

off

HTTPS_KEYSIZE

 

HTTPS_SECRETKEYSIZE

 

HTTPS_SERVER_ISSUER

 

HTTPS_SERVER_SUBJECT

 

INSTANCE_ID

6

INSTANCE_META_PATH

/LM/W3SVC/6

LOCAL_ADDR

212.49.11.11

LOGON_USER

 

PATH_INFO

/aspes/servervar.asp

PATH_TRANSLATED

F:\members\aspes\servervar.asp

QUERY_STRING

 

REMOTE_ADDR

195.72.88.113

REMOTE_HOST

195.72.88.113

REMOTE_USER

 

REQUEST_METHOD

GET

SCRIPT_NAME

/aspes/servervar.asp

SERVER_NAME

www.websamba.com

SERVER_PORT

80

SERVER_PORT_SECURE

0

SERVER_PROTOCOL

HTTP/1.0

SERVER_SOFTWARE

Microsoft-IIS/4.0

URL

/aspes/servervar.asp

HTTP_ACCEPT

image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*

HTTP_ACCEPT_LANGUAGE

es

HTTP_HOST

www.websamba.com

HTTP_USER_AGENT

Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)

HTTP_VIA

HTTP/1.0 numancia.ibm.sir (IBM HTTP Server)

HTTP_ACCEPT_ENCODING

gzip, deflate

 

Ejemplos de operaciones sobre Bases de Datos

  1. Listado sencillo de registros
  2. Paginación de resultados
  3. Ejemplo de consulta sencilla con formulario
  4. Ejemplo de inserción de datos en una tabla
  5. Ejemplo de modificación de datos en una tabla
  6. Ejemplo de paginación profesional de resultados
  7. Ejemplo de una aplicación de preguntas y respuestas

 

Listado de registros

Este ejemplo nos permite listar el resultado de una select contra una tabla de nuestra base de datos.

 

Listado.asp

<html>

<head><title>Listado de registros</title></head>


<%SQLtxt = "SELECT Producto, Cantidad, Precio FROM almacen "%>
<body>
<%set rs = CreateObject("ADODB.Recordset")
rs.Open SQLtxt, "DSN=Mibase"

%>


<center>
<table border="0" width="32%" bgcolor="#C0C0C0">
<tr>
<td width="100%">
<p align="center"><b><big>Listado de registros</big></b></td>
</tr>
</table>
<h3></center>
<br>
</h3>
<table BORDER="1" CELLSPACING="0" BORDERCOLOR="#000000" 
CELLPADDING="2" width="100%">
<tr>
<td BGCOLOR="#C0C0C0"><b>Nombre de producto</b></td>
<td BGCOLOR="#C0C0C0"><b>Cantidad</b></td>
<td BGCOLOR="#C0C0C0" align="right"><b>Precio</b></td>
</tr>


<%
Do While NOT rs.EOF%>

<tr>
<td><%= rs("Producto")%></td>
<td><%= rs("Cantidad")%></td>
<td align="right"><%= FormatCurrency(rs("Precio"))%></td>
</tr>

<% rs.MoveNext
Loop
rs.Close

%>


</table>
</body></html>

Paginación de registros

Este ejemplo nos permite paginar en bloques de registros el resultado de una select contra una tabla de nuestra base de datos.

 

Paginando.asp

<!-- #include file="adovbs.inc" -->
<html>

<!-- recibimos del formulario la dirección del movimiento y
lo guardamos en una variable de sesión para este usuario -->

<%xx=request.form("direccion")
if xx = "Atras" then 
session("pagina")=session("pagina")-1

if session("pagina")< 1 then 
session("pagina")=1 'evitamos el error por reload
end if

else 
if xx="Adelante" then 
session("pagina")=session("pagina")+1
else
session("pagina")=1 'primera pasada
end if 
end if
%> 

<head>
<title>Paginación de registros</title>
</head>

<!-- Montamos la sentencia SQL con los campos a seleccionar -->

<%SQLtxt = "SELECT Producto, Cantidad, Precio FROM almacen"%>

<body>

<!-- Creamos el objeto recordset y le asignamos un tipo de cursor
que nos permita movernos por el y asignarle tamaños de pagina -->

<%set rs = CreateObject("ADODB.Recordset")
rs.CursorType = adOpenstatic
%>

<!-- abrimos el recordset con la sentencia SQL sobre nuestra base
ODBC y le asignamos el tamaño de página -->

<%rs.Open SQLtxt, "DSN=Mibase"
rs.pagesize=10

if session("pagina")>rs.pagecount then
session("pagina")=rs.pagecount 'evitamos el error de reload
end if
%> 

<!-- situamos el cursor en el inicio de la pagina a mostrar y 
calculamos los valores de inicio y fin para mostrarlos en
las cabeceras -->

<%rs.absolutepage=session("pagina")
inicio=1+(session("pagina")-1)*rs.pagesize
fin=inicio+9
if fin > rs.recordcount then
fin =rs.recordcount
end if

%>
<center><h3>Paginación de registros</h3></center>
<table border="0" width="100%" bgcolor="#C0C0C0">
<tr>
<td width="50%" align="center">Registros <font color="#FF0000"><%=inicio%> </font>
al <font color="#FF0000"><%=fin%></font> de un total de
<font color="#FF0000"><%=rs.recordcount%></font></td>
<td width="50%" align="center">Página <font color="#FF0000"><%=session("pagina")%>
</font> de <font color="#FF0000"><%=rs.pagecount%></font></td>
</tr>
</table>
<br>
<table BORDER="1" CELLSPACING="0" BORDERCOLOR="#000000" CELLPADDING="2" width="100%">
<tr>
<td BGCOLOR="#C0C0C0"><b>Nombre de producto</b></td>
<td BGCOLOR="#C0C0C0"><b>Cantidad por unidad</b></td>
<td BGCOLOR="#C0C0C0" align="right"><b>Precio por unidad</b></td>
</tr>


<!-- montamos el bucle para mostrar los registros -->

<%
contador=0
Do While contador < rs.pagesize and NOT rs.EOF
%>


<tr>
<td><%= rs("Producto")%></td>
<td><%= rs("Cantidad")%></td>
<td align="right"><%= FormatCurrency(rs("Precio"))%></td>
</tr>

<% rs.MoveNext
contador=contador+1
Loop

%>
</table>
<div align="center">
<center>

<!--
mostramos los botones de adelante y atras segun proceda -->

<table border="0" width="38%" height="5">
<tr><%if session("pagina")<> 1 then %>
<td width="50%" height="1" align="center">
<form method="POST" action="paginando.asp">
<p><input type="submit" value="Atras" name="direccion"></p>
</form>
</td><%end if%>
<%if session("pagina")< rs.pagecount then%>
<td width="50%" height="1" align="center">
<form method="POST" name="paginando.asp">
<p><input type="submit" value="Adelante" name="direccion"></p>
</form>
</td><%end if%>
</tr>
</table>
</center>
</div>

<!-- cerramos el recordset -->

<%rs.Close%>

</body></html>

Ejemplo de consulta sencilla con formulario

Este ejemplo nos permite listar el resultado de una select elaborada desde un formulario.

Suponemos que tenemos declarada en odbc una base de datos bajo la DSN de Sistema Biblioteca.

Esta base de datos contiene una tabla llamada libros con los campos Titulo y Autor.

El formulario nos presenta un formato para escribir el titulo que buscamos, este titulo se lo pasamos como parámetro a nuestra pagina .asp que nos mostrara todos los titulo coincidentes.

Fconsu.htm

<html>

<head>

<title>Formulario para consulta sencilla</title>
</head>

<body>

<h3 align="center">Ejemplo de consulta sencilla</h3>
<p>&nbsp;</p>
<form method="POST" action="consultasencilla.asp">
<table border="1" width="100%">
<tr>
<td width="16%">Titulo:</td>
<td width="84%"><input type="text" name="titulo" size="55"></td>
</tr>
<tr>
<td width="16%"><input type="submit" value="Enviar" name="B1"></td>
<td width="84%"><input type="reset" value="Restablecer" name="B2"></td>
</tr>
</table>
</form>



Consultasencilla.asp

<html>
<head>
<title>Ejemplo de consulta sencilla</title>
</head><body bgcolor="#808000">
<div align="center">
<center>
<table border="1" width="62%" bgcolor="#008000">
<tr>
<td width="100%">
<p align="center"><font color="#FFFFFF">Resultados de su consulta</font></td>
</tr>
</table>
</center>
</div>


<%ctitulo=request.form("titulo")
set rs=createobject("ADODB.Recordset")
sqltxt="select titulo,autor from libros where titulo like '%"&ctitulo&"%'"
rs.open sqltxt,"DSN=biblioteca" %>
<%if rs.eof then%>
<h3 align="center">
<font color="#FF0000">No hay datos que coincidan con su petición </font></h3>

<%else%>
<
table border="0" width="100%">
<tr>
<th width="33%" valign="middle" align="center" bgcolor="#008080">
<font color="#000000">Titulo</font></th>
<th width="33%" valign="middle" align="center" bgcolor="#008080">
<font color="#000000">Autor</font></th>
</tr>

<%do while not rs.eof%>
<
tr>
<td width="33%" valign="middle" align="center" bgcolor="#FFFFFF">
<font color="#000000"><%
=rs("Titulo")%></font></td>
<td width="33%" valign="middle" align="center" bgcolor="#FFFFFF">
<font color="#000000"><%
=rs("Autor")%></font></td>
</tr>

<%rs.movenext
loop
rs.close
end if%>
</table>
<p>&nbsp;</p>
<p align="center"><a href="fconsu.htm">Otra vez</a></p>
</body></html>

 

Inserción de registros en una tabla

Este ejemplo nos permite insertar un registro en una tabla usando el objeto recordset.

Podéis ver el ejemplo funcionando en la aplicación 

Los Foros de La Cueva  

 

La primera página es un formulario que nos permite escribir el valor a actualizar.

Debemos prestar especial atención a las sentencias remarcadas en azul.

En el "action" especificaremos la pagina ASP que procesara los datos enviados desde el formulario, recibiremos el dato introducido en la caja de texto (input type="text") en la variable "foro"(name="foro")

Insertarforo.htm

<html>
<head>
<title>Crear un Nuevo Foro</title>
</head>
<body bgcolor="#CCFFCC">
<p align="center"><font face="Verdana">Crear un nuevo Foro</font></p>

<form method="POST" action="nuevoforo.asp">
<table border="1" width="100%">
<tr>
<td width="100%" bgcolor="#008000"><font color="#FFFFFF">Nombre del Foro</font></td>
</tr>
<tr>
<td width="100%">
<p align="center"><input type="text" name="foro" size="50">
</p>
</td>
</tr>
</table>
<input type="submit" value="Enviar" name="B1">

<input type="reset" value="Restablecer" name="B2"></p>
</form>
</body>
</html>

Conseguimos un formulario con este aspecto

Nombre del Foro

 

  Como los datos son enviados desde un formulario mediante el método "POST" debemos recibirlos en nuestra pagina ASP mediante un Request.form. Si este parámetro viene vacío lo que hacemos es generar una pagina html de error que mostramos al usuario.

Si el parámetro es correcto procederemos a introducir el nuevo valor en una tabla de nuestra base de datos. Lo primero es establecer nuestra conexión con la base de datos mediante el objeto Server.

NOTA: Podréis observar que en este caso la conexión ODBC la he efectuado por un método directo que me evita tener que declarar la base de datos como DSN del Sistema en ODBC . Los efectos son los mismos que si la hubiera declarado y la invocara por su nombre ODBC.

Luego creamos nuestro Objeto Recordset , le asignamos las propiedades necesarias para que nos permita actualizar (CursorType y LockType) y abrimos la tabla "foros" a través de la conexión establecida anteriormente con la base de datos.

Invocamos al método Addnew  de Recordset para abrir sitio para un nuevo registro

Asignamos al campo "foro" el valor recibido del formulario

Invocamos al método Update de Recordset para confirmar el alta y cerramos el recordset.

Usamos un response.redirect para dirigir al usuario a otra pagina una vez que hemos terminado el trabajo de actualización.

 

nuevoforo.asp

<%
Const adOpenKeyset = 1
Const adLockOptimistic = 3

foro=request.form("foro")
if foro="" then %>

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Error al insertar pregunta</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg"></p>

<p align="center">Ningun campo puede estar en blanco,
<a href="insertarforo.htm">
inténtalo otra vez</a></p>
</body>

</html>

<%else
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\xxxxx\db\myb.mdb"))


set rs=createobject("ADODB.Recordset")
rs.CursorType = adOpenKeyset 
rs.LockType = adLockOptimistic 

rs.open "foros",conn
rs.addnew
rs("foro")=foro
rs.update
rs.close
response.redirect "foros.asp"
end if%>


Modificación de un registro en una tabla

Este ejemplo nos permite modificar un registro en una tabla usando el objeto recordset.

Quiero suponer que si estas aquí, ya has leído y entendido el ejemplo anterior.

Para modificar un registro, lo primero que tenemos que hacer es recuperarlo de la tabla y posicionar en él el cursor (hablando en plata, hacer una select para recuperarlo y movernos por el recordset obtenido hasta situarnos en el).

Una vez situados en el registro a modificar asignaremos los valores que queramos poner en los campos a modificar con sentencias de asignación normales:  rs("campo_a_modificar")="Nuevo_Valor"

Una vez asignados los valores, emplearemos el metodo Update de recordset para grabar las modificaciones en la tabla de la Base de Datos.

La tabla que usamos en el ejemplo consta de 2 campos:

TABLA IMPACTOS

codigo

Clave principal de la tabla de tipo autonumerico (Nota: los valores a los campos autonumericos los asigna directamente el mismo Gestor de Bases de Datos) 

contador

Campo numérico

 

El ejemplo que os muestro realiza una select contra la tabla seleccionando por el campo clave cuyo valor se supone que recibimos desde un formulario (no creo que haga falta decir que los campos clave no se repiten, así que nos seleccionara un solo registro o bien, si ese registro no existe nos devolverá un recordset vació).

En el caso de que encuentre el registro le sumara 1 al valor que ya existía en el campo "contador" , si no es asi y el registro no existia, creara un nuevo registro asignando el valor 1 al campo "contador" (como ya hemos comentado antes al campo "codigo" no hace falta asignarle ningún valor, se lo asigna directamente el Gestor de B.D.)

Actualizar.asp

<%
Const adOpenKeyset = 1
Const adLockOptimistic = 3

codigo=request.form("codigo")
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\xxxxx\db\myb.mdb"))
set rs=createobject("ADODB.Recordset")
rs.CursorType = adOpenKeyset 
rs.LockType = adLockOptimistic 

sqltxt="SELECT * from impactos where codigo="&codigo 
rs.Open sqltxt, conn


if rs.eof then
     rs.Addnew
     rs("impactos")=1 
     rs.Update 
else
     rs("impactos")=rs("impactos")+1
     rs.update
end if 
rs.close


response.redirect "otrositio.html" %>

Paginación profesional de resultados    

 

IMPORTANTE: antes de liarte con este ejemplo es necesario que hallas practicado y entendido el ejemplo de paginación sencilla y que estés familiarizado con los distintos métodos request .

 

 

En este ejemplo se muestra como conseguir una paginación de resultados de una consulta con un aspecto y funcionalidad igual a la usada en los buscadores tipo Yahoo , Terra, etc.

Para ello utlizaremos un formulario que nos ofrecera las opciones de páginación.

Los datos los enviaremos mediante el metodo GET , que nos los enviara como una cadena de consulta.

La página asp recibira las opciones mediante request.querystring y se llamara a si misma con esas mismas opciones mediante un link con cadena de consulta que nosotros elaboraremos en el pie de página.

 

Formulario de captura de opciones:

PPROF.HTM

<html>

<head>

<title>Consultas</title>

</head>

<body bgcolor="#800000">

<p align="center"><font color="#FFFFFF">

<big><big><big>Paginación Profesional de resultados</big></big></big></font></p>

<p align="center"><font color="#FFFFFF"><big>Listado de libros</big></font></p>

<form method="GET" action="pprof.asp">

<table border="1" width="100%" height="203">

<tr>

<td width="100%" align="center" height="23"><font color="#FFFFFF">

<b><i>Selecciona el campo de ordenacion</i></b></font></td>

</tr>

<tr>

<td width="100%" bgcolor="#FFFFCC" height="30"><table border="0" width="100%"

bgcolor="#FFCC99">

<tr>

<td width="50%" align="center">

<input type="radio" value="autor" name="orden" checked>Autor</td>

<td width="50%" align="center">

<input type="radio" value="titulo" name="orden">Titulo</td>

</tr>

</table>

</td>

</tr>

<tr>

<td width="100%" height="23"><div align="center"><center><p><i><font color="#FFFFFF">

<b>Selecciona la cantidad de registros por página</b></font></i></td>

</tr>

<tr>

<td width="100%" height="103"><table border="0" width="100%" bgcolor="#FFFFCC">

<tr>

<td width="20%" align="center" bgcolor="#FFCC99"><input type="radio" value="25"

name="tamanopagina">&nbsp; 25</td>

<td width="20%" align="center" bgcolor="#FFCC99"><input type="radio" name="tamanopagina"

value="35" checked>&nbsp; 35</td>

<td width="20%" align="center" bgcolor="#FFCC99"><input type="radio" name="tamanopagina"

value="50">&nbsp; 50</td>

<td width="20%" align="center" bgcolor="#FFCC99"><input type="radio" name="tamanopagina"

value="75">&nbsp; 75</td>

<td width="20%" align="center" bgcolor="#FFCC99"><input type="radio" name="tamanopagina"

value="all">&nbsp; todos</td>

</tr>

</table>

<div align="center"><center><p><input type="submit" value="Enviar" name="B1"></td>

</tr>

</table>

<font color="#FFFFFF"><div align="center"><center><p>&nbsp;</p>

</center></div>

</form>

</font>

</body>

</html>

 

Conseguimos un formulario como este:

 Selecciona el campo de ordenacion

  Autor

  Titulo

Selecciona la cantidad de registros por página

  25

  35

  50

  75

  todos

 

Pagina de Listado

PPROF.ASP

<!-- #include file="adovbs.inc" -->

<html>

<head>

<title>Consultas</title>

</head>

<body bgcolor="#800000">

<p align="center"><font color="#FFFFFF"><big><big><big>Paginacion Profesional</big></big></big></font></p>

<p align="center"><font color="#FFFFFF"><big>Listado de libros</big></font></p>

<font color="#FFFFFF"><%

 

Server.ScriptTimeOut=180

 

tamanopagina=request.querystring("tamanopagina")

if tamanopagina = "" then

tamanopagina=25

end if

 

paginaabsoluta=request.querystring("paginaabsoluta")

if paginaabsoluta="" then

paginaabsoluta=1

end if

orden=request.querystring("orden")

if orden = "" then

orden="codigo"

end if

set rs = CreateObject("ADODB.Recordset")

rs.CursorType = adOpenKeyset

rs.LockType = adLockOptimistic

sqltxt="SELECT * FROM biblioteca order by "&orden

rs.Open sqltxt, "DSN=biblioteca"

if tamanopagina <> "all" then

rs.pagesize= cint(tamanopagina)

rs.absolutepage=cint(paginaabsoluta)

 

contador=1%>

 

<table align="center">

<% do while not rs.eof and contador <= cint(tamanopagina) %>

<tr>

<td width="21%" bgcolor="#C59530"><%=rs("autor")%>

</td>

<td width="21%" bgcolor="#C59530"><%=rs("titulo")%>

</td>

</tr>

<%rs.movenext

contador=contador+1

loop%>

</table>

<p align="center">Pulsa en la página a la que deseas ir </p>

<table align="center" bgcolor="#ffffff">

<tr>

<%j=0

if cint(paginaabsoluta) <> 1 then

atras=cint(paginaabsoluta)-1

response.write "<td align=center><a href=pprof.asp?orden="&orden&"&tamanopagina="&tamanopagina&"&paginaabsoluta=" & atras & ">"&"&lt;&lt;"&"</a></td>"

j=j+1

end if

for i = 1 to rs.pagecount

j=j+1

if j>20 then

response.write "</tr><tr>"

j=1

end if

if cint(i) = cint(paginaabsoluta) then

response.write "<td bgcolor=#00ff00 align=center>"&i&"</td>"

else

response.write "<td align=center><a href=pprof.asp?orden="&orden&"&tamanopagina="&tamanopagina&"&paginaabsoluta=" & i & ">"&i&"</a></td>"

end if

next

end if%>

<%if cint(paginaabsoluta) <> rs.pagecount then

atras=cint(paginaabsoluta)+1

response.write "<td align=center><a href=pprof.asp?orden="&orden&"&tamanopagina="&tamanopagina&"&paginaabsoluta=" & atras & ">"&"&gt;&gt;"&"</a></td>"

end if%>

</tr>

</table>

<p align="center">&nbsp; </font></p>

</body>

</html>

Con lo que obtendras este resultado:

pprof.jpg (57543 bytes)

Una aplicación de foros sencilla

Antes de liarte con el ejemplo, puedes darte una vuelta por Los foros de la cueva para que te hagas una idea del funcionamiento de la aplicación.

Este ejercicio, sin ser complicado, si requiere de una base minima de formación en HTML y ASP-ADO, asi que no te lies con él antes de haber echado un vistazo a TODOS los ejemplos anteriores.

La base de datos sobre la que esta elaborado es ACCESS y utiliza la alocación directa del Driver sin usar DSN (esta es la forma de declaración a la que te obligan la mayoria de los servidores gratuitos al no dejarte definir DSN's de sistema)

Definición de la base de datos

Nombre de la Base de Datos:  PyR.mdb

Consta de 3 tablas:

Tabla FOROS

forosforosdef.jpg (9393 bytes)

Tabla PREGUNTAS

forospreguntasdef.jpg (14461 bytes)

Tabla RESPUESTAS

forosrespuestasdef.jpg (12744 bytes)

 

Relaciones entre las tablas:

forosrelaciones.jpg (20279 bytes)
       

 

Modulos y paginas estaticas de la aplicación

La aplicación consta de 8 paginas asp y 1 html estatico. Se podria reducir el numero de modulos reutilizando parte del codigo de estos, pero por claridad he preferido plantearlo de esta forma.

addforo.asp

Modulo de inclusión de un nuevo foro en la tabla Foros

addpregunta.asp

Modulo de inclusión de una nueva pregunta en la tabla Preguntas

addrespuesta.asp

Modulo de inclusión de una nueva respuesta en la tabla Respuestas

foros.asp

Modulo de presentación, listado de todos los foros 

insertarforo.htm

Formulario de inserción de un nuevo foro

insertarpregunta.asp

Formulario para insertar una nueva pregunta

pyr.asp

Modulo de visualización de todas las preguntas de un determinado foro

responder.asp

Formulario para insertar una respuesta a una pregunta

vr.asp

Modulo de visualización de todas las respuestas a una determinada pregunta.

addforo.asp

<%
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4%>
<%foro=request.form("foro")
if foro="" then %>

<html>

<head>
<title>Error al insertar pregunta</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg"></p>

<p align="center">Ningun campo puede estar en blanco,
<a href="insertarforo.htm">
inténtalo otra vez</a></p>
</body>

</html>

<%else
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\ewebcity\db\pyr.mdb"))


set rs=createobject("ADODB.Recordset")
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic

rs.open "foros",conn
rs.addnew
rs("foro")=foro
rs.update
rs.close
response.redirect "foros.asp"
end if%>

 

addpregunta.asp

<%
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4%>
<%autor=request.form("autor")
nforo=request.form("nforo")
pregunta=request.form("pregunta")
if autor="" or pregunta="" or nforo="" then %>

<html>

<head>

<title>Error al insertar pregunta</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg"></p>

<p align="center">Ningun campo puede estar en blanco,
<a href="insertarpregunta.asp?nforo=<%=nforo%>">
inténtalo otra vez</a></p>
</body>

</html>

<%else
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\ewebcity\db\pyr.mdb"))

set rs=createobject("ADODB.Recordset")
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic

rs.open "preguntas",conn
rs.addnew
rs("foro")=nforo
rs("autor")=autor
rs("fecha")=now()
rs("pregunta")=pregunta
rs.update
rs.close
donde="pyr.asp?nforo="&nforo
response.redirect donde
end if%>


addrespuesta.asp

<%
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4%>
<%nombre=request.form("nombre")
nforo=request.form("nforo")
respuesta=request.form("respuesta")
numero=request.form("numero")
if nombre="" or respuesta="" or numero="" or nforo="" then %>

<html>

<head>

<title>Error al insertar pregunta</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg"></p>

<p align="center">Ningun campo puede estar en blanco,
<a href="responder.asp?numero=<%=numero%>&nforo=<%=nforo%>">
inténtalo otra vez</a></p>
</body>

</html>

<%else
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\ewebcity\db\pyr.mdb"))


set rs=createobject("ADODB.Recordset")
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic

rs.open "respuestas",conn
rs.addnew
rs("numero")=numero
rs("autor")=nombre
rs("fecha")=now()
rs("respuesta")=respuesta
rs.update
rs.close
donde="vr.asp?numero="&numero&"&nforo="&nforo
response.redirect donde
end if%>


foros.asp

<html>
<%sqltxt="select * from foros order by foro"
Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\ewebcity\db\pyr.mdb"))

set rs=createobject("ADODB.Recordset")
set rsr=createobject("ADODB.Recordset")
rs.open sqltxt,conn%>


<head>
<title>La Cueva de Smaug Foros</title>
</head>

<body bgcolor="#CCFFCC">



<p align="center"><img border="0" src="images/titulo.jpg"></p>

<p align="center">&nbsp;</p>
<div align="center">
<center>
<table border="0" width="575">
<tr>
<td colspan="2" align="center" bordercolor="#008000" bgcolor="#008000" width="565"><font face="Verdana" color="#FFFFFF" size="2">Los
Foros de la Cueva TEMAS LIBRES</font></td>

</tr>
<%if rs.eof then%>
<tr><td colspan="2" width="565" bgcolor="#FFCCCC">No hay foros disponibles</td></tr>
<%else
do while not rs.eof%>

<tr>
<td width="470" bgcolor="#FFCCCC"><font face="Verdana" size="1"><%=rs("foro")%></font></td>
<td width="89" bgcolor="#FFCCCC">
<p align="center"><font face="Verdana" size="1"><a href="pyr.asp?nforo=<%=rs("codigof")%>"><img border="0" src="images/ir.gif" WIDTH="13" HEIGHT="13"></a></font></p>
</td>


<%rs.movenext
        loop
rs.close
end if%>


</table>
</center>
</div>
<br>
<div align="center">
<center>
<table border="0" width="50%" bgcolor="#FFFFFF">
<tr>
<td width="30%" align="center"><font face="Verdana" size="1"><a href="insertarforo.htm">Crear
un nuevo Foro</a></font></td>
</tr>
</table>
</center>
</div>

</body>

</html>

Insertarforo.asp

<html>

<head>

<title>Crear un Nuevo Foro</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg" width="450" height="75"></p>

<p align="center"><font face="Verdana">Crear un nuevo Foro</font></p>

<form method="POST" action="addforo.asp">
<table border="1" width="100%">
<tr>
<td width="100%" bgcolor="#008000"><font color="#FFFFFF">Nombre del Foro</font></td>
</tr>
<tr>
<td width="100%">
<p align="center"><input type="text" name="foro" size="50">
</p>
</td>
</tr>

</table>
<p align="center"><input type="hidden" name="nforo" value="<%=nforo%>">
<input type="submit" value="Enviar" name="B1"><input type="reset" value="Restablecer" name="B2"></p>
</form>

</body>

</html>

 

Insertarpregunta.asp

<%nforo=request.querystring("nforo")%>
<html>

<head>

<title>Insertar una pregunta</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg"></p>

<p align="center"><font face="Verdana">Insertar una pregunta</font></p>

<form method="POST" action="addpregunta.asp">
<table border="1" width="100%">
<tr>
<td width="100%" bgcolor="#008000"><font face="Verdana" size="2" color="#FFFFFF">Pregunta</font></td>
</tr>
<tr>
<td width="100%">Pregunta insertada por: <input type="text" name="autor" size="20">
</td>
</tr>
<tr>
<td width="100%">
<p align="center"><textarea rows="5" name="pregunta" cols="50"></textarea></td>
</tr>
</table>
<p align="center"><input type="hidden" name="nforo" value="<%=nforo%>">
<input type="submit" value="Enviar" name="B1"><input type="reset" value="Restablecer" name="B2"></p>
</form>

</body>

</html>

pyr.asp

<%nforo=request.querystring("nforo")
if nforo="" then
response.redirect "foros.asp"
end if
sqltxt="select * from foros where codigof="&nforo
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\ewebcity\db\pyr.mdb"))
set rs=createobject("ADODB.Recordset")
set rsr=createobject("ADODB.Recordset")
rs.open sqltxt,conn
if rs.eof then
response.redirect "foros.asp" 'evitamos el error de foro borrado
end if
nombredelforo=rs("foro")
rs.close

sqltxt="select * from preguntas where foro="&nforo
rs.open sqltxt,conn%>

<html>

<head>
<title>La Cueva de Smaug&nbsp; (Foros)</title>
</head>

<body bgcolor="#CCFFCC">



<p align="center"><img border="0" src="images/titulo.jpg"></p>



<p align="center"><font face="Verdana"><font size="4">Foro: </font>&nbsp;<%=nombredelforo%>
<div align="center">
<center>
<table border="0" width="575">
<tr>
<td width="62" align="center" bordercolor="#008000" bgcolor="#008000"><font face="Verdana" size="1" color="#FFFFFF">Fecha</font></td>
<td width="254" align="center" bordercolor="#008000" bgcolor="#008000"><font face="Verdana" size="1" color="#FFFFFF">Pregunta</font></td>
<td align="center" bordercolor="#008000" bgcolor="#008000" width="82"><font face="Verdana" size="1" color="#FFFFFF">Numero
de Respuestas</font></td>
<td width="94" align="center" bordercolor="#008000" bgcolor="#008000">
<p align="center"><font face="Verdana" size="1" color="#FFFFFF">Ver
Respuestas</font></td>
<td width="49" align="center" bordercolor="#008000" bgcolor="#008000">
<p align="center"><font face="Verdana" size="1" color="#FFFFFF">Responder</font></p>
</td>
</tr>
<%if rs.eof then%>
<tr><td colspan=5 width="565" bgcolor="#FFCCCC">No hay preguntas</td></tr>
<%else
do while not rs.eof%>

<tr>
<td width="62" bgcolor="#FFCCCC"><font face="Verdana" size="1"><%=formatdatetime(rs("fecha"),2)%></font></td>
<td width="254" bgcolor="#FFCCCC" valign="middle">
<font face="Verdana" size="1"><%=rs("pregunta")%></font></td>
<%sqltxt2="select count(*) from respuestas where numero ="&rs("numero")
rsr.open sqltxt2,conn %>

<td width="82" bgcolor="#FFCCCC">
<p align="center"><font face="Verdana" size="1"><%=rsr(0)%></font></td>

<td width="94" valign="middle" align="center" bgcolor="#FFCCCC">
<%if rsr(0)<> 0 then%>
<a href="vr.asp?numero=<%=rs("numero")%>&nforo=<%=nforo%>"><font face="Verdana" size="1"><img border="0" src="images/ir.gif" width="13" height="13"></font></a>
<font face="Verdana" size="1">
<%else%>
&nbsp; <%end if
rsr.close%>

</font>
</td>
<td width="49" align="center" bgcolor="#FFCCCC">
<p align="center"><font face="Verdana" size="1"><a href="responder.asp?numero=<%=rs("numero")%>&amp;nforo=<%=nforo%>"><img border="0" src="images/ir.gif" width="13" height="13"></a></font></p>
</td>
</tr>
<%rs.movenext
loop
rs.close
end if%>

</table>
</center>
</div>
<p align="center">&nbsp;</p>
<div align="center">
<center>
<table border="0" width="50%" bgcolor="#FFFFFF">
<tr>
<td width="30%" align="center"><font face="Verdana" size="1"><a href="insertarpregunta.asp?nforo=<%=nforo%>">Insertar
una pregunta</a></font></td>
</tr>
</table>
</center>
</div>
<br>
<div align="center">
<center>
<table border="0" width="50%" bgcolor="#FFFFFF">
<tr>
<td width="30%" align="center"><font face="Verdana" size="1"><a href="foros.asp">Volver a Foros</a></font></td>
</tr>
</table>
</center>
</div>
</body></html>

responder.asp

<%numero=request.querystring("numero")
nforo=request.querystring("nforo")
if numero="" or nforo="" then
response.redirect "pyr.asp"
end if
sqltxt="select * from preguntas where numero="&numero
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\ewebcity\db\pyr.mdb"))

set rs=createobject("ADODB.Recordset")
rs.open sqltxt,conn%>


<html>

<head>
<title>Responder a una pregunta</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg"></p>

<p align="center"><font face="Verdana">Responder
a una pregunta</font></p>
<table border="0" width="100%">
<tr>
<td width="100%" bgcolor="#008000"><font face="Verdana" color="#FFFFFF" size="2">Pregunta
realizada por <%=rs("autor")%> el dia <%=formatdatetime(rs("fecha"),2)%></font></td>
</tr>
<tr>
<td width="100%" bgcolor="#FFFFFF"><%=rs("pregunta")%></td>
<%rs.close%>
</tr>
</table>

<p>&nbsp;</p>
<form method="POST" action="addrespuesta.asp?nforo=<%=nforo%>">
<table border="1" width="100%">
<tr>
<td width="100%" bgcolor="#008000"><font face="Verdana" size="2" color="#FFFFFF">Respuesta</font></td>
</tr>
<tr>
<td width="100%">Respuesta elaborada por: <input type="text" name="nombre" size="20">
</td>
</tr>
<tr>
<td width="100%">
<p align="center"><textarea rows="5" name="respuesta" cols="50"></textarea></td>
</tr>
</table>
<p align="center"><input type="hidden" name="numero" value="<%=numero%>">
<input type="hidden" name="nforo" value="<%=nforo%>">
<input type="submit" value="Enviar" name="B1"><input type="reset" value="Restablecer" name="B2"></p>
</form>

</body>

</html>

vr.asp

<%numero=request.querystring("numero")
nforo=request.querystring("nforo")
if numero="" then
response.redirect "pyr.asp"
end if
sqltxt="select * from preguntas where numero="&numero
sqltxt2="select * from respuestas where numero="&numero
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\ewebcity\db\pyr.mdb"))

set rs=createobject("ADODB.Recordset")
rs.open sqltxt,conn%>

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Respuestas a una pregunta</title>
</head>

<body bgcolor="#CCFFCC">

<p align="center"><img border="0" src="images/titulo.jpg"></p>
<%if rs.eof then
response.write "no hay respuestas para esta pregunta"

else%>


<table border="1" width="100%">
<tr>
<td width="100%" bgcolor="#008000"><font face="Verdana" color="#FFFFFF" size="2">Pregunta
realizada por</font><font face="Verdana" color="#00FFFF" size="2"> <%=rs("autor")%>
</font><font face="Verdana" color="#FFFFFF" size="2">el dia</font><font face="Verdana" color="#00FFFF" size="2"> <%=formatdatetime(rs("fecha"),2)%></font></td>
</tr>
<tr>
<td width="100%" bgcolor="#FFFFFF"><%=rs("pregunta")%></td>
<%rs.close%>
</tr>
</table>
<%rs.open sqltxt2,conn%>
<%if not rs.EOF then
nrespu=0%>

<p>&nbsp;</p>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<%do while not rs.EOF
nrespu=nrespu+1%>

<tr>
<td width="25%" bgcolor="#008000"><font face="Verdana" size="2"><font color="#FFFFFF">Respuesta nº </font><font color="#FFFF00"><%=nrespu%></font></font></td>
<td width="42%" bgcolor="#008000"><font face="Verdana" size="2"><font color="#FFFFFF">autor&nbsp; </font><font color="#FFFF00"><%=rs("autor")%></font></font></td>
<td width="33%" bgcolor="#008000"><font face="Verdana" size="2"><font color="#FFFFFF">el dia </font><font color="#FFFF00"><%=formatdatetime(rs("fecha"),2)%></font></font></td>
</tr>
<tr>
<td width="100%" bgcolor="#FFFFFF" colspan="3"><%=rs("respuesta")%>
</td>
</tr>
<%rs.movenext
loop
end if%>

</table>

<p>&nbsp;</p>

<div align="center">
<center>
<table border="0" width="61%">
<tr>
<td width="50%" bgcolor="#FFFFFF">
<p align="center"><a href="responder.asp?numero=<%=numero%>&nforo=<%=nforo%>"><font face="Verdana" size="1">Insertar
Respuesta</font></a></td>
<td width="50%" bgcolor="#FFFFFF">
<p align="center"><font face="Verdana" size="1"><a href="pyr.asp?nforo=<%=nforo%>">Volver
al Foro</a></font></td>
</tr>
</table>
</center>
</div>
<%end if%>

</body></html>