Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Conectar em outra tabela no evento onSave Estou cadastrando um contrato e inserindo os dados da quadra, lote e conjunto quero antes de gravar verificar se a quadra, lote e conjunto são válidos. Preciso buscar os dados em outra tabela. Poderiam me ajudar. :( /** * method onSave() * Executed whenever the user clicks at the save button */ function onSave() { try { TTransacti...
MG
Conectar em outra tabela no evento onSave  
Fechado
Estou cadastrando um contrato e inserindo os dados da quadra, lote e conjunto quero antes de gravar verificar se a quadra, lote e conjunto são válidos. Preciso buscar os dados em outra tabela. Poderiam me ajudar. :(

/**
* method onSave()
* Executed whenever the user clicks at the save button
*/
function onSave()
{
try
{
TTransaction::open('conexao'); // open a transaction

// get the form data into an active record Contrato
$object = $this->form->getData('Contrato');
$conn = TTransaction::get(); // get PDO connection

// run query
$result = $conn->query('SELECT NUQUADRA, NULOTE, CODCONJUNTO, NUCONTRATO FROM imovel WHERE CODCONJUNTO='.$object->CODCONJUNTO.' AND NUQUADRA='.$object->NUQUADRA.' AND NULOTE='.$object->NULOTE);
$row = mysql_fetch_assoc($result);

if (empty( $result )) {
new TMessage('info','Quadra e Lote não existe');
break;
}
else
{
if ($row['NUCONTRATO']!='') {
new TMessage('info','Quadra e Lote já foi vendido');
break;
}
}


$this->form->validate(); // form validation
$object->store(); // stores the object
$this->form->setData($object); // keep form data
TTransaction::close(); // close the transaction

// shows the success message
new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
}
catch (Exception $e) // in case of exception
{
new TMessage('error', 'Error ' . $e->getMessage()); // shows the exception error message
$this->form->setData( $this->form->getData() ); // keep form data
TTransaction::rollback(); // undo all pending operations
}
}

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (6)


MG

Maria
Você poderia criar um método que pudesse fazer isso para você.
E no onSave você chama o método e dependendo do retorno, você insere ou não.
Outro recurso é transformar um dos atributos em "unique" se violado isso o banco retornarei uma exception.
A mais indicada seria uma coluna "unique", onde na mesma transação você poderia lidar com isso.....
Bem, veja qual a melhor estratégia a ser aplicada.
MG

Oi Marcelo, você teria algum exemplo prático onde você faz isso?
MG

Oi

Qual a estratégia?

Se for definir "unique" é simples, basta você escolher as colunas no BD no qual deve ser único e no try ... catch().... você terá o erro ao incluir o dado duplicado.

Aí é só pegar a exception do BD e dar uma mensagem mais amigável ao usuário.

Se for por um método, basta criar um Model mapeando a tabela. Dentro deste model você cria um método estático que receberá o parâmetro que não deve ser duplicado, você faz um acesso com este modelo e com TFilter, você pesquisa neste banco.

O método deve retornar true/false. True = caso o dado já exista, e false não.

Aí no onSave antes de chamar "store()" do objeto, você chama esta função, retornando true, vc dá mensagem personalizada, se for false, você faz o "store" normalmente.

A estratégia vai definir o que você fará na prática.

A mais simples e deixa complexidade para o banco é definir a coluna como unique.

Mas a escolha deve ser do desenvolvedor.

Espero ter ajudado!
MG

Marcelo, agradeço pela informação consegui fazer, criei um get_imovel no Record e no evento onSave Instanciei o Record passei os parametros e comparei com o registro que estou gravando com o registro do get_imovel e deu certo. :)

$imovel = new Imovel($object->CODCONJUNTO, $object->NUQUADRA, $object->NULOTE); // reads the product
if (($imovel->CODCONJUNTO=$object->CODCONJUNTO) && ($imovel->NUQUADRA=$object->NUQUADRA) && ($imovel->NULOTE=$object->NULOTE))
{
new TMessage('error','Este Lote já foi cadastrado');
$this->form->setData($object); // keep form data
}

public function get_imovel()
{
$criteria = new TCriteria;
$criteria->add(new TFilter('CODCONJUNTO', '=', $this->CODCONJUNTO));
$criteria->add(new TFilter('NUQUADRA', '=', $this->NUQUADRA));
$criteria->add(new TFilter('NULOTE', '=', $this->NULOTE));
return Pessoa::getObjects( $criteria );
}
MG

Puxa, bacana.
Legal que deu certo.
Estamos aqui para ajudar e agradeço o feedback.
Abraços
PD

Maria,

1) Evite usar SQL à mão livre, procure usar a TRepository sempre que possível:
www.adianti.com.br/doc-framework-Persistence-Collections-CollectionL

2) Sempre que precisar de uma consulta, tente criar um método na model para encapsular e poder reaprovietar;

3) Evita usar funções nativas como mysql_fetch_assoc, se precisar escrever SQL manual, use:
www.adianti.com.br/doc-framework-Persistence-Setup-SetupTransaction

Att,
Pablo