Pergunte aqui
0

Como Referenciar Elemento de Formulário em Macro?

perguntadas 2016-12-19 13:54:55 +0200

imagem do gravatar de Apsan

updated 2016-12-19 19:59:16 +0200

imagem do gravatar de Grafeno

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

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

1 Resposta

1

respondidas 2016-12-19 19:55:53 +0200

imagem do gravatar de Grafeno

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,

editar assinalar como ofensivo Excluir Link mais

Comentários

Para esclarecer um pouco mais, vou deixar um link que mostra como acessar um controle a partir de um evento: https://ask.libreoffice.org/pt-br/que...

imagem do gravatar de GrafenoGrafeno ( 2016-12-19 19:57:45 +0200 )editar

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 :) Obrigado!

imagem do gravatar de ApsanApsan ( 2016-12-21 14:27:19 +0200 )editar

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...

imagem do gravatar de dajosodajoso ( 2017-01-10 02:24:08 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2016-12-19 13:54:55 +0200

Lidas: 271 vezes

Última atualização: Dec 21 '16