com.sun.star.lang.DisposedException

Depois de instalar a última versão do LibreOffice no swriter, no windows 10 comecei a receber
esta mensagem tramada e aborrecida porque trava a minha macro e não numera mais o meu
documento automáticamente: com.sun.star.lang.DisposedException
Não consigo perceber o que tenho que fazer. Tanto trabalho (para principiante) , quando tudo estava pronto para colocar em produção sai-me esta, às tantas terei de voltar à versão anterior.
Por favor alguém me ajuda. Obrigado

Poderia postar a macro :slight_smile:

Bom dia,
Criei uma macro que atribui o Último numero de documento gravado numa dada pasta +1 e o atribui ou grava num campo REFA. A questão é saber se antes de salvar em disco (BeforePost) há como Interceptar o Nº (ver imagem, pintado azul) de modo a garantir que o N.º do documento gravado em disco não é diferente do nome atribuído automáticamente ou ao menos atribuir um readonly a esse campo uma vez que o Nome é atribuído e enviado à interface pela macro? Obrigado

Se a macro esta somando +1 no ultimo arquivo gravado, não vejo necessidade de conferir se esta certo. Não entendi.

Se postar a MACRO, alguém poderá analisar se pode ocorrer erro.

Boa tarde/bom dia,
Sim a macro está somando; está tudo como pensado, e o user recebe o popup para gravar o “AAAA-1293 odt”, só que o user
continua a dispor da possibilidade de mudar o nome (NREFA) para algo diferente de “AAAA-1293 odt” e eu não posso permitir que o faça, sob pena de não ter a garantia de que o ODT escrito em disco corresponda exatamente à referência (REFA); digamos que preciso de algo muito semelhante à “integridade referencial”, e esta é a fase 1 do projeto.
Na fase 2, todos os dados, porque há mais(além da “REFA”: N/ data e hora, utilizador que criou e que editou, assunto, VREFA, VDT, etc… ) e por último uma barra de certificação electrónica a gravar no final depois do rodapé;
posto isto,os dados serão gravados numa base de dados Firebird (não o são de imediato porque o problemas de acesso ao FB ainda não consegui resolver, mas como funciona via ODBC, vou ver)!
Ainda tenho isso pendurado e estou a estudar como fazer essa gravação pois ela visa implementar um “Livro de Registo de Correspondência Recebida” electrónico.
Do que entendi, até agora, terei que fazer duas chamadas à API StoreDocument(oDoc, FilterNames, sFileNmDoc, sPath) p/ gravar em disco e uma outra StoreDocument(oDoc, FilterNames, sFileNmDoc, sPath, 1) para gravar na base de dados.
Todavia ainda não encontrei um exemplo que faça essa gravação dos campos de um formulário em um ODT numa base de dados! Conhece algum?
Daí que o user não deve poder mudar o nome aquando da gravação. E desde que ele possa mexer eu não tenho como garantir que esse é o nome do documento final e que corresponde mesmo àquela referência.
Pode ajudar? Obrigado
Atentamente

Gilberto Schiavinatto via Ask LibreOffice <noreply@ask.libreoffice.org> escreveu no dia quinta, 22/09/2022 à(s) 03:36:

1 Like

Terei o maior gosto postar, não só a macro como a ideia (de simular um escritório eletrónico , amador(!) mas p/f deixe-me lantes impar o código (sou principiante em basic)!
Atentamente

Gilberto Schiavinatto via Ask LibreOffice <noreply@ask.libreoffice.org> escreveu no dia quinta, 22/09/2022 à(s) 03:36:

1 Like

Ainda não entendi completamente a demanda, porém, vou levar em consideração esta parte de seu comentário:

.
Se deseja atribuir um índice/incremento em cada arquivo criado, de modo que o nome não se repita, seria uma macro relacionada a manipulação de diretórios/arquivos. (O QUE EU ENTENDI)
.
Trecho de exemplo para manipulação de Diretório:

oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
' Abrir retorna 1 (true), Cancelar retorna 0 (false)
	If oFilePicker.Execute() then
		sTemp()			= oFilePicker.getFiles()		' Seleciona apenas 1 arquivo
		sPastaOrigem	= ConvertFromUrl(sTemp(0))		' A partir da Url,
		sArqNome		= Dir$(sPastaOrigem, 16)		' Obtem nome do arquivo com extensão
		sArqData		= CDateToISO(sPastaOrigem)		' Data em formato ISO
		
		' Obtem apenas último diretorio
		sTemp	= Dir(sPastaDestino, 16)
		
		' Enquanto retornar pastas, contar diretorios e construir Url da pasta destino com base na data
		i = 0
		Do While (sTemp <> "")
			i = i + 1
			sPastaDestino = sPastaDestino & GetPathSeparator()
			sPastaDestino = sPastaDestino & Left(sArqData, 4) & GetPathSeparator		' Pasta ano
			sPastaDestino = sPastaDestino & Right(sArqData, 4) & GetPathSeparator	' Pasta mes/dia
			sPastaDestino = sPastaDestino & "00" & CStr(i)								' Pasta incremento +1
			
			' Se diretorio já existir, desfazer caminho com data para criar um novo com incremento
			If FileExists(sPastaDestino) Then
				sPastaDestino = Left(sPastaDestino, Len(sPastaDestino) - 14)
			End If
			sTemp = Dir(sPastaDestino, 16)
		Loop
		
		' Se pasta não existir, criar
		If Not FileExists(sPastaDestino) Then
			MkDir sPastaDestino
		End If
		
		' Copia o arquivo para o diretório criado
		sPastaDestino = sPastaDestino & GetPathSeparator() & sArqNome
		FileCopy(sPastaOrigem, sPastaDestino)
		
	Else
		Stop
	End If

.
O exemplo acima obtem o arquivo de um local, para armazenar em outra pasta, a qual possuirá sempre uma numeração sequencial, sem se repetir, em cada qual estará um arquivo.
.
O ideal é que poste a macro que o senhor desenvolveu exatamente para ser apontado o “erro”, ou a melhor direção para funcionamento da mesma.