Controlo de Tabela em um dialog; SO: c/ WIN10, LibreOffice 7.3.5.2

Boas tardes,
No formulário o “Controlo de Tabela” ou DBGRID funciona como na imagem. Porém ao construir um dialogo o controlo de tabela não funciona, ou é bug, ou, mais provável não chego lá.
Tal fosse a necessidade estaria resolvido com o grid visivel/invisivel mesmo no form. Ainda tenho que
ver como dando 2clicks no registo trago o valor para do campo(Col,Lin) do Grid para o campo do Form. Mas fica uma apresentação horrível! Feio de morte!
Acontece que no formulário eu assignei a base de dados e a tabela(um simples e velho DBF para testar) , mas no Dialog não tem como dizer em modo desenho, o que alimenta o DBGRID (dava jeito algo como os DbConnector/Datasource/DataSet, “à lá Delphi/Lazarus”, quem sabe com o tempo;
ou então, como nos documentos.!?
Alguém conhece uma forma de por a funcionar com o desenho de dialogo sem ter que escrever
o código todo à unha!?

image

Olá,
Observe que não há controle de tabela em uma caixa de diálogo. Está rotulado incorretamente no IDE. Esse controle é um controle de grade e NÃO reconhece dados. É por isso que você precisa mover todos os dados por código.

Grato pelo esclarecimento. De qualquer forma entendemos que estamos a falar de um grid ainda não do dbgrid que os Formularios já suportam pelo menos a partir do Libre/writer 7.3.5; com toda a certeza que está ao corrente que o controlo de tabela ou Dbgrid já funciona nos forma do writer e cálculo. No dialog ainda não., ok.
Mas então quanto aos dados oriundos de uma tabela? Como determinar a dimensão da matriz, o n.o de colunas e linhas a carregar no grid. É o meu dilema para construir u DialogHelp para apoio dos users?

A sábado, 8/10/2022, 18:56, Ratslinger via Ask LibreOffice <noreply@ask.libreoffice.org> escreveu:

Aqui neste swriter formulário o controlo de tabela ou dbgrid funciona ainda que feio de morte mas ainda não no dialog

A sábado, 8/10/2022, 23:49, Mário Reis <mariodosreyx@gmail.com> escreveu:

Demo_ControloDeTabela.odt (434 KB)

O problema é que eu não sei o que você tem atualmente para o diálogo e o que você quer terminar.

Quanto às colunas, você decide o que deseja exibir na grade. Você deve definir cada coluna para estar na grade.

Para linhas, o número para isso pode ser obtido executando uma consulta na macro para gerar uma contagem dos registros a serem selecionados.

Então o número de colunas e a contagem de linhas da consulta é sua matriz.

aqui estão muitas peças para isso e cada peça tem variações. Aqui estão alguns links para várias informações (há links nos links):

https://dev.api.openoffice.narkive.com/HG4gG4m2/grid-control-on-ooo-3-3-0

Obrigado eu vou estudar estes post que me colocou aqui. De qualquer forma eu vou também deixar sublinhado o que , salvo melhor opinião, me faz falta neste momento.
No exemplo do Grafeno :
oTabela = oDialogo.getControl(“Tabela”).Model
oDadosTab = oTabela.GridDataModel
oDadosTab.removeAllRows

depoisn a matriz(Colunas) é Objecto(?) é => oIntervalo = oPlan.getCellRangeByPosition(0,1,3,UltimaLinha(oPlan))

Só que o oIntervalo não está definido antes é definido ali na linha que pega o oPlan (Sheeet).getCellRangeByPosition(0,1,3,UltimaLinha(oPlan)) , admitoque seja um objecto
mas de que tipo? Só mostra isto:
oIntervalo = oPlan.getCellRangeByPosition(0,1,3,UltimaLinha(oPlan)) E na Tabela da Base de Dados! Que Metodo/Função usar aqui para garantir que retorna oIntervalo.DataArray
mDados = oIntervalo**.DataArray** este imagino que seja retornado do oPlan.GetCellRangeByPosition( colunas.0,1,3, até última linha Lastrecord? )
For i= 0 to UBound( mDados)
oDadosTab.addRow("", mDados(i))
Next i

É esta a minha dificuldade: oIntervalo.DataArray! É aqui que tudo encrava.
De qualquer modo obrigado.
Atentamente

Ratslinger via Ask LibreOffice <noreply@ask.libreoffice.org> escreveu no dia domingo, 9/10/2022 à(s) 00:42:

Estou perdido com seu último comentário, pois não sei qual é o exemplo do grafeno.
.
Exemplo encontrado. No futuro sempre forneça o link e não faça as pessoas procurarem por ele.

.
Você terá dificuldade em se conectar a um banco de dados com base em não entender esse código.

0Plan = Sheet(0)

Cria uma matriz de dados de várias linhas de A2 a D6:

oIntervalo = oPlan.getCellRangeByPosition(0,1,3,UltimaLinha(oPlan)

Talvez mais claro, substitua estas linhas:

   For i= 0 to UBound(mDados)
      oDadosTab.addRow("", mDados(i))
   Next i

com estas:

      oDadosTab.addRow("", Array(12,"Hello54","There","NoNo")
      oDadosTab.addRow("", Array(82,"Hello","ThereYou","NoYes")
      oDadosTab.addRow("", Array(77,"Hello5a","There","No")

e execute a caixa de diálogo

Também tive um pouco de dificuldade para trazer os dados do Base para uma Grid na Caixa de Diálogo, mas resolvi da seguinte forma:

Sub PreencherGridControlComAddRows()
    Dim oGridControl As Object
    Dim oDBContext As Object
    Dim oDataSource As Object
    Dim oConnection As Object
    Dim oSQLStatement As Object
    Dim oResultSet As Object
    Dim SQL As String
    Dim RowData() As Variant
    Dim AllRows() As Variant
    Dim RowCount As Integer
'-------------------------------------------------------------------'
    ' Conectar ao banco de dados'
    oDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
    oDataSource = oDBContext.getByName("nome-do-banco") ' Substitua pelo nome do seu banco de dados'
    oConnection = oDataSource.GetConnection("", "") ' Insira usuário e senha se necessário'
'-------------------------------------------------------------------'
    ' Executar a consulta SQL'
    SQL = "SELECT campo1, campo2 FROM nome-da-tabela"
    oSQLStatement = oConnection.createStatement()
    oResultSet = oSQLStatement.executeQuery(SQL)
'-------------------------------------------------------------------'
    ' Considerando que já tenha incluído os objetos na Tabela'
    ' Limpar o GridControl antes de adicionar novos dados'
    oGridControl.removeAllRows()
'-------------------------------------------------------------------'	
	' Inicializar a variável para armazenar todas as linhas'
    RowCount = 0
    Do While oRowSet.next()
        ' Criar uma matriz de 02 colunas para a linha atual'
        RowData = Array(oRowSet.getString(2), oRowSet.getString(3))
		
        ' Expandir a matriz AllRows para adicionar a nova linha'
        ReDim Preserve AllRows(RowCount)
        AllRows(RowCount) = RowData

        RowCount = RowCount + 1  
    Loop
'-------------------------------------------------------------------'
    ' Adicionar todas as linhas ao GridControl de uma vez'
    If RowCount > 0 Then
        oGridControl.addRows( AllRows , AllRows )
    End If
'-------------------------------------------------------------------'
    ' Fechar a conexão e liberar recursos'
    oResultSet.close()
    oConnection.close()
End Sub

Vale lembrar que o código acima pode ser utilizado numa planilha exclusiva para conectar com o Banco de Dados do Base e trazer as informações para caixa de diálogo. Para trazer os dados para a planilha é mais tranquilo.

Dê uma olhada neste tópico, talvez auxilie.
.

.
----EDIT----
Acho que encontrei uma solução, ao menos temporária, talvez, para seu problema.
.

.
Deixo um arquivo .odt, com comentários nas macros para facilitar, e um link para um DataBase, de exemplos. (Baixe os dois)
.
Ask_GridControl.odt (19,8,KB)

Obrigado Filipe,
Não ajuda nada, infelizmente! É tudo acerca de scalc/sheets planilhas ou folhas de cálculo!!!
Eu necessito desesperadamente de um exemplo com tabelas de base de dados. o Acesso aos dados está feito; também não foi facil, mas já está,
agora como os “Dialogs” não têm suporte para “Controlo Table” tem de ser tudo escrito na mão, mas até agora só apareceram cenas com planilhas
e nada com base de dados!?!?
Eu percebi a técnica não abona nada (é para profissionais da programação) porque é necessário dominar amplamente as possibilidades todas de todos os controlos
Impossível para principiantes e a falta de suporte no modo design do diálogos para “controlo de tabelas” não me parece nada razoável. o delphi 1 em 1995 win3.11
já tinha isso em 3 clicks você controlava em uma folha semelhante a uma planilha tudo o que precisava fazer numa tabela não apenas mostrar e localizar, mas
inserir, modificar, deletar; tudo em design modo; no fox (create window ntop, nleft, nbottom, nright open tabela in window xpto,
no clipper c/ browse ou dbedit em 1984, um pouco mais trabalhoso, mas nada de transcendente.
Aqui nem consigo mostrar, porque não tenho como dizer diretamente este controlo de tabela usa aquela consulta ou tabela?!
Tenho que carregar um arrey com os dados da tabela mas antes tenho que calcular o Interválo?
Então e se a tabela tiver 500/1000 linhas com 30 ou 40 colunas; já não posso usar o “controlo de tabela”?
Francamente 27 anos depois!
Não faço ideia como seja no excel, mas aqui é um forte handicap e vai afastar muita gente do Libre. Ah lá isso vai!
Desculpe, eu gostava de ser simpático, mas tb acho que é necessário dar uma nota aos “gurus” as dificuldades sentidas na prática.
De qualquer forma o meu muito obrigado
Atentamente

Felipe Alé via Ask LibreOffice <noreply@ask.libreoffice.org> escreveu no dia sábado, 8/10/2022 à(s) 12:46: