BB
Problemas com SaveComposite
Olá,
estou com o seguinte problema:
Tenho a classe Conta que estende da classe TRecord, e essa conta possui 1 ou várias Parcelas... Logo, nos meus métodos store e load tenho a chamada para os seguintes métodos: saveComposite, loadComposite.
Até aí tudo bem, porém, a tela que insere uma Conta é uma TPage, e a que insere as Parcelas é uma TWindow chamada pela TPage da conta.. Quando eu salvo uma parcela tudo funciona perfeitamente, porém quando já existe uma Parcela, e eu desejo alterar algum dado da Conta, todas as parcelas são excluídas do meu BD.
Verifiquei e isso acontece em outras classes que tem um funcionamento semelhante...
Segue os métodos que salvam as classes:
Salva classe Conta
estou com o seguinte problema:
Tenho a classe Conta que estende da classe TRecord, e essa conta possui 1 ou várias Parcelas... Logo, nos meus métodos store e load tenho a chamada para os seguintes métodos: saveComposite, loadComposite.
Até aí tudo bem, porém, a tela que insere uma Conta é uma TPage, e a que insere as Parcelas é uma TWindow chamada pela TPage da conta.. Quando eu salvo uma parcela tudo funciona perfeitamente, porém quando já existe uma Parcela, e eu desejo alterar algum dado da Conta, todas as parcelas são excluídas do meu BD.
Verifiquei e isso acontece em outras classes que tem um funcionamento semelhante...
Segue os métodos que salvam as classes:
Salva classe Conta
<?phppublic function onSave($param) { try { $dados = $this->form->getData('Conta'); $this->form->validate(); TTransaction::open('conecta'); $dados->store(); $this->form->setData($dados); TTransaction::close(); } catch(Exception $e) { new TMessage('error', $e->getMessage()); TTransaction::rollback(); $this->form->setData($dados); } }?>
Salva Parcelas
<?phppublic function onSave() { try { $this->form->validate(); $dados = $this->form->getData(); TTransaction::open('conecta'); $conta = new Conta($dados->ctp_codigo); $parcela = new Parcela; $parcela->fromArray((array) $dados); $conta->addParcela($parcela); $conta->ctp_saldo = $conta->ctp_saldo - $parcela->prc_valor; if($conta->ctp_saldo <= 0) { $conta->ctp_saldo = 0; $conta->ctp_situacao = "P"; } $conta->store(); TTransaction::close(); self::atualizaFormConta($conta->ctp_saldo); $this->mostraParcelas(["ctp_codigo" => $dados->ctp_codigo]); $this->form->setData($conta); $this->onClear(); } catch(Exception $e) { new TMessage('error', $e->getMessage()); } }?>
Método Store e Load da classe Conta
<?phppublic function store() { if(empty($this->prf_codigo)) { $this->prf_codigo = TSession::getValue("prf_codigo"); } parent::store(); parent::saveComposite('Parcela', 'ctp_codigo', $this->ctp_codigo, $this->parcelas); } public function load($id) { $this->parcelas = parent::loadComposite('Parcela', 'ctp_codigo', $id); $object = parent::load($id); if($object->prf_codigo == TSession::getValue('prf_codigo')) { return $object; } else { return NULL; } }?>
Da uma lida nesse tópico
https://www.adianti.com.br/forum/pt/view_1993?duvida-sobre-o-composicao-manter-i
Obrigada pelo retorno Felipe.
Mas isso não resolveria meu problema, uma vez que pelo que pude observar as minhas parcelas não estão sendo carregadas pra memória...
Em outros lugares do sistema isso tbm acontece ... :/
Consegui resolver mudando o método onSave. Dessa vez carregando para a memória o objeto (new Conta(codigo)) e depois setando os novos valores relativos a conta:
E