Cuando inicia la aplicación debería cargar dos array de objetos con los datos de dos tablas, se me habia ocurrido colocar dos call en loadAplication(), asi cuando la aplicacion ejecute el evento creationComplete llame a loadAplication y esta llame a geteway.call('Productos.leer'... y gateway.call('Descripciones.leer'....
El primero, Productos, sería una tabla para llenar una grilla y Descripciones otra tabla para llenar algunos combobox.
El problema está al iniciar, al ejecuta los dos "call", luego de terminado el evento ejecuta los dos onResult pero siempre le asigna al array descripciones los datos traidos en el primer call, es decir llena los dos array con los datos de PRODUCTOS.
Luego probé, poner en los eventos show, creationComplete de los panels de cada vista, dio el mismo resultado.
La aplicación debajo no está terminada, está compuesta de cuatro vistas, alta y baja funcionan, modificaciones no, y "ver todos" solo es una grilla que muestra todos los productos. En altas, tiene campos para CODIGO, NOMBRE, DESCRIPCION, PRECIO y una imagen. DESCRIPCION es un combobox llenado con valores de la tabla DESCRIPCIONES (traidos con onDescripciones(event);, la imagen es un blob guardado en la tabla Productos.
Estoy usando Flex3,php5,apache2.2,firebird2.0,windowsxp/7,firefox
Esta es mi aplicación web:
Código Flex :
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle"
creationComplete="loadAplicacion()" height="576">
<!--agregar al services: Productos.php, Descripciones.php, y upload_a_temp.php.
crear en services la carpeta: imagenes-->
<mx:ApplicationControlBar dock="true">
<mx:Button label="Alta" click="onMostrarAlta(event);"/>
<mx:Button label="Baja" click="onMostrarBaja(event);"/>
<mx:Button label="Modificacion" click="onMostrarModificacion(event);"/>
<mx:Button label="Ver todos" click="onMostrarProductos(event);" />
</mx:ApplicationControlBar>
<mx:ViewStack id="viewstack1" height="500" width="326">
<mx:Panel>
<mx:Form label="Alta Producto:">
<mx:Label text="Agregando un Producto:"/>
<mx:FormItem label="Código:" width="100%">
<mx:TextInput id="tiCodigoAlta" text="{producto.CODIGO}" />
</mx:FormItem>
<mx:FormItem label="Nombre:" width="100%" >
<mx:TextInput id="tiNombreAlta" text="{producto.NOMBRE}" />
</mx:FormItem>
<mx:FormItem label="Descripción:" width="100%" >
<mx:ComboBox id="cbDescripcionAlta" width="100%"/>
</mx:FormItem>
<mx:FormItem label="Precio:" width="100%" >
<mx:TextInput id="tiPrecioAlta" text="{producto.PRECIO}" />
</mx:FormItem>
</mx:Form>
<mx:VBox>
<mx:Image id="iImagen" width="200" height="200" />
<mx:ControlBar>
<mx:Button id="btAdd" label="Seleccionar Imagen" click="buscar();" />
</mx:ControlBar>
</mx:VBox>
<mx:VBox>
<mx:ControlBar horizontalAlign="center">
<mx:Button label="Agregar" click="onAgregarProducto(event);"/>
<mx:Button label="Limpiar" />
</mx:ControlBar>
</mx:VBox>
</mx:Panel>
<mx:VBox label="Ver todos" verticalAlign="middle" horizontalAlign="center">
<mx:DataGrid id="dgProductos" dataProvider="{productos}">
<mx:columns>
<mx:DataGridColumn headerText="CODIGO" dataField="CODIGO"/>
<mx:DataGridColumn headerText="NOMBRE" dataField="NOMBRE"/>
<mx:DataGridColumn headerText="DESCRIPCION" dataField="DESCRIPCION"/>
</mx:columns>
</mx:DataGrid>
</mx:VBox>
<mx:Panel>
<mx:Form label="Baja Producto:">
<mx:Label text="Dar de baja a un Producto:"/>
<mx:FormItem label="Código:" width="100%">
<mx:TextInput id="tiCodigoBaja" />
<mx:Button label="buscar" click="onProducto(event);" />
</mx:FormItem>
<mx:FormItem label="Nombre:" width="100%" >
<mx:Label id="lbNombreBaja" text="{objeto.NOMBRE as String}" />
</mx:FormItem>
<mx:FormItem label="Descripción:" width="100%" >
<mx:Label id="lbDescripcionBaja" text="{objeto.DESCRIPCION as String}"/>
</mx:FormItem>
<mx:FormItem label="Precio:" width="100%" >
<mx:Label id="lbPrecioBaja" text="{objeto.PRECIO as String}" />
</mx:FormItem>
</mx:Form>
<mx:Image id="IImagenBaja" source="{'http://localhost/amfphp/services/'+objeto.PATH_IMAGEN}"/>
<mx:ControlBar>
<mx:Button label="Eliminar" click="onBorrarProducto(event);" />
</mx:ControlBar>
</mx:Panel>
<mx:Panel label="Modificacion">
<mx:Form>
<mx:FormItem label="Código:">
<mx:TextInput id="itCodigoAlta" text=""/>
<mx:Button label="Buscar"/>
</mx:FormItem>
<mx:FormItem label="Nombre:">
<mx:TextInput id="itNombreAlta" text=""/>
</mx:FormItem>
<mx:FormItem label="Descripcion:">
<mx:TextInput id="itDescripcionAlta" text=""/>
</mx:FormItem>
<mx:FormItem label="Precio:">
<mx:TextInput id="itPrecioAlta" text=""/>
</mx:FormItem>
<mx:FormItem>
<mx:Image id="iModificar" />
<mx:Button />
</mx:FormItem>
</mx:Form>
<mx:ControlBar>
<mx:Button id="btModificar" label="Modificar"/>
</mx:ControlBar>
</mx:Panel>
</mx:ViewStack>
<mx:NumberValidator source="{tiCodigoAlta}" property="text"
invalidCharError="Aquí van números solamente." />
<!--secciones de binding-->
<mx:Binding source="tiCodigoAlta.text" destination="producto.codigo"/>
<mx:Binding source="tiNombreAlta.text" destination="producto.nombre"/>
<mx:Binding source="cbDescripcionAlta.selectedItem.ID" destination="producto.descripcion"/>
<mx:Binding source="tiPrecioAlta.text" destination="producto.precio"/>
<mx:Binding source="{'http://localhost/amfphp/services/'+objeto.PATH_IMAGEN}" destination="IImagenBaja.source"/>
<mx:Object id="producto">
<mx:codigo></mx:codigo>
<mx:name></mx:name>
<mx:descripcion></mx:descripcion>
<mx:precio></mx:precio>
</mx:Object>
<mx:Object id="objeto" />
<mx:Script>
<![CDATA[
import mx.binding.utils.BindingUtils;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import clases.RemotingConnection;
/*variables para mandar producto a la bd*/
[Bindable] public var productos:Array;
// quitar warning public var producto:Object={"codigo":"","nombre":"","descripcion":"","precio":""};
public var gateway : clases.RemotingConnection;
/*variables para llenar el combobox con descripciones*/
[Bindable] public var descripciones:Array;
public var descripcion:Object={"id":"","descripcion":""};
/*variables para mandar la imagen a temp*/
[Bindable] private var imagesFilter:FileFilter = new FileFilter("Images", "*.jpg;*.gif;*.png");
[Bindable] private var photoShop:FileFilter = new FileFilter("Archivos Photoshop", "*.psd");
[Bindable] private var fileref:FileReference = new FileReference();
[Bindable] private var Parametros:URLVariables=new URLVariables;
[Bindable] private var request:URLRequest = new URLRequest();
private var st_path:String;
public function loadAplicacion() : void{
/*inicializando para productos*/
gateway = new RemotingConnection("http://localhost/amfphp/gateway.php");
/*lo necesario para mandar la imagen al...*/
fileref.addEventListener(Event.SELECT, seleccionar);
Parametros.carpeta = "imagenes/";
request.data = Parametros;
}
private function onResultProductos(result: Object) :void {
productos=result as Array;
}
private function onResultDescripciones(result: Object) :void {
descripciones=result as Array;
cbDescripcionAlta.dataProvider=descripciones;
cbDescripcionAlta.labelField="DESCRIPCION";
}
private function onResultAgregarProducto(result: Object) :void {
mx.controls.Alert.show("todo ok");
}
private function onResultProducto(result: Object) :void {
objeto=result;
}
private function onResultBorrar(result: Object) :void {
mx.controls.Alert.show("se borró");
}
//
private function onProductos(event:Event):void{
gateway.call('Productos.leer', new Responder(onResultProductos, gateway.onFaultRc));
gateway.close();
}
private function onDescripciones(event:Event):void{
gateway.call('Descripciones.leer', new Responder(onResultDescripciones, gateway.onFaultRc));
gateway.close();
}
private function onAgregarProducto(event:Event):void{
gateway.call('Productos.agregar', new Responder(onResultAgregarProducto, gateway.onFaultRc),
producto.codigo,producto.nombre,producto.descripcion, st_path, producto.precio);
}
private function onProducto(event:Event):void {
gateway.call('Productos.leer_producto', new Responder(onResultProducto, gateway.onFaultRc),tiCodigoBaja.text);
}
private function onBorrarProducto(event:Event):void{
gateway.call('Productos.borrar', new Responder(onResultBorrar, gateway.onFaultRc),tiCodigoBaja.text);
}
private function onMostrarAlta(event:Event):void{
viewstack1.selectedIndex=0;
}
private function onMostrarBaja(event:Event):void{
viewstack1.selectedIndex=2;
}
private function onMostrarModificacion(event:Event):void{
viewstack1.selectedIndex=3;
}
private function onMostrarProductos(event:Event):void{
viewstack1.selectedIndex=1;
}
//
private function buscar():void { //disparado por btAdd
fileref.browse([imagesFilter,photoShop]);
}
private function seleccionar(event:Event):void { //disparado por buscar al aceptarlo
Parametros.NomFile =fileref.name;
request.method = URLRequestMethod.POST;
request.url = "http://localhost/amfphp/services/upload_a_temp.php";
Parametros.NomFile =fileref.name;
fileref.upload(request);
//ahora muestra la imagen, st_path es relativo a la aplicacion ej: ..httpdoc/practica/imagenes/algo.jpg
st_path=Parametros.carpeta + Parametros.NomFile;
iImagen.source="http://localhost/amfphp/services/"+st_path;
mx.controls.Alert.show("http://localhost/amfphp/services/"+st_path);
}
]]>
</mx:Script>
</mx:Application>
esta es mi clase RemotingConnection:
Código ActionScript :
package clases {
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import mx.controls.Alert;
import mx.utils.ObjectUtil;
import mx.managers.CursorManager;
public class RemotingConnection extends NetConnection {
public function RemotingConnection( sURL:String ) {
objectEncoding = ObjectEncoding.AMF0;
if (sURL) connect( sURL );
}
public function onFaultRc( fault: Object) : void{
CursorManager.removeBusyCursor();
Alert.show( "Error: \n" + ObjectUtil.toString(fault) , "Error en Webservices");
}
}
} 