Error #1009: Não é possível

Opá galera Flexiana, recorro a vós, não sei o que fazer…

Tô recebendo o seguinte erro

TypeError: Error #1009: N⭠矰oss쵥l acessar uma propriedade ou um m賯do de uma refer魣ia de objeto nula.
	at componentes::cp_registro/resultAtualizarOn()[C:\ZServer\Apache2.2\htdocs\sistemas\SisAnesth1.0\flex\src\componentes\acs\cp_registro.as:23]
	at componentes::cp_registro/___cp_registro_Operation2_result()[C:\ZServer\Apache2.2\htdocs\sistemas\SisAnesth1.0\flex\src\componentes\cp_registro.mxml:15]
	at flash.events::EventDispatcher/dispatchEventFunction()
	at flash.events::EventDispatcher/dispatchEvent()
	at mx.rpc::AbstractOperation/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\rpc\AbstractOperation.as:249]
	at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:318]
	at mx.rpc::Responder/result()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\rpc\Responder.as:56]
	at mx.rpc::AsyncRequest/acknowledge()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:84]
	at NetConnectionMessageResponder/resultHandler()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:552]
	at mx.messaging::MessageResponder/result()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\MessageResponder.as:235]

Já sei exatamente onde ocorre, fiz alguns teste, fui tirando e colocando códigos.
Só estou pegando dois campos [txt_id e txt_dtReg] pra ficar mais curto.

//Meu Remote
<s:RemoteObject id="ro_registro" destination="zend" source="Registro">
	<s:method name="atualizarOn" result="resultAtualizarOn(event)">
		<s:arguments>
			<txt_id>{txt_id.text}</txt_id>//identificador
			<txt_dtReg>{txt_dtReg.text}</txt_dtReg>//data do registro
		</s:arguments>
	</s:method>
</s:RemoteObject>

//o texto do textinput vem de uma datagrid [só qnd clica na datagrid]
<s:TextInput id="txt_dtReg" x="108" y="6" width="96" height="25" text="{dg_registro.selectedItem.dataReg}"/>

//botão que chama a function
<s:Button id="btnAtualizar" y="7" right="190" width="80" height="25" label="Atualizar" click="atualizarOn()" fontSize="13"/>

//a dtagrid que tem um dataProvider
<mx:DataGrid id="dg_registro" left="5" right="5" bottom="5" dataProvider="{arrReg}">
	<mx:columns>
		<mx:DataGridColumn width="30" dataField="id_reg" headerText="Id"/>
		<mx:DataGridColumn width="50" dataField="dataReg" headerText="Data" labelFunction="getDados"/>
	</mx:columns>
</mx:DataGrid>

//parte do AS
[Bindable]
public var arrReg:Object;

public function atualizarOn():void{
	ro_registro.atualizarOn.send();
}
public function resultAtualizarOn(event:ResultEvent):void{
	arrReg = event.result.detalhes;
}

Sempre ao clicar no atualizar ele dá pau, o campo é atualizado no banco, o campo é atualizado na data grid, mas trava e vem o erro.

Alguém poderia me ajudar???

Esse erro ocorre quando você tenta acessar uma propriedade de um objeto nulo. Para contornar por exemplo se esse erro, se estiver ocorrendo ao tentar acessar um objeto TextInput por exemplo, você seta uma variavel que irá receber os dados que forem para aquela text input por exemplo:

//Bindable é necessario para quando atualizar a variavel atualizar também as suas referencias
[Bindable]
private var varTextoCampo1:String = “”;

No mxml coloque assim no sua propriedade de campo de texto

adicione também isso para que quando inserir um novo dado no campo atualizar automaticamente no sua variavel

ai se você quiser atualizar esse campo atualize diretamente sua variavel por exemplo se quiser limpar faça isso

geralmente são criados classes com os campos de registros ficando mais fácil essa implementação

flw!

Vou implementar aki, e te retorno, bom… Bem explicado ficou!

Você também pode tentar chamar seu método ao criar os componentes dessa da tela por exemplo se você tem um MDIWindows pode chamar a propriedade

essa propriedade só é chamado ao criar os objetos da tela!

também é uma alternativa rápida

Mas assim eu já faço, no creationComplete eu chamo a function que carrega o object, assim:

public function iniciar():void{
	ro_registro.buscarAll.send();
}

//no creation
creationComplete="iniciar()"

ainda não tentei fazer o que vc disse acima, assim que eu puder vou tentar

