<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Código Metrópoli - Blog de programación &#187; Flex</title>
	<atom:link href="http://www.codigometropoli.com/category/flex/feed/" rel="self" type="application/rss+xml" />
	<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>
		<item>
		<title>Sistema de Gastos en Flex con AMFPHP y MySQL</title>
		<link>http://www.codigometropoli.com/sistema-de-gastos-en-flex-con-amfphp-y-mysql/</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>
]]></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>
		</item>
		<item>
		<title>Componente DataGrid</title>
		<link>http://www.codigometropoli.com/componente-datagrid/</link>
		<comments>http://www.codigometropoli.com/componente-datagrid/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 21:12:26 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Componente]]></category>
		<category><![CDATA[DataGrid]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=248</guid>
		<description><![CDATA[El componente DataGrid nos permite listar información dentro de un control formado por renglones y columnas. Tiene la propiedad de añadir un scrollbar horizontal o vertical en caso de que la información no se muestre completamente dentro de las dimensiones establecidas del DataGrid. Este componente es ideal para mostrar objetos que tienen varias propiedades, por [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flex.png" alt="Flash y PHP" width="93" height="93" />El componente DataGrid nos permite listar información dentro de un control formado por renglones y columnas. Tiene la propiedad de añadir un scrollbar horizontal o vertical en caso de que la información no se muestre completamente dentro de las dimensiones establecidas del DataGrid. Este componente es ideal para mostrar objetos que  tienen varias propiedades, por ejemplo un arreglo que contiene la información obtenida de un query o consulta a una base de datos.</p>
<p><span id="more-248"></span></p>
<p>Este control tiene las siguientes propiedades:</p>
<ul>
<li> Columnas con diferente o igual tamaño</li>
<li>Columnas cuyo tamaño el usuario puede agrandar o disminuir en tiempo de ejecución</li>
<li>Columnas que el usuario puede reordenar en tiempo de ejecución</li>
<li>Las cabeceras de las columnas pueden ser personalizables</li>
<li>Usar un &#8220;Item Renderer&#8221;específico para mostrar datos, que no sean texto, dentro de cualquier columna. Por ejemplo, podemos crear un Item Rendender para mostrar botones, combobox, botones de radio, iconos, etc. dentro de una columna.</li>
<li>Ordenar la información mostrada en el DataGrid de acuerdo al criterio de alguna columna en específico.</li>
</ul>
<p>Si deseas conocer todos los métodos y propiedades que conforman la clase DataGrid, ingresa a la siguiente página y de lado inferior izquierdo, dentro de la lista &#8220;<strong>All Classes</strong>&#8221; busca la clase DataGrid. Esta clase pertenece al paquete <strong>mx.controls</strong>, por lo que también podrías llegar a la información de la clase DataGrid haciendo click en la parte superior izquierda (Packages) en donde dice <strong>mx.controls</strong>.</p>
<p><span style="color: #560e00; text-decoration: underline;"><strong>Tutorial</strong></span></p>
<p>Abre el programa <strong>Flex Builder 3</strong> y crea un nuevo proyecto (Flex Project) con el nombre DataGridControl. No olvides seleccionar la opción &#8220;Web application&#8221; como tipo de aplicación (Application type).<br />
En el panel <strong>Components</strong>, dentro de la sección <strong>Controls</strong>, busca el control <strong>DataGrid </strong>y arrástralo al área de trabajo. Selecciona el <strong>DataGrid </strong>que tienes en el área de trabajo y dentro del panel <strong>Properties </strong>asígnale el ID de <em>productos_dg</em>.</p>
<p>Haz click en el botón <strong>Source </strong>para cambiarte de la vista de diseño a la vista de código. Observarás que el programa creó automáticamente el código del <strong>DataGrid</strong>; este código es similar a:</p>
<pre class="brush: as3;">
&lt;mx:DataGrid x=&quot;204&quot; y=&quot;135&quot; id=&quot;productos_dg&quot;&gt;
	&lt;mx:columns&gt;
		&lt;mx:DataGridColumn headerText=&quot;Column 1&quot; dataField=&quot;col1&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Column 2&quot; dataField=&quot;col2&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Column 3&quot; dataField=&quot;col3&quot;/&gt;
	&lt;/mx:columns&gt;
&lt;/mx:DataGrid&gt;
</pre>
<p>Como podrás darte cuenta, este DataGrid recién creado está formado por tres columnas (cada <strong>DataGridColumn </strong>que se encuentra dentro de los tags <strong>mx:columns</strong>). El encabezado  por default de estas columnas es <em>Column 1</em>, <em>Column 2</em> y <em>Column 3</em>. Agrega una nueva columna y cambiales el nombre por <em>Producto</em>, <em>Precio Unitario</em>, <em>Cantidad </em>y <em>Total</em>. El código quedará de la siguiente forma:</p>
<pre class="brush: as3;">
&lt;mx:DataGrid x=&quot;278.5&quot; y=&quot;46&quot; id=&quot;productos_dg&quot; width=&quot;638&quot; height=&quot;281&quot;&gt;
	&lt;mx:columns&gt;
		&lt;mx:DataGridColumn headerText=&quot;Título DVD&quot; dataField=&quot;titulo&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Protagonistas&quot; dataField=&quot;protagonistas&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Precio&quot; dataField=&quot;precio&quot;/&gt;
&lt;mx:DataGridColumn headerText=&quot;Año&quot; dataField=&quot;fecha&quot;/&gt;
	&lt;/mx:columns&gt;
&lt;/mx:DataGrid&gt;
</pre>
<p>En el código anterior podrás ver que también le cambié el valor de la propiedad <strong>dataField </strong>a cada columna.<br />
La propiedad <strong>dataField </strong>es el nombre del campo o propiedad a la que hace referencia en el arreglo o colección que contiene la información que llenará el <strong>DataGrid</strong>. A este arreglo o colección de datos se le conoce como <em>Data Provider</em> (proveedor de datos o de información).</p>
<p>Existen varias formas de llenar de información el dataProvider. La forma más sencilla y menos dinámica es usando el siguiente código:</p>
<pre class="brush: as3;">
&lt;mx:dataProvider&gt;
    &lt;mx:Object titulo=&quot;Dexter - The complete second season&quot; 		protagonistas=&quot;Michael C. Hall&quot; precio=&quot;24.99&quot; fecha=&quot;2006&quot;/&gt;
    &lt;mx:Object titulo=&quot;The Office - Season Four&quot; 					protagonistas=&quot;Steve Carell&quot; 	precio=&quot;30.99&quot; fecha=&quot;2005&quot; /&gt;
    &lt;mx:Object titulo=&quot;Gilmore Girls - The complete seventh season&quot; protagonistas=&quot;Lauren Graham, Alexis Bledel&quot; precio=&quot;22.99&quot; fecha=&quot;2006&quot; /&gt;
    &lt;mx:Object titulo=&quot;21 Jump Street - The complete first season&quot; 	protagonistas=&quot;Peter DeLuise, Johnny Depp&quot; precio=&quot;21.99&quot; fecha=&quot;1987&quot; /&gt;
    &lt;mx:Object titulo=&quot;Friends - The complete ninth season&quot; 		protagonistas=&quot;Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer&quot; precio=&quot;24.99&quot; fecha=&quot;2002&quot; /&gt;
&lt;/mx:dataProvider&gt;
</pre>
<p>El código anterior deberás colocarlo dentro de los tags &lt;mx:DataGrid&gt;  y &lt;/mx:DataGrid&gt;, ya sea antes del código de las columnas o bien después.</p>
<p>Si corres la aplicación verás la información en el DataGrid similar a la siguiente imagen:</p>
<p style="text-align: center;"><img src="http://www.codigometropoli.com/images/screens/ps14sc1.jpg" alt="" /></p>
<p>De la imagen anterior, podemos ver que automáticamente el ancho de las columnas del DataGrid es el mismo para las cuatro columnas. Para las columnas de <em>Precio </em>y <em>Año </em>es mucho desperdicio de espacio ya que la información de estas columnas es poca. Cambia el código por lo siguiente para ajustar las columnas:</p>
<pre class="brush: as3;">
&lt;mx:columns&gt;
	&lt;mx:DataGridColumn headerText=&quot;Título DVD&quot; dataField=&quot;titulo&quot; width=&quot;250&quot;/&gt;
	&lt;mx:DataGridColumn headerText=&quot;Protagonistas&quot; dataField=&quot;protagonistas&quot;/&gt;
	&lt;mx:DataGridColumn headerText=&quot;Precio&quot; dataField=&quot;precio&quot; width=&quot;50&quot;/&gt;
&lt;mx:DataGridColumn headerText=&quot;Año&quot; dataField=&quot;fecha&quot; width=&quot;50&quot;/&gt;
&lt;/mx:columns&gt;
</pre>
<p>Después de realizar los cambios anteriores, la aplicación se verá igual a la siguiente imagen:</p>
<p style="text-align: center;"><img src="http://www.codigometropoli.com/images/screens/ps14sc2.jpg" alt="" /></p>
<p>Los títulos de los DVDs y los protagonistas se pueden leer mejor, sin embargo la información no se muestra completa. Si le das click en el borde derecho de cada columna (dentro del  área del encabezado) podrás ajustar el ancho de las columnas.</p>
<p>Si haces click sobre el título de la columna Título DVD verás que la información es ordenada alfabéticamente de forma ascendente de acuerdo a los títulos DVD. Si vuelves a hacer click sobre el título de la misma columna la información se mostrará en orden alfabético descendente. Si queremos evitar que una columna se pueda ordenar (en ocasiones esto es necesario cuando usamos ítem renderers en la columna), agrégale la propiedad <strong>sortable </strong>con el valor de <strong>false</strong>:</p>
<pre class="brush: as3;">
&lt;mx:DataGridColumn headerText=&quot;Título DVD&quot; dataField=&quot;titulo&quot; width=&quot;250&quot; sortable=&quot;false&quot;/&gt;
</pre>
<p>Ahora haz click sobre la columna <strong>Precio </strong>y, sin soltarlo, arrastra la columna y ponla en medio de la columna <em>Título DVD</em> y <em>Protagonistas</em>. Las columnas, por default, tienen la opción <strong>draggable </strong>activada, para desactivarlo agrega esta propiedad con el valor de <strong>false</strong>:</p>
<pre class="brush: as3;">
&lt;mx:DataGridColumn headerText=&quot;Precio&quot; dataField=&quot;precio&quot; width=&quot;50&quot; draggable=&quot;false&quot;/&gt;
</pre>
<p>&nbsp;</p>
<p>Otra forma de pasarle la información al DataGrid es creando un arreglo y llenándolo con la información que contendrá el DataGrid. Arrastra otro control DataGrid al área de trabajo y ponle de ID <em>productos2_dg</em>. A este nuevo DataGrid ponle la misma cantidad de columnas y propiedades. El código de este DataGrid quedaría:</p>
<pre class="brush: as3;">
&lt;mx:DataGrid x=&quot;279.5&quot; y=&quot;401&quot; id=&quot;productos2_dg&quot; width=&quot;638&quot; height=&quot;281&quot; creationComplete=&quot;llenaDataGrid()&quot;&gt;

	&lt;mx:columns&gt;
		&lt;mx:DataGridColumn headerText=&quot;Título DVD&quot; dataField=&quot;titulo&quot; width=&quot;250&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Protagonistas&quot; dataField=&quot;protagonistas&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Precio&quot; dataField=&quot;precio&quot; width=&quot;50&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Año&quot; dataField=&quot;fecha&quot; width=&quot;50&quot;/&gt;
	&lt;/mx:columns&gt;

&lt;/mx:DataGrid&gt;
</pre>
<p>Para crear y llenar el arreglo, añade el siguiente código a tu aplicación:</p>
<pre class="brush: as3;">
&lt;mx:Script&gt;
	&lt;![CDATA[
		private var data_provider:Array = new Array();

		private function llenaDataGrid() {
		data_provider.push({titulo:&quot;Dexter - The complete second season&quot;, protagonistas:&quot;Michael C. Hall&quot;, precio:&quot;$24.99&quot;, fecha:&quot;2006&quot;, imagen:&quot;Dexter.jpg&quot;});
		data_provider.push({titulo:&quot;The Office - Season Four&quot;, protagonistas:&quot;Steve Carell&quot;, precio:&quot;$30.99&quot;, fecha:&quot;2005&quot;, imagen:&quot;The_Office.jpg&quot;});
		data_provider.push({titulo:&quot;Gilmore Girls - The complete seventh season&quot;, protagonistas:&quot;Lauren Graham, Alexis Bledel&quot;, precio:&quot;$22.99&quot;, fecha:&quot;2006&quot;, imagen:&quot;Gilmore_Girls.jpg&quot;});
		data_provider.push({titulo:&quot;21 Jump Street - The complete first season&quot;, protagonistas:&quot;Peter DeLuise, Johnny Depp&quot;, precio:&quot;$21.99&quot;, fecha:&quot;1987&quot;, imagen:&quot;21_Jump_Street.jpg&quot;});
		data_provider.push({titulo:&quot;Friends - The complete ninth season&quot;, protagonistas:&quot;Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer&quot;, precio:&quot;$24.99&quot;, fecha:&quot;2002&quot;, imagen:&quot;Friends.jpg&quot;});

		productos2_dg.dataProvider = data_provider;
		}
	]]&gt;
&lt;/mx:Script&gt;
</pre>
<p>A pesar de que en este ejemplo estamos poniendo la información directamente en el código y no lo estamos obteniendo dinámicamente, te puedes dar cuenta que de esta segunda forma podemos obtener la información dinámicamente metiendo el código de <strong>push </strong>dentro de un ciclo <strong>for </strong>que recorra los registros regresados por un query.</p>
<p><img style="float: left;" src="http://codigometropoli.com/images/nota.jpg" alt="Nota" /> Este post es para explicar a grandes rasgos la finalidad y funcionalidad de un <strong>DataGrid</strong>. Este post nos servirá como entrada a una serie de tutoriales que pondré en unos días sobre cómo crear, almacenar y eliminar registro de una base  <strong>SQLite </strong>con <strong>AIR</strong>. Dentro de estos tutoriales usaremos DataGrids para mostrar la información obtenida de la base de datos.</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000;"><strong>Evento ListEvent.CHANGE</strong></span></p>
<p>Este evento es uno de los más importantes cuando se está trabajando con DataGrids. Este evento es disparado cuando un usuario selecciona alguno de los registros del DataGrid. Para ejemplificar  su uso, mostraremos la imagen del DVD que el usuario seleccionó (sí, para eso le agregamos al arreglo data_provider el nombre de la imagen de cada DVD).<br />
Después de la línea productos2_dg.dataProvider = data_provider; agrega las siguientes líneas:</p>
<pre class="brush: as3;">
productos2_dg.addEventListener(ListEvent.CHANGE, muestraImagen);
</pre>
<p>En la línea anterior de código le estamos diciendo al programa que cada vez que el evento CHANGE se ejecute,  llame a la función muestraImagen.<br />
Al finalizar la función <strong>llenaDataGrid</strong>, crea la función <strong>muestraImagen </strong>con el siguiente código:</p>
<pre class="brush: as3;">
private function muestraImagen(event:ListEvent) {
	imagen_dvd.source = &quot;dvds/&quot; + event.target.selectedItem.imagen;
}
</pre>
<p>En este código estamos recibiendo como parámetro un evento de tipo ListEvent. Este parámetro nos permite saber sobre qué registro del DataGrid el usuario hizo click (event.target.selectedItem). Además, estamos obteniendo la propiedad <em>imagen </em>(que nosotros establecimos en el dataProvider) de ese registro (event.target.selectedItem.imagen). Recuerda, que además de la propiedad <em>imagen </em>puedes obtener la propiedad event.target.selectedItem.titulo, event.target.selectedItem.precio, event.target.selectedItem.fecha, etc.  Genial ¿no? De esta forma podríamos pasarle a cada registro su ID en la base de datos para cuando queramos modificarlo o eliminarlo.<br />
Ya que tenemos la propiedad <em>imagen</em>, se lo pasamos a la propiedad source de <em>image_dvd</em>. Pero… ¿qué es imagen_dvd? <em>imagen_dvd</em> es un componente de tipo <strong>Image </strong>el cual nos permite cargar y mostrar imágenes en él. Este componente, al igual que el <strong>DataGrid</strong>,  se encuentra de la sección <strong>Control</strong>.</p>
<p>A continuación te muestro el código de este control. Antes de cerrar el tag Application (&lt;/mx:Application) inserta el siguiente código:</p>
<pre class="brush: as3;">
&lt;mx:Image y=&quot;497&quot; width=&quot;240&quot; height=&quot;240&quot; horizontalCenter=&quot;0&quot; id=&quot;imagen_dvd&quot; themeColor=&quot;#000000&quot;/&gt;
</pre>
<p>Por último nos queda llamar a la función <strong>llenaDataGrid</strong>, esta función la llamaremos cuando el segundo <strong>DataGrid </strong>se haya creado. Para eso usaremos la propiedad <strong>creationComplete</strong>:</p>
<pre class="brush: as3;">
&lt;mx:DataGrid y=&quot;268&quot; id=&quot;productos2_dg&quot; width=&quot;638&quot; height=&quot;188&quot; creationComplete=&quot;llenaDataGrid()&quot; horizontalCenter=&quot;0&quot;&gt;
</pre>
<p>¡Listo! Con las líneas que acabamos de crear estamos insertando un control <strong>Image </strong>para desplegar los JPGs de cada DVD.</p>
<p>¿Te perdiste? No te preocupes, aquí va el código completo de la aplicación.</p>
<pre class="brush: as3;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot;&gt;
	&lt;mx:DataGrid y=&quot;50&quot; id=&quot;productos_dg&quot; width=&quot;638&quot; height=&quot;188&quot; horizontalCenter=&quot;0&quot;&gt;

		&lt;mx:columns&gt;
			&lt;mx:DataGridColumn headerText=&quot;Título DVD&quot; dataField=&quot;titulo&quot; width=&quot;250&quot; sortable=&quot;false&quot;/&gt;
			&lt;mx:DataGridColumn headerText=&quot;Protagonistas&quot; dataField=&quot;protagonistas&quot;/&gt;
			&lt;mx:DataGridColumn headerText=&quot;Precio&quot; dataField=&quot;precio&quot; width=&quot;50&quot; draggable=&quot;false&quot;/&gt;
			&lt;mx:DataGridColumn headerText=&quot;Año&quot; dataField=&quot;fecha&quot; width=&quot;50&quot;/&gt;
		&lt;/mx:columns&gt;

&lt;mx:dataProvider&gt;
    	    &lt;mx:Object titulo=&quot;Dexter - The complete second season&quot; protagonistas=&quot;Michael C. Hall&quot; precio=&quot;$24.99&quot; fecha=&quot;2006&quot; imagen=&quot;Dexter.jpg&quot;/&gt;
    	    &lt;mx:Object titulo=&quot;The Office - Season Four&quot; protagonistas=&quot;Steve Carell&quot; 	precio=&quot;$30.99&quot; fecha=&quot;2005&quot; imagen=&quot;The_Office.jpg&quot; /&gt;
    	    &lt;mx:Object titulo=&quot;Gilmore Girls - The complete seventh season&quot; protagonistas=&quot;Lauren Graham, Alexis Bledel&quot; precio=&quot;$22.99&quot; fecha=&quot;2006&quot; imagen=&quot;Gilmore_Girls.jpg&quot;/&gt;
    	    &lt;mx:Object titulo=&quot;21 Jump Street - The complete first season&quot; protagonistas=&quot;Peter DeLuise, Johnny Depp&quot; precio=&quot;$21.99&quot; fecha=&quot;1987&quot; imagen=&quot;21_Jump_Street.jpg&quot; /&gt;
    	    &lt;mx:Object titulo=&quot;Friends - The complete ninth season&quot; protagonistas=&quot;Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer&quot; precio=&quot;$24.99&quot; fecha=&quot;2002&quot; imagen=&quot;Friends.jpg&quot; /&gt;
	    &lt;/mx:dataProvider&gt;

	&lt;/mx:DataGrid&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.events.ListEvent;
			private var data_provider:Array = new Array();

			private function llenaDataGrid() {
				data_provider.push({titulo:&quot;Dexter - The complete second season&quot;, protagonistas:&quot;Michael C. Hall&quot;, precio:&quot;$24.99&quot;, fecha:&quot;2006&quot;, imagen:&quot;Dexter.jpg&quot;});
				data_provider.push({titulo:&quot;The Office - Season Four&quot;, protagonistas:&quot;Steve Carell&quot;, precio:&quot;$30.99&quot;, fecha:&quot;2005&quot;, imagen:&quot;The_Office.jpg&quot;});
				data_provider.push({titulo:&quot;Gilmore Girls - The complete seventh season&quot;, protagonistas:&quot;Lauren Graham, Alexis Bledel&quot;, precio:&quot;$22.99&quot;, fecha:&quot;2006&quot;, imagen:&quot;Gilmore_Girls.jpg&quot;});
				data_provider.push({titulo:&quot;21 Jump Street - The complete first season&quot;, protagonistas:&quot;Peter DeLuise, Johnny Depp&quot;, precio:&quot;$21.99&quot;, fecha:&quot;1987&quot;, imagen:&quot;21_Jump_Street.jpg&quot;});
				data_provider.push({titulo:&quot;Friends - The complete ninth season&quot;, protagonistas:&quot;Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer&quot;, precio:&quot;$24.99&quot;, fecha:&quot;2002&quot;, imagen:&quot;Friends.jpg&quot;});

				productos2_dg.dataProvider = data_provider;
				productos2_dg.addEventListener(ListEvent.CHANGE, muestraImagen);
			}

			private function muestraImagen(event:ListEvent) {
				imagen_dvd.source = &quot;dvds/&quot; + event.target.selectedItem.imagen;
			}
		]]&gt;
	&lt;/mx:Script&gt;
	&lt;mx:DataGrid y=&quot;268&quot; id=&quot;productos2_dg&quot; width=&quot;638&quot; height=&quot;188&quot; creationComplete=&quot;llenaDataGrid()&quot; horizontalCenter=&quot;0&quot;&gt;

		&lt;mx:columns&gt;
			&lt;mx:DataGridColumn headerText=&quot;Título DVD&quot; dataField=&quot;titulo&quot; width=&quot;250&quot;/&gt;
			&lt;mx:DataGridColumn headerText=&quot;Protagonistas&quot; dataField=&quot;protagonistas&quot;/&gt;
			&lt;mx:DataGridColumn headerText=&quot;Precio&quot; dataField=&quot;precio&quot; width=&quot;50&quot;/&gt;
			&lt;mx:DataGridColumn headerText=&quot;Año&quot; dataField=&quot;fecha&quot; width=&quot;50&quot;/&gt;
		&lt;/mx:columns&gt;

&lt;/mx:DataGrid&gt;
	&lt;mx:Image y=&quot;497&quot; width=&quot;240&quot; height=&quot;240&quot; horizontalCenter=&quot;0&quot; id=&quot;imagen_dvd&quot; themeColor=&quot;#000000&quot;/&gt;
&lt;/mx:Application&gt;
</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 type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<div align="center" style="margin-top:10px;">
<table border="0" cellspacing="0" cellpadding="0" width="180">
<tbody>
<tr>
<td valign="top"><a href="http://www.codigometropoli.com/wp-content/uploads/2008/08/DataGridControl/DataGridControl.html" target="center"><img title="Ver Ejempo" src="http://codigometropoli.com/images/ver_ejemplo.png" alt="Ver Ejemplo" /></a></td>
</tr>
</tbody>
</table>
</div>
<div style="margin-top:40px; margin-bottom:30px;">
<strong>Enlaces recomendados:</strong></p>
<p>» <a href="http://livedocs.adobe.com/flex/3/langref/index.html" target="_blank">Adobe® Flex® 3 Language Reference</a></p>
<p><strong>Entradas relacionadas:</strong></p>
<p>» <a href="http://www.codigometropoli.com/web-services-en-flex/" target="_blank">Web Services en Flex</a><br />
» <a href="http://www.codigometropoli.com/cargar-swf-en-flex/" target="_blank">Cargar SWF en Flex</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/componente-datagrid/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Web Services en Flex</title>
		<link>http://www.codigometropoli.com/web-services-en-flex/</link>
		<comments>http://www.codigometropoli.com/web-services-en-flex/#comments</comments>
		<pubDate>Sat, 07 Jun 2008 02:59:40 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Servicios Web]]></category>
		<category><![CDATA[WebService]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=20</guid>
		<description><![CDATA[De acuerdo a WikiPedia, un Servicio Web es un conjunto de protocolos y estándares que permiten intercambiar datos entre aplicaciones desarrolladas en diferentes lenguajes de programación y ejecutadas sobre cualquier plataforma. Dentro de Flex existe la clase WebService, al cual nos permite acceder a Servicios Web en SOAP. En esta entrada usaremos un servicio web [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flex.png" alt="Flex" width="93" height="93" />De acuerdo a <a href="http://es.wikipedia.org/wiki/Web_Service" target="_blank">WikiPedia</a>, un Servicio Web es un conjunto de protocolos y estándares que permiten intercambiar datos entre aplicaciones desarrolladas en diferentes lenguajes de programación y ejecutadas sobre cualquier plataforma.</p>
<p style="text-align: left;">Dentro de Flex existe la clase WebService, al cual nos permite acceder a Servicios Web en SOAP. En esta entrada usaremos un servicio web que, de acuerdo a nuestra consulta, nos regresa el número teléfonico (lada) internacional (International Dialing code) del país que seleccionemos.</p>
<p><span id="more-20"></span></p>
<p style="text-align: left;">Para este ejercicio usaremos Flex Builder 3 y Flash CS3.</p>
<p style="text-align: left;"><span style="color: #560e00;"><span style="text-decoration: underline;"><strong>Tutorial</strong></span></span></p>
<p style="text-align: left;">1. Abre Flex Builder 3 y crea un nuevo proyecto (En tipo de aplicación selecciona Aplicación Web). Ponle como nombre de proyecto <strong>LadaInternacional</strong>. Haz click en el botón de Finalizar.</p>
<p style="text-align: left;">2. Da click en el botón vista de &lt;em&gt;Diseño&lt;/em&gt; y arrastra los siguientes elementos al área de diseño:</p>
<p style="padding-left: 30px; text-align: left;">- 1 Componente <strong>SWFLoader</strong></p>
<p style="padding-left: 30px; text-align: left;">- 3 Controles <strong>Label</strong> con los siguientes textos: País, Lada y Respuesta</p>
<p style="padding-left: 30px; text-align: left;">- 2 Controles <strong>Label </strong>sin texto; el ID del primero deberá ser pais_lb, y del segundo lada_lb</p>
<p style="padding-left: 30px; text-align: left;">- 1 Control <strong>TextArea</strong> con ID info_txt</p>
<p style="padding-left: 30px; text-align: left;">La distribución deberá ser similar a la siguiente imagen:</p>
<p style="text-align: center;"><a title="Figura 1: Distribución de los controles" href="../images/screens/ps7sc1.png" target="_blank"><img src="../images/previews/ps7sc1.png" alt="Figura 1: Distribución de los controles" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">3. Baja el siguiente archivo SWF y guardalo en la carpeta raíz de tu proyecto (LadaInternacional).</p>
<p>
<object width="300" height="117">
<param name="movie" value="../wp-content/uploads/2008/05/mapa-en-flash.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="300" height="117" src="../wp-content/uploads/2008/05/mapa-en-flash.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<div style="margin-top:30px; margin-bottom:20px;" align="center">
<table border="0" cellspacing="0" cellpadding="0" width="374">
<tbody>
<tr>
<td valign="top"><a href="http://codigometropoli.com/wp-content/uploads/2008/05/mapa-en-flash.swf"><img title="Descargar Archivo SWF" src="../images/descargar.png" alt="Descargar Archivo SWF" /></a></td>
<td valign="top"><a href="http://codigometropoli.com/wp-content/uploads/2008/05/mapa-en-flash.fla"><img title="Descargar Archivo FLA" src="../images/descargar.png" alt="Descargar Archivo FLA" /></a></td>
</tr>
</tbody>
</table>
</div>
<p><img align="absmiddle" src="../images/nota.jpg" alt="Nota" /> La imagen del mapa la bajé de FlashKit en <a href="http://www.flashkit.com/movies/Utilities/Other/World_Ma-Eduardo_-10825/index.php" target="_blank">esta</a> dirección.</p>
<p style="text-align: left;">El archivo de Flash está formado por un mapa y unos botones rojos, los cuales muestra el nombre del país al ponerse encima de ellos (rollOver). Los nombres de instancia de cada uno de estos botones son:</p>
<p style="padding-left: 30px; text-align: left;">- mex_btn: Botón para México</p>
<p style="padding-left: 30px; text-align: left;">- can_btn: Botón para Canadá</p>
<p style="padding-left: 30px; text-align: left;">- usa_btn: Botón para Estados Unidos</p>
<p style="padding-left: 30px; text-align: left;">- arg_btn: Botón para Argentina</p>
<p style="padding-left: 30px; text-align: left;">- bra_btn: Botón para Brasil</p>
<p style="padding-left: 30px; text-align: left;">- esp_btn: Botón para España</p>
<p style="text-align: left;">El código ActionScript que contiene el archivo de Flash es:</p>
<pre class="brush: as3;">
mex_btn.addEventListener(MouseEvent.CLICK, muestraCodigo);
can_btn.addEventListener(MouseEvent.CLICK, muestraCodigo);
usa_btn.addEventListener(MouseEvent.CLICK, muestraCodigo);
arg_btn.addEventListener(MouseEvent.CLICK, muestraCodigo);
bra_btn.addEventListener(MouseEvent.CLICK, muestraCodigo);
esp_btn.addEventListener(MouseEvent.CLICK, muestraCodigo);

function muestraCodigo(evento:MouseEvent):void {
	var pais:String = &quot;&quot;;
	switch(evento.target.name){
		case &quot;mex_btn&quot;:
			pais = &quot;Mexico&quot;;
			break;
		case &quot;can_btn&quot;:
			pais = &quot;Canada&quot;;
			break;
		case &quot;usa_btn&quot;:
			pais = &quot;United States&quot;;
			break;
		case &quot;arg_btn&quot;:
			pais = &quot;Argentina&quot;;
			break;
		case &quot;bra_btn&quot;:
			pais = &quot;Brazil&quot;;
			break;
		case &quot;esp_btn&quot;:
			pais = &quot;Spain&quot;;
			break;
	}
	root.parent.parent['parentApplication'].llamadaServicio(pais);
}
</pre>
<p>El código anterior modifica el valor de la variable <strong>pais</strong> de acuerdo al botón que se hizo click, y se realiza la llamada a la función <strong>llamadaServicio</strong> que se encuentra en nuestra aplicación de Flex.</p>
<p style="text-align: left;">4. Selecciona el <em>SWFLoader</em> y en el panel de propiedades haz click en el botón <em>Browse</em> del lado derecho de <em>Source</em> (Fuente). Selecciona el archivo SWF que acabas de bajar (mapa-en-flash.swf) y haz click en el botón abrir.</p>
<p style="text-align: left;">5. Haz click en el botón de vista <em>Source</em>. Agrega las siguientes líneas de código</p>
<pre class="brush: as3;">
&lt;mx:WebService id=&quot;codigoLada&quot; wsdl=&quot;http://www.webservicex.net/country.asmx?wsdl&quot; fault=&quot;Alert.show(event.fault.faultString);&quot; showBusyCursor=&quot;true&quot;&gt;
		&lt;mx:operation name=&quot;GetISD&quot; result=&quot;callResultHandler(event)&quot; fault=&quot;callFaultHandler(event)&quot;&gt;
			&lt;mx:request&gt;
				&lt;CountryName&gt;{pais}&lt;/CountryName&gt;
			&lt;/mx:request&gt;
		&lt;/mx:operation&gt;
&lt;/mx:WebService&gt;
</pre>
<p>En el código anterior primero creamos el tag WebService y establecemos sus propiedades. En este caso, el servicio web que vamos a usar se encuentra en <a href="http://www.webservicex.net/country.asmx?wsdl">http://www.webservicex.net/country.asmx?wsdl</a>.<br />
La propiedad <strong>fault</strong> nos permite especificar qué acciones se llevarán a cabo cuando se presente un error. En este caso estamos  mostraremos un mensaje de alerta con la información del error.<br />
La propiedad <strong>showBusyCursor</strong> cuando está en true mostrará como cursor un reloj mientras se esté ejecutando el servicio. </p>
<p>Dentro del tag de operación (<em>operation</em>) especifícamos el nombre de la función que usaremos como servicio. En este caso la función u operación se llama <strong>GetISD</strong> y el resultado se usará en la función <em>callResultHandler</em>.</p>
<p>El tag de request nos permite especificar el valor de los párametros que se deben enviar al ejecutar el servicio. En el caso de este Web Service, sólo requeremos enviar un párametro cuyo nombre es <strong>CountryName</strong>. Este parámetro va a tomar el valor de la variable <strong>pais</strong>.</p>
<p><img style="float: left;" src="../images/nota.jpg" alt="Nota" /> El nombre de la función (GetISD) y de los parámetros (CountryName) vienen especificados en el <a href="http://www.webservicex.net/country.asmx?wsdl">descriptor</a> del servicio. Dentro de este archivo se pueden observar las siguientes líneas:</p>
<pre class="brush: xml;">
&lt;s:element name=&quot;GetISD&quot;&gt;
	&lt;s:complexType&gt;
		&lt;s:sequence&gt;
			&lt;s:element minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; name=&quot;CountryName&quot; type=&quot;s:string&quot;/&gt;
		&lt;/s:sequence&gt;
	&lt;/s:complexType&gt;
&lt;/s:element&gt;
</pre>
<p style="text-align: left;">6. Ahora veremos el código necesario para recibir la respuesta del servicio web y hacer uso de los datos recibidos. Añade el siguiente código a tu aplicación de Flex:</p>
<pre class="brush: as3;">
&lt;mx:Script&gt;
	&lt;![CDATA[
		/* Importamos las librerías que requerimos */
		import mx.controls.Alert; /* Para mostrar el mensaje de Alerta si hubo algún error */
		import mx.rpc.events.FaultEvent; /* Necesario para cuando se presente un error en el evento al tratar de ejecutar el servicio */
		import mx.rpc.events.ResultEvent; /* Lo utilizamos para manejar los resultados del evento */

		[Bindable]
		public var pais:String = &quot;&quot;; /* Variable que usaremos como parámetro para la llamada del servicio */

		/* Esta función es llamada desde el archivo de Flash cuando se hace click en alguno de los botones de los países */
		public function llamadaServicio(country:String):void {
			pais = country; /* Recibimos como parámetro el nombre del país de acuerdo al botón al que le hizo click el usuario */
			codigoLada.GetISD.send(); /* Hacemos la llamada al servicio enviando los datos necesarios.
			Observa que la variable país ya estaba ligada al servicio (Línea 4 del último código ActionScript que puse) */
		}

		/* Esta función es llamada cuando hubo un error al tratar de ejecutar el servicio */
		private function callFaultHandler(error:FaultEvent):void {
			/* Mostramos el error en consola, con un mensaje de alerta y en el campo de texto info_txt */
			trace(&quot;Error: &quot; + error.fault.toString());
			Alert.show(error.fault.toString(), &quot;Error&quot;);
			pais_lb.text = error.fault.toString();
		}

		/* Esta función es llamada cuando no hubo error y el servicio web nos regresa la respuesta */
		private function callResultHandler(event:ResultEvent):void {
			// Guardamos en una variable de texto el resultado que trae el evento
			var respuesta:String = event.target.lastResult.toString();
			/* Debido a que el Servicio Web nos regresa un XML, estos datos se los pasamos a una variable de tipo XML */
			var XMLresult:XML = new XML(respuesta);			

			/* Mostramos el resultado en las diversas cajas de texto */
			info_txt.text = XMLresult.Table[0].toXMLString(); /* Mostramos el XML regresado */
			lada_lb.text = XMLresult.Table[0].code.toString(); /* Mostramos el valor del nodo code */
			pais_lb.text = XMLresult.Table[0].name.toString(); /* Mostramos el valor del nodo name */
		}

	]]&gt;
&lt;/mx:Script&gt;
</pre>
<p>Aquí va de nuevo todo el código junto de la aplicación en Flex (LadaInternacional.mxml):</p>
<pre class="brush: as3;">
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot;&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.controls.Alert;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;

			[Bindable]
			public var pais:String = &quot;&quot;;

			public function llamadaServicio(country:String):void {
				pais = country;
				codigoLada.GetISD.send();
			}

			private function callFaultHandler(error:FaultEvent):void {
				trace(&quot;Error: &quot; + error.fault.toString());
				Alert.show(error.fault.toString(), &quot;Error&quot;);
				info_txt.text = error.fault.toString();
			}

			private function callResultHandler(event:ResultEvent):void {
				var respuesta:String = event.target.lastResult.toString();
				var XMLresult:XML = new XML(respuesta);			

				info_txt.text = XMLresult.Table[0].toXMLString();
				lada_lb.text = XMLresult.Table[0].code.toString();
				pais_lb.text = XMLresult.Table[0].name.toString();
			}

		]]&gt;
	&lt;/mx:Script&gt;
	&lt;mx:WebService id=&quot;codigoLada&quot; wsdl=&quot;http://www.webservicex.net/country.asmx?wsdl&quot; fault=&quot;Alert.show(event.fault.faultString);&quot; showBusyCursor=&quot;true&quot;&gt;
		&lt;mx:operation name=&quot;GetISD&quot; result=&quot;callResultHandler(event)&quot; fault=&quot;callFaultHandler(event)&quot;&gt;
			&lt;mx:request&gt;
				&lt;CountryName&gt;{pais}&lt;/CountryName&gt;
			&lt;/mx:request&gt;
		&lt;/mx:operation&gt;
	&lt;/mx:WebService&gt;
	&lt;mx:SWFLoader y=&quot;18&quot; horizontalCenter=&quot;14&quot; source=&quot;../mapa-en-flash.swf&quot;/&gt;
	&lt;mx:Label y=&quot;284&quot; text=&quot;País:&quot; fontWeight=&quot;bold&quot; color=&quot;#F3F7F8&quot; fontSize=&quot;14&quot; horizontalCenter=&quot;-132&quot;/&gt;
	&lt;mx:Label y=&quot;315&quot; text=&quot;Lada:&quot; fontWeight=&quot;bold&quot; color=&quot;#F3F7F8&quot; fontSize=&quot;14&quot; horizontalCenter=&quot;-129&quot;/&gt;
	&lt;mx:Label y=&quot;284&quot; fontWeight=&quot;bold&quot; color=&quot;#77180E&quot; fontSize=&quot;14&quot; width=&quot;129&quot; id=&quot;pais_lb&quot; horizontalCenter=&quot;-24&quot;/&gt;
	&lt;mx:Label y=&quot;315&quot; fontWeight=&quot;bold&quot; color=&quot;#77180E&quot; fontSize=&quot;14&quot; width=&quot;129&quot; id=&quot;lada_lb&quot; horizontalCenter=&quot;-24&quot;/&gt;
	&lt;mx:TextArea y=&quot;356&quot; width=&quot;345&quot; height=&quot;126&quot; id=&quot;info_txt&quot; horizontalCenter=&quot;84&quot;/&gt;
	&lt;mx:Label y=&quot;356&quot; text=&quot;Respuesta:&quot; fontWeight=&quot;bold&quot; color=&quot;#F3F7F8&quot; fontSize=&quot;14&quot; horizontalCenter=&quot;-149&quot; textDecoration=&quot;underline&quot;/&gt;
	&lt;mx:LinkButton click=&quot;navigateToURL(new URLRequest('www.codigometropoli.com'))&quot; label=&quot;www.codigometropoli.com&quot; horizontalCenter=&quot;35&quot; bottom=&quot;50&quot; fontSize=&quot;12&quot; color=&quot;#E1E4E4&quot; themeColor=&quot;#00BAFF&quot;/&gt;

&lt;/mx:Application&gt;
</pre>
<p>Hemos llegado al final del tutorial, no olvides bajar los archivos y visitar la página de ejemplo.</p>
<div align="center"><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 style="margin-top:30px; margin-bottom:20px;" align="center">
<table border="0" cellspacing="0" cellpadding="0" width="374">
<tbody>
<tr>
<td valign="top"><a href="http://codigometropoli.com/wp-content/uploads/2008/05/Flex/LadaInternacional.html" target="center"><img title="Ver Ejempo" src="../images/ver_ejemplo.png" alt="Ver Ejemplo" /></a></td>
<td valign="top"><a href="http://codigometropoli.com/wp-content/uploads/descarga.php?file=2008/05/LadaInternacional.zip"><img title="Descargar Archivo" src="../images/descargar.png" alt="Descargar Archivo" /></a></td>
</tr>
</tbody>
</table>
</div>
<p style="text-align: left;"><strong>Post Relacionados:</strong></p>
<p style="text-align: left;">» <a href="../cargar-swf-en-flex" target="_blank">Cargar SWF en Flex</a></p>
<p style="text-align: left;"><strong>Enlaces recomendados:</strong></p>
<p style="text-align: left;">» <a href="http://es.wikipedia.org/wiki/Web_Service" target="_blank">Servicio Web en WikiPedia</a><br />
» <a href="http://livedocs.adobe.com/flex/3/langref/mx/rpc/soap/mxml/WebService.html" target="_blank">Clase WebService (Adobe® Flex® 3 Language Reference)</a><br />
» <a href="http://livedocs.adobe.com/flex/3/langref/index.html" target="_blank">Adobe® Flex® 3 Language Reference</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/web-services-en-flex/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Cargar SWF en Flex</title>
		<link>http://www.codigometropoli.com/cargar-swf-en-flex/</link>
		<comments>http://www.codigometropoli.com/cargar-swf-en-flex/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 06:58:14 +0000</pubDate>
		<dc:creator>Carla Macías</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[SWFLoader]]></category>

		<guid isPermaLink="false">http://www.codigometropoli.com/?p=19</guid>
		<description><![CDATA[Flex Builder incluye dentro de su librería de componentes el SWFLoader. Este componente nos permite cargar archivos SWF dentro de nuestras aplicaciones en Flex. En esta entrada además de aprender a usarlo verás cómo llamar una función dentro de Flex desde el SWF. Para este ejercicio usaremos Flex Builder 3, que puedes bajarlo de aquí. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://codigometropoli.com/images/flex.png" alt="Flex" width="93" height="93" />Flex Builder incluye dentro de su librería de componentes el <em>SWFLoader</em>. Este componente nos permite cargar archivos SWF dentro de nuestras aplicaciones en Flex. En esta entrada además de aprender a usarlo verás cómo llamar una función dentro de Flex desde el SWF.</p>
<p><span id="more-19"></span></p>
<p>Para este ejercicio usaremos Flex Builder 3, que puedes bajarlo de <a href="https://www.adobe.com/cfusion/tdrc/index.cfm?product=flex" target="_blank">aquí</a>.</p>
<p><span style="color: #560e00;"><span style="text-decoration: underline;"><strong>Tutorial</strong></span></span></p>
<p>1. Abre Flex Builder 3 y crea un nuevo proyecto (En tipo de aplicación selecciona Aplicación Web). Ponle como nombre de proyecto <strong>FLEXSwfLoader</strong>. Haz click en el botón de Finalizar.</p>
<p>2. Da click en el botón vista de <em>Diseño</em> y arrastra una etiqueta o <em>Label</em> al área de diseño. Asígnale las siguientes propiedades al botón:</p>
<p style="padding-left: 30px;">- Width: 200 pixeles de ancho<br />
- Color de fuente: Blanco #FFFFFF<br />
- Bold / Verdana / 12px<br />
- ID: resultado<br />
- Borra el texto de la etiqueta</p>
<p style="text-align: center;"><a title="Figura 1: Estableciendo las propiedades del Label" href="../images/screens/ps6sc1.png" target="_blank"><img src="../images/previews/ps6sc1.png" alt="Figura 1: Estableciendo las propiedades del Label" /></a></p>
<p style="text-align: left;">2.  Busca el componente <em>SWFLoader</em> dentro de la lista de <em>Controles</em> del panel <em>Componentes</em>. Arrastra el componente al área de Diseño.</p>
<p>3. Baja el siguiente archivo SWF (ActionScript 3.0) y guardalo en la carpeta raíz de tu proyecto (en este caso deberá ir en la carpeta <strong>FLEXSwfLoader</strong>). Este archivo lo cargaremos en nuestra aplicación de Flex:</p>
<div>
<object width="150" height="150">
<param name="movie" value="../wp-content/uploads/2008/05/flash-in-flex.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="150" height="150" src="../wp-content/uploads/2008/05/flash-in-flex.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</div>
<div style="margin-top:30px; margin-bottom:20px;" align="center">
<table border="0" cellspacing="0" cellpadding="0" width="374">
<tbody>
<tr>
<td valign="top"><a href="http://www.megaupload.com/?d=IFXJL873" target="_blank"><img title="Descargar Archivo SWF" src="../images/descargar.png" alt="Descargar Archivo SWF" /></a></td>
<td valign="top"><a href="http://www.megaupload.com/?d=T55WYGGB" target="_blank"><img title="Descargar Archivo FLA" src="../images/descargar.png" alt="Descargar Archivo FLA" /></a></td>
</tr>
</tbody>
</table>
</div>
<p>En el archivo Flash tenemos un campo de introducción de texto cuyo nombre de instancia es <strong>texto_txt</strong>; el texto que introduzcamos aquí se mostrará en la etiqueta (Label) <strong>resultado</strong> en Flex. Debajo de este campo está el botón &#8220;<em>Pasar valor a Flex</em>&#8221; con nombre de instancia <strong>pasar_txt</strong>; este botón se encargará de modificar el valor de la variable <strong>mensaje</strong>, la cual se mostrará en la etiqueta <strong>resultado</strong>. Por último hay un botón con &#8220;<em>Llamar función</em>&#8221; como letrero y nombre de instancia <strong>llamar_txt</strong>; este botón mostrará un mensaje de alerta de Flex.</p>
<p>El código del archivo de Flash es el siguiente:</p>
<pre class="brush: as3;">
pasar_btn.addEventListener(MouseEvent.CLICK, pasar_valor);
llamar_btn.addEventListener(MouseEvent.CLICK, llamar_funcion);

function pasar_valor(evento:MouseEvent):void {
     root.parent.parent['parentApplication']['mensaje'] = texto_txt.text; /* En nuestra aplicación de Flex tendremos definida la variable mensaje. Aquí le estamos modificando su valor de acuerdo al texto introducido por el usuario */
}

function llamar_funcion(evento:MouseEvent):void {
     root.parent.parent['parentApplication'].muestraAlert(); /* En nuestra aplicación de Flex tendremos una función llamada muestraAlert, la cual mostrará un mensaje de Alerta en Flex */
}
</pre>
<p>4. Selecciona el <em>SWFLoader</em> y en el panel de propiedades haz click en el botón <em>Browse</em> del lado derecho de <em>Source</em> (Fuente). Selecciona el archivo SWF que acabas de bajar (flash-in-flex.swf) y haz click en el botón abrir.</p>
<p>5. Cámbiate a la vista de Código (Source) y agrega las siguientes líneas de código:</p>
<pre class="brush: as3;">
&lt;mx:Script&gt;
	&lt;![CDATA[
		import mx.controls.Alert; /* Importamos la librería para mostrar el mensaje de Alerta */

		[Bindable]
		public var mensaje:String = &quot;&quot;; /* Variable que modificaremos por medio del SWF. OJO: La variable debe ser pública */

		public function muestraAlert():void { /* Esta función la llamaremos desde el SWF */
			Alert.show(&quot;Mensaje de Alerta en Flex&quot;); /* Muestra el mensaje de Alerta */
		}
	]]&gt;
&lt;/mx:Script&gt;
</pre>
<p>Además, asígnale al tag del Label la siguiente propiedad de texto:</p>
<pre class="brush: as3;">&lt;mx:Label text=&quot;{mensaje}&quot; ... </pre>
<p>Eso es todo lo que tienes que hacer para llamar a la aplicación de Flex desde el SWF embebido.</p>
<div align="center" style="margin-top:20px;"><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 style="margin-top:30px; margin-bottom:20px;" align="center">
<table border="0" cellspacing="0" cellpadding="0" width="374">
<tbody>
<tr>
<td valign="top"><a href="http://codigometropoli.com/wp-content/uploads/2008/05/Flex/FLEXSwfLoader.html" target="center"><img title="Ver Ejempo" src="../images/ver_ejemplo.png" alt="Ver Ejemplo" /></a></td>
<td valign="top"><a href="http://www.megaupload.com/?d=V2RUDOHG" target="_blank"><img title="Descargar Archivo" src="../images/descargar.png" alt="Descargar Archivo" /></a></td>
</tr>
</tbody>
</table>
</div>
<p><strong>Enlaces recomendados:</strong></p>
<p>» <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=controls_15.html" target="_blank">SWFLoader Control<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigometropoli.com/cargar-swf-en-flex/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

