Programando o LibreOffice Base. Parte 3

Hoje, examinamos o uso de caixas de diálogo ao editar dados no LibreOffice Base (OpenOffice Base). Como descobrimos em postagens anteriores, o formulário LibreOffice Base (OpenOffice Base) é na verdade uma instância do editor de texto do LibreOffice (OpenOffice) Writer. Para organizar a interface da janela dentro do formulário, são usadas caixas de diálogo - que são convenientemente criadas na interface visual interna, mas não têm suporte para comunicação com tabelas de banco de dados. Vamos organizar essa conexão com macros do OO Basic.

Vamos começar em ordem. Crie duas tabelas no banco de dados:

produtos
- id (número inteiro, chave primária)
- nome (string)

pedidos
- id (número inteiro, chave primária)
- productId (inteiro)
- contagem (inteiro)
- data (tipo de dados Data)

Crie o formulário de pedidos, adicione o elemento Formulário ao formulário com o nome de pedidos. Bem como controle de tabela com fonte de dados de pedidos. Como fazer isso foi discutido na Parte 2 de uma série de mensagens.

Ao definir as propriedades da coluna de data, preste atenção às propriedades marcadas na figura com setas que permitem exibir dados no formato desejado e use o calendário suspenso para selecionar uma data específica.

Desenhando
imagem

Agora, diretamente na tabela, você pode adicionar e modificar dados. Até certo ponto, isso é conveniente, semelhante ao trabalho usual de um cliente com um processador de tabela. Mas, em algum momento, começam os problemas que também são característicos do trabalho com processadores de tabela. Os dados podem ser alterados aleatoriamente, mesmo sem perceber. E tendo notado, é impossível reverter tudo como estava. Há pouco espaço para novos alto-falantes e pode ocorrer rolagem horizontal desagradável. Os títulos das colunas também têm um limite de tamanho (caso contrário, não caberão horizontalmente), e isso não permitirá uma descrição detalhada dos dados.

Como uma meia medida, você pode colocar campos regulares para entrada de dados ao lado da tabela (controle de texto, controle numérico, etc.). Defina os campos correspondentes da tabela de pedidos como uma fonte de dados e tudo funcionará. Ao navegar em um conjunto de dados, os dados nos campos de entrada serão alterados. Ao alterar dados nos campos de entrada, os dados na tabela do banco de dados serão alterados. Mas esta solução não ficará muito bonita.

Portanto, implementamos essa funcionalidade usando caixas de diálogo. Os diálogos têm uma limitação significativa. Os campos de entrada da caixa de diálogo não estão relacionados à tabela do banco de dados. Portanto, o preenchimento dos campos de entrada da caixa de diálogo da tabela do banco de dados e o salvamento dos campos de entrada na tabela do banco de dados precisarão ser feitos com a macro OO Basic. No entanto, isso é bom, porque permite que você considere as possibilidades de programar o OO Basic (antes disso, minhas mensagens descreviam trabalhar apenas com o ambiente, mas tudo isso foi uma preparação para a mensagem de hoje).

Para abrir o editor de Diálogo, você precisa selecionar no menu Ferramentas-> Macros-> Organizar Macros-> LibreOffice Basic-> Organizador-> Diálogo-> Novo | Editar | Excluir. Eu gostaria de ter uma maneira mais rápida de chegar a este editor. Depois disso, o editor de diálogo será aberto (infelizmente, não é o mais conveniente) no qual criaremos campos com os nomes dos campos na tabela do banco de dados. Como você se lembra, os Diálogos não se ligam automaticamente às tabelas do banco de dados, portanto, escreveremos uma macro para fazer isso. E, como convenção de nomenclatura, vamos definir os nomes dos campos de entrada e dos campos da tabela de banco de dados da mesma forma.

Um editor com um formulário final será mais ou menos assim:

Desenhando
imagem

Em seguida, adicione dois botões ao Diálogo. Daremos os nomes dos botões arbitrariamente, mas começando com um sublinhado, para distingui-los dos campos do banco de dados. Cada botão na paleta de propriedades pode receber uma ação. Vamos definir a ação OK para o botão - ele fecha a caixa de diálogo com a confirmação da ação. E o segundo - Cancelar - fecha a caixa de diálogo sem confirmar a ação.

Feche o editor de caixa de diálogo e retorne ao editor de formulários. Vamos criar um botão que chama a caixa de diálogo e atribuir o procedimento manipulador Order_Edit a ele, no qual preencheremos o diálogo da tabela de banco de dados FromBaseToDialog (oForm, oDialog) e salvaremos os dados da tabela de banco de dados de diálogo FromDialogToBase (oDialog, oForm).

Sub Order_Edit(Event) Dim oDialog As Object Dim orders As Object orders = Thiscomponent.DrawPage.Forms.GetByName("orders") DialogLibraries.LoadLibrary("Standard") oDialog = CreateUnoDialog(DialogLibraries.Standard.dialogOrder) FromBaseToDialog(orders, oDialog) If oDialog.Execute() = 1 Then FromDialogToBase(oDialog, orders) orders.UpdateRow() End If End Sub Sub FromBaseToDialog(oForm, oDialog) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then ODialog.GetControl(sName).SetText(oForm.Columns.GetByName(sName).String) End If Next I End Sub Sub FromDialogToBase(oDialog, oForm) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then oForm.Columns.GetByName(sName).UpdateString(Trim(oDialog.GetControl(sName).GetText())) End If Next I End Sub 

Supõe-se que o Diálogo foi salvo na biblioteca Padrão como dialogOrder. Naturalmente, você pode escolher outros nomes. Os nomes dos controles iniciados com sublinhados são ignorados e não são processados. Além disso, nomes começando com Label, que são usados ​​para cabeçalhos de campos de texto, não são processados.

Chamar oDialog.Execute () = 1 exibe a caixa de diálogo dentro da janela Formulários e pausa a macro até você clicar em OK ou Cancelar. Quando você clica em OK, o valor retornado é igual a um.

Source: https://habr.com/ru/post/pt445640/


All Articles