Controle de Formulário Inserir Arquivo

Caríssimos, boa tarde. Sou um usuário bem inexperiente e autodidata. Estou indo bem, mas enfrento o seguinte problema. Tenho um formulário que melhoraria muito se pudesse permitir ao usuário carregar arquivos writer. Usei o controle de formulário Inserir Arquivo. Deixei o arquivo que quero inserir, como teste, no mesmo diretório do banco. Consigo inserir o arquivo com sucesso, mas há dois problemas:

  1. Depois de efetuar o registro com o arquivo inserido, descobri que ao clicar no comando ele me abre o diretório, mas retorna a informação de que aquele tipo de arquivo não pode ser aberto por aquele programa. Mas isso é o de menos, afinal o diretório está aberto, o usuário tem o nome do arquivo e pode selecioná-lo facilmente - ele então abre.

  2. Esse é sério: o arquivo fica anexado a todos os registros, e não somente ao ativo. Não há a aba dados em propriedades do controle. Em propriedades do formulário, há, e há uma parametrização de ciclo. Padrão, Apenas Registro Ativo, Todos os Registros. A opção por qualquer um dos parâmetros não altera nada. Esse problema inviabiliza a melhora, e não sei mais o que fazer.

Meu sistema operacional é o Windows 11 e minha versão do LibreOffice 7.4.

Desde já grato,

André Falavigna

O arquivo selecionado através do botão em formulário do Base, só pode ser aberto utilizando macro. O base funciona apenas como frontend do banco de dados. Sendo assim, ele somente armazena a informação (dado, a depender do tipo) na tabela respectiva.

Entendi mais ou menos o que descreveu por experiência com projetos pessoais no Base. Tente esclarecer melhor o problema, por favor.

1 Like

Obrigado pela atenção. Vou mostrar o código e ver se você consegue me dar uma luz:

Sub InsertFile()
Dim oForm As Object
Dim oButton As Object
Dim oDialog As Object
Dim sFilePath As String
Dim sFileContent As String
Dim oField As Object

' Caminho do arquivo ODB com o endereço IP
sFilePath = "\\10.100.1.200\prazo\AQUINATE_PRODUCAO_V1_062023.odb"

' Obtenha o formulário "DistribuicaoTarefas"
oForm = GetFormFromODB(sFilePath, "DistribuicaoTarefas")

If Not IsNull(oForm) Then
    ' Obtenha o botão de inserção de arquivo
    oButton = oForm.getByName("Inserir_Arquivo")
    
    ' Abra a caixa de diálogo para selecionar o arquivo
    oDialog = createUnoService("com.sun.star.ui.dialogs.FilePicker")
    oDialog.initialize(Array())
    oDialog.execute()
    
    ' Obtenha o caminho do arquivo selecionado
    sFilePath = oDialog.getFiles().get(0)
    
    ' Leia o conteúdo do arquivo
    sFileContent = ReadFileContent(sFilePath)
    
    ' Obtenha o campo "Documentacao_I"
    oField = oForm.getByName("Documentacao_I")
    
    ' Defina o conteúdo do campo
    oField.Text = sFileContent
    
    ' Atualize o formulário
    oForm.reload()
Else
    MsgBox "Não foi possível encontrar o formulário DistribuicaoTarefas no arquivo ODB."
End If

End Sub

Function GetFormFromODB(sODBFilePath As String, sFormName As String) As Object
Dim oContext As Object
Dim oDBContext As Object
Dim oFormContainer As Object
Dim oForm As Object

On Error GoTo ErrorHandler

' Crie um contexto
oContext = CreateUnoService("com.sun.star.uno.UnoRuntime")

' Abra o arquivo ODB
oDBContext = oContext.createInstanceWithContext("com.sun.star.sdb.DatabaseContext", oContext.createUnoContext())
oFormContainer = oDBContext.getByName(sODBFilePath)

If Not IsNull(oFormContainer) Then
    ' Obtenha o formulário desejado
    oForm = oFormContainer.Forms.getByName(sFormName)
    
    If Not IsNull(oForm) Then
        Set GetFormFromODB = oForm
    End If
End If

Exit Function

ErrorHandler:
’ Lida com erros, se necessário

Set GetFormFromODB = Nothing

End Function

Ótimo, já que me disseram que só com macro eu conseguiria, via formulário, inserir um arquivo que está num diretório e gravá-lo num campo do banco. Mas ele sequer acha o primeiro objeto. Não entendo por quê.

Grato,

André

Quanto a isso, o LibO Base possui dois tipos de dados que podem ser compatíveis.
.


.

  1. Armazenar imagem (deixa o BD pesado): LONGVARBINARY
  2. Armazenar endereço do arquivo/diretório (recomendável): LONGVARCHAR
    .
    Na segunda opção, o BD fica mais leve e se faz necessário, para ficar fácil trabalhar, que exista um diretório específico para armazenamento dos arquivos.
    .
    Com essa opção você pode incluir/editar/excluir arquivos com macros, podendo minimizar problemas futuros com o BD.

Qual objeto da macro? sFilePath ou oForm?