Comunidad de diseño web y desarrollo en internet online

Inicializar aplicación flex con dos fuentes de datos

Citar            
MensajeEscrito el 03 May 2010 11:30 am
Tengo que inicializar una aplicación flex con dos fuentes de datos, una para llenar un combobox y otra para llenar un data grid.

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");
      } 
        }
}

Por fernando6867

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 May 2010 03:40 pm
Idea: llama al segundo método en el onResult del primero, así evitas que se mezclen, en otras palabras, los encadenas

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 May 2010 07:01 pm
muchas gracias por la idea, funcionó la concatenación, pero no se si es muy prolijo, (no se yo, no soy muy experto en esto, es solo una congetura).

Pero se me ocurrio que podia simplificar el problema (para mejorar el entendimiento), y ahora estoy mas desconcertado que antes, lo que sigue es una simplificación que expresa mas o menos lo que tengo que hacer, sin consulta a la base. Lo raro es sin consulta a la base de datos funciona.

Código Flex :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical"
    creationComplete="loadAplicacion();">
   <mx:Script>
      <![CDATA[
         import clases.RemotingConnection;
         import mx.controls.Alert;
         public var gateway : RemotingConnection;
      
      public function loadAplicacion():void{  
                 gateway = new RemotingConnection("http://localhost/amfphp/gateway.php");
                 gateway.call('operaciones.suma', new Responder(onResultSuma, onFault), '2','3');
                 gateway.call('operaciones.resta', new Responder(onResultResta, onFault), '2','3');
      }
           public function onResultSuma(result:int) : void{
         Alert.show("la suma de 2 a 3 es: " + result.toString()); //el resultado se muestra bien
      }
      public function onResultResta(result:int) : void{
         Alert.show("la resta de 2 a 3 es: " + result.toString()); //el resultado se muestra bin
      }                              
      public function onFault( fault : String ) : void{
         Alert.show(fault);
      }      
      ]]>
   </mx:Script>
</mx:Application>


El php que le corresponde:

Código PHP :

<?php
class operaciones{
   function suma($a,$b){
      return intval($a) + intval($b);
   }
   function resta($a,$b){
      return intval($a) - intval($b);
   }
}
?>


Pero ahora lo loco de esto es cuando los metodos php tienen consultas a la base de datos:

Código PHP :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"    creationComplete="loadAplicacion();">
   <mx:Script>
      <![CDATA[
         import clases.RemotingConnection;
         import mx.controls.Alert;
         public var gateway : RemotingConnection;
      
      public function loadAplicacion():void{  
                 gateway = new RemotingConnection("http://localhost/amfphp/gateway.php");
                 gateway.call('Productos.leer', new Responder(onResultProductos, onFault));
                 gateway.call('Descripciones.leer', new Responder(onResultDescripciones, onFault));
      }
           public function onResultProductos(result:Array) : void{
         productos.dataProvider=result; //a este lo trae bien
      }
      public function onResultDescripciones(result:Array) : void{
         descripciones.dataProvider=result; //aca trae a productos, en vez de descripciones
      }                              
      public function onFault( fault : String ) : void{
         Alert.show(fault);
      }      
      ]]>
   </mx:Script>
   
   <mx:DataGrid id="productos">
      <mx:columns>
         <mx:DataGridColumn headerText="CODIGO" dataField="CODIGO"/>
         <mx:DataGridColumn headerText="NOMBRE" dataField="NOMBRE"/>
         <mx:DataGridColumn headerText="PRECIO" dataField="PRECIO"/>
      </mx:columns>
   </mx:DataGrid>
   
   <mx:DataGrid id="descripciones">
      <mx:columns>
         <mx:DataGridColumn headerText="ID" dataField="ID"/>
         <mx:DataGridColumn headerText="DESCRIPCION" dataField="DESCRIPCION"/>
      </mx:columns>
   </mx:DataGrid>   
</mx:Application>


El php para esto resumidamente,
<php>
function leer() {
$sql = "select * from ".TABLA.";";
$query = ibase_query($this->conexion(),$sql);
while($row= ibase_fetch_object($query))
$return[] = $row;
return $return;
}
</php>

TABLA es una constante con el valor PRODUCTOS y para el otro es DESCRIPCIONES.

bueno, no se si se habrá alguna explicación posible a eso?

fernando

Por fernando6867

1 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.