Comunidad de diseño web y desarrollo en internet online

Llenar Combobox desde una base de datos MYSQL con PHP y Flex

Citar            
MensajeEscrito el 06 Ene 2010 06:50 pm
Hola soy nuevo usuario de Flex, he realizado un par de ejemplos de comunicacion entre Flex y PHP con MySQL. He logrado llenar un Combobox desde la base de datos atraves de un XML, pero lo unico que me falta es llenar la propiedad data del combobox, ya que la propiedad label se llena automaticamente cuando en la propiedad dataProvider pongo el valor de event.result.row.Name, pero tambien falta event.result.row.Id para data. por ejemplo:

label=event.result.row.Name
data=event.result.row.Id --->> lo cual seria el value del combobox

Esta es la aplicacion.

Código :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="518" height="396" horizontalAlign="center" applicationComplete="myServiceXML.send()">
   <mx:Script>
      <![CDATA[
          import flash.display.Sprite;
            import flash.xml.XMLDocument;
            import flash.xml.XMLNode;
            import flash.xml.XMLNodeType;
          
          import flash.net.navigateToURL;
          import mx.collections.ArrayCollection;
         import mx.rpc.events.ResultEvent;
         import mx.controls.Alert;
         import mx.collections.*;
         
               
         private function grabar():void
         {
            webservice.send();
         }
         private function cancelar():void
         {
              txtNombre.text = '';
              txtCantidad.text = '';
              txtPrecio.text = '';
              txtPrecioCompra.text = '';
                  
         }
         private function onResult(e:ResultEvent):void
         {
              if(e.result.insertado == true)
                Alert.show("EL REGISTRO SE INSERTO CORRECTAMENTE.", "INFORMACION");
              else
                Alert.show("HA OCURRIDO UN ERROR AL INSERTAR EL REGISTRO.","ERROR");  
         }
         
      [Bindable]
      private var phpFile:String = "genera_combo.php";
        public var datosAC:ArrayCollection; 
      // this function handles the response from our call to the server
      
      public function handleResultXML(event:ResultEvent):void 
      {
         cbxType.dataProvider = event.result.row.Name;    
         }
      
        
         
      ]]>
   </mx:Script>
   
   <mx:HTTPService id="webservice" url="inventario_monedas.php" method="POST" showBusyCursor="true" result="onResult(event)">
     <mx:request xmlns="">
       <tipo>{cbxType.value}</tipo>
       <nombre>{txtNombre.text}</nombre>
       <cantidad>{txtCantidad.text}</cantidad>
       <precio>{txtPrecio.text}</precio>
       <preciocompra>{txtPrecioCompra.text}</preciocompra>
     </mx:request>   
   </mx:HTTPService>
   
   <mx:HTTPService id="myServiceXML" 
      url="{phpFile}" 
      method="POST" result="handleResultXML(event)" useProxy="false" resultFormat="e4x"/>
   
   <mx:Panel x="52" y="54" width="422" height="256" layout="absolute" id="inventory" title="Inventario de Monedas">
      
      <mx:ComboBox x="89" y="28" id="cbxType" width="274" selectedIndex="0" labelField="Name">
       
      </mx:ComboBox>
      
      <mx:Label x="48" y="32" text="Tipo"/>
      <mx:Label x="32" y="58" text="Nombre"/>
      <mx:TextInput x="89" y="55" width="274" id="txtNombre"/>
      <mx:TextInput x="89" y="82" id="txtCantidad"/>
      <mx:TextInput x="89" y="108" id="txtPrecio"/>
      <mx:TextInput x="89" y="134" id="txtPrecioCompra"/>
      <mx:Label x="25" y="86" text="Cantidad"/>
      <mx:Label x="42" y="110" text="Precio"/>
      <mx:Label x="8" y="135" text="Precio Venta"/>
      <mx:Button x="89" y="171" label="Grabar" click="grabar()"/>
      <mx:Button x="159" y="171" label="Cancelar" click="cancelar()"/>
   </mx:Panel>
   <mx:TextArea x="52" y="333" width="422" id="txtResultado"/>
</mx:Application>


Este es el Archivo inventario_monedas.php

Código :

<?php
echo "<?xml version=\"1.0\" ?>\n";
require_once("cmw_connection.php");

