Bem, último post antes de reformular o código e ganhar juízo. Já perdi tempo
suficiente com isto:

PHP (umVO.php) :

class getOFcilindrosVO
{
    var $num_of;

    var $posicao;

    var $obs1;
    var $obs2;
    var $obs3;

    var $getofcilcores = array();



    var $_explicitType = "vo.getOFcilindrosVO";


Flex (umVO.as);

[RemoteClass(alias="vo.getOFcilindrosVO")]

    [Bindable]
    public class getOFcilindrosVO {

        public var num_of:Number;

        public var obs1:Text;
        public var obs2:Text;
        public var obs3:Text;

        public var posicao:Number;

        public var getofcilcores:ArrayCollection = new ArrayCollection(); //
(*)VER COMENTÁRIO ABAIXO

    }


Do PHP é enviada a estrutura correcta, com Array no getofcilcores, e
preenchido com o segundoVO.

(*) Se no Flex tiver esta var em Array, o event.result entra com Array e
Object, com dados. Basta esta var estar em ArrayCollection e simplesmente os
dados não entram no flex e recebo um TypeError: Error #1034: Falha de
coerção de tipo: não é possível converter [...@31589d99 em
mx.collections.ArrayCollection. Entendo o erro, mas antes de este ser
gerado, podia-me dar a possibilidade de converter o result em
ArrayCollection, ou seja, a conversão é tentada antes de me permitir o que
quer que seja. O que também entendo que seja por usar VOs, mas qual é a
solução à volta disto? Não é possivel usar VOs dentro de VOs? Se usar um VO
fico limitado a algumas estruturas de dados?

Com VO sou obrigado a lidar com o que me é fornecido, já que o Flex não me
deixa tratar as entradas, isto porque não entra nada. Ou tenho o VO igual ao
do PHP, o que limita em estruturas. :-P

Desculpem a insistência no assunto, mas não encontro absolutamente nada que
me ajude na internet, e já li imensos exemplos, mas nenhum com subniveis de
VOs.

Por outro lado, é possivel fazer as conversões de estruturas no construct da
classe do VO? Algo assim:

public class getOFcilindrosVO {

        public var num_of:Number;

        public var obs1:Text;
        public var obs2:Text;

       public function getOFcilindrosVO(entrada:Object):void{

       // conversões e afins aqui, que imagino sejam executadas antes do
result chegar ao flex, ou melhor, antes de me permitir fazer alguma coisa no
command.

}


E chega. Qualquer resposta ou direcção a tomar, agradeço, ou vou converter
os VOs em apenas 1 nivel e criar várias outras estruturas.
Muitissimo obrigado.


MV



2009/4/24 Miguel Vaz <[email protected]>
>
> Isso é precisamente o que já experimentei, mas os dados não são
correctamente atribuidos, ficando o arraycollection a 0. Não entendo mesmo
porquê. Se for array, funciona, já que os dados regressam do php como array,
mas se tentar colocar os dados num arraycollection dessa forma, não
funciona.
>
> Parece-me que vou ter de dividir os dados em estruturas diferentes, todas
de 1 nivel, ao invés do que pretendia fazer, vários niveis de VOs.
>
>
> MV
>
>
>
>
> 2009/4/24 rui <[email protected]>
>>
>> Miguel Vaz escreveu:
>> >
>> > Sim, entendo que o Array não faça dispatch de eventos, e pretendo que
>> > a estrutura seja ArrayCollection, mas o problema é que essa (com
>> > array) é a única forma de conseguir que o flex receba os dados, embora
>> > erradamente, com a estrutura interior não como VO, mas como Object.
>> >
>> > Mesmo fazendo casting do array do result que tem os VOs secundários, o
>> > flex simplesmente ignora os dados, mantendo o arraycollection null.
>> >
>> > Amanhã farei novos testes, mas admito que isto me está a deixar pelos
>> > cabelos. Mais porque acho que estou a entender o processo, e mesmo
>> > assim algo falha.
>> >
>> > MV
>> >
>> >
>> >
>> >
>> > 2009/4/23 Nuno Fernandes <[email protected]
>> > <mailto:[email protected]>>
>> >
>> >
>> >     Podes sim ter VO's dentro de ArrayCollection emq ue o
>> >     ArrayCollection é
>> >     uma propriedade de outro VO, so que o exemplo que deste na classe
>> >
>> >     public var getofcilcores:Array = new Array();
>> >
>> >     o getofcilcores é um Array e não um ArrayCollection, logo não é
>> >     capaz de
>> >     efectuar o dispatch the eventos caso haja alterações.
>> >
>> >     da seguinte forma é capaz de dar menos problemas
>> >
>> >     public var getofcilcores:ArrayCollection = new ArrayCollection ();
>> >
>> >     se tudo estiver correcto não deveras ter problemas a passar a info
do
>> >     PHP para o FLEX e vice-versa
>> >
>> >
>> >     Miguel Vaz escreveu:
>> >     >
>> >     > Já tenho tudo mais ou menos a funcionar, apenas com uma dúvida:
>> >     >
>> >     > E se pretender ter um VO dentro de outro VO? Não da forma como no
>> >     > exemplo do João Fernandes, em que um segundo VO existe dentro do
>> >     > primeiro, mas apenas uma vez, e sim ter, por exemplo, um VO com
uma
>> >     > propriedade que será um arraycollection de outro tipo de VO.
>> >     >
>> >     > Algo assim:
>> >     >
>> >     >
>> >     > package vo
>> >     > {
>> >     >     import com.adobe.cairngorm.vo.IValueObject;
>> >     >
>> >     >     import mx.controls.Text;
>> >     >
>> >     >     [RemoteClass(alias="vo.getOFcilindrosVO")]
>> >     >
>> >     >     [Bindable]
>> >     >     public class getOFcilindrosVO implements IValueObject {
>> >     >
>> >     >         public var num_of:Number;
>> >     >
>> >     >         public var obs1:Text;
>> >     >         public var obs2:Text;
>> >     >         public var obs3:Text;
>> >     >
>> >     >         public var posicao:Number;
>> >     >
>> >     >         public var getofcilcores:Array = new Array(); // aqui
>> >     fica um
>> >     > arraycollection de VOs
>> >     >
>> >     >
>> >     >     }
>> >     > }
>> >     >
>> >     > O getofcilcores é um array que terá um outro VO em cada indice. O
>> >     > problema é que o interior é recriado como Object. Do PHP os dados
>> >     > regressam correctamente, um VO com propriedades e um Array com
>> >     indices
>> >     > como VOs. A transferência é que falha.
>> >     >
>> >     > A questão é se deverei ter uma função dentro do VO para
transferir
>> >     > valor a valor e construir devidamente o getofcilcores como
>> >     > arraycollection de VOs.
>> >     >
>> >     > Confuso? :-)
>> >     >
>> >     > Algo como ter um pessoasVO que tem uma propriedade que é uma
>> >     lista de
>> >     > hoteisVO, por exemplo.
>> >     >
>> >     > De qualquer forma, muito obrigado pelas dicas, foram extremamente
>> >     > esclarecedores, acho que já entendi como posso lidar
>> >     convenientemente
>> >     > com VOs. Apesar de darem algum trabalho, os dados ficam melhor
>> >     > estruturados e com extras acrescidos.
>> >     >
>> >     > MV
>> >     >
>> >     >
>> >     >
>> >     >
>> >     >
>> >     >
>> >     > 2009/4/23 Nuno Fernandes <[email protected]
>> >     <mailto:[email protected]>
>> >     > <mailto:[email protected] <mailto:[email protected]>>>
>> >     >
>> >     >
>> >     >     Pois Miguel o teu problema é estares a usar o
>> >     >     modelo.OFgeral[posicao].propriedade="dados".
>> >     >
>> >     >     O que se passa é que esse tipo de alterações não fazem que o
>> >     >     ArrayCollection faça o dispatch do evento CollectionChange.
>> >     A melhor
>> >     >     forma é mesmo como eu exemplifiquei,
>> >     >
>> >     >      modelo.OFgeral.removeItemAt(posicao)
>> >     >      modelo.OFgeral.addItemAt(posicao,null)
>> >     >     o metodo addItem provoca o dispatch do evento
>> >     CollectionChange e tudo
>> >     >     começa a funcionar.
>> >     >
>> >     >     o que tu chamaas de  "limpar" ou "atribuição"do ponto de
>> >     vista do
>> >     >     ArrayCollection é a mesma coisa, alteração em um item. Eu
>> >     geralmente o
>> >     >     que faço é no VO do FLEX tenho um campo que me indica se o
>> >     item é para
>> >     >     ser usado, visível, ou qualquer outra coisa, e faço a
>> >     alteração a esse
>> >     >     nivel, assim sempre posso ter filterFunctions associadas ao
>> >     >     ArrayCollection e outras coisas mais :D
>> >     >
>> >     >     Abraços
>> >     >
>> >     >     Miguel Vaz escreveu:
>> >     >     >
>> >     >     > No meu modelo eu tenho:
>> >     >     >
>> >     >     > OFgeral:ArrayCollection = new ArrayCollection();
>> >     >     >
>> >     >     > Antes de fazer a chamada à base de dados, tenho uma rotina
que
>> >     >     corre o
>> >     >     > OFgeral à procura de posições disponíveis (que se traduzem
em
>> >     >     janelas
>> >     >     > abertas), onde irá colocar os resultados. Daí existir no
>> >     command
>> >     >     > apenas uma atribuição e não um addItem. O addItem só é
>> >     feito uma
>> >     >     vez,
>> >     >     > antes da chamada à BD, se a posição estiver abtera, caso
>> >     contrário
>> >     >     > apenas limpo os dados nessa posição
>> >     (modelo.OFgeral[posicao]=null) e
>> >     >     > reinsiro o VO.
>> >     >     >
>> >     >     > Os meus binds, como no exemplo do text, são sempre
>> >     >     > {modelo.OFgeral.getItemAt(posicao).propriedade}, para
>> >     atribuições,
>> >     >     > faço modelo.OFgeral[posicao].propriedade="dados".
>> >     >     >
>> >     >     > De qualquer forma, de momento não posso fazer nenhum
>> >     teste, já que
>> >     >     > estou em casa, mas amanhã vou analisar melhor a situação e
>> >     deixo
>> >     >     aqui
>> >     >     > o que encontrar. Vou rever melhor o código e ver se existe
>> >     alguma
>> >     >     > coisa que me está a escapar, já que o projecto começa a
>> >     ganhar uma
>> >     >     > dimensão considerável.
>> >     >     >
>> >     >     > Agradeço imenso o tempo e a paciência que estão todos a
ter.
>> >     >     Aprecio o
>> >     >     > esforço, já que isto dos VOs é mais uma lacuna nos meus
>> >     >     conhecimentos.
>> >     >     > Lacuna de um assunto que considero bastante importante
>> >     para uma
>> >     >     > eficiente gestão/organização de transmissão de dados.
>> >     >     >
>> >     >     > Quem sabe daqui a uns meses vos dou um assunto
>> >     interessante para uma
>> >     >     > eventual apresentação num dos eventos. ;-) O projecto que
>> >     estou a
>> >     >     > desenvolver é algo um pouco à margem do habitual em
>> >     projectos de
>> >     >     flex,
>> >     >     > e poderá ser interessante como case study para mostrar
algumas
>> >     >     > utilizações menos vistas com flex.
>> >     >     >
>> >     >     > MV
>> >     >     >
>> >     >     >
>> >     >     >
>> >     >     >
>> >     >     >
>> >     >     > 2009/4/22 Nuno Fernandes <[email protected]
>> >     <mailto:[email protected]>
>> >     >     <mailto:[email protected] <mailto:[email protected]
>>
>> >     >     > <mailto:[email protected]
>> >     <mailto:[email protected]> <mailto:[email protected]
>> >     <mailto:[email protected]>>>>
>> >     >     >
>> >     >     >
>> >     >     >     Bom tenho que vazar, mas aqui fica a info
>> >     >     >
>> >     >     >       1. o OFgeral _*TEM*_ que ser do tipo ArrayCollection,
se
>> >     >     for um
>> >     >     >          Array, não há bandings
>> >     >     >       2. para "mexeres" num ArrayCollection não usamos a
mesma
>> >     >     técnica do
>> >     >     >          Array [index],  usamos  os metodos
getItemAt(index),
>> >     >     >          addItemAt(index) e removeItemAt(index) por exemplo
>> >     >     >
>> >     >     >     Se o OFgeral for um ArrayCollection nas labels só tens
que
>> >     >     colocar:
>> >     >     >
>> >     >     >     text="{modelo.OFgeral.getItemat(1).num_of}"
>> >     >     >
>> >     >     >     mas na function result isto :
>> >     >     >
>> >     >     >     modelo.OFgeral[posicao]= tempor;
>> >     >     >
>> >     >     >     deve ser substituido por
>> >     >     >
>> >     >     >     modelo.OFgeral.addItemAt(posicao, tempor);
>> >     >     >
>> >     >     >     Mas le a DOC sobre esses métodos, porque no caso do
>> >     >     addItemAt se nesse
>> >     >     >     index já existir algo, esse conteudo passa para o index
a
>> >     >     seguir e
>> >     >     >     assim
>> >     >     >     sucessivamente, se quiseres alterar o conteudo de um
>> >     index no
>> >     >     >     ArrayCollection o que deves fazer é primeiro removes e
>> >     depois
>> >     >     >     adicionas.
>> >     >     >
>> >     >     >     Abraços
>> >     >     >
>> >     >     >
>> >     >     >
>> >     >     > >
>> >     >
>> >     >
>> >     >
>> >     >
>> >     >
>> >     > >
>> >
>> >
>> >
>> >
>> >
>> > >
>> Podes ir a propriedades source do arrayCollection que basicamente é um
>> array normal.
>>
>> logo terias:
>>
>> public var getofcilcores:ArrayCollection = new ArrayCollection ();
>> getofcilcores.source = evt.result as array
>>
>>
>> não sei se era isto que querias...
>>
>> abraço,
>> rui cruz
>>
>>
>>
>> >>
>

--~--~---------~--~----~------------~-------~--~----~
Recebeu esta mensagem porque está inscrito em Grupo "Mailing List da Comunidade 
Portuguesa de Rich Internet Applications - www.riapt.org" do Grupos Google.
 Para enviar mensagens para este grupo, envie um email para 
[email protected]
 Para anular a inscrição neste grupo, envie um email para 
[email protected]
 Para mais opções, visite este grupo em 
http://groups.google.com/group/riapt?hl=pt-PT
-~----------~----~----~----~------~----~------~--~---

Responder a