lunes, 21 de diciembre de 2009

Visiten mi nuevo Blog

En el nuevo blog encontrar toda la informacion q he publicado hasta ahora, como muchas cosas nuevas. Proximamente tb publicare codigo en Vb. Net
click Aqui

viernes, 27 de noviembre de 2009

Triggers y Procedimientos Almacenados en MySQL


Unas opciones no muy usadas cuando se trabaja con MySQL son los triggers y los procedimientos almacenados (stored procedures), supongo que a que es algo nuevo en MySQL y la gente no está acostumbrada a estas dos funcionalidades.
Vamos a mostrar un ejemplo de uso de triggers y procedimientos almacenados paso a paso. Quizás el ejemplo no sea el más correcto, o simplemente sea poco útil, pero lo importante es el uso en sí, no el ejemplo.
Nuestro sistema tendrá dos tablas, una con ventas y la otra con comisiones. En la primera se almacenarán cada venta que se realiza en un comercio, y en la segunda las comisiones que le corresponden a cada vendedor en el momento.

CREATE TABLE `ventas` (
  `vendedor` int(11),
  `producto` int(11),
  `importe` float
)
 
CREATE TABLE `comisiones` (
  `vendedor` int(11),
  `comision` float
)
 
Las comisiones se calcula de una forma especial, le corresponde un porcentaje de las ventas según el tipo de producto, y es importante para los vendedores el que se sepa en cada momento qué comisiones lleva ganadas (esto es una justificación para no usar un cron o algo parecido).
Para calcular qué comisión le corresponde a un vendedor, calcularemos los porcentajes para cada tipo de producto vendido y luego lo añadiremos/actualizaremos en la tabla de comisiones. Todo se realizará en un procedimiento almacenado.
 
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_comisiones`$$
CREATE PROCEDURE `test`.`sp_comisiones` (IN mivendedor INT)
BEGIN
 DECLARE micomision INT DEFAULT 0;
 DECLARE suma INT;
 DECLARE existe BOOL;
 
 select IFNULL(sum(importe),0) into suma from ventas where producto = 1 and vendedor = mivendedor;
 SET micomision = micomision + (suma * 0.15);
 
 select IFNULL(sum(importe),0) into suma from ventas where producto = 2 and vendedor = mivendedor;
 SET micomision = micomision + (suma * 0.1);
 
 select IFNULL(sum(importe),0) into suma from ventas where producto = 3 and vendedor = mivendedor;
 SET micomision = micomision + (suma * 0.2);
 
 select count(1)>0 into existe from comisiones where vendedor = mivendedor;
 if existe then
  UPDATE comisiones set comision = comision+micomision where vendedor = mivendedor;
 else
  insert into comisiones (vendedor, comision) values (mivendedor, micomision);
 end if;
END$$
 
DELIMITER ;
 
Ahora, para actualizar los datos de las comisiones usaremos un trigguer, así cuando se haga una venta (insert en la tabla ventas), se llamará al procedimiento almacenado (sp_comisiones), que recalculará la comisión para ese vendedor.
 
DELIMITER $$
DROP TRIGGER `test`.`tr_ventas_insert`$$
CREATE TRIGGER `test`.`tr_ventas_insert` AFTER INSERT on `test`.`ventas`
FOR EACH ROW BEGIN
 call sp_comisiones(new.vendedor);
END$$
DELIMITER ;

Manual WML - Parte VI Final

Las URL
relativas o absolutas

Puede ocurrir que el dispositivo WAP o el gateway no interprete correctamente una URL relativa. Para evitar esto ser recomienda usar la URL absoluta:



NO

<a href="../foo/bar.wml">
<a href="#myID">
<a ref="http://my.server.com/foo/bar.wml">
<a
href="http://my.server.com/foo/bar.wml#myID">


Nombre de variables
y ficheros

No olvides que los datos se envian y reciben a través del aire. La velocidad suele se de 9600. Intenta que se envien el menor volumen de datos posible.
Idea 1: Usa nombres de ficheros lo más cortos posibles. Ej: http:"//my.server.com/i.wml" mejor que http://my.server.com/index.wml
Idea 2: Usa nombres de variables lo más cortos posibles. Si usas menos de 25 variables lo mejor es que uses las letras del alfabeto.




Imágenes

Cuidado. No todos los dispositivos WAP aceptan imágenes. Utilízalas lo menos posible. Alguna SDK si las aceptan, pero... Y si las utilizas no te olvides nunca de poner el atributo alt <img src="imagen.gif" alt="Icono" />




Nombre de variables
y ficheros

¿Has intentado alguna vez escribir un password en un teléfono móvil? Es muy fácil en un PC o en un PDA, pero en un teléfono... Procura no usar el atributo type="password" en los input




¿Listas o Links
normales?

Hay dos formas de crear una lista de 2 links, con un select o con a. Recomendamos la segunda por lo que se explica abajo





NO

<select ivalue="0">
<option onpick="#Card2">Link
1</option>
<option onpick="#Card3">Link
2</option>
</select>
<p><a href="#Card2">Link
1</a></p>
<p><a href="#Card3">Link
2</a></p>

Así se va a ver


Así se va a ver


aaaa
bbb
El
problema es que como aparece
seleccionado el primer link,
no podemos
accionarlo, y
si bajamos al segundo,
se inicializa el evento
onpick
y nos vamos a al Card3
Link 1
Link 2


Newcontext="true"

&Iquest;Has visto en el código de alguna página <card id="card1" title="Currency" newcontext="true">? ¿ Lo has probado?
Si pones ese atributo, las variables se borran, incluso la history, por lo que no se puede usar el back. Para inicializar variables es mejor
<card title="Titulo">
<<onevent "onenterforward">
<refresh>
<setvar name="Var1" value="
"/>
<setvar name="some_var2" value="
"/>
</refresh>
</onevent>
...
</card>




Pasar datos a ASP o
CGI

Por ejemplo con un
input:
<input format="NN" name="Var1" title="Var1:"/>
<do
type="accept" label="Mandar:">
<go
href="http://*****/test.asp?datos=$(Var1)"/>




Detectar en el
servidor si se accede con un dispositivo WAP

Sorry, pero no lo he traducido...
XP
Sacado de http://www.egroups.com/group/wmlprogramming

I tried to redirect my browser clients using ASP and following your sample
code. For some reason the content type is text/html. I submit the code see if
any of you can see whats wrong. The redirect woks fine when I use the web
browser.

---------code-----------------------------------------------------

<%Response.ContentType = "text/vnd.wap.wml"%>
<% Dim uastring,
wmlURL, htmlURL
uastring = request.ServerVariables("HTTP_USER_AGENT")

wmlURL = "/martin/index.wml"
htmlURL = "some URL"
If
(InStr(uastring,"UP") Or InStr(uastring, "Nokia") Or InStr(uastring,
"Wap"))
Then
     Response.Redirect wmlURL
else

     Response.Redirect htmlURL
End If %>

-------End of code---------------------------------------
Marco

 

The only problem with this approach is when you encounter a phone that does
not support WMLScript, or your site gets hit by an HTML client. You're much
better off checking on the server end first. This is a trivial exercise in just
about any language, Perl, ASP, Java, etc...

In Perl 5
#!/usr/local/bin/perl5

$ua = $ENV{"HTTP_USER_AGENT"};
if ($ua =~ "UP"){ print "Status: 302 Moved
Temporarily\r Location: <one location>"; } elsif($ua =~ "Nokia"){ ...

You get the picture.

In asp, this construct would look like:

Dim uastring
uastring = request.ServerVariables("HTTP_USER_AGENT")
If
(InStr(uastring,"UP"))Then Response.Redirect(<onelocation>)

and in a Java Servlet it would look like this:

String ua = req.getHeader(HTTP_USER_AGENT);
if (ua.indexOf("UP")!= null){

res.setStatus(res.SC_MOVED_TEMPORARILY);
res.setHeader("Location",
<one location>);