private void ClickBtnCriar()
		{
            ((frmMain)TopLevelControl).EnterWaitMode();

            if (((frmMain)TopLevelControl).isSuportPanel && !PersistencyHelper.hasCurrentDatasetChanges())
            {
                if (GetCurrentTipoNoticiaAut()[0] == TipoNoticiaAut.EntidadeProdutora)
                {
                    MessageBox.Show("Não é permitido criar entidades produtores a partir de um painel de suporte." + System.Environment.NewLine +
                        "Selecione a área de menu referente às entidades produtoras para efetuar a operação", "Criação de entidade produtora", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                try {
                    Trace.WriteLine("Saving before creating new CA in suport panel...");
                    PersistencyHelper.save();
                    PersistencyHelper.cleanDeletedData();
                }
                catch (Exception) {
                    MessageBox.Show("Ocorreu um erro ao tentar abrir o formulário de criação." + System.Environment.NewLine + "Por favor contacte o administrador de sistema.", "Criação de controlo de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }

			FormCreateControloAut form = null;
			try
			{
				if (GetCurrentTipoNoticiaAut()[0] == TipoNoticiaAut.EntidadeProdutora)
					form = new FormCreateEntidadeProdutora();
				else
					form = new FormCreateControloAut();

				form.cbNoticiaAut.BeginUpdate();
				form.cbNoticiaAut.DataSource = caList.cbNoticiaAut.DataSource;
				form.cbNoticiaAut.DisplayMember = caList.cbNoticiaAut.DisplayMember;
				form.cbNoticiaAut.EndUpdate();
				if (form.cbNoticiaAut.Items.Count == 2)
				{
					form.cbNoticiaAut.SelectedIndex = 1;
					form.cbNoticiaAut.Enabled = false;
				}
				form.LoadData(true);
			}
			finally
			{
				((frmMain)TopLevelControl).LeaveWaitMode();
			}

			switch (form.ShowDialog())
			{
				case DialogResult.OK:
					Trace.WriteLine("A criar notícia de autoridade...");
					GISADataset.DicionarioRow dicionarioRow = null;
					if (GisaDataSetHelper.GetInstance().Dicionario.Select(string.Format("Termo = '{0}'", form.ListTermos.ValidAuthorizedForm.Replace("'", "''"))).Length > 0 && form.ListTermos.ValidAuthorizedForm != null)
						dicionarioRow = (GISADataset.DicionarioRow)(GisaDataSetHelper.GetInstance().Dicionario.Select(string.Format("Termo = '{0}'", form.ListTermos.ValidAuthorizedForm.Replace("'", "''")))[0]);
					else if (form.ListTermos.ValidAuthorizedForm != null && form.ListTermos.ValidAuthorizedForm.Length > 0)
					{
						dicionarioRow = GisaDataSetHelper.GetInstance().Dicionario.NewDicionarioRow();
                        dicionarioRow.Termo = form.ListTermos.ValidAuthorizedForm;
						dicionarioRow.CatCode = "CA";
						dicionarioRow.Versao = new byte[]{};
					}

					// excluir selecção de termos inválidos. nunca deveria acontecer
					Trace.Assert(dicionarioRow != null);

					// se o estado da row for detached trata-se de um novo termo 
					// criado. nesse caso é necessário adiciona-lo ao dataset.
					if (dicionarioRow.RowState == DataRowState.Detached)
					{
						dicionarioRow.isDeleted = 0;
						GisaDataSetHelper.GetInstance().Dicionario.AddDicionarioRow(dicionarioRow);
					}

					// obter o tipo de noticia de autoridade escolhido
					GISADataset.TipoNoticiaAutRow tnaRow = null;
					tnaRow = (GISADataset.TipoNoticiaAutRow)form.cbNoticiaAut.SelectedItem;
					Trace.Assert(tnaRow != null);

					// adicionar a nova notícia de autoridade ao modelo de dados e à interface
					GISADataset.ControloAutRow caRow = GisaDataSetHelper.GetInstance().ControloAut.NewControloAutRow();
					caRow.Autorizado = false;
					caRow.Completo = false;
					caRow.IDTipoNoticiaAut = tnaRow.ID;
					caRow.NotaExplicativa = "";
					caRow.IDIso639p2 = 348L; // language: portuguese
					caRow.IDIso15924 = 60L; // script: latin
					caRow.ChaveColectividade = "";
					caRow.ChaveRegisto = "";
					caRow.RegrasConvencoes = "";
					caRow.Observacoes = "";
					caRow.DescContextoGeral = "";
					caRow.DescEnquadramentoLegal = "";
					caRow.DescEstatutoLegal = "";
					caRow.DescEstruturaInterna = "";
					caRow.DescOcupacoesActividades = "";
					caRow.DescHistoria = "";
					caRow.DescOutraInformacaoRelevante = "";
					caRow.DescZonaGeografica = "";
					caRow.isDeleted = 0;

					GisaDataSetHelper.GetInstance().ControloAut.AddControloAutRow(caRow);

					GISADataset.TipoControloAutFormaRow tcafRowAutorizado = null;
					tcafRowAutorizado = (GISADataset.TipoControloAutFormaRow)(GisaDataSetHelper.GetInstance().TipoControloAutForma.Select("ID=" + System.Enum.Format(typeof(TipoControloAutForma), TipoControloAutForma.FormaAutorizada, "D"))[0]);

					// criar um registo em ControloAutDicionario usando o termo obtido e com TipoControloAutforma "autorizado"
					byte[] Versao = null;
					GISADataset.ControloAutDicionarioRow cadRow = null;
					cadRow = GisaDataSetHelper.GetInstance().ControloAutDicionario.AddControloAutDicionarioRow(caRow, dicionarioRow, tcafRowAutorizado, Versao, 0);

                    //Ao criar uma EP criar também um nível correspondente, de forma a ser possível adicionar "RelacaoHierarquica"s
					GISADataset.NivelRow nRow = null;
					GISADataset.NivelControloAutRow ncaRow = null;
					var args = new PersistencyHelper.NewControloAutPreSaveArguments();
                    var postSaveAction = new PostSaveAction();
                    var argsPostSave = new PersistencyHelper.UpdatePermissionsPostSaveArguments();
                    postSaveAction.args = argsPostSave;

                    postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs)
                    {
                        if ((tnaRow.ID == (long)TipoNoticiaAut.EntidadeProdutora && !args.successCodigo) || !args.successTermo)
                            return;
 
                        // registar a criação do controlo de autoridade (o registo deve ser feito à parte do save visto que a tabela ControloAutDataDeExistencia não está ligada a ControloAut e por esse motivo, o ID na tabela de registo ser igual em ControloAut em vez de ser negativo)
                        if (((frmMain)TopLevelControl).isSuportPanel)
                        {
                            GISADataset.TrusteeUserRow tuAuthorRow = null;
                            if (SessionHelper.GetGisaPrincipal().TrusteeUserAuthor != null && !(SessionHelper.GetGisaPrincipal().TrusteeUserAuthor.RowState == DataRowState.Detached))
                                tuAuthorRow = SessionHelper.GetGisaPrincipal().TrusteeUserAuthor;
                            var r = GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator, tuAuthorRow, DateTime.Now);
                            GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.AddControloAutDataDeDescricaoRow(r);
                        }
                        else
                            CurrentContext.RaiseRegisterModificationEvent(caRow);

                        PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao,
                                GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Where(ca => ca.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran);
                    };

					if (caRow.TipoNoticiaAutRow.ID == Convert.ToInt64(TipoNoticiaAut.EntidadeProdutora))
					{
                        var tep = GisaDataSetHelper.GetInstance().TipoEntidadeProdutora.Cast<GISADataset.TipoEntidadeProdutoraRow>().First();
                        GisaDataSetHelper.GetInstance().ControloAutEntidadeProdutora.AddControloAutEntidadeProdutoraRow(caRow, tep, new byte[] { }, 0);
                        GisaDataSetHelper.GetInstance().ControloAutDatasExistencia.AddControloAutDatasExistenciaRow(caRow, "", "", "", "", false, "", "", "", false, new byte[] { }, 0);

						CreateAssociatedNivel(caRow, ref nRow, ref ncaRow);
						nRow.Codigo = ((FormCreateEntidadeProdutora)form).txtCodigo.Text;
						args.nID = nRow.ID;
					}

					try
					{
						args.caID = caRow.ID;
						args.dID = dicionarioRow.ID;
                        args.dTermo = dicionarioRow.Termo.Replace("'", "''");
						args.cadIDControloAut = cadRow.IDControloAut;
						args.cadIDDicionario = cadRow.IDDicionario;
						args.cadIDTipoControloAutForma = cadRow.IDTipoControloAutForma;

                        PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.validateCANewTermo, args, postSaveAction);
                        PersistencyHelper.cleanDeletedData(new List<TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("Nivel"), PersistencyHelper.determinaNuvem("ControloAut") }));

                        if (args.successTermo && (!(form is FormCreateEntidadeProdutora) || args.successCodigo))
						{
                            if (successfulSave == PersistencyHelper.SaveResult.successful)
                            {
                                GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());
                                try
                                {
                                    List<string> IDNiveis = ControloAutRule.Current.GetNiveisDocAssociados(caRow.ID, ho.Connection);
                                    GISA.Search.Updater.updateNivelDocumental(IDNiveis);
                                }
                                catch (Exception ex)
                                {
                                    Trace.WriteLine(ex.ToString());
                                    throw;
                                }
                                finally
                                {
                                    ho.Dispose();
                                }
                            }

							caList.AddNivel(cadRow);
						}
						else
						{
							if (form is FormCreateEntidadeProdutora)
								MessageBox.Show("Não foi possível criar a notícia de autoridade " + Environment.NewLine + "uma vez que essa designação e/ou código já" + Environment.NewLine + "é utilizada.", "Nova Notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
							else
								MessageBox.Show("Não foi possível criar a notícia de autoridade " + Environment.NewLine + "uma vez que já existe uma com essa designação.", "Nova Notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
						}
					}
					catch (Exception ex)
					{
						Trace.WriteLine(ex);
						throw;
					}
					break;
				case DialogResult.Cancel:
				break;
			}
		}
Esempio n. 2
0
        internal static bool Save(CorrespondenciaDocs correspondenciaDoc, Dictionary<Entidade, DataRow> rows)
        {
            var dg = (DocumentoGisa)correspondenciaDoc.EntidadeInterna;

            // listas de IDs tanto dos documentos como dos controlos de autoridade criados para serem usados na
            // actualização dos índices de pesquisa como também na atribuição de permissões (somente no caso
            // dos documentos)
            List<long> nIDs = new List<long>();
            List<string> produtoresID = new List<string>();
            List<string> assuntosID = new List<string>();
            List<string> tipologiasID = new List<string>();

            // documentos que vão ser-lhes actualizadas as permissões
            var nRows = new List<GISADataset.NivelRow>();
            nRows = GisaDataSetHelper.GetInstance().Nivel.Cast<GISADataset.NivelRow>().Where(r => r.RowState == DataRowState.Added).ToList();

            // atribuição de permissões aos documentos novos
            nRows.ForEach(r => {
                var rhRow = r.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().FirstOrDefault();
                if (rhRow == null)
                    PermissoesHelper.AddNewNivelGrantPermissions(r);
                else
                    PermissoesHelper.AddNewNivelGrantPermissions(r, rhRow.NivelRowByNivelRelacaoHierarquicaUpper);
            });

            // manter uma lista de niveis e controlos de autoridade criados para que seja possível actualizar o 
            // índice de pesquisa
            var documentoRows = GisaDataSetHelper.GetInstance().Nivel.Cast<GISADataset.NivelRow>().Where(r => r.RowState == DataRowState.Added && r.IDTipoNivel == (long)TipoNivel.DOCUMENTAL).ToList();
            var produtorRows = GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(r => r.IDTipoNoticiaAut == (int)TipoNoticiaAut.EntidadeProdutora && r.RowState == DataRowState.Added).ToList();
            var assuntoRows = GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(r => (r.IDTipoNoticiaAut == (int)TipoNoticiaAut.Onomastico || r.IDTipoNoticiaAut == (int)TipoNoticiaAut.Ideografico || r.IDTipoNoticiaAut == (int)TipoNoticiaAut.ToponimicoGeografico) && r.RowState == DataRowState.Added).ToList();
            var tipologiaRows = GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(r => r.IDTipoNoticiaAut == (int)TipoNoticiaAut.TipologiaInformacional && r.RowState == DataRowState.Added).ToList();
            
            // guardar nas listas os IDs dos documentos e dos controlos de autoridade que foram atribuidos na
            // base de dados durante o save e criar registos de adição/modificação dos niveis e dos 
            // controlos de autoridade
            GISADataset.TrusteeUserRow tuOperator = SessionHelper.GetGisaPrincipal().TrusteeUserOperator;
            DateTime data = DateTime.Now;
            GISADataset.TrusteeUserRow tuAuthor = null;

            var docRow = rows[correspondenciaDoc.EntidadeInterna];
            var docToReg = default(GISADataset.NivelRow);
            if (Concorrencia.WasRecordModified(docRow) || Concorrencia.WasRecordModified(((GISADataset.NivelRow)docRow).GetFRDBaseRows().Single()))
                docToReg = docRow as GISADataset.NivelRow;

            if (SessionHelper.GetGisaPrincipal().TrusteeUserAuthor != null && !(SessionHelper.GetGisaPrincipal().TrusteeUserAuthor.RowState == DataRowState.Detached))
                tuAuthor = SessionHelper.GetGisaPrincipal().TrusteeUserAuthor;

            // VALIDAÇÕES


            //validar documento novo
            PersistencyHelper.ValidaIntegDocExtPreSaveArguments psArgs = new PersistencyHelper.ValidaIntegDocExtPreSaveArguments();
            PersistencyHelper.ValidaIntegDocExtPreConcArguments pcArgs = new PersistencyHelper.ValidaIntegDocExtPreConcArguments();
            
            var pcArgsLst = new List<PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments>();
            var psArgsNivelLst = new List<PersistencyHelper.SetNewCodigosPreSaveArguments>();
            foreach (var nRow in documentoRows)
            {
                var pcArgsNewNivel = new PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments();
                var psArgsNivel = new PersistencyHelper.SetNewCodigosPreSaveArguments();
                var pcArgsNivelUniqueCode = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments();

                // dados que serão usados no delegate responsável pela criação do nível documental
                var rhRow = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single();
                pcArgsNivelUniqueCode.nRowID = nRow.ID;
                pcArgsNivelUniqueCode.ndRowID = nRow.GetNivelDesignadoRows().Single().ID;
                pcArgsNivelUniqueCode.rhRowID = nRow.ID;
                pcArgsNivelUniqueCode.rhRowIDUpper = rhRow.IDUpper;
                pcArgsNivelUniqueCode.frdBaseID = nRow.GetFRDBaseRows().Single().ID;
                pcArgsNivelUniqueCode.testOnlyWithinNivel = true;

                pcArgsNewNivel.IDTipoNivelRelacionado = rhRow.IDTipoNivelRelacionado;
                pcArgsNewNivel.argsNivel = pcArgsNivelUniqueCode;

                psArgsNivel.createNewNivelCodigo = false;
                psArgsNivel.createNewUFCodigo = false;
                psArgsNivel.setNewCodigo = rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SD;
                psArgsNivel.argsNivelDocSimples = NiveisHelper.AddNivelDocumentoSimplesWithDelegateArgs(nRow.GetNivelDesignadoRows().Single(), rhRow.IDUpper, rhRow.IDTipoNivelRelacionado);

                pcArgsLst.Add(pcArgsNewNivel);
                psArgsNivelLst.Add(psArgsNivel);
            }

            if (documentoRows.Count == 0 && dg != null)
            {
                var rhRowOld = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Cast<GISADataset.RelacaoHierarquicaRow>().SingleOrDefault(r => r.RowState == DataRowState.Deleted);
                var rhRowNew = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Cast<GISADataset.RelacaoHierarquicaRow>().SingleOrDefault(r => r.RowState == DataRowState.Added);
                if (rhRowOld != null && rhRowNew != null)
                {
                    var nRow = GisaDataSetHelper.GetInstance().Nivel.Cast<GISADataset.NivelRow>().Single(r => r.ID == dg.Id);
                    var pcArgsNewNivel = new PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments();
                    var psArgsNivel = new PersistencyHelper.SetNewCodigosPreSaveArguments();
                    var pcArgsNivelUniqueCode = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments();

                    pcArgsNewNivel.argsNivel = pcArgsNivelUniqueCode;

                    // dados que serão usados no delegate responsável pela criação do nível documental
                    pcArgsNivelUniqueCode.nRowID = nRow.ID;
                    pcArgsNivelUniqueCode.ndRowID = nRow.GetNivelDesignadoRows()[0].ID;
                    pcArgsNivelUniqueCode.rhRowID = nRow.ID;
                    pcArgsNivelUniqueCode.rhRowIDUpper = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDUpper;
                    pcArgsNivelUniqueCode.frdBaseID = nRow.GetFRDBaseRows()[0].ID;
                    pcArgsNivelUniqueCode.testOnlyWithinNivel = true;

                    pcArgsNewNivel.IDTipoNivelRelacionado = TipoNivelRelacionado.D;

                    psArgsNivel.createNewNivelCodigo = false;
                    psArgsNivel.createNewUFCodigo = false;

                    pcArgsLst.Add(pcArgsNewNivel);
                    psArgsNivelLst.Add(psArgsNivel);
                }
            }

            pcArgs.newDocsList = pcArgsLst;
            psArgs.newDocArgs = psArgsNivelLst;

            // validar controlo de autoridade novo
            List<PersistencyHelper.NewControloAutPreSaveArguments> newControloAutArgs = new List<PersistencyHelper.NewControloAutPreSaveArguments>();
            foreach (var caRow in GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(c => c.RowState == DataRowState.Added))
            {
                PersistencyHelper.NewControloAutPreSaveArguments args = new PersistencyHelper.NewControloAutPreSaveArguments();
                if (caRow.TipoNoticiaAutRow.ID == Convert.ToInt64(TipoNoticiaAut.EntidadeProdutora))
                {
                    var nRow = caRow.GetNivelControloAutRows()[0].NivelRow;
                    args.nID = nRow.ID;
                    args.epCodigo = nRow.Codigo;
                }

                args.caID = caRow.ID;
                args.dID = caRow.GetControloAutDicionarioRows()[0].DicionarioRow.ID;
                args.dTermo = caRow.GetControloAutDicionarioRows()[0].DicionarioRow.Termo.Replace("'", "''");
                args.cadIDControloAut = caRow.GetControloAutDicionarioRows()[0].IDControloAut;
                args.cadIDDicionario = caRow.GetControloAutDicionarioRows()[0].IDDicionario;
                args.cadIDTipoControloAutForma = caRow.GetControloAutDicionarioRows()[0].IDTipoControloAutForma;

                newControloAutArgs.Add(args);
            }

            psArgs.newControloAutArgs = newControloAutArgs;

            // Atribuir permissões aos níveis criados
            PostSaveAction postSaveAction = new PostSaveAction();
            PersistencyHelper.UpdatePermissionsPostSaveArguments argsPostSave = new PersistencyHelper.UpdatePermissionsPostSaveArguments();
            postSaveAction.args = argsPostSave;

            postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs)
            {
                
                if (!argsPostSave.cancelAction)
                {
                    if (docToReg != null)
                    {
                        var regNvl = GISA.Model.RecordRegisterHelper.CreateFRDBaseDataDeDescricaoRow(docToReg.GetFRDBaseRows()[0], tuOperator, tuAuthor, data);
                        GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.AddFRDBaseDataDeDescricaoRow(regNvl);
                        PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, new DataRow[] { regNvl }, postSaveArgs.tran);
                    }

                    var regCa = produtorRows.Select(caRow => GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, tuOperator, tuAuthor, data)).ToList();
                    regCa.AddRange(assuntoRows.Select(caRow => GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, tuOperator, tuAuthor, data)));
                    regCa.AddRange(tipologiaRows.Select(caRow => GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, tuOperator, tuAuthor, data)));
                    regCa.ToList().ForEach(r => GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.AddControloAutDataDeDescricaoRow(r));
                    PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, regCa.ToArray(), postSaveArgs.tran);
                }
            };

            PersistencyHelper.SaveResult saveResult =
                PersistencyHelper.save(ValidaIntegDocExt, pcArgs, ValidaIntegDocExt, psArgs, postSaveAction, true);

            if (saveResult == PersistencyHelper.SaveResult.unsuccessful)
            {
                var errorDetailsLst = pcArgsLst.Select(args => ((PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments)args.argsNivel).message)
                    .Where(msg => msg != null && msg.Length > 0).ToList();

                var errorDetails = new StringBuilder();
                errorDetailsLst.ForEach(str => errorDetails.AppendLine(str));


                // mostrar mensagem
                DialogResult dResult = MessageBox.Show(
                    errorDetails + System.Environment.NewLine +
                    "A gravação vai ser abortada.",
                    "Erro",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);

                return false;
            }
            else if (saveResult == PersistencyHelper.SaveResult.cancel)
            {
                GisaDataSetHelper.GetInstance().RejectChanges();
                return false;
            }
            else
            {
                var err = psArgs.newControloAutArgs.FirstOrDefault(e => !e.successTermo || (e.epCodigo != null && !e.successCodigo));
                if (err != null)
                {
                    var errStr = (err.epCodigo != null && !err.successCodigo) ?
                                    string.Format("O código {0} já está a ser utilizado por outra entidade produtora.", err.epCodigo) :
                                    string.Format("O termo {0} já está a ser utilizado por outro controlo de autoridade.", err.dTermo);

                    // mostrar mensagem
                    DialogResult dResult = MessageBox.Show(
                        errStr + System.Environment.NewLine +
                        "A gravação vai ser abortada.",
                        "Erro",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);

                    return false;
                }
            }

            // actualizar os IDs das entidades internas
            var entidadesInternas = rows.Keys.ToList().OfType<EntidadeInterna>().ToList();
            //var entidadesExternas = rows.Keys.ToList().OfType<EntidadeExterna>().ToList();
            entidadesInternas.ForEach(ent => ent.Id = (long)rows[ent]["ID"]);
            //entidadesExternas.ForEach(ent => ent.IDExterno = (long)rows[ent]["ID"]);

            // actualizar índices de pesquisa
            foreach (GISADataset.ControloAutRow caRow in produtorRows)
                produtoresID.Add(caRow.ID.ToString());

            foreach (GISADataset.ControloAutRow caRow in assuntoRows)
                assuntosID.Add(caRow.ID.ToString());

            foreach (GISADataset.ControloAutRow caRow in tipologiaRows)
                tipologiasID.Add(caRow.ID.ToString());

            var niveisDocumentais = nRows.Select(r => r.ID.ToString()).ToList();
            GISA.Search.Updater.updateNivelDocumental(niveisDocumentais);
            GISA.Search.Updater.updateNivelDocumentalComProdutores(niveisDocumentais);
            GISA.Search.Updater.updateProdutor(produtoresID);
            GISA.Search.Updater.updateAssunto(assuntosID);
            GISA.Search.Updater.updateTipologia(tipologiasID);

            return true;
        }