Comunidad de diseño web y desarrollo en internet online

Importante duda. Intentando separar en capas...

Citar            
MensajeEscrito el 22 Ago 2008 09:34 pm
Hola gente de clab, tengo una Gran duda. Estoy intentado separar mi programación en capas, para simplificarlo pongo codigo.

Nota: hay cosas que aun no encajan porque no lo he terminado, pero me marca algunos errores que no pense que me marcaría.
Básicamente, como puedo separar los DataAccessObject (DAO)? Porque la aplicacion sobre la que me estoy basando (Salesbuilder) maneja todo con {as} ya que trabaja con SQLite, y lo que yo estoy haciendo es migrarlo a SQLServer con .Net del lado del servidor, utilizando como verán.. WebServices.. lo que no logro entender es como hago para hacer por ejemplo un return desde mi clase DAO si tengo que pasar por 3 funciones para poder consumir el webservice.

Ésto es en mi MXML, es una especie de DashBoard donde se muestran las 10 primeras "Empresas" o "Cuentas":

Código Flex :

[Bindable] private var topCuentas:ArrayCollection;
[Bindable] private var cuentas:ArrayCollection;
private var max:Number = 0;

public function loadData():void
{
   var dao:CuentaDAO = new CuentaDAO();
   topCuentas = dao.getCuentas();
   for (var i:int=0 ; i<topAccounts.length ; i++)
   {
      var account:Cuenta = topAccounts.getItemAt(i) as Account;
      var total:Number = cuenta.currentYearResults + cuenta.lastYearResults;
      if (total > max)
      {
         max = total; 
      }
   }
   DataGridBarRenderer.max = max;
   cuentas = dao.getCuentas();
}


Mi clase CuentaDAO:

Código ActionScript :

package com.salesbuilder.dao
{
    import com.salesbuilder.model.Account;
    import mx.collections.ArrayCollection;
    
   //Para llamar a web service desde AS
   import mx.rpc.Fault;   
   import mx.rpc.events.FaultEvent;      
   import mx.rpc.events.ResultEvent;
   import mx.rpc.soap.LoadEvent;
   import mx.rpc.soap.WebService;
   import mx.events.ListEvent;
   
   public class CuentaDAO
   {
      public function CuentaDAO()
      {
         //sqlConnection = SQLConnectionManager.getConnection("salesbuilder");
      }
      
      /*--------------------------------------------*/
      /* WEBSERVICES                          */
      /*--------------------------------------------*/      
      
      
      /* Función: onWSDL()                                               */
      /* Descripción: Guarda el usuario registrado en la DB      */
      /*----------------------------------------------------------------------*/
      
      public var getCuentasTop : WebService = new WebService();
      public function getCuentas():void
      {
         getCuentasTop.wsdl = "http://localhost:3332/net/Cuenta.asmx?WSDL";
         getCuentasTop.addEventListener(LoadEvent.LOAD, onCuentaWSL);
         getCuentasTop.addEventListener(FaultEvent.FAULT, onWebServiceFault);
         getCuentasTop.loadWSDL();
      }
      
      //listener que avisa cuando el WSDL se ha cargado
      private function onCuentaWSL (event:LoadEvent):void
      { 
         getCuentasTop.getCuenta.addEventListener(ResultEvent.RESULT, onGetCuenta);
         getCuentasTop.getCuenta();
      }
      
      [Bindable]
      private var arrCuentas:ArrayCollection
      private function onGetCuenta (event:ResultEvent):void
      {         
         
         arrCuentas=event.result as ArrayCollection;
         var datos:ArrayCollection = new ArrayCollection();

         for (var i:String in arrCuentas) {   
            datos.addItem({data:arrCuentas[i].cuentaId, label:arrCuentas[i].cuenta});
         }
         return datos;

      }
      
      // En caso de que el WebService no puede ser cargado.
      public function onWebServiceFault(event:FaultEvent):void 
      {
         var fault: Fault = event.fault;
         var message:String = "An error occurred. The details are as follows\ncode: " + fault.faultCode;
         message += "\ndetail: " + fault.faultDetail;
         trace("Web Service Error :" + message);
      }
      
   }
}


Aclaro que no quiero que me hagan el codigo, sino que me guien como encarar el problema jeje.

Saludos

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 25 Ago 2008 10:52 pm
Tu problema lo puedes resolver con setters y getters, mira la siguiente clase:

Código ActionScript :

