Como Referenciar Elemento de Formulário em Macro?

Bom dia pessoal,

Estou tentando fazer algo um pouquinho complicado.

Estou fazendo um formulário de controle de inventário para a fábrica onde trabalho.
No formulário, o usuário deverá poder selecionar o produto que quer inventariar e digitar a quantidade. Mas ai pensei, ele precisa ver a unidade de medida daquele produto para cadastrar corretamente. A unidade de medida já faz parte da tabela cadastro_produto. Então, baseado em sua escolha de produto pela listbox do inventario, outra listbox roda uma query que busca a unidade de medida correspondente à aquela do produto selecionado. O problema é que não consigo acessar a listbox dos produtos pelas macros.

Segue o código abaixo:

Sub Atualiza_Unidade_Medida

Dim oForm as Object
Dim oNomeProduto as Object
Dim oUnidadeMedida as Object

oForm = ThisComponent.Drawpage.Forms.getByName("CadastroInventario")

oNomeProduto = oForm.getByName("lbNomeProduto")

DIM oSQL_Statement AS OBJECT 
DIM stSql AS STRING 
DIM oResult AS OBJECT
DIM iResult AS INTEGER
oSQL_Statement = oConnection.createStatement()

stSql = "SELECT Unidade_Medida FROM Cadastro_Produto WHERE Nome_Produto = " + oNomeProduto.getText()
oResult = oSQL_Statement.executeQuery(stSql)
oForm.getByName("tbUnidadeMedida") = oResult

End Sub

A macro ja para no oForm dizendo com.sun.star.container.NoSuchElementException

Boa tarde,


O erro significa que não existe um objeto chamado "CadastroInventario" para o "**ThisComponent**".

Aí podemos ter duas causas “comuns”:

  1. Executar a macro diretamente na janela do Editor Basic. Dentro do Base quando rodamos as macros no editor o objeto “ThisComponent” passa a ser a próprio editor e não o banco de dados ou o formulário. É preciso, então, rodar a macro sempre a partir do Formulário: através de um botão, um evento ou pelo Menu Ferramentas > Macro > Executar macro….
  2. “CadastroIventario” ser nome do Formulário que é listado na janela principal do Base. Na verdade, ele vai ser um Documento do Writer que engloba os Formulários/SubFormulários (Contêineres) e que é armazenado no arquivo odb.
    Mas o que precisa ser passado ao método getByName é o nome do formulário (contêiner) que possui os controles. Geralmente o primeiro contêiner formulário é chamado “MainForm” porque é assim que é nomeado automaticamente pelo “Assistente de Formulário”. É possível ver o nome através do “Navegador de formulários” no modo de edição de Formulário.

Descrição da imagem

Então, a linha correta seria neste cenário:

oForm = ThisComponent.Drawpage.Forms.getByName("MainForm")

Atte,

Para esclarecer um pouco mais, vou deixar um link que mostra como acessar um controle a partir de um evento: LO Base: Como acessar o conteúdo de um controle em um form?

Muitíssimo obrigado!! Na verdade eu precisava mesmo referenciar o sub-form, mas depois que você me mostrou o método, apliquei o mesmo para o subform, referenciando ele a partir do mainform.
Deu certo :slight_smile:
Obrigado!

Apsan, como vc fez isso? o meu ta dando erro no oSQL_Statement = oConnection.CreateStatement()

O meu problema é um pouco diferente do seu, mas bem próximo.

O que preciso é pegar o idProduto da tabela produto e jogar no subform, e ao fazer isso ele pegar mais algumas informações sobre o produto como nome, preço…