//---------------------------------------------------------- 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); } }