Comunidad de diseño web y desarrollo en internet online

Problemas con tabla de un solo registro.

Citar            
MensajeEscrito el 23 Jul 2009 04:12 pm
Buenas.

En una aplicación flex pongo un datagrid y el codigo para llenarlo con los datos de una tabla en mysql.
Cuando en la tabla hay solo un registro el datagrid ni aparece. Cuando la tabla tiene mas de un rergistro
todo va bien.

Qué puede ser eso?

Gracias.

Por Krames

25 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Jul 2009 04:49 pm
Seguramente es problema de codigo, cuando menos pon el codigo donde asignas los valores

Por sergestux

49 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Jul 2009 05:11 pm
Aqui está el código:

El mxml

Código :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="inicio()">



   <mx:Script>
      <![CDATA[
         import Clases.Barrio;
         import mx.collections.ArrayCollection;
         import mx.controls.Alert;
         
         [Bindable]
         public var listaBarrios:ArrayCollection;
         
         private function inicio():void{
            var b:Barrio = new Barrio();
            b.padre = this;
            b.obtenerLista();
         }
         
      ]]>
   </mx:Script>
   
   
   <mx:ComboBox x="53" y="64" dataProvider="{listaBarrios}" labelField="nombre">
   </mx:ComboBox>
   <mx:DataGrid x="53" y="107" dataProvider="{listaBarrios}">
      <mx:columns>
         <mx:DataGridColumn headerText="Column 1" dataField="id_barrio"/>
         <mx:DataGridColumn headerText="Column 2" dataField="nombre"/>
      </mx:columns>
   </mx:DataGrid>
   
</mx:Application>



Barrio.as

Código :

package Clases
{
   import mx.collections.ArrayCollection;
   import mx.controls.Alert;
   import mx.rpc.events.FaultEvent;
   import mx.rpc.events.ResultEvent;
   import mx.rpc.http.HTTPService;
   
   public class Barrio
   {
      
      public var id_barrio:int;
      public var nombre:String;
      
      public var padre:Object;
      private var srv:HTTPService;
      
      public function Barrio()
      {
         id_barrio = 0;
         nombre = "";
         srv = new HTTPService();
         srv.useProxy = false;
         srv.method = "POST";
         srv.addEventListener(FaultEvent.FAULT, errorSrv);
      }
      
      public function obtenerLista():void{
         srv.url = "http://localhost/VoyDirecto/lista_barrios.php";
         srv.addEventListener(ResultEvent.RESULT, resLista);
         srv.send();
      }
      
      private function errorSrv(e:FaultEvent):void{
         Alert.show("Ocurrió un error en la petición.", "Error");
      }
      
      
      private function resLista(e:ResultEvent):void{
         if(padre is VoyDirecto){
            padre.listaBarrios = e.result.barrios.barrio as ArrayCollection;
         }
         srv.removeEventListener(ResultEvent.RESULT, resLista);
      }

   }
}




Pero si fuera por el código, por qué funciona bien para mas de un registro en la tabla?


Gracias.

Por Krames

25 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 23 Jul 2009 05:38 pm
El codigo que muestras me parece bien, tendrias que poner tambien el codigo de http://localhost/VoyDirecto/lista_barrios.php simplificado. Haz las pruebas de manera que el script php simule la misma situacion como si le pasaras parametros y solamente te regresara un valor, seguramente tu problema tiene que estar en la condicion de algun ciclo a la hora de asignar valores

Por sergestux

49 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Jul 2009 05:40 pm
Que significa esta evaluacion?:

if(padre is VoyDirecto)

Por sergestux

49 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Jul 2009 09:32 pm
lo mismo que tiene la variaable voydirecto si para validar que hay datos, yo la sacaria simplemente trae los datos si no hay datos
obvio no te va mostrar nada y si hay lo mostrara, por lo pronto que cresta tiene la variable VOYDIRECTO
y supongo que es booleana.

Por xcom

Claber

530 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Jul 2009 06:14 am
Buenas a todos.

Gracias por responder.

Primero que nada, en la clase barrio.as delaro un campo padre:Object.
Este campo va a hacer referencia a la ventana (o componente) que instancie el objeto de tipo barrio.
Por esto es que pongo al crear el bjeto barrio: b.padre = this;

Segundo: VoyDirecto es el nombre de la aplicación (la ventana principal, VoyDirecto.mxml), es por esto que cuando llegan
los datos pregunto si el campo parent es de tipo VoyDirecto para poder entregarle los datos al correspondiente
ArrayCollection en el. Esto es porque la clase barrio va a poder ser instanciada desde otras ventanas.

Tercero: El problema se resume a la asignacion del resultado al ArrayCollection. Obviamente está fallando la asignación
cuando el resultado trae solo un registro. Siendo asi, la pregunta seria:
¿Cómo averiguo si el resultado (e.result) trae solo un registro o si trae varios?
y ¿Cómo se lo asigno como dataprovider al datagrid cuando solo hay un registro?

Gracias otra vez.

Por Krames

25 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Jul 2009 07:24 am
Tal y como dices el problema es cuando igualamos listaBarrios a e.result.barrios.barrio as ArrayCollection;
Personalmente me gusta más, en lugar de realizar una igualación, realizar una COPIA, vamos, algo del estilo de

Código ActionScript :

padre.listaBarrios = new ArrayCollection(e.result.barrios.barrio)
//ó
padre.listaBarrios = new ArrayCollection()
for (var item:Object in e.result.barrios.barrio){
    padre.listaBarrios.addItem(item)


Es que no sé qué te devuelve listabarrios.php, pero supongo que será un STRING o un fichero XML y es ahí donde está el problema

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Jul 2009 04:34 am
Gracias a todos por responder.

Eliseo2, probé el código que me pasaste y no funcionó, de todos modos muchas gracias.

Buscando en la red encontre la solución, aqui la dejo para los que la necesiten:

Código :


if (e.result.courses == null){
               
                   coursesList = new ArrayCollection();
                   
               }else if (e.result.courses.course is ArrayCollection){
                  
                    coursesList = e.result.courses.course;
                    
               }else if (e.result.courses.course is ObjectProxy){
                  
                     coursesList = new ArrayCollection(ArrayUtil.toArray(e.result.courses.course));
                     
               }



Funciona para resultados con cero, uno, o mas registros.

Gracias a todos.

Por Krames

25 de clabLevel



Genero:Masculino  

msie7

 

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