Asp y WAP

28
Indice de contenidos Introducción o ¿Qué es WAP? o Aplicaciones Consideraciones técnicas o Introducción o Emuladores WAP o WML Descripción de los elementos WML I o <deck> y <card> o <do> o <timer> o <template> Descripción de los elementos WML II o Introducción de datos o Enlaces o Variables o Imágenes o Formato del texto WMLScript o Uso de WMLScript Aplicación WAP: parte I o Ejemplo de aplicación: Consulta de valores de la bolsa o Acceso y autentificación o Include de conexión a BD y mantenimiento de la sesión Aplicación WAP: parte II o Menú de operaciones o Procesar Compra / Venta o Diseño y pruebas de la aplicación o Material utilizado en este artículo Dispositivos WAP y portales o Dispositivos wap o Portales WAP Direcciones de interés o Información general o Emuladores y herramientas wap o WAP y ASP En esta página:

Transcript of Asp y WAP

Page 1: Asp y WAP

Indice de contenidos

Introducción o ¿Qué es WAP? o Aplicaciones

Consideraciones técnicas o Introducción o Emuladores WAP o WML

Descripción de los elementos WML I o <deck> y <card> o <do> o <timer> o <template>

Descripción de los elementos WML II o Introducción de datos o Enlaces o Variables o Imágenes o Formato del texto

WMLScript o Uso de WMLScript

Aplicación WAP: parte I o Ejemplo de aplicación: Consulta de valores de la bolsa o Acceso y autentificación o Include de conexión a BD y mantenimiento de la sesión

Aplicación WAP: parte II o Menú de operaciones o Procesar Compra / Venta o Diseño y pruebas de la aplicación o Material utilizado en este artículo

Dispositivos WAP y portales o Dispositivos wap o Portales WAP

Direcciones de interés o Información general o Emuladores y herramientas wap o WAP y ASP

En esta página:

Introducción o ¿Qué es WAP?

o Aplicaciones

Introducción

¿Qué es WAP?

Page 2: Asp y WAP

WAP recibe el nombre de Wireless Application Protocol y es un nuevo protocolo que permite acceder a Internet desde un teléfono móvil cómo si se tratase de un navegador.

Aplicaciones

El tamaño del dispositivo y la movilidad son los dos puntos fuertes que avalan el éxito de esta tecnología y que la han convertido en una referencia en tan solo unos meses. Por el contrario, las reducidas dimensiones de la pantalla y las limitaciones de velocidad de acceso son sus enemigos principales.

Teniendo en cuenta sus virtudes y defectos, parece obvio que no utilizaremos esta herramienta para visualizar fotografías de nuestro próximo destino de vacaciones ni de nuestro actor/actriz preferido. Sin embargo aplicaciones de consulta y transacciones bancarias, operaciones en bolsa o compra de entradas para el cine serán algunos de los servicios que esta tecnología ya está explotando. En el futuro, se abre además un interesante abanico de posibilidades en el terreno del comercio electrónico, ya que el teléfono móvil por si solo podría ofrecer mecanismos de seguridad y pago electrónico como si se tratase de una tarjeta de crédito.

En esta página:

Consideraciones técnicas o Introducción o Emuladores WAP

o WML

Consideraciones técnicas

Introducción

WAP se basa en el uso de protocolos y conceptos de Internet aplicados para el acceso a información y servicios mediante el teléfono móvil.

