LO Base: alterar conteúdo de campo de TableControl em sub-formulário

Prezados,

Estou usando um LO 5.2.2.2.2 em um Ubuntu 16.10 (mas volta e meia preciso trabalhar com o mesmo projeto em um Ubuntu 12.04, LO 4.4.7.2), com banco HSQLDB externo. Anexo a este post seguem uma base de exemplo e um screenshot do diagrama.

Eu possuo duas tabelas no formato principal - detalhes. Ou seja, uma tabela que possui os dados principais, como ID de pedido, cliente, datas etc. em cada linha, e uma outra, detalhes, relacionada à primeira, com N linhas para cada linha da primeira tabela, como os itens de um pedido.

Para editar essas duas tabelas eu montei um formulário, vamos chamá-lo de pai, e dentro deste um subformulário, o filho. Para isso usei o wizard do LibreOffice Base, que deu bom resultado - a navegação funciona direitinho.

No subformulário é usado um controle de tabela, que reflete o conteúdo da tabela filho. O formulário todo acabou assim:

Eu preciso alterar via LO Basic (ou seja, programaticamente) um campo do Table Control. Como eu faço isso? Neste exemplo é um campo formatado, que recebe o resultado da conta Qtd * Preço * (1-Desc). No caso real vai ser um campo texto no qual eu vou inserir uma combinação dos outros campos, montando uma frase.

Por exemplo, preciso ler um dos campos do formulário-pai, ler o conteúdo do “Source Column” no Table Control (que está no subform), combiná-los e guardar o resultado no “Select” do Table Control. Como esse campo está atrelado a uma coluna da tabela filho, eu também preciso fazer esse conteúdo ser gravado nela.

Graças à ajuda do Grafeno, aqui no Fórum, eu aprendi a fazer isso em formulários simples, ou seja, a combinar o conteúdo de vários controles em um outro, e fazê-lo gravar no campo de tabela associado a este outro controle. Agora preciso fazer o mesmo com controles em subformulários. Para piorar, não é qualquer controle: é um TableControl. Fiz algumas buscas na web mas não consegui entender/usar o pouco que achei sobre esse controle, menos ainda sob subforms e praticamente nada dos dois combinados.

Grato pela atenção,

Fábio

Anexos:

Olá. Seria interessante você disponibilizar uma versão do arquivo .odb com dados fictícios. O Ask aceita arquivos anexos, basta editar sua pergunta e anexar o arquivo. Acontece que para “manipular” os campos do form, subform e do controle tabela é preciso ver a estrutura em detalhes. Apenas com esta imagem fica impraticável. Atte,

Obrigado, Grafeno. Entendi e vou subir um anexo. Como estou usando um HSQLDB à parte, independente, vou precisar migrar para o do LO, e vou levar uns dias até ter tempo. []s.

Grafeno, atualizei o post com um Base de exemplo que contém uma base (meu banco de treinamento, Beltrano) e um formulário emulando a minha situação. Também troquei a imagem da pergunta, mostrando um exemplo concreto. Obrigado pela sugestão. :wink:

Boa tarde,

Uma solução poderia ser usar o evento “Antes da Alteração do Registro” do Subformulário, que acontece antes do ponteiro mudar (pular) para outro registro. E como o controle em questão é um Table Control, significa que sempre que for ocorrer uma mudança de linha, primeiro o cálculo será executado e a coluna (campo) alterada.

  • Navegador de formulários > botão direito mouse: SubForm > Propriedades > Aba Eventos > Antes da Alteração do Registro

Sub Antes_AlterarRegistro( oEvento )
' SubForm > Eventos > Antes da alteração do Registro
   
   ' Garantir que a fonte é um SubForm
   If oEvento.Source.ImplementationName <> "com.sun.star.comp.forms.ODatabaseForm" Then Exit Sub
   
   oSubForm = oEvento.Source
   ocTabela = oSubForm.getByName("SubForm_Grid")
   
   vQtde = ocTabela.getByName("QUANTIDADE").CurrentValue
   vPreco = ocTabela.getByName("PRECO_UNITARIO").CurrentValue
   vDesc = ocTabela.getByName("DESCONTO").CurrentValue

   If vQtde = 0 Or vPreco = 0 Then Exit Sub
   
   oSubTotal = ocTabela.getByName("TOTAL_ITEM")
   vSubTotal = oSubTotal.CurrentValue

   ' Calcular
   vTmpSub = vQtde*vPreco*(1-vDesc)
   
   If vTmpSub = vSubTotal Then Exit Sub
   
   ' Aterar o campo vinculado (Boundfield) a
   ' coluna SubTotal
   oSubTotal.BoundField.updateFloat( CSng(vTmpSub) )
   
   If oSubForm.isNew Then ' se um novo registro
      oSubForm.insertRow()
   Else ' se um registro já existente
      oSubForm.updateRow()
   End If
   
End Sub

O Controle de Tabela é um conjunto de controles empilhados, o qual, pode-se dizer, tem por característica refletir o *"ResultSet"* do seu Formulário/SubFormulário. E como o controle da coluna é um **campo formatado**, para evitar maiores complicações, é melhor atualizar diretamente o campo vinculado (Boundfield) deste.


Atte,