<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Código Metrópoli - Blog de programación</title>
	
	<link>http://www.codigometropoli.com</link>
	<description>Programación para Super Héroes</description>
	<lastBuildDate>Wed, 27 Apr 2011 07:20:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/feedburner/ERTc" /><feedburner:info uri="feedburner/ertc" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Compartir archivos vía WiFi entre PlayBook y Mac</title>
		<link>http://feedproxy.google.com/~r/feedburner/ERTc/~3/TOHm8S2vIQU/</link>
		<comments>http://www.codigometropoli.com/compartir-archivos-via-wifi-entre-playbook-y-mac/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 06:34:29 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[PlayBook]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=633</guid>
		<description><![CDATA[La nueva Blackberry PlayBook nos permite compartir archivos vía WiFi entre nuestras computadoras y el dispositivo móvil; de esta forma podemos acceder a los archivos de nuestra PlayBook desde nuestra computadora y transferirle archivos. Para hacerlo, sólo basta hacer click en el botón de configuración que se encuentra en la parte superior derecha: Para poder [...]]]></description>
			<content:encoded><![CDATA[<p>La nueva Blackberry PlayBook nos permite compartir archivos vía WiFi entre nuestras computadoras y el dispositivo móvil; de esta forma podemos acceder a los archivos de nuestra PlayBook desde nuestra computadora y transferirle archivos. Para hacerlo, sólo basta hacer click en el botón de configuración que se encuentra en la parte superior derecha:</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000006.jpg" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000006-300x175.jpg" alt="" title="BlackBerry Playbook - 1" width="300" height="175" class="aligncenter size-medium wp-image-641" /></a></p>
<p><span id="more-633"></span></p>
<p>Para poder ver y/o establecer el nombre de nuestro dispositivo, el nombre de usuario y el grupo de trabajo al que pertenece, debemos hacer click en la opción Network Identification dentro de <em>Storage &#038; Sharing</em>.</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000009.jpg" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000009-300x175.jpg" alt="" title="BlackBerry Playbook - 2" width="300" height="175" class="aligncenter size-medium wp-image-637" /></a></p>
<p>En esta ventana podemos modificar el nombre de nuestra PlayBook, el grupo al que pertenece y el nombre de usuario. Con éste nombre de usuario y la contraseña que ya definimos, vamos a poder acceder al dispositivo desde nuestra computadora.</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000008.jpg" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000008-300x175.jpg" alt="" title="Blackberry Playbook - 3" width="300" height="175" class="aligncenter size-medium wp-image-636" /></a></p>
<p>Ahora debemos hacer click la opción <em>Storage &#038; Sharing</em> en el menú izquierdo. Dentro de esta sección podremos permitir el acceso a los archivos de nuestro dispositivo vía WiFi.</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000007.jpg" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/IMG_00000007-300x175.jpg" alt="" title="Blackberry Playbook - 4" width="300" height="175" class="aligncenter size-medium wp-image-635" /></a></p>
<p>Para permitir el acceso vía USB, debemos activar la primera opción: <em>File Sharing</em>.<br />
En nuestro caso, queremos compartir archivos vía WiFi, por lo que activaremos la segunda opción: <em>Wi-Fi Sharing</em>. <strong>Importante:</strong> Para evitar que cualquier persona, que esté conectado en nuestra misma red, acceda a nuestros archivos, es altamente recomendable proteger el acceso asignando una contraseña; para eso, debemos activar la tercera opción: <em>Password Protect</em>. También es recomendable cambiar la contraseña con cierta frecuencia, para eso basta con hacer click en el botón <em>Change Password</em>.</p>
<p>Una vez configurado nuestra tableta, abriremos una ventana del Finder en nuestra Mac:</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.10.31.png" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.10.31-300x221.png" alt="" title="MacBook Pro - 1" width="300" height="221" class="aligncenter size-medium wp-image-634" /></a></p>
<p>Veremos que aparece nuestra PlayBook en la lista de dispositivos compartidos (lado izquierdo del <em>Finder</em>). Debido a que protegimos el acceso por medio de un password, debemos hacer click en el botón de Conectar como…  que se encuentra en la parte superior derecha de la ventana.</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.10.57.png" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.10.57-300x212.png" alt="" title="MacBook Pro - 2" width="300" height="212" class="aligncenter size-medium wp-image-638" /></a></p>
<p>Seleccionamos la opción <em>Usuario registrado</em> e ingresamos el <strong>Username</strong> y <strong>Password</strong> que definimos en la PlayBook. Después de hacer click en el botón Conectar, veremos las carpetas que están en nuestra tableta:</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.11.25.png" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.11.25-300x220.png" alt="" title="MacBook Pro - 3" width="300" height="220" class="aligncenter size-medium wp-image-639" /></a></p>
<p>Dentro de la carpeta media encontramos los directorios de <em>camera</em>, <em>books</em>, <em>documents</em>, etc.</p>
<p><a href="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.13.02.png" target="_blank"><img src="http://www.codigometropoli.com/wp-content/uploads/2011/04/Captura-de-pantalla-2011-04-26-a-las-22.13.02-300x198.png" alt="" title="MacBook Pro - 4" width="300" height="198" class="aligncenter size-medium wp-image-640" /></a></p>
<div align="center" style="margin-top:0px; margin-bottom:15px;"><script type="text/javascript"><!--
      google_ad_client = "pub-5808310808246221";
      /* 250x250, Posts */
      google_ad_slot = "8254875600";
      google_ad_width = 250;
      google_ad_height = 250;
// --></script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></div>

<p><a href="http://feedads.g.doubleclick.net/~a/xgx4XuobOzokLrmkwhMvtxa8zpA/0/da"><img src="http://feedads.g.doubleclick.net/~a/xgx4XuobOzokLrmkwhMvtxa8zpA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xgx4XuobOzokLrmkwhMvtxa8zpA/1/da"><img src="http://feedads.g.doubleclick.net/~a/xgx4XuobOzokLrmkwhMvtxa8zpA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/feedburner/ERTc/~4/TOHm8S2vIQU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/compartir-archivos-via-wifi-entre-playbook-y-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.codigometropoli.com/compartir-archivos-via-wifi-entre-playbook-y-mac/</feedburner:origLink></item>
		<item>
		<title>Seminario Virtual – Flash CS5.5 to iPhone, iPad, Android &amp; Mobile Devices</title>
		<link>http://feedproxy.google.com/~r/feedburner/ERTc/~3/5B6m6YpQz4g/</link>
		<comments>http://www.codigometropoli.com/seminario-virtual-flash-cs5-5-to-iphone-ipad-android-mobile-devices/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 21:00:50 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Android app]]></category>
		<category><![CDATA[Creative Suite]]></category>
		<category><![CDATA[Flash CS5.5]]></category>
		<category><![CDATA[flash para aplicaciones móviles]]></category>
		<category><![CDATA[iPhone app]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/seminario-virtual-flash-cs5-5-to-iphone-ipad-android-mobile-devices/</guid>
		<description><![CDATA[Paul Trani (@paultrani Blog), Adobe Evangelist, será el presentador de este seminario virtual. Aquí veremos las nuevas características del nuevo Flash CS5.5, así como la capacidad para crear aplicaciones para dispositivos móviles. El registro es gratuito en Eventbrite y la cita es hoy martes 26 de abril de 2011 a las 6:30pm hora del Pacífico [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Paul Trani</strong> (@paultrani <a href="http://www.paultrani.com/blog/">Blog</a>), Adobe Evangelist, será el presentador de este <em>seminario virtual</em>. Aquí veremos las nuevas características del nuevo <strong>Flash CS5.5</strong>, así como la capacidad para crear aplicaciones para dispositivos móviles. </p>
<p>El registro es <strong>gratuito</strong> en <a href="http://flashtomobile.eventbrite.com/">Eventbrite</a> y la cita es hoy martes <b>26 de abril de 2011</b> a las 6:30pm hora del <a href="http://wwp.greenwichmeantime.com/time-zone/usa/pacific-time/">Pacífico GMT – 7</a>, 8:30pm hora de <a href="http://wwp.greenwichmeantime.com/time-zone/north-america/mexico/mexico-city/index.htm">México GMT -5</a>.
<p>Publicado con WordPress para BlackBerry.</p>
<div align="center" style="margin-top:0px; margin-bottom:15px;"><script type="text/javascript"><!--
      google_ad_client = "pub-5808310808246221";
      /* 250x250, Posts */
      google_ad_slot = "8254875600";
      google_ad_width = 250;
      google_ad_height = 250;
// --></script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></div>

<p><a href="http://feedads.g.doubleclick.net/~a/X0AqGMP4f034Ijjra6cAkfOwB5o/0/da"><img src="http://feedads.g.doubleclick.net/~a/X0AqGMP4f034Ijjra6cAkfOwB5o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/X0AqGMP4f034Ijjra6cAkfOwB5o/1/da"><img src="http://feedads.g.doubleclick.net/~a/X0AqGMP4f034Ijjra6cAkfOwB5o/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/feedburner/ERTc/~4/5B6m6YpQz4g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/seminario-virtual-flash-cs5-5-to-iphone-ipad-android-mobile-devices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.codigometropoli.com/seminario-virtual-flash-cs5-5-to-iphone-ipad-android-mobile-devices/</feedburner:origLink></item>
		<item>
		<title>Componente ColorPicker</title>
		<link>http://feedproxy.google.com/~r/feedburner/ERTc/~3/RnoiCQUhyhc/</link>
		<comments>http://www.codigometropoli.com/componente-colorpicker/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 22:08:17 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[ColorPicker]]></category>
		<category><![CDATA[Componentes]]></category>
		<category><![CDATA[Flash CS4]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=523</guid>
		<description><![CDATA[El componente ColorPicker (disponible a partir del Flash CS3, versión 3.0 de ActionScript), al hacer click sobre él, nos muestra un conjunto de colores de los cuales el usuario puede seleccionar uno de ellos. Con este componente podremos hacer que el usuario cambie de color un MovieClip, un texto, etc. Además, nos permite indicarle qué [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flash.png" alt="Flash" title="Flash" width="93" height="93" />El componente <strong>ColorPicker</strong> (disponible a partir del Flash CS3, versión 3.0 de ActionScript), al hacer click sobre él, nos muestra un conjunto de colores de los cuales el usuario puede seleccionar uno de ellos. Con este componente podremos hacer que el usuario cambie de color un MovieClip, un texto, etc. Además, nos permite indicarle qué colores el usuario podrá seleccionar, ideal para cuando queremos que el objeto a cambiar de color vaya acorde a un estilo definido o a una gama de colores.<span id="more-523"></span></p>
<p>Este componente tiene las siguientes propiedades:</p>
<ul>
<li> <strong>enabled</strong>:  Valor booleano para establecer si el componente está habilitado o no.</li>
<li><strong>selectedColor</strong>: Con esta propiedad podemos establecer el color que estará seleccionado al inicio. También podemos, por medio de ActionScript, determinar el color que está seleccionad actualmente.</li>
<li><strong>showTextField</strong>: Este componente tiene por default un campo de texto donde se muestra el valor hexadecimal del color seleccionado y donde el usuario puede escribir el valor hexadecimal del color que quiere seleccionar.</li>
<li><strong>visible</strong>: Valor booleano. Si es true el componente ColorPicker se mostrará, si es false el ColorPicker no se verá.</li>
</ul>
<p>Para conocer todos los métodos, propiedades y eventos que conforman la clase <strong>ColorPicker</strong>, ingresa a la siguiente <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/controls/ColorPicker.html" target="_blank">página</a>.</p>
<h4><span style="color: #ff0000;"><strong>Tutorial</strong></span></h4>
<p>En este tutorial mostraremos tres ejemplos prácticos del uso del <strong>ColorPicker</strong>. En el primero cambiaremos el color de un rectángulo usando el <strong>ColorPicker</strong>. En el segundo, rellenaremos un rectángulo con degradado (dos colores) utilizando la función <em>beginGradientFill</em>; los colores pasados como parámetros a esta función serán obtenidos de dos componentes <strong>ColorPicker</strong>. Además, por medio de un <strong>Slider</strong>, el usuario podrá cambiar la rotación del degradado. En el último, cambiaremos el color de un texto dinámico.</p>
<p>Para este tutorial usaremos el Flash CS4. Abre el programa y crea un nuevo documento de Flash.<br />
En el panel <strong>Components</strong> (Ctrl + F7), dentro de la sección <strong>User Interface</strong>, busca el componente <strong>ColorPicker</strong> y arrastra tres de ellos al área de trabajo. Selecciona el primer <strong>ColorPicker</strong> que tienes en el área de trabajo y dentro del panel <strong>Properties</strong> asígnale el nombre de instancia de <em>picker1</em>. A los otros componentes asígnales como nombre de instancia <em>picker2</em> y <em>picker3</em>, respectivamente. Dentro del mismo panel de <strong>Components</strong> -&gt; <strong>User Interface</strong> selecciona un componente <strong>Slider</strong> y arrástralo al área de trabajo. Ponle como nombre de instancia <em>slider</em>. Además, crea dos textos dinámicos con nombres de instancia <em>color_txt</em> y <em>texto_txt</em>.</p>
<p>Ordena los componentes de tu área de trabajo, de tal forma que te quede como en la siguiente imagen:</p>
<div align="center"><div class="wp-caption aligncenter" style="width: 344px"><a href="http://codigometropoli.com/images/screens/colorpicker_1.jpg" target="_blank"><img title="Componente ColorPicker" src="http://codigometropoli.com/images/previews/colorpicker_1.jpg" alt="Nota: El orden de los ColorPicker(s) va de arriba hacia abajo y de izquierda a derecha,  de tal forma que el ColorPicker de hasta arriba es picker1.  El texto dinámico que está más arriba es color_txt y el texto dinámico de abajo es texto_txt. " width="334" height="243" /></a><p class="wp-caption-text">Nota: El orden de los ColorPicker(s) va de arriba hacia abajo y de izquierda a derecha,  de tal forma que el ColorPicker de hasta arriba es picker1.  El texto dinámico que está más arriba es color_txt y el texto dinámico de abajo es texto_txt. </p></div></div>
<p>Es momento de pasar al código de nuestra aplicación. Renombra la capa donde se encuentran nuestros componentes (generalmente <em>Layer 1</em>) y ponle de nombre <em>Componentes</em>. Agrega una capa con el nombre de <em>Acciones</em>, dentro de esta capa estará todo nuestro código. A continuación explicaré parte por parte el código; recuerda bajar el archivo del tutorial, el cual se encuentra al final de este post.</p>
<p>En nuestra aplicación necesitaremos detectar cuando el usuario seleccionó otro color en alguno de los <strong>ColorPicker</strong>, o bien cuando desplazó la barra del <strong>Slider</strong>. Para lo anterior es necesario importar las librerías <em>ColorPickerEvent</em> y <em>SliderEvent</em>.</p>
<pre class="brush: as3;">
import fl.events.ColorPickerEvent;
import fl.events.SliderEvent;
</pre>
<p>Para que podamos pintar con degradado el segundo rectángulo de nuestro ejercicio, haremos uso de las librerías <em>geom</em> y <em>display</em>. Del primero usaremos la clase <strong>Matrix</strong>; para el segundo usaremos la clase <strong>Graphics</strong>.</p>
<pre class="brush: as3;">
import flash.geom.Matrix;
import flash.display.Graphics;
</pre>
<p>Además, declararemos una variable llamada <em>radianes</em>, en la cual guardaremos el valor de la rotación del degradado. Para este valor debemos usar radianes y no grados, por lo que ten en cuenta que 1° = PI radianes / 180 (profundizaremos sobre este tema más adelante). Por default, el valor de esta variable será cero.</p>
<pre class="brush: as3;">
var radianes:Number = 0;
</pre>
<p><span style="color: #c00000;"><strong>Primer ejercicio</strong></span></p>
<p>Ahora veremos el código de nuestro primer ejercicio. Primero crearemos un MovieClip llamado cuadrado; el color de inicio de este cuadrado será el negro (0&#215;000000), el cual lo pasaremos como parámetro a nuestra función <em>dibujaCuadrado</em> (del cual mostraré su código más adelante). Además, le asignamos el texto “0&#215;000000” a nuestro campo dinámico <em>color_txt</em> y llamamos la función <em>addChild</em> para agregar el MovieClip al contenedor y visualizarlo.</p>
<pre class="brush: as3;">
var cuadrado:MovieClip = new MovieClip();
dibujaCuadrado(cuadrado, 0x000000);
color_txt.text = &quot;#000000&quot;;
addChild(cuadrado);
</pre>
<p>A continuación veremos el código de la función <em>dibujaCuadrado</em>:</p>
<pre class="brush: as3;">
function dibujaCuadrado(clipo:MovieClip, color:uint):void
{
	clipo.graphics.beginFill(color, 1);
	clipo.graphics.drawRect(150, 59, 75, 75);
	clipo.graphics.endFill();
}
</pre>
<p>En el código anterior, la función <em>dibujaCuadrado</em> recibe como parámetro el MovieClip donde queremos dibujar el cuadrado y color de relleno de éste. El tipo de dato del color es <em>uint</em> (unsigned integer – entero sin signo), este tipo de dato es utilizado en gran medida para el valor de los colores, ya que su máximo valor es el doble que el del tipo de dato <em>int</em>. Para conocer más sobre uint visita esta <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/uint.html" target="_blank">página</a>.</p>
<p>La primera línea de código de la función <em>dibujaCuadrado</em> establece el color de llenado del cuadrado por medio de la función <em>beginFill</em>. Esta función recibe como primer parámetro el color de relleno y como segundo parámetro el valor del alfa (transparencia). Recuerda que desde el AS3, los valores de alfa van de 0 a 1 y no de 0 a 100.<br />
La segunda línea dibuja el cuadrado en la coordenada x = 100 y y = 150, y con un ancho (width) y alto (height) de 75 pixeles, usando la función <em>drawRect</em>.<br />
La última línea se encarga de aplicar el relleno al MovieClip.</p>
<p>Si corres la aplicación con lo que llevamos ahorita, verás que aparece un cuadrado de color negro del lado izquierdo del primer <strong>ColorPicker</strong>. Sin embargo, si haces click en picker1 y seleccionas un color verás que no cambia el color del cuadrado. Esto es porque no hemos ligado los eventos del <strong>ColorPicker</strong> al color del cuadrado, para lograrlo estableceremos dos listeners, uno sobre el evento <strong>ITEM_ROLL_OVER</strong> y otro sobre el evento <strong>CHANGE</strong>. El evento ITEM_ROLL_OVER es accionado cuando el usuario se posiciona sobre cualquier color de la paleta de color (valga la redundancia) del ColorPicker. Este evento lo usaremos debido a que en nuestra aplicación queremos mostrar el cambio de color sobre el MovieClip en el momento de posicionarnos en algún color y no al tener que hacerle click. El evento CHANGE es accionado cuando el usuario hace click sobre un color; utilizaremos este evento para mostrar el valor del color seleccionado en el texto dinámico <em>color_txt</em>.</p>
<pre class="brush: as3;">
picker1.addEventListener(ColorPickerEvent.ITEM_ROLL_OVER, overHandler);
picker1.addEventListener(ColorPickerEvent.CHANGE, changeHandler);
</pre>
<p>Al producirse el evento ITEM_ROLL_OVER, se llamará a la función <em>overHandler</em>.<br />
Al producirse el evento CHANGE, se llamára a la función <em>changeHandler</em>.<br />
A continuación, veremos el código de estas dos funciones:</p>
<pre class="brush: as3;">
function overHandler(event:ColorPickerEvent):void
{
    var numero:uint = event.target.selectedColor;
   dibujaCuadrado(cuadrado, numero);
}
function changeHandler(event:ColorPickerEvent):void
{
	var numero:uint = event.target.selectedColor;
	var color:String = event.target.hexValue.toString();
	color_txt.text = &quot;#&quot; + color.toUpperCase();
	dibujaCuadrado(cuadrado, numero);
}
</pre>
<p>No olvides que, por tratarse de eventos, estas dos funciones reciben como parámetro el evento generado.<br />
En la función <em>overHandler</em>, obtenemos el color seleccionado del componente que generó el evento (en este caso, picker1). Ese color lo almacenamos en una variable local llamada <em>numero</em> la cual es de tipo <em>uint</em>. Después, llamamos a la función <em>dibujaCuadrado</em> (cuyo código lo vimos más arriba) pasándole como parámetro el MovieClip del cuadrado y el color seleccionado.<br />
En la función <em>changeHandler</em>, al igual que en la función anterior, obtenemos el color seleccionado del componente que generó el evento (picker1). En esta función, además de guardar el valor del color seleccionado en formato <em>uint</em>, obtenemos el valor hexadecimal del color seleccionado para mostrarlo en nuestro campo dinámico <em>color_txt</em> (para el usuario es más fácil hacer uso del valor hexadecimal de un color que su valor <em>uint</em>). Posteriormente hacemos la llamada a la función <em>dibujaCuadrado</em>.</p>
<p>Si corres la aplicación verás que al posicionarte encima de un color de la gama de picker1, el MovieClip del cuadrado cambia de color. Además, si seleccionas alguno de los colores, el texto dinámico <em>color_txt</em> muestra el valor del color seleccionado.</p>
<p><span style="color: #c00000;"><strong>Segundo ejercicio</strong></span></p>
<p>Como lo comenté más arriba, en este segundo ejercicio veremos cómo aplicar un degradado a otro MovieClip cuadrado. Este degradado estará formado por dos colores, los cuales serán obtenidos de los ColorPicker <em>picker2</em> y <em>picker3</em>. Primero estableceremos el color por default (el cual estará seleccionado desde un inicio) del <em>picker2</em> y <em>picker3</em>.</p>
<pre class="brush: as3;">
picker2.selectedColor = 0x0000CC;
picker3.selectedColor = 0x66FF00;
</pre>
<p>Para este ejercicio vamos a crear otro MovieClip en el cual dibujaremos un cuadrado. El MovieClip se llamará <em>cuadraodDeg</em>:</p>
<pre class="brush: as3;">
var cuadradoDeg:MovieClip = new MovieClip();
dibujaCuadradoDegradado(cuadradoDeg, 0x0000CC, 0x66FF00);
addChild(cuadradoDeg);
</pre>
<p>Hasta ahora, el único cambio es que mandamos a llamar la función <em>dibujaCuadradoDegradado</em>, la cual recibirá la referencia del MovieClip y los dos colores que formarán el degradado.</p>
<p>El código de la función <em>dibujaCuadradroDegradado</em> es el siguiente:</p>
<pre class="brush: as3;">
function dibujaCuadradoDegradado(clipo:MovieClip, color1:uint, color2:uint)
{
    var matriz:Matrix = new Matrix();
    matriz.createGradientBox(80, 80, radianes, 150, 165);
    clipo.graphics.beginGradientFill(GradientType.LINEAR, [color1, color2], [1, 1], [1, 255], matriz, SpreadMethod.PAD, InterpolationMethod.LINEAR_RGB);
    clipo.graphics.drawRect(150, 165, 80, 80);
    clipo.graphics.endFill();
}
</pre>
<p>Para crear el degradado necesitamos la función <em>createGradientBox</em>, la cual recibe cómo parámetros el ancho y alto del degradado, el valor de rotación del degradado (en radianes) y la distancia en pixeles para trasladar el degradado hacia la izquierda (tx) y hacia abajo (ty). Esta función pertenece a la clase <strong>Matrix</strong>,  por lo tanto declaramos la variable <em>matriz</em> para usar la función.</p>
<p>Posteriormente hacemos uso de la función <em>beginGradientFill</em>. Esta función recibe los siguientes parámetros:</p>
<ul>
<li><strong>type</strong>: Especifica el tipo de degradado que se va a utilizar (lineal o radial). GradientType.LINEAR, GradientType.RADIAL.</li>
<li><strong>colors</strong>: Arreglo con el valor de los colores que formarán parte del degradado.</li>
<li><strong>alphas</strong>: Arreglo con los valores del alfa (transparencia) de cada uno de los colores del parámetro anterior. El valor del alfa va de 0 a 1.</li>
<li><strong>ratios</strong>: Arreglo con los valores de la proporción de distribución. Este valor define el porcentaje del ancho (width) donde el color se muestra al 100%. El valor puede ir de 0 a 255, donde el 0 representa la posición de hasta la izquierda y 255 representa la posición de hasta la derecha de la caja del degradado.</li>
<li><strong>matrix</strong>: La variable de la clase Matrix que definimos con anterioridad y con la cual utilizamos el método <em>createGradientBox</em>.</li>
<li><strong>spreadMethod</strong>: Especifica el método de propagación (spread) a utilizar. Este valor puede ser PAD (rellenar), REFLECT (reflejo) y REPEAT (repite el degradado a lo ancho de la caja).</li>
<li><strong>interpolationMethod</strong>: Método de interpolación. Su valor puede ser linearRGB y RGB.</li>
</ul>
<p>Por último dibujamos nuestro cuadrado y usamos el método <em>endFill</em> para aplicar el relleno.<br />
Al igual que en el ejercicio anterior, debemos establecer listeners para el <em>picker2</em> y <em>picker3</em>. Estos listeners se ejecutarán cuando se presente el evento CHANGE en los ColorPicker y llamarán a la función <em>cambiaDegradado</em>.</p>
<pre class="brush: as3;">
picker2.addEventListener(ColorPickerEvent.CHANGE, cambiaDegradado);
picker3.addEventListener(ColorPickerEvent.CHANGE, cambiaDegradado);
</pre>
<p>La función <em>cambiaDegradado</em> llamará a su vez a la función <em>dibujaCuadradoDegradado</em>, cuyos parámetros son el MovieClip al cual se le aplicará el degradado y los colores seleccionados del <em>picker1</em> y <em>picker2</em>.</p>
<pre class="brush: as3;">
function cambiaDegradado(event:ColorPickerEvent)
{
	dibujaCuadradoDegradado(cuadradoDeg, picker2.selectedColor, picker3.selectedColor);
}
</pre>
<p>Si corres la aplicación verás que aparece un cuadrado con degradado azul y verde. Si seleccionas otro color de cualquiera de los <strong>ColorPicker</strong> <em>picker2</em> y <em>picker3</em>, el degradado cambiará. Ahora solo nos falta programar la función del <strong>Slider</strong> <em>slider</em> para cambiar la rotación del degradado. A este slider le agregaremos un listener cuando se ejecute el evento THUMB_DRAG, es decir, cuando el slider es presionado y movido por el mouse.</p>
<pre class="brush: as3;">
slider.addEventListener(SliderEvent.THUMB_DRAG, cambiarRotacion);
</pre>
<p>Selecciona el componente <strong>Slider</strong> que está en tu área de trabajo y en el Inspector de Componentes (Shift + F7) ponle las siguientes propiedades:</p>
<div align="center"><div class="wp-caption aligncenter" style="width: 294px"><img title="Componente ColorPicker" src="http://codigometropoli.com/images/screens/inspector_de_componentes.jpg" alt="Inspector de Componentes del Slider" width="284" height="325" /></a><p class="wp-caption-text">Inspector de Componentes del Slider </p></div></div>
<p>De la imagen anterior se observa que el valor mínimo del Slider será 0 mientras que el máximo es de 180. Esto es porque queremos que el rango del valor de rotación sea de 0° a 180°. En el momento en que nosotros obtenemos el valor del Slider (cuando se ejecuta el listener) debemos cambiar el valor de grados a radianes, por medio de la fórmula (Math.PI / 180) * grados.</p>
<pre class="brush: as3;">
function cambiarRotacion(event:SliderEvent)
{
	var grados:Number = event.value;
	var rads:Number = (Math.PI / 180) * grados;
	radianes = rads;
	dibujaCuadradoDegradado(cuadradoDeg, picker2.selectedColor, picker3.selectedColor);
}
</pre>
<p>La última línea de la función <em>cambiarRotacion</em> llama a la función <em>dibujaCuadradoDegradado</em>, la cual al ser llamada utilizará el nuevo valor de la variable radianes.</p>
<p><span style="color: #c00000;"><strong>Tercer ejercicio</strong></span></p>
<p>En este tercer ejercicio cambiaremos el color de un texto dinámico de acuerdo al color seleccionado del ColorPicker <em>picker4</em>. Además, estableceremos el arreglo de colores que queremos mostrar en el <em>picker4</em>.<br />
Primero vamos a ocultar el campo de texto del <em>picker4</em> para evitar que el usuario introduzca el valor de un color distinto a los mostrados en el arreglo:</p>
<pre class="brush: as3;">
picker4.showTextField = false;
</pre>
<p>Para establecer los colores a mostrar dentro de este componente utilizamos la propiedad <em>colors</em>, la cual recibe un arreglo de colores:</p>
<pre class="brush: as3;">
picker4.colors = [0xFFFFFF, 0x004070, 0x4b8cdb, 0xa1c8f7, 0x6fb543,
		  0xddb0cf, 0xf8ccd5, 0xffe8a1, 0xfdd382, 0xf2ec87,
		  0x307ec7, 0x57a3de, 0xcbe8f5, 0x4781b3, 0x1c5485];
</pre>
<p>Ahora establecemos el número de colores que queremos mostrar por fila, es decir, la cantidad de columnas de colores a mostrar dentro del ColorPicker. En nuestro caso queremos que sea de 5 en 5.</p>
<pre class="brush: as3;">
picker4.setStyle(&quot;columnCount&quot;, 5);
</pre>
<p>El color por default de nuestro texto dinámico será negro, por lo tanto seleccionamos el color negro en el <strong>picker4</strong>.</p>
<pre class="brush: as3;">
picker4.selectedColor = 0x000000;
</pre>
<p>Para poderle cambiar el color a un texto dinámico, debemos crear una variable de tipo <strong>TextFormat</strong>. Recuerda que el nombre de instancia de nuestro texto dinámico es <em>texto_txt</em>, y para aplicarle el formato debemos utilizar el método <em>setTextFormat</em>.</p>
<pre class="brush: as3;">
var formato:TextFormat = new TextFormat();
formato.bold = true;
formato.color = 0x000000;
formato.size = 16;
formato.font = &quot;Arial&quot;;
texto_txt.setTextFormat(formato);
</pre>
<p>Por último solo nos queda añadirle un listener al <em>picker4</em> y establecer la función que cambiará el color:</p>
<pre class="brush: as3;">
picker4.addEventListener(ColorPickerEvent.CHANGE, cambiaTexto);

function cambiaTexto(event:ColorPickerEvent)
{
	formato.color = picker4.selectedColor;
	texto_txt.setTextFormat(formato);
}
</pre>
<div align="center" style="margin-top:0px"><script type="text/javascript"><!--
      google_ad_client = "pub-5808310808246221";
      /* 250x250, Posts */
      google_ad_slot = "8254875600";
      google_ad_width = 250;
      google_ad_height = 250;
// --></script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></div>
<div align="center" style="margin-top:30px; margin-bottom:10px;">
<object width="550" height="400">
<param name="movie" value="http://codigometropoli.com/wp-content/uploads/2008/12/componente_colorpicker.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<embed type="application/x-shockwave-flash" width="550" height="400" src="http://codigometropoli.com/wp-content/uploads/2008/12/componente_colorpicker.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</div>
<div align="center" style="margin-top:10px; margin-bottom:20px;">
<table border="0" cellspacing="0" cellpadding="0" width="180">
<tbody>
<tr>
<td valign="top"><a href="http://www.megaupload.com/?d=BW7OUW4J" target="_blank"><img src="../images/descargar.png" alt="Descargar Archivo" /></a></td>
</tr>
</tbody>
</table>
</div>
<div style="margin-top:40px; margin-bottom:30px;">
<strong>Enlaces recomendados:</strong><br />
» <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/geom/Matrix.html" target="_blank">Clase Matrix</a><br />
» <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/geom/Matrix.html#createGradientBox()" target="_blank">Función createGradientBox</a><br />
» <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/Graphics.html#beginGradientFill()" target="_blank">Función beginGradientFill</a><br />
» <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/controls/Slider.html" target="_blank">Clase Slider</a></div>

<p><a href="http://feedads.g.doubleclick.net/~a/i0b0KjOSzODHtdl-MUHLnkPPvH0/0/da"><img src="http://feedads.g.doubleclick.net/~a/i0b0KjOSzODHtdl-MUHLnkPPvH0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/i0b0KjOSzODHtdl-MUHLnkPPvH0/1/da"><img src="http://feedads.g.doubleclick.net/~a/i0b0KjOSzODHtdl-MUHLnkPPvH0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/feedburner/ERTc/~4/RnoiCQUhyhc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/componente-colorpicker/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.codigometropoli.com/componente-colorpicker/</feedburner:origLink></item>
		<item>
		<title>Componente DateField</title>
		<link>http://feedproxy.google.com/~r/feedburner/ERTc/~3/FIxuf5IqdKo/</link>
		<comments>http://www.codigometropoli.com/componente-datefield/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 04:31:55 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Componentes]]></category>
		<category><![CDATA[DateField]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=507</guid>
		<description><![CDATA[El componente DateField permite que el usuario de nuestra aplicación seleccione una fecha dentro de un calendario que es mostrado cuando se hace click en este componente. La ventaja principal del DateField es que el usuario nunca ingresará una fecha incorrecta (por ejemplo 31 de abril); además de que podemos establecer un rango de fechas [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flash.png" alt="Flash" width="93" height="93" />El componente DateField permite que el usuario de nuestra aplicación seleccione una fecha dentro de un calendario que es mostrado cuando se hace click en este componente. La ventaja principal del DateField es que el usuario nunca ingresará una fecha incorrecta (por ejemplo 31 de abril); además de que podemos establecer un rango de fechas dentro de las cuales el usuario puede hacer su elección, o bien deshabilitar fechas.<span id="more-507"></span></p>
<p>Este componente tiene los siguientes parámetros:</p>
<ul>
<li><strong>dayNames</strong>:  Arreglo con los nombres de los días de la semana. Por default y por los nombres en ingles, el valor es [S, M, T, W, T, F, S]</li>
<li><strong>disableDays</strong>: Arreglo con los días de la semana que queremos que aparezcan deshabilitados. Ej. Sábados y Domingos ([0,6])</li>
<li><strong>firstDayOfWeek</strong>: Día de comienzo de la semana. El valor por default es cero y eso significa que el primer día de la semana será el domingo. En caso de querer establecer el lunes como el primer día de la semana, cambia el valor por 1.</li>
<li><strong>monthNames</strong>: Nombre de los meses. Por default los nombres de los meses están en inglés, sin embargo en esta parte los podemos poner en español.</li>
<li><strong>showToday</strong>: Variable booleana para establecer si deseamos señalar el día de hoy en el calendario. Por default el valor es <em>true</em>.</li>
</ul>
<p>Para conocer todos los métodos, propiedades y eventos que conforman la clase DateField, ingresa a la siguiente <a href="http://livedocs.adobe.com/flash/8/main/00003411.html" target="_blank">página</a>.</p>
<p><span style="color: #560e00; text-decoration: underline;"><strong>Tutorial</strong></span></p>
<p>Para este tutorial usaremos el Flash 8. Abre el programa y crea un nuevo documento de Flash.<br />
En el panel <strong>Components </strong>(Ctrl + F7), dentro de la sección <strong>User Interface</strong>, busca el componente <strong>DateField</strong> y arrástralo al área de trabajo. Selecciona el <strong>DateField</strong> que tienes en el área de trabajo y dentro del panel <strong>Properties</strong> asígnale el nombre de instancia de <em>fecha</em>. Dentro del mismo panel de <strong>Components </strong>-&gt; <strong>User Interface</strong> selecciona un componente <strong>Button</strong> y arrástralo al área de trabajo. Ponle como nombre de instancia <em>mostrar_btn</em> y como <em>label</em> “Mostrar fecha”.</p>
<p>Renombra la capa donde se encuentran estos componentes (generalmente Layer 1) y ponle de nombre <em>Componentes</em>. Agrega una capa con el nombre de Acciones y dentro de esta capa pega  el siguiente código:</p>
<pre class="brush: as3;">
mostrar_btn.onRelease = function()
{
	trace(&quot;Fecha Seleccionada: &quot; + fecha.selectedDate);
}
</pre>
<p>Lo que hace el código anterior es mostrar en el panel <strong>Output</strong> el valor de la fecha seleccionada. Si el usuario no seleccionó alguna fecha, el mensaje mostrará el valor de <strong>undefined</strong>. Observa que de esta forma es fácil validar si el usuario seleccionó una fecha, de la siguiente forma:</p>
<pre class="brush: as3;">
if(fecha.selectedDate == undefined)
{
	trace(&quot;El usuario no seleccionó fecha&quot;);
}
</pre>
<p>Cuando el usuario selecciona una fecha, el valor de esa fecha seleccionada es mostrado dentro del rectángulo del <strong>DateField</strong>. Haz la prueba y verás que el campo de la fecha te despliega un valor similar al mostrado en la siguiente imagen:</p>
<div align="center" style="margin-bottom:10px;"><img title="Imagen 1: DateField - Fecha seleccionada" src="http://www.codigometropoli.com/images/screens/datefield_flash.jpg" alt="Imagen 1: DateField - Fecha seleccionada" width="174" height="36" /></div>
<p>Si haces click en el botón de <em>Mostrar fecha</em>, el valor obtenido por la propiedad <strong>selectedDate</strong> será: Wed Dec 3 00:00:00 GMT-0600 2008. Es posible que en estos momentos te preguntes de qué le sirve al usuario mostrarle la fecha en ese formato si lo más seguro es que tu usuario final hable español; o peor aún ¿de qué te sirve el formato regresado por la propiedad <strong>selectedDate</strong> si lo que quieres es guardar el valor en una columna de tipo Date de una base de datos?</p>
<p><span style="color: #c00000;"><strong>Cambiar el formato de la fecha mostrada en el DateField</strong></span></p>
<p>Para cambiar el formato de la fecha bastará con hacer uso de la propiedad <strong>dateFormatter</strong>. A esta propiedad hay que establecerle la función o método que se encargará de regresar la fecha en el formato especificado. Supongamos que queremos que la fecha se muestre como 03/12/2008, para eso tendríamos que añadir el siguiente código:</p>
<pre class="brush: as3;">
fecha.dateFormatter = function(fecha_sel:Date)
{
	var dia:String = fecha_sel.getDate() &lt; 10 ? &quot;0&quot; +  fecha_sel.getDate() :  fecha_sel.getDate();
	var mes:String = (fecha_sel.getMonth() + 1) &lt; 10 ? &quot;0&quot; +  (fecha_sel.getMonth() + 1) :  (fecha_sel.getMonth() + 1);
	return dia + &quot;/&quot; + mes + &quot;/&quot; + fecha_sel.getFullYear();
}
</pre>
<p>Esta función recibe cómo parámetro la fecha seleccionada por el usuario. De esa fecha podemos obtener el día usando la función <strong>getDate()</strong>; esta función nos regresa un valor de 1 a 31. Para obtener el número de mes de la fecha seleccionada usamos la función <strong>getMonth()</strong>; esta función nos regresa un valor de 0 a 11 donde el 0 equivale al mes de Enero y 11 al mes de Diciembre. La función <strong>getFullYear()</strong> nos regresará el valor del año seleccionado con el formato completo (es decir, de cuatro dígitos. Ej. 2005).<br />
En nuestro ejemplo queremos que el mes y el día tengan dos dígitos, es por eso que en nuestro código verificamos si el número de día o mes es menor que 10, si es así le agregamos un cero al inicio.<br />
Dentro de la función anterior podemos actualizar el valor de una variable global para guardar la fecha en el formato que deseemos de acuerdo a la base de datos que utilicemos o a nuestras necesidades. Por ejemplo, suponiendo que la fecha la tenemos que almacenar de la forma 2008-12-03, podremos considerar el siguiente código:</p>
<pre class="brush: as3;">
var fecha_seleccionada:String = “”;
fecha.dateFormatter = function(fecha_sel:Date)
{
	var dia:String = fecha_sel.getDate() &lt; 10 ? &quot;0&quot; +  fecha_sel.getDate() :  fecha_sel.getDate();
	var mes:String = (fecha_sel.getMonth() + 1) &lt; 10 ? &quot;0&quot; +  (fecha_sel.getMonth() + 1) :  (fecha_sel.getMonth() + 1);
	fecha_seleccionada = fecha_sel.getFullYear() + “-“ + mes + “-“ + dia;
	return dia + &quot;/&quot; + mes + &quot;/&quot; + fecha_sel.getFullYear();
}
</pre>
<p><span style="color: #c00000;"><strong>Deshabilitar días de la semana en el componente DateField</strong></span></p>
<p>Como lo dije al inicio del tutorial, la propiedad <em>disabledDays</em> nos permite especificar por medio de un arreglo qué días de la semana queremos que aparezcan deshabilitados. Supongamos que queremos realizar una aplicación estilo agenda para anotar nuestras juntas de trabajo. Para evitar equivocarnos, al momento de realizar la selección de fecha, y establecer una junta de trabajo un sábado o domingo, podemos deshabilitar estos días de la siguiente manera:</p>
<pre class="brush: as3;">
fecha.disabledDays = [0, 6];
</pre>
<p>Del código anterior, el número cero hace referencia al día domingo, mientras que el día seis hace referencia al día sábado.</p>
<p><span style="color: #c00000;"><strong>Deshabilitar fechas o rango de fechas en el componente DateField</strong></span></p>
<p>Para deshabilitar una fecha o bien un rango de fechas debemos usar la propiedad <em>disabledRanges</em>. Esta propiedad puede ser un arreglo de objetos cuyo tipo de dato es <em>Date</em>, o bien un objeto que contiene las propiedades <em>rangeStart</em> y <em>rangeEnd</em> y cuyos valores deben ser un objeto Date.</p>
<p>Continuando con el ejemplo anterior (el de la aplicación estilo agenda), imaginemos que vamos a salir de vacaciones del 20 al 28 de diciembre, y por lo tanto queremos deshabilitar esos días. El siguiente código nos permitirá hacerlo:</p>
<pre class="brush: as3;">
fecha.disabledRanges = [{rangeStart: new Date(2008, 11, 20), rangeEnd: new Date(2008, 11, 28)}];
</pre>
<p>Recuerda que el número de meses comienzan en 0, por lo tanto para el mes de diciembre el número es el 11.</p>
<div align="center" style="margin-top:0px"><script type="text/javascript"><!--
      google_ad_client = "pub-5808310808246221";
      /* 250x250, Posts */
      google_ad_slot = "8254875600";
      google_ad_width = 250;
      google_ad_height = 250;
// --></script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></div>
<div align="center" style="margin-top:30px; margin-bottom:20px;">
<object width="400" height="280">
<param name="movie" value="http://codigometropoli.com/wp-content/uploads/2008/12/componente_datefield.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<embed type="application/x-shockwave-flash" width="400" height="280" src="http://codigometropoli.com/wp-content/uploads/2008/12/componente_datefield.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</div>
<div align="center" style="margin-top:30px; margin-bottom:20px;">
<table border="0" cellspacing="0" cellpadding="0" width="180">
<tbody>
<tr>
<td valign="top"><a href="http://www.megaupload.com/?d=RT8VIL1Y" target="_blank"><img src="../images/descargar.png" alt="Descargar Archivo" /></a></td>
</tr>
</tbody>
</table>
</div>
<div style="margin-top:40px; margin-bottom:30px;">
<strong>Enlaces recomendados:</strong><br />
» <a href="http://livedocs.adobe.com/flash/8/main/00003411.html" target="_blank">DateField Class</a></div>

<p><a href="http://feedads.g.doubleclick.net/~a/MbKyyvaSOk4wAiTJZTi2E55Vp6M/0/da"><img src="http://feedads.g.doubleclick.net/~a/MbKyyvaSOk4wAiTJZTi2E55Vp6M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/MbKyyvaSOk4wAiTJZTi2E55Vp6M/1/da"><img src="http://feedads.g.doubleclick.net/~a/MbKyyvaSOk4wAiTJZTi2E55Vp6M/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/feedburner/ERTc/~4/FIxuf5IqdKo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/componente-datefield/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://www.codigometropoli.com/componente-datefield/</feedburner:origLink></item>
		<item>
		<title>Sistema de Gastos en Flex con AMFPHP y MySQL</title>
		<link>http://feedproxy.google.com/~r/feedburner/ERTc/~3/PwjkNAQD-Bg/</link>
		<comments>http://www.codigometropoli.com/sistema-de-gastos-en-flex-con-amfphp-y-mysql/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 16:30:48 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=472</guid>
		<description><![CDATA[En este tutorial veremos cómo acceder a los registros de una base de datos MySQL desde Flex utilizando AMFPHP. Realizaremos un pequeño Sistema de Gastos en el cual haremos inserciones a la base de datos, consultas, modificaciones y eliminación de registros. Si no sabes qué es y para qué sirve el AMFPHP, visita nuestro tutorial [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flex.png" alt="Flex" width="93" height="93" />En este tutorial veremos cómo acceder a los registros de una base de datos MySQL desde Flex utilizando <a href="http://www.amfphp.org/" target="_blank">AMFPHP</a>. Realizaremos un pequeño Sistema de Gastos en el cual haremos inserciones a la base de datos, consultas, modificaciones y eliminación de registros. Si no sabes qué es y para qué sirve el AMFPHP, visita nuestro tutorial de <a href="http://www.codigometropoli.com/introduccion-a-amfphp/" target="_self">Introducción a AMFPHP</a>.</p>
<p><span id="more-472"></span></p>
<p>En esta ocasión no veremos a detalle todo el código que involucra el sistema; sin embargo, puedes encontrar al final de esta entrada los archivos fuentes.<br />
El sistema funciona de la siguiente manera:<br />
- El usuario primero da de alta tipo de monedas en la Sección de Divisas (Su nombre y símbolo).<br />
- Posteriormente el usuario puede dar de alta servicios en la Sección de Servicios (valga la redundancia). Estos servicios son opcionales y pueden seleccionarse cuando un usuario introduce un gasto en el sistema. Ejemplo de servicios: teléfono, gas, luz, educación, restaurantes, entretenimiento, etc.<br />
- Dentro del sistema, el usuario puede dar de alta gastos e ingresos. Estos gastos o ingresos requieren de la fecha, cantidad y divisa con la cual se realizó la operación. De manera opcional se puede introducir un concepto (descripción) y se puede seleccionar un servicio (si se trata de un gasto).</p>
<p>Comenzaremos con el script de nuestra base de datos:</p>
<pre class="brush: sql;">
# Host: localhost    Database: codmetr_gastos
# ------------------------------------------------------
# Server version 4.1.22-community-nt

#
# Table structure for table tbldivisa
#
CREATE TABLE `tbldivisa` (
  `INTNUMDIVISA` int(11) NOT NULL auto_increment,
  `STRNOMBRE` varchar(30) NOT NULL default '',
  `STRSIMBOLO` varchar(5) character set utf8 default NULL,
  PRIMARY KEY  (`INTNUMDIVISA`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

#
# Table structure for table tbloperacion
#
CREATE TABLE `tbloperacion` (
  `INTNUMOPERACION` int(11) NOT NULL auto_increment,
  `DTMFECHA` date NOT NULL default '0000-00-00',
  `STRCONCEPTO` varchar(100) default NULL,
  `NUMCANTIDAD` decimal(10,2) default NULL,
  `INTNUMDIVISA` int(11) NOT NULL default '0',
  `INTNUMSERVICIO` int(11) default NULL,
  `INTOPERACION` int(11) NOT NULL default '0',
  PRIMARY KEY  (`INTNUMOPERACION`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

#
# Table structure for table tblservicio
#
CREATE TABLE `tblservicio` (
  `INTNUMSERVICIO` int(11) NOT NULL auto_increment,
  `STRNOMBRE` varchar(50) default NULL,
  PRIMARY KEY  (`INTNUMSERVICIO`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
</pre>
<p>Del código anterior podemos observar que tenemos una tabla <strong>tbldivisa</strong>, en la cual almacenamos los tipos de moneda que utilizamos. Una tabla <strong>tblservicio</strong> donde guardamos los servicios ingresados; y una tabla <strong>tbloperacion</strong> en donde almacenamos las operaciones (gastos e ingresos). Las relaciones entre divisas y servicios con respecto a las operaciones están dadas por el ID de estas tablas (INTNUMDIVISA e INTNUMSERVICIO).</p>
<p>Ahora veremos el código PHP de nuestra que funcionará como servicio:</p>
<pre class="brush: php;">
&lt;?php
class SistemaGastos
{
	var $sqlstring = &quot;&quot;;
	var $server = &quot;localhost&quot;;
	var $user =  &quot;usuario_database&quot;;
	var $pass = &quot;contrasena_database&quot;;
	var $database = &quot;codigometr_gastos&quot;;

	var $db = 0;
	var $rs = 0;
	var $row = 0;
	var $recordcount = 0;
	var $EOF = true;

	function _conectarBaseDatos()
	{
		 $this-&gt;db = mysql_connect($this-&gt;server,$this-&gt;user,$this-&gt;pass);
   		 mysql_select_db($this-&gt;database,$this-&gt;db) or die(mysql_error());
	}

	function _ejecutarQuery($strSql)
	{
    		$this-&gt;sqlstring = $strSql;
	    	$this-&gt;_exec_command();
		return $this-&gt;lastid;
    	}

	function _exec_command()
	{
		if ($this-&gt;db &amp;&amp; $this-&gt;sqlstring!=&quot;&quot;)
		{
			$this-&gt;rs = mysql_query($this-&gt;sqlstring,$this-&gt;db);
			if ($this-&gt;rs)
			{
				$this-&gt;EOF = true;
				$this-&gt;recordcount = mysql_affected_rows();
				$this-&gt;lastid = mysql_insert_id();
			}
			else
			{
				$this-&gt;recordcount = 0;
				$this-&gt;EOF = true;
			}
		}
		else
		{
			$this-&gt;recordcount = 0;
			$this-&gt;EOF = true;
		}
	}	

	function _destruir()
	{
    		if($this-&gt;db)
			mysql_close($this-&gt;db);
	}

	/* Métodos para la tabla tbldivisa */
	function insertarDivisa($nombre, $simbolo)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Insert into `tbldivisa` (`STRNOMBRE`, `STRSIMBOLO`) VALUES ('&quot; . $nombre . &quot;', '&quot; . $simbolo . &quot;')&quot;;
		$this-&gt;_ejecutarQuery($sql);
		$this-&gt;_destruir();
	}

	function modificarDivisa($idDivisa, $nombre, $simbolo)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Update `tbldivisa` set `STRNOMBRE` = '&quot; . $nombre . &quot;', `STRSIMBOLO` = '&quot; . $simbolo . &quot;' where `INTNUMDIVISA` = &quot; . $idDivisa;
		$this-&gt;_ejecutarQuery($sql);
		$this-&gt;_destruir();
	}

	function eliminarDivisa($idDivisa)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Delete from `tbldivisa` where `INTNUMDIVISA`= &quot; . $idDivisa;
		$result = mysql_query($sql);
		$sql = &quot;Delete from `tbloperacion` where `INTNUMDIVISA`= &quot; . $idDivisa;
		mysql_query($sql);
		$this-&gt;_destruir();
		return $result;
	}

	function obtenerDivisas()
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Select INTNUMDIVISA, STRNOMBRE, STRSIMBOLO from tbldivisa ORDER BY STRNOMBRE asc&quot;;
		$result = mysql_query($sql);

		while ($row = mysql_fetch_object($result))
		{
			$divisas[] = $row;
		}	

		$this-&gt;_destruir();

		return($divisas);
	}

	/* Métodos para la tabla tblservicio */
	function insertarServicio($nombre)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Insert into `tblservicio` (`STRNOMBRE`) VALUES ('&quot; . $nombre . &quot;')&quot;;
		$this-&gt;_ejecutarQuery($sql);
		$this-&gt;_destruir();
	}

	function modificarServicio($idServicio, $nombre)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Update `tblservicio` set `STRNOMBRE` = '&quot; . $nombre . &quot;' where `INTNUMSERVICIO` = &quot; . $idServicio;
		$this-&gt;_ejecutarQuery($sql);
		$this-&gt;_destruir();
	}

	function eliminarServicio($idServicio)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Delete from `tblservicio` where `INTNUMSERVICIO`= &quot; . $idServicio;
		$result = mysql_query($sql);
		$sql = &quot;Delete from `tbloperacion` where `INTNUMSERVICIO`= &quot; . $idServicio;
		mysql_query($sql);
		$this-&gt;_destruir();
		return $result;
	}

	function obtenerServicios()
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Select INTNUMSERVICIO, STRNOMBRE from tblservicio ORDER BY STRNOMBRE asc&quot;;
		$result = mysql_query($sql);

		while ($row = mysql_fetch_object($result))
		{
			$servicios[] = $row;
		}	

		$this-&gt;_destruir();

		return($servicios);
	}

	/* Métodos para la tabla tbloperacion */
	function insertarOperacion($fecha, $concepto, $cantidad, $id_divisa, $servicio, $operacion)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;INSERT INTO `tbloperacion` (DTMFECHA, STRCONCEPTO, NUMCANTIDAD, INTNUMDIVISA, INTNUMSERVICIO, INTOPERACION) VALUES ('&quot; . $fecha . &quot;','&quot; . $concepto . &quot;',&quot; . $cantidad . &quot;,&quot; . $id_divisa . &quot;,&quot; . $servicio . &quot;,&quot; . $operacion . &quot;)&quot;;
		$result = $this-&gt;_ejecutarQuery($sql);
		$this-&gt;_destruir();

		return $result;
	}

	function actualizarOperacion($idOperacion, $fecha, $concepto, $cantidad, $id_divisa, $servicio, $operacion)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Update `tbloperacion` set `DTMFECHA` = '&quot; . $fecha . &quot;', `STRCONCEPTO` = '&quot; . $concepto . &quot;', `NUMCANTIDAD` = &quot; . $cantidad . &quot;, `INTNUMDIVISA` = &quot; . $id_divisa . &quot;, `INTNUMSERVICIO` = &quot; . $servicio . &quot;, `INTOPERACION` = &quot; . $operacion . &quot; where `INTNUMOPERACION` = &quot; . $idOperacion;
		$result = $this-&gt;_ejecutarQuery($sql);
		$this-&gt;_destruir();
		return $result;
	}

	function eliminarOperacion($idOperacion)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Delete from `tbloperacion` where `INTNUMOPERACION`= &quot; . $idOperacion;
		$result = mysql_query($sql);
		$this-&gt;_destruir();
		return $result;
	}

	function obtenerOperaciones()
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Select * from `tbloperacion` ORDER BY DTMFECHA asc&quot;;
		$result = mysql_query($sql);

		while ($row = mysql_fetch_object($result))
		{
			$operaciones[] = $row;
		}	

		$this-&gt;_destruir();

		return($operaciones);
	}

	function realizarConsulta($servicio, $divisa, $concepto, $fecha1, $fecha2, $cantidad1, $cantidad2, $operacion)
	{
		$this-&gt;_conectarBaseDatos();
		$sql = &quot;Select top.DTMFECHA, top.STRCONCEPTO, top.NUMCANTIDAD, top.INTNUMDIVISA, top.INTNUMSERVICIO, top.INTOPERACION, td.STRNOMBRE, td.STRSIMBOLO FROM tbloperacion AS top, tbldivisa as td WHERE td.INTNUMDIVISA = top.INTNUMDIVISA&quot;;

		/* Selección Concepto */
		if($concepto != &quot;&quot;)
			$sql .= &quot; AND top.STRCONCEPTO LIKE '%&quot; . $concepto . &quot;%'&quot;;

		/* Selección Divisa */
		if($divisa != 0) {
			$sql .= &quot; AND top.INTNUMDIVISA = &quot; . $divisa . &quot; AND td.INTNUMDIVISA = &quot; . $divisa;
		}

		/* Selección Servicio */
		if($servicio != 0) {
			$sql .= &quot; AND top.INTNUMSERVICIO = &quot; . $servicio;
		}

		if($cantidad1 != &quot;&quot; &amp;&amp; $cantidad2 != &quot;&quot;)
		{
			if($cantidad1 &lt;= $cantidad2)
				$sql .= &quot; AND top.NUMCANTIDAD BETWEEN &quot; . $cantidad1 . &quot; AND &quot; . $cantidad2;
			else
				$sql .= &quot; AND top.NUMCANTIDADBETWEEN &quot; . $cantidad2 . &quot; AND &quot; . $cantidad1;
		}
		else if($cantidad1 != &quot;&quot;)
			$sql .= &quot; AND top.NUMCANTIDAD = &quot; . $cantidad1;
		else if($cantidad2 != &quot;&quot;)
			$sql .= &quot; AND top.NUMCANTIDAD = &quot; . $cantidad2;

		/* Selección Operación */
		if($operacion == 3)
			$sql .= &quot; AND top.INTOPERACION &gt;= 1 AND top.INTOPERACION &lt;= 2&quot;;
		else
			$sql .= &quot; AND top.INTOPERACION = &quot;  . $operacion;		

		if($fecha1 != NULL || $fecha2 != NULL)
		{
			if($fecha1 != &quot;&quot; &amp;&amp; $fecha2 == &quot;&quot;)
			{
				$sql .= &quot; AND top.DTMFECHA = '&quot; . $fecha1 . &quot;'&quot;;
			}
			else
			{
				$sql .= &quot; AND top.DTMFECHA &gt;= '&quot; . $fecha1 . &quot;' AND top.DTMFECHA &lt;= '&quot; . $fecha2 . &quot;'&quot;;
			}
		}

		$sql .= &quot; ORDER BY top.DTMFECHA asc, top.NUMCANTIDAD asc&quot;;
		$result = mysql_query($sql);

		while ($row = mysql_fetch_object($result))
		{
			$registros[] = $row;
		}	

		$this-&gt;_destruir();

		return($registros);
	}
}
?&gt;
</pre>
<p>Los métodos que inician con guión bajo (_) son métodos privados y por lo tanto no podemos acceder a ellos desde Flex. Los otros métodos <em>insertarDivisa</em>, <em>modificarDivisa</em>, <em>eliminarDivisa</em>, <em>obtenerDivisas</em>, etc. son métodos públicos a los cuales accedemos desde Flex.<br />
Observa cómo en los métodos obtenerXXX almacenamos los registros en un arreglo y lo regresamos a nuestra aplicación. Los queries en realidad son muy sencillos, por lo que no requieren explicación; solamente observa cómo en los métodos <strong>eliminarServicio</strong> y <strong>eliminarDivisa</strong> hacemos el borrado de los registros que involucran estos registros en la tabla <em>tbloperacion</em>. Esto es para evitar que haya inconsistencia en la base de datos.</p>
<p>Ahora veremos el código principal de nuestra aplicación en Flex.<br />
Para poder hacer uso del AMFPHP necesitamos de las librerías <strong>NetConnection</strong> y <strong>Responder</strong>.</p>
<pre class="brush: as3;">
	import flash.net.NetConnection;
	import flash.net.Responder;
</pre>
<p>Para poder acceder a los servicios en AMFPHP debemos especificar la ruta en la cual se encuentra el archivo gateway.php de AMFPHP:</p>
<pre class="brush: as3;">
	private var gateway:String = &quot;http://www.codigometropoli.com/wp-content/uploads/2008/10/SistemaGastos/AMFPHP1.9/gateway.php&quot;;
	private var connection:NetConnection;
	private var responder:Responder;
</pre>
<p>Al iniciar la aplicación debemos llamar a la función <em>connect</em> pasándole como parámetro el <em>gateway</em>:</p>
<pre class="brush: as3;">
function iniciaAplicacion()
{
	connection = new NetConnection;
	connection.connect(gateway);
}
</pre>
<p>Dentro del constructor de la clase Responder debemos especificar las funciones que se ejecutarán en caso de que la llamada haya sido sido exitosa y en caso de que haya existido un error. Para hacer la llamada al servicio utilizamos la función <em>call</em>; a la cual pasamos como parámetro el nombre de la función que queremos llamar y que se encuentra en la clase <strong>SistemaGastos.php</strong>, nuestro objeto de la clase Responder y los parámetros que debemos pasarle a la función:</p>
<pre class="brush: as3;">
responder = new Responder(insertarOperacionResult, errorConsulta);
connection.call(&quot;SistemaGastos.insertarOperacion&quot;, responder, param1, param2, param3...);
</pre>
<p>Del código anterior podemos deducir que el nombre de nuestra clase en PHP es <strong>SistemaGastos</strong> y que tiene un método público llamado <strong>insertarOperacion</strong>.</p>
<p>En caso de que la llamada haya sido exitosa, se ejecutará el método <em>insertarOperacionResult</em>:</p>
<pre class="brush: as3;">
private function insertarOperacionResult(result:Object):void {
	if(result.toString() != &quot;0&quot;)
	{
		restablecerForma();
		Alert.show(&quot;Registro almacenado&quot;, &quot;Aviso&quot;);
	}
	else
		Alert.show(&quot;No se pudo almacenar el registro&quot;, &quot;Error&quot;);
}
</pre>
<p>En caso contrario, si existiera algún error en la llamada al servicio, la función <em>errorConsulta</em> se ejecutará:</p>
<pre class="brush: as3;">
private function errorConsulta(fault:Object):void {
	Alert.show(fault.description, &quot;Error&quot;);
	CursorManager.removeBusyCursor();
}
</pre>
<p>Nuestra forma de alta de operación (Gasto o Ingreso) será la siguiente:</p>
<div align="center"><img src="http://www.codigometropoli.com/images/screens/sistema_gastos_flex_alta.jpg" alt="Formulario de alta de gastos o ingresos" /></div>
<p>De la imagen anterior puedes saber qué tipo de información estamos solicitando, cuál es la obligatoria (Fecha, Cantidad y Divisa), así como la forma en qué estamos mostrando al usuario las divisas y servicios dados de alta (por medio de ComboBox).</p>
<p>Las partes de código mostradas forman parte de la llamada a una función que se encarga de insertar un registro. El código no tendrá variación cuando se trate de modificar un registro; y cuando se trate de eliminar un registro solamente le pasaremos el ID del registro a eliminar. ¿Pero qué pasa cuando se trata de una consulta? ¿Cómo obtenemos los registros registros regresados por la base de datos? ¿Cómo mostramos esos registros?</p>
<p>Si leíste el tutorial sobre <a href="http://www.codigometropoli.com/componente-datagrid/">Componente DataGrid</a> y las cuatro entregas del tutorial <a href="http://www.codigometropoli.com/category/air/">Sistema de Clientes en AIR</a> sabrás que podemos recorrer cada uno de los registros obtenidos de la base de datos y almacenarlos en un arreglo por medio del método <em>push</em>; posteriormente ese arreglo es pasado al DataGrid como su proveedor de datos (<em>dataProvider</em>).</p>
<p>Primero hacemos la llamada al método <em>realizarConsulta</em> del servicio <strong>SistemaGastos</strong>:</p>
<pre class="brush: as3;">
responder = new Responder(realizarConsultaResult, errorConsulta);
connection.call(&quot;SistemaGastos.realizarConsulta&quot;, responder, param1, param2, param3...);
</pre>
<p>Definimos el código de nuestra función realizarConsultaResult:</p>
<pre class="brush: as3;">
private function realizarConsultaResult(result:Array):void
{
	if(result != null)
	{
		var totalRegistros:Number = result.length;
		var totales_array:Array = new Array();

		for (var i:int = 0; i &lt; result.length; i++)
		{
	    		...
	       		var divisa_txt:String = result[i].STRNOMBRE;
       			var simbolo_txt:String = result[i].STRSIMBOLO;
	       		...
	    		var cantidad:Number = result[i].NUMCANTIDAD;

		    	if(totales_array.length == 0)
		    		totales_array.push({cantidad:cantidad, divisaID:result[i].INTNUMDIVISA, divisa:divisa_txt, simbolo:result[i].STRSIMBOLO});
	    		else
	    		{
	    			var posicion:Number = regresaPosicionMoneda(totales_array, result[i].INTNUMDIVISA);
		    		if(posicion != -1)
		    		{
	    				var total:Number = totales_array[posicion].cantidad;
	    				total += cantidad;
	    				totales_array[posicion].cantidad = total;
		    		}
		    		else
	    				totales_array.push({cantidad:cantidad, divisaID:result[i].INTNUMDIVISA, divisa:divisa_txt, simbolo:result[i].STRSIMBOLO});
	    			}
data_provider.push({fecha_operacion:DateUtilities.returnReadableDate(result[i].DTMFECHA), concepto:result[i].STRCONCEPTO, cantidad:currencyFormatter.format(result[i].NUMCANTIDAD), cantidad_numero:result[i].NUMCANTIDAD, servicio:servicio_txt, divisa:divisa_txt, operacion:returnTipoOperacion(result[i].INTOPERACION)});
		}

		registros_dg.dataProvider = data_provider;

		info_txt.text = &quot;Total registros: &quot; + totalRegistros + &quot;\n&quot;;
		for(var j:Number = 0; j &lt; totales_array.length; j++)
		{
		 	var simbolo:String = totales_array[j].simbolo;
		 	if(simbolo == &quot;?&quot;)
		 		simbolo = &quot;€&quot;;
		 	currencyFormatter.currencySymbol = simbolo;
		 	info_txt.text += &quot;\n     --&gt; &quot; + totales_array[j].divisa +  &quot; = &quot; + currencyFormatter.format(totales_array[j].cantidad);
		 }
	}
	else
		info_txt.text = &quot;&quot;;

	CursorManager.removeBusyCursor();
}
</pre>
<p>Del código anterior podemos decir que&#8230; primero verificamos que el resultado obtenido por el servicio sea distinto de nulo (es decir, que no esté vacío) ya que si no nos mostraría error. En la variable totalRegistros almacenamos el número de registros obtenidos mediante la propiedad <strong>length</strong> del arreglo. Recorremos el arreglo result por medio de un ciclo <strong>for</strong> y dentro de este ciclo hacemos las operaciones que requerimos con los valores obtenidos. Observa que para acceder a cada una de las columnas de nuestros registros lo hacemos de la forma result[i].STRNOMBRE, result[i].STRSIMBOLO, result[i].INTNUMDIVISA, etc. donde STRNOMBRE, STRSIMBOLO, &#8230; son los nombres de nuestras columnas en la tabla <strong>tbloperacion</strong> de nuestra base de datos. Dentro del código de nuestro ciclo for estamos sumando (ingreso) o restando (si se trata de gasto) las cantidades pertenecientes a un mismo tipo de moneda; y así mostrar la cantidad ganada o gastada por tipo de moneda.</p>
<div align="center"><img src="http://www.codigometropoli.com/images/screens/sistema_gastos_flex1.jpg" alt="Resultado de las operaciones por moneda" /></div>
<p>Dentro del archivo SistemaGastos.php observarás que el código de la función realizarConsulta es largo y está lleno de condicionales. Esto es porque las consultas las podemos realizar de acuerdo a los siguientes criterios:</p>
<div align="center" style="margin-bottom:10px;"><a href="http://www.codigometropoli.com/images/screens/sistema_gastos_flex_consulta.jpg" target="_blank"><br />
<img src="http://www.codigometropoli.com/images/previews/sistema_gastos_flex_consulta.jpg" alt="Forma de consulta de gastos e ingresos" /></a></div>
<p>Hemos llegado al final de este tutorial, no olvidemos revisar el ejemplo y bajar los archivos fuentes.</p>
<div align="center" style="margin-top:10px"><script type="text/javascript"><!--
      google_ad_client = "pub-5808310808246221";
      /* 250x250, Posts */
      google_ad_slot = "8254875600";
      google_ad_width = 250;
      google_ad_height = 250;
// --></script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></div>
<div align="center" style="margin-top:40px;margin-bottom:40px;">
<table border="0" cellspacing="0" cellpadding="0" width="180">
<tbody>
<tr>
<td valign="top"><a href="http://www.codigometropoli.com/wp-content/uploads/2008/10/SistemaGastos/Sistema_Gastos.html" target="_blank"><img title="Ver Ejempo" src="http://codigometropoli.com/images/ver_ejemplo.png" alt="Ver Ejemplo" /></a></td>
<td valign="top"><a href="http://www.megaupload.com/?d=DM0QBFMO" target="_blank"><img title="Descargar Archivo" src="../images/descargar.png" alt="Descargar Archivo" /></a></td>
</tr>
</tbody>
</table>
</div>

<p><a href="http://feedads.g.doubleclick.net/~a/rK9mfZzQIqsXTD5aIS-swO0fCrQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/rK9mfZzQIqsXTD5aIS-swO0fCrQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rK9mfZzQIqsXTD5aIS-swO0fCrQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/rK9mfZzQIqsXTD5aIS-swO0fCrQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/feedburner/ERTc/~4/PwjkNAQD-Bg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/sistema-de-gastos-en-flex-con-amfphp-y-mysql/feed/</wfw:commentRss>
		<slash:comments>56</slash:comments>
		<feedburner:origLink>http://www.codigometropoli.com/sistema-de-gastos-en-flex-con-amfphp-y-mysql/</feedburner:origLink></item>
	</channel>
</rss>