Agora me bateu uma dúvida…
Se eu estiver atualizando os campos[muitos] eu terei que fazer o [Bindable] para todos?

[quote=Ramon.Onix]Mas assim eu já faço, no creationComplete eu chamo a function que carrega o object, assim:

public function iniciar():void{
	ro_registro.buscarAll.send();
}

//no creation
creationComplete="iniciar()"

ainda não tentei fazer o que vc disse acima, assim que eu puder vou tentar
[/quote]

ta o creationComplete é uma propriedade existente em cada componente podendo por exemplor usar no Application ai quando todos os objetos(componentes da tela) forem criados ele irá acionar o código do creationComplete caso o tenha


[quote=Ramon.Onix]Agora me bateu uma dúvida…
Se eu estiver atualizando os campos[muitos] eu terei que fazer o [Bindable] para todos?[/quote]

geralmente a variavel criada é feito através de uma estrutura de classes em action script então geralmente você declara apenas uma variavel do tipo da classe, nessa classe contém as variaveis que você irá usar.

um exemplo de classe em ActionScript seria

package br.com.ivan.bean{ public class Usuario{ //atributos públicos public var id:Number; public var nome:String; public var login:String; public var senha:String; public var email:String; } }

já no código action script da sua tela eu preciso declarar um objeto para essa classe, podendo ficar assim:

[Bindable] private var usuario:Usuario = new Usuario();

no código mxml que contém os campos faço a referencia para cada campo

[code]<mx:TextInput text="{usuario.nome}" id=“tiNome”/>
<mx:TextInput text="{usuario.login}" id=“tiLogin”/>

[/code]

esse aqui também é necessário para cada campo

[code]<mx:Binding source=“tiNome.text” destination=“usuario.nome” />
<mx:Binding source=“tiLogin.text” destination=“usuario.login” />

[/code]

uma das melhores coisas nisso tudo é que quando for salvar você manda apenas seu objeto com todos os dados lá e quando você precisar os campos você declara um novo objeto por exemplo

dá uma estudada em como criar classes em flex e veja suas vantagens e desvantagens!

flw

Cara ainda não entendi direito onde está essa referencia nula…
só ocorre qnd eu clico em atualizar [no php é um update]

public function atualizarOn():void{
	ro_registro.atualizarOn.send();
}

agora, eu fico me perguntando onde está a referencia nula??? eu tenho outro form que tem as mesmas coisas, campos diferentes, mas funciona normal.

desculpa pela minha ignorância, mas ainda não consegui entender.

No seu caso é a onde está apontado no código cp_registro.as na linha 23

nessa linha você deve estar tentando acessar algum objeto cujo instancia é nula você pode usar o debugador da sua ide e definir end-point para verificar o que está ocorrendo!

Então o erro é aki…

public function resultAtualizarOn(event:ResultEvent):void{
	arrReg = event.result.detalhes;//linha q causa o erro.
	limparCampos();
}

mas lá em cima eu já tenho isso:

[Bindable]
public var arrReg:Object;

e no creation complete eu chamo a iniciar()

public function iniciar():void{
	ro_registro.buscarAll.send();//no remote eu chamo o metodo buscarAll do php
}

//result do buscarAll()
public function resultBuscarAll(event:ResultEvent):void{
	arrReg = new Object;
	arrReg = event.result.detalhes;
}

agora não sei como resolver com base no que vc me falou.

Olá,

Linha com o erro:

O seu “result” está retornando nulo. Veja se está tudo OK na sua camada backend, debugue o retorno.

Flw

Reaolvido…
Muito obrigado camaradas…

Fiz o que o marcosFa disse, fui olhar o Back-end [PHP], descobri que a function que deveria retornar o “detalhes” não o estava fazendo era assim

function atualizarOn($campos) {
        new conexao();

$sql = "UPDATE ...";

$rst = mysql_query($sql);

//mudei essa parte
if (mysql_affected_rows() > 0) {
    $dados = new Registro();
    return $dados->buscarAll();
}

deixei assim… e funciona

if (mysql_affected_rows() > 0) {
            $resultado->atualiza = "OK";

            $pos = 0;
            $sql1 = "SELECT * FROM registros";
            $rst1 = mysql_query($sql1);

            while ($reg1 = mysql_fetch_object($rst1)) {
                $resultado->detalhes[$pos] = $reg1;
                $pos++;
            }
        } else {
            $resultado->atualiza = "ERRO";
        }

        return $resultado;
    

Valew, t+