// utilizado no contexto das eliminações public static void verifyIfCanDeleteRH(PersistencyHelper.PreConcArguments args) { PersistencyHelper.canDeleteRHRowPreConcArguments cdrhPca = null; cdrhPca = (PersistencyHelper.canDeleteRHRowPreConcArguments)args; GISADataset.NivelRow nRow = (GISADataset.NivelRow)(GisaDataSetHelper.GetInstance().Nivel.Select("ID=" + cdrhPca.nRowID.ToString())[0]); GISADataset.NivelRow nUpperRow = null; if (GisaDataSetHelper.GetInstance().Nivel.Select("ID=" + cdrhPca.nUpperRowID.ToString()).Length > 0) { nUpperRow = (GISADataset.NivelRow)(GisaDataSetHelper.GetInstance().Nivel.Select("ID=" + cdrhPca.nUpperRowID.ToString())[0]); } GISADataset.RelacaoHierarquicaRow rhRow = null; if (GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", cdrhPca.rhRowID, cdrhPca.rhRowIDUpper)).Length > 0) { rhRow = (GISADataset.RelacaoHierarquicaRow)(GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", cdrhPca.rhRowID, cdrhPca.rhRowIDUpper))[0]); } // Permitir apenas a eliminação de folhas e de níveis cuja // a funcionalidade eliminação não elimina o nível propriamente // dito mas sim a sua relação com o nível superior int parentCount = 0; int directChildCount = 0; bool moreThenOneParent = false; bool notExistsDirectChild = false; parentCount = DBAbstractDataLayer.DataAccessRules.NivelRule.Current.getParentCount(cdrhPca.nRowID.ToString(), cdrhPca.tran); directChildCount = DBAbstractDataLayer.DataAccessRules.NivelRule.Current.getDirectChildCount(cdrhPca.nRowID.ToString(), string.Empty, cdrhPca.tran); moreThenOneParent = parentCount > 1; notExistsDirectChild = directChildCount == 0; Trace.WriteLine("parentCount: " + parentCount.ToString()); Trace.WriteLine("directChildCount: " + directChildCount.ToString()); if (!(!(TipoNivel.isNivelOrganico(nRow) && TipoNivel.isNivelOrganico(nUpperRow)) && (TipoNivel.isNivelOrganico(nRow) || (TipoNivel.isNivelOrganico(nUpperRow) && moreThenOneParent) || (notExistsDirectChild)))) { string filter = string.Format("rh.IDTipoNivelRelacionado != {0:d}", TipoNivelRelacionado.UF); parentCount = DBAbstractDataLayer.DataAccessRules.NivelRule.Current.getParentCount(cdrhPca.nRowID.ToString(), cdrhPca.tran); directChildCount = DBAbstractDataLayer.DataAccessRules.NivelRule.Current.getDirectChildCount(cdrhPca.nRowID.ToString(), filter, cdrhPca.tran); moreThenOneParent = parentCount > 1; notExistsDirectChild = directChildCount == 0; Trace.WriteLine("parentCount: " + parentCount.ToString()); Trace.WriteLine("directChildCount: " + directChildCount.ToString()); cdrhPca.deleteSuccessful = false; cdrhPca.continueSave = false; if (!(!(TipoNivel.isNivelOrganico(nRow) && TipoNivel.isNivelOrganico(nUpperRow)) && (TipoNivel.isNivelOrganico(nRow) || (TipoNivel.isNivelOrganico(nUpperRow) && moreThenOneParent) || (notExistsDirectChild)))) { cdrhPca.message = "Só é possível eliminar os níveis que não tenham outros níveis directamente associados"; } else { cdrhPca.message = "Existem unidades físicas associadas a este nível não podendo por isso ser eliminado."; } } else { //ToDo: simplificar este IF: o facto de rhrow ser nothing indica o caso onde é necessario executar o // o método DeleteInDataSet if (rhRow != null) { System.Data.DataSet tempgisaBackup1 = cdrhPca.gisaBackup; PersistencyHelper.BackupRow(ref tempgisaBackup1, rhRow); cdrhPca.gisaBackup = tempgisaBackup1; rhRow.Delete(); } else { Nivel.DeleteInDataSet(nRow, false, cdrhPca.gisaBackup); // é possível que esta linha não seja já precisa uma vez que o cleandeleteddata seguinte irá limpar do DS de trabalho as linhas que já não existam } } }
public static void ensureUniqueCodigo(PersistencyHelper.PreConcArguments args) { PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments pcArgs = null; pcArgs = (PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments)args; GISADataset.NivelRow nRow = (GISADataset.NivelRow)(GisaDataSetHelper.GetInstance().Nivel.Select("ID=" + pcArgs.nRowID.ToString())[0]); GISADataset.NivelDesignadoRow ndRow = (GISADataset.NivelDesignadoRow)(GisaDataSetHelper.GetInstance().NivelDesignado.Select("ID=" + pcArgs.ndRowID.ToString())[0]); GISADataset.RelacaoHierarquicaRow rhRow = null; if (GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", pcArgs.rhRowID, pcArgs.rhRowIDUpper)).Length > 0) { rhRow = (GISADataset.RelacaoHierarquicaRow)(GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", pcArgs.rhRowID, pcArgs.rhRowIDUpper))[0]); } // Se o nível em questão for uma entidade detentora if (rhRow == null && nRow.TipoNivelRow.ID == TipoNivel.LOGICO) { if (DBAbstractDataLayer.DataAccessRules.NivelRule.Current.isUniqueCodigo(nRow.Codigo, nRow.ID, pcArgs.tran, pcArgs.testOnlyWithinNivel)) { pcArgs.successful = true; } else { var cod = nRow.Codigo; System.Data.DataSet tempgisaBackup1 = pcArgs.gisaBackup; PersistencyHelper.BackupRow(ref tempgisaBackup1, ndRow); pcArgs.gisaBackup = tempgisaBackup1; System.Data.DataSet tempgisaBackup2 = pcArgs.gisaBackup; PersistencyHelper.BackupRow(ref tempgisaBackup2, nRow); pcArgs.gisaBackup = tempgisaBackup2; ndRow.RejectChanges(); PermissoesHelper.UndoAddNivelGrantPermissions(nRow); nRow.RejectChanges(); pcArgs.message = string.Format( "Não é possível completar a operação porque não é permitido " + Environment.NewLine + "que duas unidades de informação tenham o mesmo código " + Environment.NewLine + "parcial ({0}) no mesmo nivel de descrição.", cod); } } else { // antes de obter o código verificar se adição de um novo nível ainda é possível (por razões // de concorrência é necessário garantir que tanto o nível acima mantém-se na base de dados // até o save estar terminado) bool upperRelationExists; if (rhRow.IDUpper < 0) { upperRelationExists = true; } else { upperRelationExists = NivelRule.Current.isNivelDeleted(rhRow.IDUpper, args.tran); } if (!upperRelationExists) { var frdRow = GisaDataSetHelper.GetInstance().FRDBase.Cast <GISADataset.FRDBaseRow>().Single(r => r.ID == pcArgs.frdBaseID); Nivel.DeleteInDataSet(frdRow, false, pcArgs.gisaBackup); Nivel.DeleteInDataSet(nRow, false, pcArgs.gisaBackup); pcArgs.message = "Não foi possível criar/editar a unidade informacional uma" + Environment.NewLine + "vez que a unidade superior foi apagada por outro utilizador."; } else { if (DBAbstractDataLayer.DataAccessRules.NivelRule.Current.isUniqueCodigo(nRow.Codigo, nRow.ID, pcArgs.tran, pcArgs.testOnlyWithinNivel, rhRow.NivelRowByNivelRelacaoHierarquicaUpper.ID)) { pcArgs.successful = true; } else { var cod = nRow.Codigo; if (nRow.RowState == DataRowState.Modified) { nRow.RejectChanges(); GisaDataSetHelper.GetInstance().IndexFRDCA.Cast <GISADataset.IndexFRDCARow>() .Where(r => r.RowState != DataRowState.Unchanged).ToList().ForEach(r => r.RejectChanges()); } else if (nRow.RowState == DataRowState.Added) { var frdRow = GisaDataSetHelper.GetInstance().FRDBase.Cast <GISADataset.FRDBaseRow>().Single(r => r.ID == pcArgs.frdBaseID); Nivel.DeleteInDataSet(frdRow, false, pcArgs.gisaBackup); Nivel.DeleteInDataSet(nRow, false, pcArgs.gisaBackup); } pcArgs.message = string.Format( "Não é possível completar a operação porque não é permitido " + Environment.NewLine + "que duas unidades de informação tenham o mesmo código " + Environment.NewLine + "parcial ({0}) no mesmo nivel de descrição.", cod); } } } }