if($_POST)
{

  $tipo         = (int)$_POST['tipo'];
  $nombre       = $_POST['nombre'];
  $cantidad     = (float)$_POST['cantidad'];
  $precio       = (float)$_POST['precio'];
  $preciocompra = (float)$_POST['preciocompra'];


  $cn = Connect();

  $sql = "INSERT INTO currency_change.currencystock
        (CompanyId,
        TypeId,
        NAME,
        Amount,
        Price,
        PriceOfBuy
       )
        VALUES
        (5,
        $tipo,
        '$nombre',
        $cantidad,
        $precio,
        $preciocompra )";

   if(executeCommand($cn, $sql))
       $insertado = true;
   else
       $insertado = false;

     if($insertado == true)
       echo "<insertado>true</insertado>";
     else
       echo "<insertado>false</insertado>";
}

?>


Este es el archivo para llenar el Combobox. genera_combo.php

<?php
  require_once("cmw_connection.php");
  $cn = Connect();
  $sql = "select * from currencytype";
  $qry = executeQuery($cn, $sql);

        $dom = new DOMdocument('1.0', 'iso-8859-1');                        
        $dom->formatOutput = false;                                               
        $rows = $dom->appendChild($dom->createElement('rows'));      
        $i = 0;
       while($fila = mysqli_fetch_object($qry))
       {
        $rows->appendChild($row = $dom->createElement('row'));        
        $row->appendChild($dom->createElement('Id', $fila->Id));
        $row->appendChild($dom->createElement('Name', $fila->Name));
       }
        echo $dom->saveXML();                                                       


?>

Les agradeceria por favor que me den una mano con ese detalle.


Gracias.

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Ene 2010 09:12 pm
Para que se seteen ambas propiedades desde el dataprovider deberías tener un ArrayCollection que contenga objetos con propiedades label y data ... intenta usando rows con nodos cuyas propiedades sean label y data y setea a row y no name como dataprovider
Te sugiero que no uses XML para el pasaje de datos, Remoting es lo mejor para información estructurada, pero incluso un cadena separada por comas es mas rápido

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 Ene 2010 09:49 pm
Ya tambien he intentado con cadenas ceparadas por coma, por ejemplo [{label:" x ", data:" y "} , {etc}] enviandolo en el result y tratando de meterlo en un array pero no lo asume como tal. Podirias por favor ser mas explicito con relacion a Remoting?, Que es?.

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Ene 2010 10:09 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 Ene 2010 11:01 pm
lo mas simple extiende tu combobox y usa json

Por xcom

Claber

530 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ene 2010 01:04 am
Como extenderlo, dices crear una clase a partir de ComboBox?

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ene 2010 01:39 am
he hecho una rutina que me retorne un json de la siguiente manera:

{"monedas":
{"fila":[{"data":8, "label":Pesos}]},
{"fila":[{"data":9, "label":Coronas checas}]},
{"fila":[{"data":10, "label":Coronas danesas}]},
{"fila":[{"data":11, "label":Coronas noruegas}]},
{"fila":[{"data":12, "label":Coronas suecas}]},
{"fila":[{"data":13, "label":Dolares australianos}]},
{"fila":[{"data":14, "label":Dolares canadienses}]},
{"fila":[{"data":15, "label":Dolares de Hong Kong}]},
{"fila":[{"data":16, "label":Dolares de Nueva Zelanda}]},
{"fila":[{"data":17, "label":Dolares singapurenses}]},
{"fila":[{"data":18, "label":Euros}]},
{"fila":[{"data":19, "label":Forints hungaros}]},
{"fila":[{"data":20, "label":Francos suizos}]},
{"fila":[{"data":21, "label":Libras esterlinas}]},
{"fila":[{"data":22, "label":Nuevos shequels israelies}]},
{"fila":[{"data":23, "label":Pesos mexicanos}]},
{"fila":[{"data":24, "label":Yenes japoneses}]},
{"fila":[{"data":25, "label":Zlotys polacos}]},
{"fila":[{"data":26, "label":Dolares Estadounidenses}]}
}

