// Método que trata da atribuição de uma designação a um Diploma/Modelo durante uma criação ou edição private GISADataset.ControloAutDicionarioRow manageDesignacaoDiplomaModelo(GISADataset.ControloAutDicionarioRow cadRow, string termo, GISADataset.TipoNoticiaAutRow TipoNoticiaAutRow, GISADataset.ControloAutRow carow, GISADataset.TipoControloAutFormaRow tcafRowAutorizado) { // NOTA: é criada na mesma uma linha Dicionario; posteriormente no algoritmo que trata os // conflitos de concorrência vai proceder à reutilização da linha existente na // base de dados if (cadRow != null) { // se por algum motivo a transacção onde este método está inserido voltar a ser executada, // mfaPca.cadRow já não será nothing e por esse motivo deverá ser apagada a existente // em memória seja qual for o seu rowstate GisaDataSetHelper.GetInstance().ControloAutDicionario.RemoveControloAutDicionarioRow(cadRow); GisaDataSetHelper.GetInstance().Dicionario.RemoveDicionarioRow(cadRow.DicionarioRow); } else if (GisaDataSetHelper.GetInstance().Dicionario.Select("Termo='" + termo.Replace("'", "''") + "' AND CatCode='" + getCatCode(carow.TipoNoticiaAutRow) + "'").Length > 0) { GISADataset.DicionarioRow dicionarioRow = (GISADataset.DicionarioRow)(GisaDataSetHelper.GetInstance().Dicionario.Select("Termo='" + termo.Replace("'", "''") + "' AND CatCode='" + getCatCode(carow.TipoNoticiaAutRow) + "'")[0]); GisaDataSetHelper.GetInstance().Dicionario.RemoveDicionarioRow(dicionarioRow); } GISADataset.DicionarioRow dRow = GisaDataSetHelper.GetInstance().Dicionario.AddDicionarioRow(termo, getCatCode(carow.TipoNoticiaAutRow), new byte[]{}, 0); return GisaDataSetHelper.GetInstance().ControloAutDicionario.AddControloAutDicionarioRow(carow, dRow, tcafRowAutorizado, new byte[]{}, 0); }
private void setNewTermo(PersistencyHelper.PreConcArguments args) { try { PersistencyHelper.ManageFormasAutorizadasPreConcArguments mfaPca = (PersistencyHelper.ManageFormasAutorizadasPreConcArguments)args; string termo = mfaPca.termo; GISADataset.ControloAutRow carow = (GISADataset.ControloAutRow)(GisaDataSetHelper.GetInstance().ControloAut.Select("ID=" + mfaPca.caRowID.ToString())[0]); GISADataset.TipoControloAutFormaRow tcafRowAutorizado = (GISADataset.TipoControloAutFormaRow)(GisaDataSetHelper.GetInstance().TipoControloAutForma.Select("ID=" + System.Enum.Format(typeof(TipoControloAutForma), TipoControloAutForma.FormaAutorizada, "D"))[0]); DataSet gisaBackup = mfaPca.gisaBackup; //Dim dataReader As IDataReader GISADataset.DicionarioRow dRowOrig = null; GISADataset.ControloAutDicionarioRow cadRowOrig = ControloAutHelper.getFormaAutorizada(carow); bool existsOrigCad = false; ArrayList termoUsed = DiplomaModeloRule.Current.GetDicionario(getCatCode(carow.TipoNoticiaAutRow), termo.Trim(), mfaPca.tran); // Distinguir entre criar e editar um Diploma/Modelo if (carow.ID < 0) { // Criar Diploma/Modelo: // - verificar se o termo escolhido existe na base de dados e se nesse caso, verificar se // está a ser utilizado noutro Diploma/Modelo if (((long)(termoUsed[0])) > 0 && (bool)(termoUsed[1])) { // A designação já existe na base de dados mas está marcada como apagada mfaPca.cadRow = manageDesignacaoDiplomaModelo(mfaPca.cadRow, mfaPca.termo, carow.TipoNoticiaAutRow, carow, tcafRowAutorizado); } else if (((long)(termoUsed[0])) > 0 && ! ((bool)(termoUsed[1]))) { // A designação já existe na base de dados mas não está marcada como apagada; no entanto, // é preciso saber se está a ser usada por outro Diploma/Modelo (tipicamente, nesta // situação a designação está a ser utilizada por um Diploma/Modelo mas já aconteceu não // estar a ser utilizada fruto de uma resolução de conflito de concorrência) if (DiplomaModeloRule.Current.ExistsControloAutDicionario((long)(termoUsed[0]), 1, carow.TipoNoticiaAutRow.ID, mfaPca.tran)) { carow.RejectChanges(); mfaPca.message = "A designação especificada já existe, deverá escolhê-la da lista caso a pretenda utilizar."; } else { mfaPca.cadRow = manageDesignacaoDiplomaModelo(mfaPca.cadRow, mfaPca.termo, carow.TipoNoticiaAutRow, carow, tcafRowAutorizado); } } else { // A designação não existe na base de dados mfaPca.cadRow = manageDesignacaoDiplomaModelo(mfaPca.cadRow, mfaPca.termo, carow.TipoNoticiaAutRow, carow, tcafRowAutorizado); } } else { // Editar Diploma/Modelo // - verificar se entretanto outro utilizador já editou o Diploma/Modelo // - verificar se o termo escolhido existe na base de dados e se nesse caso, verificar se // está a ser utilizado noutro Diploma/Modelo existsOrigCad = DiplomaModeloRule.Current.ExistsControloAutDicionario(cadRowOrig.IDDicionario, cadRowOrig.IDTipoControloAutForma, carow.TipoNoticiaAutRow.ID, mfaPca.tran); dRowOrig = cadRowOrig.DicionarioRow; PersistencyHelper.BackupRow(ref gisaBackup, cadRowOrig); PersistencyHelper.BackupRow(ref gisaBackup, dRowOrig); cadRowOrig.Delete(); // é permitido apagar o termo antigo uma vez que é único para diplomas/modelo dRowOrig.Delete(); if (existsOrigCad) { // o Diploma/Modelo não foi editado por nenhum outro utilizador if (((long)(termoUsed[0])) > 0 && (bool)(termoUsed[1])) { // A designação já existe na base de dados mas está marcada como apagada mfaPca.cadRow = manageDesignacaoDiplomaModelo(mfaPca.cadRow, mfaPca.termo, carow.TipoNoticiaAutRow, carow, tcafRowAutorizado); } else if (((long)(termoUsed[0])) > 0 && ! ((bool)(termoUsed[1]))) { // A designação já existe na base de dados mas não está marcada como apagada; no entanto, // é preciso saber se está a ser usada por outro Diploma/Modelo (tipicamente, nesta // situação a designação está a ser utilizada por um Diploma/Modelo mas já aconteceu não // estar a ser utilizada fruto de uma resolução de conflito de concorrência) if (DiplomaModeloRule.Current.ExistsControloAutDicionario((long)(termoUsed[0]), 1, carow.TipoNoticiaAutRow.ID, mfaPca.tran)) { dRowOrig.RejectChanges(); cadRowOrig.RejectChanges(); mfaPca.message = "A designação especificada já existe, deverá escolhê-la da lista caso a pretenda utilizar."; } else { mfaPca.cadRow = manageDesignacaoDiplomaModelo(mfaPca.cadRow, mfaPca.termo, carow.TipoNoticiaAutRow, carow, tcafRowAutorizado); } } else { // A designação não existe na base de dados mfaPca.cadRow = manageDesignacaoDiplomaModelo(mfaPca.cadRow, mfaPca.termo, carow.TipoNoticiaAutRow, carow, tcafRowAutorizado); } } else { // Outro utilizador já editou este Diploma/Modelo pelo que não é possível reeditá-lo dRowOrig.RejectChanges(); cadRowOrig.RejectChanges(); mfaPca.message = "Não foi possível executar a operação pretendida pois o controlo de autoridade foi alterado por outro utilizador."; } } } catch (Exception ex) { Trace.WriteLine(ex); throw; } }