La especificación en la que se basa la tecnología WAP está desarrollada por el Forum Wap (http://www.wapforum.com) en la que forman parte las empresas más representativas de la telefonía móvil.

De manera similar a la arquitectura de capas en la que se basan las redes de ordenadores, WAP utiliza la especificación denominada WML (Wireless Markup Language) para enviar y recibir los datos entre el servidor y el móvil como si se tratase del protocolo HTTP entre el servidor y el navegador de Internet. Siguiendo con la equivalencia con Internet, el conocido JavaScript, se denomina en telefonía móvil WMLScript, y permitirá realizar validación de datos y otros procesos del cliente mediante un sencillo lenguaje de script.

En la siguiente captura (extraída de la Guía de desarrollo de Nokia Wap Toolkit) se detalla la equivalencia de los protocolos WAP y de Internet.

Modelo de operación WAP (extraído de la guía de desarrollo de Nokia Wap Toolkit)

Page 3: Asp y WAP

1. Petición de una URL 2. El dispositivo (móvil) envía una URL a un proxy WAP mediante el protocolo

WAP 3. El proxy WAP convierte la URL en formato HTTP que es enviada al servidor

Web 4. La petición HTTP es procesada por el servidor WEB. Puede tratarse de una

petición estática o puede intervenir un CGI, JSP (Java Server Pages) o ASP. 5. El servidor Web devuelve una pagina WML con la cabecera HTTP 6. El proxy WAP recibe la página, y tras su verificación la convierte a formato

binario que será enviado al móvil. 7. El móvil recibe la respuesta en formato WAP. Procesa el WML que contiene

mostrando el primero de los elementos <card>

Emuladores WAP

El ejemplo desarrollado en este tutorial ha sido probados con el emulador proporcionado por Nokia. Puede descargar este emulador en la dirección de Nokia http://www.nokia.com

Para su ejecución necesitará Java 1.2 disponible en el site de Sun http://www.javasoft.com

Con el kit de desarrollo de Nokia, podrá crear sus propios archivos wml, probarlos mediante un completo entorno de desarrollo que incluye el editor de texto, compilador WML y WMLScript, visualizador de debug como variables y mensajes e información de la sesión. Además cuenta con un emulador gráfico de un teléfono móvil wap con el que podrá interactuar con los archivos wml generados.

En la captura se visualiza el emulador gráfico de teléfono móvil. Con los botones centrales, puede realizar desplazamiento (scroll) vertical mientras que los botones laterales permiten realizar la acción que se visualiza en la parte inferior del visor.

WML

El lenguaje WML está basado en XML, como descriptores de los elementos se utilizan tags (que contienen atributos) que deben cerrarse para tratarse de un documento sintácticamente correcto. Se trata de un lenguaje case sensitive y los atributos deben estar en minúsculas.

Por ejemplo:

<tag atributo1="valor1"> contenido </tag> <tag/> elemento vacío (sin contenido)

Como cualquier documento XML necesita un archivo DTD que determine las reglas de diseño del documento una información que se indica en la línea:

Page 4: Asp y WAP

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">

Conozca el contenido del documento wml_1.1.xml

Ejemplo de documento WML <?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><!-- Ejemplo de documento WML --><wml> <template> <do type="prev" name="anterior" label="Anterior"> <prev/> </do> </template>

<card id="login" title="Móvil-bank"> <p> <img src="logoasp.wbmp" alt="logo"/> Bienvenido al primer banco que opera por el móvil DNI: <input type="text" name="dni" maxlength="8"/> <do type="accept" label="Aceptar"> <go href="#inicio"/> </do> <!-- Sobreescribir el elemento DO/PREV del template para evitar esta acción en el primer desk --> <do type="prev" name="anterior"> <noop/> </do> </p> </card>

<card id="inicio" title="Móvil-bank"> <p> <do type="accept" label="Consultar saldo"> <go href="#opConsulta"/> </do> <do type="accept" label="Transferencia"> <go href="#opTransferencia"/> </do> Seleccione la operación que desea realizar </p> </card>

<card id="opConsulta" title="Consulta de saldo"> <p align="left"> Seleccione su <b> cuenta corriente</b>: <select title="Cuenta Cte" name="idCta" iname="iidCta"> <option value='cta1'>2010-8893</option> <option value='cta2'>2019-2232</option> <option value='cta3'>2321-1221</option> </select> </p> <p> <do type="accept" label="Aceptar"> <go method="get" href="/asps/doQuery"/> </do> </p> </card>

Page 5: Asp y WAP

<card id="opTransferencia" title="Transferencia" ontimer="#inicio"> <timer value="500"/> <p> Bienvenido a la página de <b>transferencias</b><br/> <anchor> Volver <go href="#inicio"/> </anchor> </p> </card></wml>

Las siguientes imágenes muestran algunos ejemplos del documento WML anterior

   

Card inicio Menú de Opciones

   

Card de la operación consulta Card de la operación Transferencia

En esta página:

Descripción de los elementos WML I o <deck> y <card> o <do> o <timer>

o <template>

Descripción de los elementos WML I

<deck> y <card>

<deck>

Un documento WML está formado por un elemento <deck> (equivalente a una pagina html) que contiene múltiples elementos <card>.

Para minimizar el tráfico, el teléfono, descargará el documento WML completamente, sin embargo tan solo visualizará un elemento <card> cada vez.

<card>

Este elemento especifica un bloque de información visualizable en pantalla por ejemplo un texto o un menú de opciones. Puede contener <onevent>, <timer> y bloques <p> o <do>

Ejemplo de documento básico <?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">

Page 6: Asp y WAP

<wml> <card id="card1" title="wml document"> <p> Card 1<br/> </p> </card> <card id="card2" title="wml document"> <p> Card 2<br/> </p> </card> </wml>

<do>

El elemento <do> permite programar las acciones que puede realizar el usuario en un card, por ejemplo, la navegación a otros elementos card. El atributo "type" especifica la acción que deberá ejecutarse y típicamente toma el valor de "accept" para mostrar una opción accesible mediante la pulsación de la tecla de función.

Entre las posibles acciones que puede contener un elemento <do> figuran:

go: accede a otro elemento card o deck. prev: accede al card anterior refresh: recarga el card actual options: muestra operaciones adicionales noop: no hace nada

Ejemplos:

Referencia a un card del deck actual <do type="accept" label="Consulta de saldo"> <go href="#opConsulta"/></do>

Referencia a un deck de otro WML <do type="accept" label="Consulta de saldo"> <go href="/WMLArchivos/bancaonline.wml"/></do>

Uso de prev <do type="prev" name="Previous" label="Previous"> <prev/></do>

Uso de Noop <do type="prev" name="Previous"> <noop/></do>

<timer>

Este elemento permite por ejemplo, controlar el tiempo desde la carga de un card y lanzar un evento ontimer cuando se cumpla cierto tiempo o controlar la selección de un elemento de una lista de opciones mediante el evento onpick.

Page 7: Asp y WAP

En los siguientes ejemplos, el evento "ontimer" indica la url (archivo wml o deck) que se debe solicitar cuando se cumpla el tiempo indicado por el elemento timer declarado a continuación. (30 segundos)

Ejemplos:

Modo 1 <card> <onevent type="ontimer"> <go href="#inicio"/> </onevent> <timer value="300"/>

Modo 2 <card ontimer"=#inicio"> <timer value="300"/>

<template>

Permite definir elementos (de tipo <do> y onevent) que se aplicaran a todos los elementos <card>.

Si desea prescindir o cambiar del template en un deck deberá sobreescribir el elemento <DO/PREV> del template. En el ejemplo siguiente la sentencia <noop/> indica no hacer nada.

Ejemplos:

Uso de template <template> <do type="prev" label="anterior"> </prev> </do></template>

Sobreescritura <card id="login" title="Movil-bank"> <p> <do type="prev" name="anterior"> <noop/> </do> </p></card>

En esta página:

Descripción de los elementos WML II o Introducción de datos o Enlaces o Variables o Imágenes

o Formato del texto

Page 8: Asp y WAP

Descripción de los elementos WML II

Introducción de datos

De modo equivalente a los elementos de tipo form de HTML, WML contempla la introducción de datos por parte del usuario, gracias a los elementos <input> para la introducción de texto por teclado y <select> para mostrar una lista de opciones.

Para el elemento input pueden definirse caracteres máximos permitidos, valores por defecto y formato de los datos.

Ejemplo de Input <card> <p>Introduzca sus datos: <br/> Nombre: <input type="text" name="nombre" maxlength="30" value="Juan"/><br/> Apellido: <input type="text" name="apellido"/><br/> Edad: <input type="text" name="edat" format="NN"/> </p></card>

Ejemplo de onpick <card id="Card_1"> <p> Seleccione la opción deseada: <select name="operacion"> <option value="1" onpick="consulta.wml"> Consulta </option> <option value="2" onpick="transfer.wml"> Transferencias </option> <option value="3" onpick="acciones.wml"> Cotización bolsa </option> </select> </p></card>

En el caso del <select> puede preseleccionar opciones. En el siguiente ejemplo, la variable I contendrá los valores indicados por los elementos de tipo option separados por el carácter ";"

Preslección <card> <p> Selecciona tus actividades preferidas: <select name="X" iname="I" ivalue="1;2" multiple="true"> <option value="A">Lectura</option> <option value="B">Deporte</option> <option value="C">Ocio</option> </select> </p></card>

Page 9: Asp y WAP

En el siguiente ejemplo se utiliza el elemento <optgroup> para agrupar opciones

Agrupación de opciones <wml><card id="card1" title="pais"> <p> Seleccione un país: <select name="país" multiple="true" tabindex="2"> <optgroup title="Europa"> <option value="esp">España</option> <option value="ita">Italia</option> <option value="por">Portugal</option> </optgroup> <optgroup title="América"> <option value ="arg">Argentina</option> <option value ="uru">Uruguay</option> <option value ="bra">Brasil</option> </optgroup> </select> </p></card></wml>

En el siguiente ejemplo, el campo <postfield>, permite enviar información al servidor indicado por "href" lo que en HTML sería equivalente a utilizar campos ocultos (tipo hidden).

Uso de PostField <go method="get" href="http://midominio/asps/doLoan.asp"> <postfield name="importe" value="835000"/> <postfield name="porcentaje" value="7.2"/> <postfield name="tiempo" value="6"/></go>

Cómo resultado del anterior ejemplo el servidor recibiría la siguiente petición:doLoan.asp?importe=835000&porcentaje=7.2&tiempo=6

Esta información podría ser recuperada en la página ASP con el código:

Request.querystring("importe")Request.querystring("porcentaje")Request.querystring("tiempo")

Enlaces

El elemento <anchor>equivale al tag <A> en HTML y habitualmente contendrán elementos de tipo <do>. A diferencia de estos últimos, su activación no se realiza con la pulsación de las teclas de navegación del móvil.

Por ejemplo,

<anchor>Volver <go href="#inicio"/ >

</anchor>

es equivalente a

Page 10: Asp y WAP

<a href="#inicio" > <br/>Volver</a>

Variables

En WML, puede se declaran las variables mediante un texto precedido del símbolo "$". Por ejemplo: $(nombre)

Para asignar un valor a una variable se utiliza el elemento "setvar" del siguiente modo: <setvar name="location" value="$(X)"/ >

Pueden ser manipuladas por WMLScript y utilizadas directamente en un documento WML del modo "Hola, $(nombre)"

Imágenes

La tecnología WAP soporta la visualización de imágenes en formato denominado WBMP cuya característica principal es el escaso consumo de bytes para hacer más rápida su descarga.

Para generar este tipo de imágenes puede utilizar el plug-in disponible para Adobe Photoshop así como utilizar el convertidor de BMP a WBMP que incorpora el software de Nokia.

Para insertar una imagen se utiliza el elemento "img" como en HTML, puede especificarse atributos como espacio horizontal y vertical, alineación y texto alternativo.

A continuación se detalla un ejemplo del elemento img

<img src="bitmaps/moon.wbmp" alt="Moon" src="default.wbmp"space="1" vspace="1"/>

Formato del texto

WML proporciona mecanismos para formatear textos como negritas, itálica o subrayado.

Formato de texto <wml><card id="card1"> <p align="center"> <em>Muestra<u>de texto </u>formateado <i>por <strong>WML<br/> </strong></i> <b>Alex Morales</b></em> </p></card></wml>

WML también soporta tablas aunque éstas no pueden anidarse.

Ejemplo de tablas <wml> <card id="card1" title="Ejemplo de tabla"> <p> <table columns="3">

Page 11: Asp y WAP

<tr> <td>Col1</td><td>Col2</td><td>Col3</td> </tr> <tr> <td>D11</td><td>D12</td><td>D13</td> </tr> <tr> <td>D21</td><td>D22</td><td>D23</td> </tr> <tr> <td>D31</td><td>D32</td><td>D33</td> </tr> <tr> <td>D41</td><td>D42</td><td>D43</td> </tr> </table> </p></card></wml>

En esta página:

WMLScript

o Uso de WMLScript

WMLScript

Uso de WMLScript

WMLScript (Wireless Markup Language Script) permite ejecutar procesos sobre los archivos WML en el propio cliente. Su utilización es indicada para validar datos introducidos por el usuario, acceder a funcionalidades del dispositivo (por ejemplo enviar mensajes, consultar la agenda de teléfonos o los datos de la tarjeta de la operadora).

En el siguiente ejemplo se utilizan dos archivos uno WML y otro WMLS que contiene una sencilla función para sumar dos valores.

Archivo WML de entrada de datos y visualización del resultado

Archivo WML <?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><wml> <card id="card1" title="Suma"> <p> Operando 1: <input format="*N" name="op1" title="operando 1:"/> <br/> Operando 2: <input format="*N" name="op2" title="Operando 2:"/>

Page 12: Asp y WAP

<br/> Resultado= <u>$(sumatorio)</u> <do type="accept" label="Sumar"> <go href="funciones.wmls#Suma('sumatorio','$(op1)','$(op2)')"/> </do> </p></card> </wml>

Archivo WMLS de funciones

Archivo WMLS /* * Funcion Suma */ extern function Suma(varname, op1, op2) { var result = op1 + op2; // Se envía el resultado WMLBrowser.setVar(varname, s); // Se actualiza el card actual para mostrar el resultado WMLBrowser.refresh(); };

En esta página:

Aplicación WAP: parte I o Ejemplo de aplicación: Consulta de valores de la bolsa o Acceso y autentificación

o Include de conexión a BD y mantenimiento de la sesión

Aplicación WAP: parte I

Ejemplo de aplicación: Consulta de valores de la bolsa

La aplicación de ejemplo permite al usuario realizar el mantenimiento y la consulta de su cartera de valores de bolsa. Para ello se utiliza una base de datos (formato access .mdb) en la que se contemplan las tablas con las relaciones siguientes.

Entre las operaciones disponibles en la aplicación figuran la consulta de los valores de la cartera del usuario, así como la compra y venta de valores.

Una característica común en todas las páginas es la identificación del tipo de información que el servidor web está enviando en este caso al servidor WAP. ASP permite esta identificación mediante la instrucción

<% Response.ContentType = "text/vnd.wap.wml" %>

Deberán considerarse funcionalidades no se han tratado como controles de los formularios de entrada de datos o errores de acceso a la base de datos.

Page 13: Asp y WAP

Acceso y autentificación

En la página inicial del sistema (default.asp) se visualizan los campos de login o identificación del usuario (en este caso el dni y un password).

Página: default.asp <% Response.ContentType = "text/vnd.wap.wml"' se inicializa la variable de sesión con un valor cualquiera' para controlar el fin de sesionsession("DNI")="acme" %>

<?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><wml><card id="login" title="Móvil-bank"><p> Bienvenido<br/> DNI: <input type="text" name="dni" maxlength="8"/> Password:<input type="password" name="password" maxlength="8"/>

<do type="accept" label="Aceptar"><go method="post" href="procesarlogin.asp"/>

</do></p></card></wml>

Cuando el usuario haya introducido su identificación se envia al servidor la petición de la página "procesarlogin.asp" que comprobará la existencia del usuario en la BD. En caso afirmativo se muestra el enlace a la página del menú y en caso contrario se muestra un mensaje de usuario no autorizado.

Página: Procesar login <% Response.buffer = true %> <%Response.ContentType = "text/vnd.wap.wml" %> <!--#include file="bd_init.asp" --><?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><wml><% Dim strSQL Dim cnn1 Dim rs Call CrearConexion() strSQL = "SELECT * FROM Cliente WHERE IdCliente='" & request.form("DNI") & "' AND password='" & request.form("password") & "'" rs.Open strSQL, cnn1 if rs.EOF then %> <card id="login" title="Móvil-bank"> <p> Datos incorrectos. Vuélvelo a intentar <br/> <do type="prev" name="anterior" label="Anterior">

Page 14: Asp y WAP

<prev/> </do> </p> </card><% else %> <card id="home" title="Móvil-bank"> <p> Hola <%=rs("nombre")%> ! <anchor> Menú <go href="menu.asp"/> </anchor> </p> </card><% ' Inicialización de las variables de sesión Session("DNI") = request.form("DNI") end if rs.Close cnn1.Close%></wml>

Include de conexión a BD y mantenimiento de la sesión

En la página anterior así como en todas las siguientes, se utiliza la técnica de incluir el archivo bd_init.asp que verifica la validez de la sesión e inicializa los objetos de acceso a base de datos que utilizan las páginas (connection y recordset).

En caso de que la sesión haya finalizado (típicamente por inactividad del cliente) se redirecciona de nuevo la página de inicio de la aplicación "default.asp"

Se utiliza el acceso mediante dsn por lo que deberá crearse el correspondiente origen de datos ODBC de tipo Access a la base de datos bolsa.mdb con el nombre "wapbolsa".

Página: db_init.asp <%Sub CrearConexion Dim strCnn

' Comprobar que la sesión está activa if session("DNI")= "" then response.clear response.redirect "default.asp" response.end end if

' Abrir la conexión strCnn = "DSN=wapBolsa" Set cnn1 = Server.CreateObject("ADODB.Connection") cnn1.Open strCnn 'Inicialización del objeto Recordset Set rs = Server.CreateObject("ADODB.Recordset") End sub%>

Page 15: Asp y WAP

En esta página:

Aplicación WAP: parte II o Menú de operaciones o Procesar Compra / Venta o Diseño y pruebas de la aplicación

o Material utilizado en este artículo

Aplicación WAP: parte II

Menú de operaciones

En la página menu.asp se escriben 4 cards en el primero de ellos se muestran las opciones del menú (Consultar cartera, Compra y Venta) y en los tres restantes el detalle de cada una de estas operaciones gracias a lo cual se minimizar el tráfico (exceptuando la transacción de compra / venta en Base de datos).

Fragmento 1: menú <% Response.buffer = true %> <% Response.ContentType = "text/vnd.wap.wml" %><!--#include file="bd_init.asp" --><?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><wml><% Dim strSQL Dim cnn1 Dim rs Call CrearConexion() %> <card id="inicio" title="Móvil-bank"> <p> Seleccione la operación<br/> <do type="accept" label="Consultar cartera"> <go href="#opConsulta"/> </do> <do type="accept" label="Compra"> <go href="#opCompra"/> </do> <do type="accept" label="Venta"> <go href="#opVenta"/> </do> </p> </card>

En la Consulta de Cartera se seleccionan todos los valores del cliente identificado en la sesión y se construye una tabla en la que se muestra el nombre del valor, la cantidad de valores de que dispone el precio unitario y la tendencia del mercado (ascendente/ descendente o estable). Para esta última información se utilizan wbmp que han sido generados a partir de un archivo gif mediante la herramienta Nokia Wap Tookit.

Page 16: Asp y WAP

Fragmento 2: Consuta de Cartera <% '**** CONSULTAR CARTERA **** dim qt qt = chr(34) strSQL = "SELECT ClienteValor.IdCliente, Cliente.Nombre as NomCliente, Cliente.Apellido, ClienteValor.Cantidad, Valor.Nombre as NomValor, Valor.Importe, Valor.Tendencia FROM Valor INNER JOIN (Cliente INNER JOIN ClienteValor ON Cliente.IdCliente = ClienteValor.IdCliente) ON Valor.IdValor = ClienteValor.IdValor WHERE (((ClienteValor.IdCliente)= '"& session("DNI") & "'))" rs.Open strSQL, cnn1 if rs.EOF then <card id="opConsulta" title="Consultar Cartera"> <p> Cartera vacía <br/> <do type="accept" label="Compra"> <go href="#opcompra"/> </do> </p> </card><% else %> <card id="opConsulta" title="Consultar Cartera"> <p> Cartera: <%=rs("NomCliente")%> &nbsp; <%=rs("Apellido") %> <table columns="4"> <tr> <td>Valor</td> <td></td> <td></td> <td></td> </tr> <% do while not rs.EOF response.write "<tr><td>" & rs("NomValor") & "</td>" response.write "<td>" & rs("Cantidad") & "</td>" & chr(10) response.write "<td>" & rs("Importe") & "</td>" & chr(10) response.write "<td><img src=" & qt & "tendencia" & rs("Tendencia") & ".wbmp" & qt & " alt=" & qt & rs("Tendencia") & qt & "/></td></tr>" & chr(10) rs.movenext loop response.write "</table>" %> <do type="accept" label="Venta"> <go href="#opventa"/> </do> <do type="accept" label="Compra"> <go href="#opcompra"/> </do> </p> </card><% end if rs.Close %>

Page 17: Asp y WAP

En la Compra de valores se consulta en la BD los valores existentes, mostrando en un objeto de tipo <select> su nombre y su importe. El usuario deberá seleccionar uno de estos valores así como la cantidad que va a comprar.

El formulario será enviado a la página procesarcompra.asp que se describe más adelante.

Fragmento 3: Compra de valores <% '**** COMPRA DE VALORES ****

strSQL = "SELECT Valor.IdValor, Valor.Nombre, Valor.Importe FROM Valor" rs.Open strSQL, cnn1 %> <card id="opCompra" title="Compra de valores"> <p> Seleccione el valor y la cantidad a comprar <br/>

<select title="valor" name="valor"> <% ' Mostrar los valores disponibles para comprar do while not rs.EOF response.write "<option value='" & rs("IdValor") & "'>" & rs("Nombre") & " - " & rs("Importe") & "</option>" rs.movenext loop rs.Close %>

</select> Cantidad: <input type='text' name='cantidad' maxlength='4'/> <do type="accept" label="Hacer Compra">

<go method="post" href="procesarcompra.asp"/> </do> </p> <p> <do type="accept" label="Consultar cartera"> <go href="#opConsulta"/> </do> <do type="accept" label="Venta"> <go href="#opVenta"/> </do> </p> </card>

En la Venta de valores se consulta en la BD los valores que tiene un usuario mediante un operación JOIN de las tablas "Valor" y "ClienteValor". Como en el caso anterior, un objeto de tipo <select> mostrará su nombre y el número de valores de que dispone. El usuario deberá seleccionar uno de estos valores así como la cantidad que va a vender (que no podrá sobrepasar el número indicado anteriormente.

El formulario será enviado a la página procesarventa.asp que se describe más adelante.

Fragmento 4: Venta de valores

Page 18: Asp y WAP

<% '**** VENTA DE VALORES ****

strSQL = "SELECT ClienteValor.IdCliente, ClienteValor.IdValor, ClienteValor.Cantidad, Valor.Nombre FROM Valor INNER JOIN ClienteValor ON Valor.IdValor = ClienteValor.IdValor WHERE (((ClienteValor.IdCliente)='"& session("DNI") & "'))" rs.Open strSQL, cnn1 %> <card id="opVenta" title="Venta de valores"> <p> Seleccione el valor y la cantidad a Vender <br/>

<select title="valor" name="valor"> <% ' Mostrar los valores disponibles para vender do while not rs.EOF response.write "<option value='" & rs("IdValor") & "'>" & rs("Nombre") & " - " & rs("Cantidad") & "</option>" rs.movenext loop rs.Close %>

</select> Cantidad: <input type='text' name='cantidad' maxlength='4'/> <do type="accept" label="Hacer Venta">

<go method="post" href="procesarventa.asp"/> </do> </p> <p> <do type="accept" label="Consultar cartera"> <go href="#opConsulta"/> </do> <do type="accept" label="Compra"> <go href="#opCompra"/> </do> </p> </card> <% cnn1.Close%></wml>

Procesar Compra / Venta

En la página "procesarcompra.asp" deberá actualizarse en la BD la petición del usuario de compra de X unidades del valor Z. Para ello deberá en primer lugar identificarse si tal valor ya existe en la cartera del usuario para ejecutar según el caso la instrucción de SQL UPDATE o INSERT. Un mensaje de resultado de la operación así como el elemento <anchor> que permite acceder de nuevo al menú completan el <desk>> que genera esta página.

Página: Procesarcompra.asp <% Response.buffer = true %> <% Response.ContentType = "text/vnd.wap.wml" %>

Page 19: Asp y WAP

<?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN""http://www.wapforum.org/DTD/wml_1.1.xml"><wml><!--#include file="bd_init.asp" --><% Dim strSQL,strSQLAction Dim cnn1 Dim rs Call CrearConexion() strSQL = "SELECT ClienteValor.IdCliente, ClienteValor.IdValor, ClienteValor.Cantidad, Valor.IdValor, Valor.Nombre, Valor.Importe FROM Valor INNER JOIN ClienteValor ON Valor.IdValor = ClienteValor.IdValor WHERE (((ClienteValor.IdCliente)='" & session("dni") & "') AND ((ClienteValor.IdValor)='" & request.form("valor") & "'))" rs.Open strSQL, cnn1 if rs.eof then ' No existe el valor en la cartera del cliente --> INSERT INTO .. strSQLAction = "INSERT INTO ClienteValor (IdCliente, IdValor,Cantidad) " strSQLAction = strSQLAction & "VALUES ('" & Session("dni") & "'" strSQLAction = strSQLAction & ", '" & request.form("valor") & "'" strSQLAction = strSQLAction & ", " & request.form("cantidad") & ")" strSQL = "SELECT Valor.IdValor, Valor.Nombre, Valor.Importe FROM Valor WHERE idValor='" & request.form("valor") & "'" rs.Close rs.Open strSQL, cnn1 msg = "Nuevo valor " & rs("Nombre") & " a su cartera. Total acciones:" & request.form("cantidad") & " <br/> Se cargarán:" & rs("Importe") * request.form("cantidad") & "pts<br/>" else ' Ya existe el valor en la cartera del cliente --> UPDATE ... strSQLAction = "UPDATE ClienteValor SET cantidad = " & rs("cantidad") + request.form("cantidad") strSQLAction = strSQLAction & " WHERE idValor='" & request.form("valor") & "' AND idCliente='" & session("dni") & "'" msg = "Se han añadido " & request.form("cantidad") & " nuevas acciones de "& rs("Nombre") & " a su cartera<br/>Total acciones: " & rs("cantidad") + request.form("cantidad") & "<br/> Se cargarán:" & rs("Importe") * request.form("cantidad") & " pts<br/>" end if ' Se ejecuta la actualización de la BBDD según strSQLAction cnn1.Execute strSQLAction%> <card id="procesarcompra" title="Móvil-bank"> <p> <% response.write msg %> <anchor> Menú <go href="menu.asp"/>

Page 20: Asp y WAP

</anchor> </p> </card><% rs.Close cnn1.Close %></wml>

Por último, en la página "procesarventa.asp" deberá actualizarse en la BD la petición del usuario de venta de X unidades del valor Z. De manera similar a la operación de compra, en este caso se debe comprobar que la cantidad a vender sea igual o inferior a la cantidad disponible en ese momento practicando la operación de DELETE o UPDATE respectivamente.

Página: Procesarventa.asp <% Response.buffer = true %> <% Response.ContentType = "text/vnd.wap.wml" %><?xml version="1.0"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><wml><!--#include file="bd_init.asp" --><% Dim strSQL,strSQLAction Dim cnn1 Dim rs

Call CrearConexion()

strSQL = "SELECT ClienteValor.IdCliente, ClienteValor.IdValor, ClienteValor.Cantidad, Valor.IdValor, Valor.Nombre,Valor.Importe FROM Valor INNER JOIN ClienteValor ON Valor.IdValor = ClienteValor.IdValor WHERE (((ClienteValor.IdCliente)='" & session("dni") & "') AND ((ClienteValor.IdValor)='" & request.form("valor") & "'))" rs.Open strSQL, cnn1 if cInt(rs("Cantidad")) = cInt(request.form("cantidad")) then ' Se eliminan todas las acciones del valor --> Borrar valor DELETE.. strSQLAction = "DELETE ClienteValor.* FROM ClienteValor WHERE (((ClienteValor.IdCliente)='" & session("dni") & "') AND ((ClienteValor.IdValor)='" & request.form("valor") & "'))" msg = "El valor " & rs("Nombre") & " ha sido eliminado .<br/> Se abonarán: " & rs("Importe") * request.form("cantidad") & " pesetas.<br/>" else ' Disminuyen las acciones del valor --> UPDATE... strSQLAction = "UPDATE ClienteValor SET cantidad = " & rs("cantidad") - request.form("cantidad") strSQLAction = strSQLAction & " WHERE idValor='" & request.form("valor") & "'AND idCliente='" & session("dni") & "'" msg = "Se han eliminado " & request.form("cantidad") & " acciones

Page 21: Asp y WAP

de "& rs("Nombre") & " de su cartera<br/>Total acciones: " & rs("cantidad") - request.form("cantidad") & "<br/> Se abonarán: " & rs("Importe") * request.form("cantidad") & " pesetas<br/>" end if ' Se ejecuta la actualización de la BBDD según strSQLAction cnn1.Execute strSQLAction%> <card id="procesarventa" title="Móvil-bank"> <p> <% response.write msg %> <anchor> Menú <go href="menu.asp"/> </anchor> </p> </card><% rs.Close cnn1.Close %></wml>

Diseño y pruebas de la aplicación

Antes de realizar las páginas en formato WML la aplicación ha sido desarrollada y probada en formato HTML. En el proceso de pruebas deberá disponerse de un gateway WAP y uno de los emuladores existentes en el mercado como por ejemplo Nokia Wap Tookit o WinWap pro. (ver direcciones de interés).

Material utilizado en este artículo

Descarga el código utilizado en este artículo

En esta página:

Dispositivos WAP y portales o Dispositivos wap

o Portales WAP

Dispositivos WAP y portales

Dispositivos wap

Alcatel OneTouch Alcatel OneTouch 300 Alcatel OneTouch 500 Alcatel OneTouch 700 Benefon Twin Dual SIM Benefon Q WAP+HTML Bosch 1886 TriBand

Page 22: Asp y WAP

Bosch 820 Ericsson A2618 Ericsson R320 Ericsson R380 Ericsson R520 Ericsson T36 Mitsubishi GEO GPRS Motorola v2288 Motorola v2282 Motorola Accompli A6188 Motorola P7689 Motorola L7389 Motorola L708e Motorola L7389e Motorola i2000 Nokia 6250 Nokia 6210 Nokia 7110 Sagem MC 939 WAP Samsung SGH A110 Siemens P35 Siemens C35i Siemens M35i Siemens S25 Siemens IC35

Portales WAP

Directorio WAP Internacional http://elindice.com/WAP/Directorio/Internacional/

Directorio WAP Españolhttp://elindice.com/WAP/Directorio/Espanol/

Guayhttp://www.guay.com/movil/index.wml

Wap-Wap http://www.movired.com/wap-wap/index.html

Wapeas http://www.wapeas.com/

Wapamente http://www.wapamente.com/indice2.html

KeWAPo http://www.kewapo.com/index.asp

Andanza http://www.andanza.com/

PortalWap http://portalwap.com/

Tv20 Terrassa http://Tvterrassa.com/wap

iBrujula http://www.ibrujula.com

Portal personalizado WAP

Page 23: Asp y WAP

En esta página:

Direcciones de interés o Información general o Emuladores y herramientas wap

o WAP y ASP

Direcciones de interés

Información general

WAPes

Wap forum

Especificación WML y WMLSCript

Arquitectura WAP

Especificaciones del Wap Forum

Especificación XML

Phone.com WAP Overview

Emulador WAP en el navegador

Información sobre móbiles y tecnología celular

Emuladores y herramientas wap

Emulador Wap UP.SDK 4.0 Beta 1

Navegador Wap WinWap 3.0

Nokia WAP Toolkit

Audicode WAP Server

WapLite WAP Server

Ericsson toolkit

Waptor 2.3 Editor y visualizador WML

WAPman Visor WML para Windows

Crear archivos WBMP. Plug-in para Photoshop/Painshop

Convertiror a WBMP online

Page 24: Asp y WAP

Convertidor a WBMP

WAP y ASP

WAP and ASP - Part I

WAP and ASP - Part II

WAP an Introduction

An Online Shopping Cart WAP Application using WML and ASP