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).

<% 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.

<%
'**** 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")%> <%=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
%>
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.

<%
'**** 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.
<%
'**** 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.

<% 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 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"/>
</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.

<% 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
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