comparar campos com registros ja cadastrados Ola Pessoal.... Preciso de uma ajuda... Como procedo para que no ato de gravar os dados eu possa avaliar se os campos digitados já não pertencem a um registro gravado anteriormente ? Exemplo dos campos: Empresa_ID * Data_Cadastro * Operador_ID * Sequencia Caso já exista algo no banco gravado anteriormente o sistema mostra que já possui um registro..... Caso não tenha sido gra...
MC
comparar campos com registros ja cadastrados  
Ola Pessoal....

Preciso de uma ajuda...
Como procedo para que no ato de gravar os dados eu possa avaliar se os campos digitados já não pertencem a um registro gravado anteriormente ?

Exemplo dos campos:

Empresa_ID *
Data_Cadastro *
Operador_ID *
Sequencia

Caso já exista algo no banco gravado anteriormente o sistema mostra que já possui um registro.....
Caso não tenha sido gravado vem um numero sequencia iniciando do "01"

Estou utilizando Postgres e criei um índice para que talvez pudesse facilitar tal analise....
Como estou iniciando no PHP e Adianti estou tento um pouco de dificuldade....
Caso algum dos amigos tenha uma sugestão, por favor, agradeço..

Att
Marcelo Carvalho

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (7)


MC

Fiz a inclusao //select no metodo onSave


 
  1. <?php
  2. public function onSave( $param )
  3. {
  4. try
  5. {
  6. TTransaction::open('loterica'); // open a transaction
  7. /**
  8. // Enable Debug logger for SQL operations inside the transaction
  9. TTransaction::setLogger(new TLoggerSTD); // standard output
  10. TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  11. **/
  12. $this->form->validate(); // validate form data
  13. $object = new VinculoCxOpTrm; // create an empty object
  14. $data = $this->form->getData(); // get form data as array
  15. $object->fromArray( (array) $data); // load the object with data
  16. $object->store(); // save the object
  17. //select
  18. $result = '';
  19. $sql = "select * from vinculo_cx_op_trm where (id_empresa = {$param['id_empresa']}) and (dt_operacao = '{$param['dt_operacao']}') and (id_caixa = {$param['id_caixa']}) and (id_operador = {$param['id_operador']}) and (id_terminal = {$param['id_terminal']})";
  20. $conn = TConnection::open('loterica'); // abre uma conexão
  21. // executa a instrução SQL
  22. $result = $conn->query($sql);
  23. $resp = $result->fetchObject();
  24. // get the generated id
  25. $data->id = $object->id;
  26. $this->form->setData($data); // fill form data
  27. TTransaction::close(); // close the transaction
  28. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved')); // success message
  29. $this->onReload(); // reload the listing
  30. }
  31. catch (Exception $e) // in case of exception
  32. {
  33. new TMessage('error', $e->getMessage()); // shows the exception error message
  34. $this->form->setData( $this->form->getData() ); // keep form data
  35. TTransaction::rollback(); // undo all pending operations
  36. }
  37. }
  38. ?>


E estou recebendo o erro "Object of class PDOStatement could not be converted to string" Quando comento as linhas $result = $conn->query($sql); $resp = $result->fetchObject(); grava normalmente


NR

Use as classes do Adianti para realizar a consulta:
 
  1. <?php
  2. VinculoCxOpTrm::where('id_empresa','=',$param['id_empresa'])->where('dt_operacao','=',$param['dt_operacao'])->where('id_caixa','=',$param['id_caixa'])->where('id_operador','=',$param['id_operador'])->where('id_terminal','=',$param['id_terminal'])->load();
  3. ?>
MC

Nataniel obrigado

Aquela forma que eu fiz ate não deu mais o erro....
Porem a variável $result eu não consigo saber oque esta apresentando...
Meu intuito é verificar se os campos digitados na tela, já estão gravados em no Banco de Dados...

Não sei se essa forma é a mais indicada....

Essa sua sugestão, devo colocar na classe de modelo do VinculoCxOpTrm ?
Se for isso como devo chama-la ???
NR

Marcelo, pode substituir o sql manual pelo código que passei, dentro da onSave mesmo. A função load retorna um array de objetos, então pode testá-la diretamente:
 
  1. <?php
  2. //onsave
  3. $registros_bd = VinculoCxOpTrm::where('id_empresa','=',$param['id_empresa'])->where('dt_operacao','=',$param['dt_operacao'])->where('id_caixa','=',$param['id_caixa'])->where('id_operador','=',$param['id_operador'])->where('id_terminal','=',$param['id_terminal'])->load();
  4. if ($registros_bd)
  5. {
  6. throw new Exception('Dados repetidos');
  7. }
  8. ?>
MC

Ola Nataniel
Só agora pude testar sua dica...

Exclui todos os registros da tabela, digitei os campos para inclusão, porem no ato da gravação gera a mensagem "Dados Repetidos"...

Ou seja, esta validando, porem não aceita inclusão na base de dados mesmo que não tenha nenhum dado registrado....tabela zerada....

Apenas copiei o seu código e inseri na minha onSave

Tem alguma ideia ?? Sugestão ??

Att
AF

Bom dia Marcelo.

Fiz no model da classe onde precisa verificar dessa forma.

Veja se te ajuda.

public function onAfterStore($object)
{

$this->contas = new Contas($object->id_conta);

if ($this->contas->nome_conta == 'MENS')
{
$criteria = new TCriteria;
$criteria->add(new TFilter('mes_referencia', '=', $object->mes_referencia));
$criteria->add(new TFilter('ano_referencia', '=', $object->ano_referencia));
$criteria->add(new TFilter('id_mensalista', '=', $object->id_mensalista));
$criteria->add(new TFilter('id_conta', '=', $object->id_conta));

$repository = new TRepository('Lancamentos');
$count = $repository->count($criteria);
if ($count > 1)
{
throw new Exception('Já existe mensalidade paga com esse vencimento.');
}
}
}

Atenciosamente,
Ailton Furtado
NR

Marcelo, a verificação está sendo feita após a função store. Ou seja, está verificando após gravar, por isso sempre encontra os dados.