Beispiel #1
0
        // 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
                }
            }
        }
Beispiel #2
0
        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);
                    }
                }
            }
        }