Tu crees que si meto ese resultado en un ArrayCollection se interprete en flex como tal?.

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ene 2010 11:42 am
¿Por que JSon y no Remoting?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Ene 2010 12:38 pm
Es que no logro entender, instale amfphp pero no se como hacer la transicion para llenar el combobox, podrias darme un ejemplo de como hacerlo?.

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ene 2010 12:41 pm
Realmente el problema que tengo es recibir un arreglo desde el request hacia Flex, con eso yo resuelvo la idea es meter ese arreglo en un ArrayCollection para llenar el combobox. Pero Flex no recibe el arreglo como tal, lo recibe como un string.

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ene 2010 12:58 pm
Tienes que parsear un string. Si fuera algo así

labels=uno,dos,tres,cuatro&data=1,2,3,4

En el handleResult del HTTPService haría algo así:

Código ActionScript :

function handleResult(res:Object):void{
   var labels:Array = res.labels.split(",");
   var data:Array = res.data.split(",");
   var dp:ArrayCollection = new ArrayCollection()
   for(var i:Number = 0; i<labels.length; i++) dp.addItem({label:labels[i], data:data[i]})
   //quitale el labelField al tag combobox 
   cbxType.dataProvider - dp
}


La ventaja con Remoting es que ya pasas un objeto con la estructura que quieras y no es necesario el parseo, pero hasta que te funcione, esto está bien

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Ene 2010 01:51 pm
Hola, lo mejor para leer de una base de datos con php, es manejarte con AMFPHP , hay varios buenos tutoriales que te pueden ayudar en internet, buscá AMFPHP y PHP, así como envío de mensajes a través de Value Objects y Remote Objects. Es bastante más sencillo de lo que parece al comienzo, y muy ùtil! Saludos!

Por Arteniz

41 de clabLevel



Genero:Masculino  

Programador

firefox
Citar            
MensajeEscrito el 07 Ene 2010 02:08 pm
he aplicado tu idea de esta manera.

public function handleResult(res:Object):void
{
var labels:Array = res.labels.split(",");
var data:Array = res.data.split(",");
var dp:ArrayCollection = new ArrayCollection()
for(var i:Number = 0; i<labels.length; i++)
dp.addItem({label:labels[i], data:data[i]})

cbxType.dataProvider = dp
}

public function handleResultXML(event:ResultEvent):void
{
handleResult(event.result);
}


y me da el siguiente error:

TypeError: Error #1006: value is not a function.

la cadena que le envio desde el request es la siguiente:


labels=Pesos,Coronas checas,Coronas danesas,Coronas noruegas,Coronas suecas,Dolares australianos,Dolares canadienses,Dolares de Hong Kong,Dolares de Nueva Zelanda,Dolares singapurenses,Euros,Forints hungaros,Francos suizos,Libras esterlinas,Nuevos shequels israelies,Pesos mexicanos,Yenes japoneses,Zlotys polacos,Dolares Estadounidenses&data=8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

que podria estar pasando?

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ene 2010 02:26 pm
Aúna las dos funciones en una sola. Si no te dice en que línea da el error, comenta todo y ve descomentando de a una línea para ver que lo genera

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Ene 2010 02:35 pm
Estuve depurando y probando y encontre lo siguiente: el error es provocado por que por ejemplo

var labels:Array = res.labels.split(",");
var data:Array = res.data.split(",");

la llamada res.data o res.labels no la reconoce como propiedades, es decir, el objeto res cuando llamas una de esas propiedades ya sea data o labels no las reconoce como tal. y por eso da un error de tipo. Por consiguiente no hace el split.

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Ene 2010 02:48 pm
Ya he resuelto el problema mira de que forma:

public function handleResult(res:Object):void
{
var cadenas:Array = res.split("&");
var labels:Array = cadenas[0].split(",");
var data:Array = cadenas[1].split(",");
var dp:ArrayCollection = new ArrayCollection()
for(var i:Number = 0; i<labels.length; i++)
dp.addItem({label:labels[i], data:data[i]});

cbxType.dataProvider = dp
}

separé la cadena en dos arreglos y luego generé el arraycollection.


Gracias por tu Ayuda.

Por minetgate

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Feb 2010 01:43 am
hola que tal saben tengo un problema muy parecido podrian echarme la mano para postearlo aqui o talvez abro un tema nuevo?

Por Shadonwk

50 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Feb 2010 05:25 pm
abre un nuevo tema, de lo contrario es muy dificil que lo vean, además podrás poner el título bien explicativo para tu problema en particular

Por Xyrer

628 de clabLevel

1 tutorial

Genero:Masculino  

Android App Development

chrome

 

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