Beispiel #1
0
//----------------------------------------------------------
void GatilhoWidget::aplicarConfiguracao(void)
{
 try
 {
  Gatilho *gatilho=NULL;
  unsigned i, qtd;
  Coluna *coluna=NULL;

  iniciarConfiguracao<Gatilho>();

  //Obtém a referência ao gatilho que está sendo criado/editado
  gatilho=dynamic_cast<Gatilho *>(this->objeto);

  //Configura no gatilhos todos os atributos preenchidos no formulário
  gatilho->definirTipoDisparo(TipoDisparo(tipo_disparo_cmb->currentText()));
  gatilho->executarPorLinha(exec_por_linha_chk->isChecked());
  gatilho->definirPostergavel(postergavel_chk->isChecked());
  gatilho->definirTipoPostergacao(TipoPostergacao(tipo_postergacao_cmb->currentText()));
  gatilho->definirCondicao(exp_condicional_txt->toPlainText());
  gatilho->definirFuncao(dynamic_cast<Funcao *>(sel_funcao->obterObjeto()));
  gatilho->definirTabReferenciada(dynamic_cast<Tabela *>(sel_tabela_ref->obterObjeto()));
  gatilho->definirEvento(TipoEvento::on_insert, insert_chk->isChecked());
  gatilho->definirEvento(TipoEvento::on_update, update_chk->isChecked());
  gatilho->definirEvento(TipoEvento::on_delete, delete_chk->isChecked());
  gatilho->definirEvento(TipoEvento::on_truncate, truncate_chk->isChecked());

  /* Remove todas as colunas e argumentos para inserir aqueles
     configurados no formulário */
  gatilho->removerArgumentos();
  gatilho->removerColunas();

  //Adiciona os argumentos
  qtd=tab_argumentos->obterNumLinhas();
  for(i=0; i < qtd; i++)
   gatilho->adicionarArgumento(tab_argumentos->obterTextoCelula(i, 0));

  //Adiciona as colunas
  qtd=tab_colunas->obterNumLinhas();
  for(i=0; i < qtd; i++)
  {
   coluna=reinterpret_cast<Coluna *>(tab_colunas->obterDadoLinha(i).value<void *>());
   gatilho->adicionarColuna(coluna);
  }

  //Aplica as configurações básicas
  ObjetoBaseWidget::aplicarConfiguracao();
  finalizarConfiguracao();
 }
 catch(Excecao &e)
 {
  /* Cancela a configuração o objeto removendo a ultima operação adicionada
     referente ao objeto editado/criado e desaloca o objeto
     caso o mesmo seja novo */
  cancelarConfiguracao();
  throw Excecao(e.obterMensagemErro(),e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
 }
}
//----------------------------------------------------------
void RelacionamentoWidget::aplicarConfiguracao(void)
{
 try
 {
  Relacionamento *relacao=NULL;
  unsigned tipo_rel, qtd, i;
  vector<unsigned> id_cols;

  /* Devido a complexidade da classe Relacionamento e a forte ligação entre todos os
     relacinamentos do modelo, é necessário armazenar o XML dos objetos especiais e
     desconectar TODOS os relacionamentos, executar a modificação no
     relacionamento e logo após revalidar todos os demais */
  modelo->obterXMLObjetosEspeciais();
  modelo->desconectarRelacionamentos();

  if(!this->novo_obj)
  {
   //Adiciona o relacionamento à lista de operações antes de ser modificado
   lista_op->adicionarObjeto(this->objeto, Operacao::OBJETO_MODIFICADO);
  }

  //Aplica as configurações básicas
  ObjetoBaseWidget::aplicarConfiguracao();

  //Caso o objeto seja um relacionamento tabela-tabela
  if(this->objeto->obterTipoObjeto()==OBJETO_RELACAO)
  {
   //Obtém a referência ao mesmo fazendo o cast correto
   relacao=dynamic_cast<Relacionamento *>(this->objeto);
   tipo_rel=relacao->obterTipoRelacionamento();
   relacao->blockSignals(true);

   /* Atribui os valores configurados no formulário ao relacionamento.
      Alguns campos são atribuído ao objeto somente para um tipo específico
      de relacionamento */
   relacao->definirSufixoTabela(RelacionamentoBase::TABELA_ORIGEM, sufixo_orig_edt->text());
   relacao->definirSufixoTabela(RelacionamentoBase::TABELA_DESTINO, sufixo_dest_edt->text());
   relacao->definirSufixoAutomatico(sufixo_auto_chk->isChecked());

   relacao->definirTabelaObrigatoria(RelacionamentoBase::TABELA_ORIGEM, false);
   relacao->definirTabelaObrigatoria(RelacionamentoBase::TABELA_DESTINO, false);

   if(tab_orig_obrig_chk->isEnabled())
    relacao->definirTabelaObrigatoria(RelacionamentoBase::TABELA_ORIGEM, tab_orig_obrig_chk->isChecked());

   if(tab_dest_obrig_chk->isEnabled())
    relacao->definirTabelaObrigatoria(RelacionamentoBase::TABELA_DESTINO, tab_dest_obrig_chk->isChecked());

   if(tipo_rel==RelacionamentoBase::RELACIONAMENTO_GEN ||
      tipo_rel==RelacionamentoBase::RELACIONAMENTO_DEP)
   {
    //Obtém os ids das colunas selecionadas como participantes da chave primária especial
    qtd=coluna_rel_lst->count();
    for(i=0; i < qtd; i++)
    {
     //Caso o item na lista esteja selecionado seu id é armazenado no vetor de ids
     if(coluna_rel_lst->item(i)->checkState()==Qt::Checked)
      id_cols.push_back(i);
    }

    //Atribui o vetor de ids configurado acima como sendo os ids das colunas da chave primária especial
    relacao->definirColsChavePrimariaEspecial(id_cols);
   }
   //Campos específicos para relacionamentos 1-n e 1-1
   else if(tipo_rel==RelacionamentoBase::RELACIONAMENTO_1N ||
      tipo_rel==RelacionamentoBase::RELACIONAMENTO_11)
   {
    relacao->definirIdentificador(identificador_chk->isChecked());
    relacao->definirPostergavel(postergavel_chk->isChecked());
    relacao->definirTipoPostergacao(TipoPostergacao(tipo_postergacao_cmb->currentText()));
   }
   //Campos específicos para relacionamentos n-n
   else if(tipo_rel==RelacionamentoBase::RELACIONAMENTO_NN)
    relacao->definirNomeTabelaRelNN(nome_tab_relnn_edt->text());

   try
   {
    /* Caso o relacinamento seja de dependência, generalização ou
       identificador verifica se existe redundância de relacionamentos */
    if(tipo_rel==RelacionamentoBase::RELACIONAMENTO_DEP ||
       tipo_rel==RelacionamentoBase::RELACIONAMENTO_GEN ||
       relacao->relacionamentoIdentificador())
     modelo->verificarRedundanciaRelacoes(relacao);

    /* Faz a validação dos relacionamentos para refletir a nova configuração
       do relacionamento */
    modelo->validarRelacionamentos();
    relacao->blockSignals(false);
    relacao->definirModificado(true);
   }
   catch(Excecao &e)
   {
    /* O único erro que é desconsiderado é o de invalidação de objetos, pois,
       mesmo com a restauração do estado original do relacionamento estes
       objetos não são recuperados */
    if(e.obterTipoErro()==ERR_PGMODELER_REFCOLUNAINVTABELA)
     //Exibe uma mensagem de erro com o conteúdo da exceção
     caixa_msg->show(e);
    //Para os demais erros a exceção é encaminhada
    else
     throw Excecao(e.obterMensagemErro(),e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
   }
  }

  //Finaliza o encademanto de operações aberto
  lista_op->finalizarEncadeamentoOperacoes();

  //Finaliza a configuração do relacionamento
  finalizarConfiguracao();
 }
 catch(Excecao &e)
 {
  /* Cancela a configuração o objeto removendo a ultima operação adicionada
     referente ao objeto editado/criado e desaloca o objeto
     caso o mesmo seja novo */
  lista_op->anularEncadeamentoOperacoes(true);
  this->cancelarConfiguracao();
  lista_op->anularEncadeamentoOperacoes(false);

  /* Faz a validação dos relacionamentos para refletir a nova configuração
     do relacionamento */
  modelo->validarRelacionamentos();

  throw Excecao(e.obterMensagemErro(),e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
 }
}