package {
   
   public class example{
      
      private var _cuenta:uint;
      
      public function example():void{
         
         //---Inicializar cuenta
         
         _cuenta = 0;
         
      }
      
      //---Funciones de set y get de cuenta
      
      public function set cuenta(valor:Number):void{
         
         _cuenta = valor;
         
      }
      
      public function get cuenta():Number{         
         
         return _cuenta;
         
      }
      
   }
   
}


Bueno, desde la clase donde yo cree una nueva instancia de "example" puedo asignarle o pedirle que me devuelva el valor de la variable "_cuenta" de esta manera:

Código ActionScript :

var myExample:example = new example();

myExample.cuenta = 100;

trace(myExample.cuenta); //Te devolverá el valor que le hayas asignado en este caso 100

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 26 Ago 2008 02:13 pm
Gracias man :wink:
Ahroa voy cazando como es la cosa.. sin embargo, he estado probando y me da un error, estuve googleando pero no logro saber que me quiere decir ese error.

Código :

Intento de acceso a un método cuentas no accesible mediante una referencia con tipo estático bla bla bla...


Ahora hice ésto en la capa DAO:

Código :

package com.salesbuilder.dao
{
    import mx.collections.ArrayCollection;
    import mx.rpc.Fault;
    import mx.rpc.events.FaultEvent;
    import mx.rpc.events.ResultEvent;
    import mx.rpc.soap.LoadEvent;
    import mx.rpc.soap.WebService;
   
   public class CuentaDAO
   {
      [Bindable]
      private var _datos:ArrayCollection = new ArrayCollection();
      
      public function CuentaDAO()
      {
         //sqlConnection = SQLConnectionManager.getConnection("salesbuilder");
      }
      
      /*--------------------------------------------*/
      /* WEBSERVICES                                */
      /*--------------------------------------------*/      
      
      
      /* Función: onWSDL()                                       */
      /* Descripción: Guarda el usuario registrado en la DB      */
      /*---------------------------------------------------------*/
      
      public var getCuentasTop : WebService = new WebService();
      public function getCuentas():void
      {
         getCuentasTop.wsdl = "http://localhost:3332/net/Cuenta.asmx?WSDL";
         getCuentasTop.addEventListener(LoadEvent.LOAD, onCuentaWSL);
         getCuentasTop.addEventListener(FaultEvent.FAULT, onWebServiceFault);
         getCuentasTop.loadWSDL();
      }
      
      //listener que avisa cuando el WSDL se ha cargado
      public function onCuentaWSL (event:LoadEvent):void
      { 
         getCuentasTop.getCuenta.addEventListener(ResultEvent.RESULT, onGetCuenta);
         getCuentasTop.getCuenta();
      }
      
      [Bindable]
      public var arrCuentas:ArrayCollection
      public function onGetCuenta (event:ResultEvent):ArrayCollection
      {         
         getCuentas();
         arrCuentas=event.result as ArrayCollection;
         var datos:ArrayCollection = new ArrayCollection();

         for (var i:String in arrCuentas) {   
            datos.addItem({data:arrCuentas[i].cuentaId, label:arrCuentas[i].cuenta});
         }
         return datos;         
      }
      

      public function get cuentas():ArrayCollection
      {
         getCuentas();
         return _datos;
      }
      
      // En caso de que el WebService no puede ser cargado.
      public function onWebServiceFault(event:FaultEvent):void 
      {
         var fault: Fault = event.fault;
         var message:String = "An error occurred. The details are as follows\ncode: " + fault.faultCode;
         message += "\ndetail: " + fault.faultDetail;
         trace("Web Service Error :" + message);
      }
      
   }
}


Me suena a que estoy haciendo cagadas ahi.. no?

Aqui es donde tengo que llamar al método (donde me da el error)

Código :

      [Bindable] private var topCuentas:ArrayCollection;

      [Bindable] private var cuentas:ArrayCollection;
      
      private var max:Number = 0;
      
      public function loadData():void
      {
         var dao:CuentaDAO = new CuentaDAO();
         topCuentas = dao.cuentas(); //Acá me da el error
      }


Una vez que haga funcionar eso, creo que la funcion getter tiene que estar en la capa de "modelo" no? Ahi está definido el objeto Cuenta (Cuenta.as), pero ahora mismo tiene sólo las propiedades, sin ningún método.

Gracias por la mano chininet.

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 26 Ago 2008 07:35 pm
Solucionado :D ya funciona, gracias elchininet!!!! De a poco estoy empezando a entender como funciona ésto jeje.

Saludos

Jonathan Griguol

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7

 

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