Como utilizar controle de tabela no formulário Calc

Bom dia,

Alguém sabe como utilizar o controle de tabela em um formulário no calc? Ele aparece nas ferramentas, mas não fica disponível apenas se utilizá-lo na planilha ao invés do formulário.

1 Like

Olá Amigo Grafeno, teria como voce me ajudar na questão desta tabela? Como eu consigo programaticamente localizar e deletar uma linha desta tabela ?

Bom dia, Companheiro sou principiante em Basic.
Parabéns pelo exemplo, mas não tem um idêntico ao “controle-tabela-dialog” onde a “fonte de dados” em vez de ser CALC seja uma “base de dados” com o logon feito por programa, a partir de um consulta ou query. Ex: Minhabase.ODB (uso um acesso ao Firebird via ODBC) porque o acesso nativo no LbOff. Ver 7.3.5 ainda dá muito problema. Obrigado
Atentamente

Grafeno boa tarde como poderei fazer isto, a variável INTERVALO não está definida previamente:
oIntervalo = oPlan.getCellRangeByPosition(0,1,3,UltimaLinha(oPlan))
usando uma TABELA de base de dados ?
Pode ajudar? Obrigado

@dosreis57
Já deu uma olhada no arquivo exemplo aqui?

Infelizmente nenhum deles ajuda! É uma pena!

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

Boa noite / madrugada de 2.ª feira por aqui PT/Azores 00H50m
Eureka já faz tudo programado… monta o DBgrid. Falta implementar no meu exemplo este aqui.
Agora isto em 300.000 record deve ser um carroção daqueles do Farwest do como aquele em que viajava o “tiradentes”.
Ah! não esqueça criar o Dialog1, é importante
Aqui tem o link: https://forum.openoffice.org/en/forum/viewtopic.php?t=91358
Assim que implementar o meu exemplo mando-lhe para partilhar na rede
Penso que deve ser por aqui:

’ Preencher com dados

datamodel = Gridmodel.GridDataModel 'rem é um outro tipo de Grid Parece-me

oResult = oQuery.executeQuery(sSql)
If NOT IsNull(oResult) AND NOT IsEmpty(oResult) Then
iRecord=1
while oResult.next()
DataModel.AddRow( CStr( iRecord ) , Array(" Campo1 ", iCampo2, iCampo3 etc…))
DataModel.AddRow( CStr( iRecord ) , Array(oResult.getString(1),oResult.getString(2),oResult.getString(3)) ’ Não há-de falter muito. amanhã continuo
'datamodel.addRow(“a”, Array(“foo”, 100,20))
'datamodel.addRow(“b”, Array(“bar”, 200,300,400)) 'datamodel.addRow(“c”, Array(“hoge”, 300))
'datamodel.addRow(“d”, Array(“huga”, 400))

isFound = True
iRecord = iRecord + 1
wend 'Fim do While
End If ’ NOT IsNull(oResult) AND NOT IsEmpty(oResult) Then

If isFound=False then
iRsp = 0
iRsp = MsgBox(“Não existe! Tentar de novo?”, 1, “Confirma?” )
If iRsp=1 Then
Goto GoNIF
Else
Goto GoFim
End if ’ i
else
’ não faz nada
End if ’ isNotFound

Ainda tem muito que fazer.
Tenho que descansar Boa noite

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

Exemplo Totalmente funcional. Está a dar-me um problema ao abrir a 1.ª vez porque criei o dialog no próprio documento e não em: “DialogLibraries”

Deve haver um modo de dizer que não é no geral mas no local.
Gostaria de partilhar consigo o 2.º exemplo.
Num form vazio, crie um botão de comando e dialog1.
Copie e cole código abaixo nas Macros; ligue o onclick do form à macro “Dialog_with_Grid” e corra.
Parece perfeito não sei, mas pareceu-me que andava a procura do mesmo que eu?!
Por acaso não sabe sabe como fazer um LOCATE(“CampoChave”, Chave, etc…
Não encontrei nada disso; pelos vistos tenho que correr as linha todas do grid até encontrar o campo/coluna com o valor que no input da pesquisa!?
Não é nada prático mas se não houver outro modo vai ter de ser

REM ***** BASIC *****
Dim dlg
dim oDlg as variant
Sub Dialog_with_Grid
Dim x, y, mx as string
Dim z, n as Integer

'run Standard Dialog1
oDlg = CreateUnoDialog(DialogLibraries.Standard.getByName(“Dialog1”))

'create Grid
oGridModel = oDlg.Model.createInstance(“com.sun.star.awt.grid.UnoControlGridModel”)
oGridModel.Name = “myGrid”

With oGridModel

.ShowColumnHeader = True
.ShowRowHeader = false
.HScroll = false
rem.VScroll = True
.Sizeable = True
.Step = 0

End with

oColumnModel = createUnoService(“com.sun.star.awt.grid.DefaultGridColumnModel”)

Titlesarray=array(“Title1”,“Title2”,“Title3”,“Title4”,“Title5”,“Title6”,“Title7”,“Title8”,“Title9”,“Title10”)
Valuesarray=array(“Value1”,“Value2”,“Value3”,“Value4”,“Value5”,“Value6”,“Value7”,“Value8”,“Value9”,“Value10”)

’ add columns

for i=0 to ubound(Titlesarray)
oColumn = createUnoService(“com.sun.star.awt.grid.GridColumn”)
oColumn.Title = Titlesarray(i)
oColumn.Resizeable=true
oColumn.ColumnWidth=32
oColumn.Flexibility=false
oColumnModel.addColumn(oColumn)
next
oGridModel.ColumnModel = oColumnModel

’ add Rows
oDataModel = createUnoService(“com.sun.star.awt.grid.DefaultGridDataModel”)
for i=1 to 10
x=Cint(i)
Valuesarray=array(“Vrl-1.”+x,“Vrl-2.”+x,“Vlr-3.”+x,“Vlr-4.”+x,“Vlr-5.”+x,“Vlr-6.”+x,“Vlr-7.”+x,“Vlr-8.”+x,“Vlr-9.”+x,“Vlr-10.”+x)
oDataModel.addRow(cint(i), Valuesarray)

next i

oGridModel.GridDataModel = oDataModel

’ create Grid-Controlelement
oGridControl = createUnoService(“com.sun.star.awt.grid.UnoControlGrid”)
oGridControl.setModel(oGridModel) 'das Model zuweisen

’ add Grid-Controlelement to Dialog
oDlg.addControl(“tab_g1”, oGridControl)
’ set Position and Size of Grid-Controlelement (try!)
’ Left, Top, Width, Height
oGridControl.setPosSize(10,40,775, 335, com.sun.star.awt.PosSize.POSSIZE)

REM add a button model
oButtonModel = oDlg.model.createInstance(“com.sun.star.awt.UnoControlButtonModel”)
oButtonModel.Name = “Value_Button”
oButtonModel.Width = 100
oButtonModel.Height = 15
oButtonModel.PositionX = 68
oButtonModel.PositionY = 155
oButtonModel.Label = “Selecione a coluna”
oButtonModel.PushButtonType = com.sun.star.awt.PushButtonType.STANDARD
oDlg.model.insertByName(“Value_Button”, oButtonModel)
oValue_Listener = CreateUnoListener(“Value_Listener_”,“com.sun.star.awt.XActionListener”)
oCmdValue = oDlg.getControl(“Value_Button”)
oCmdValue.AddActionListener(oValue_Listener)

’ run Dialog
oDlg.execute()
’ remove action listener after
oDlg.getControl(“Value_Button”).removeActionListener(oValue_Listener)

End Sub

rem—action listener for button
Sub Value_Listener_actionPerformed( oEv As com.sun.star.awt.ActionEvent )
if NOT oDlg.getControl(“tab_g1”).hasSelectedRows() then 'keine markierte Zeile=nenhuma linha marcada
msgbox “Por favor selecione um valor!”
exit sub
end if
'a_linha não faço nada com isso mas mais tarde vou ter de carrega a linha inteira coluna a coluna para preencher
’ o formulário
aZeile = oDlg.getControl(“tab_g1”).model.GridDataModel.getRowData(oDlg.getControl(“tab_g1”).getCurrentRow)
x=""
y=""
z= oDlg.getControl(“tab_g1”).CurrentRow + 1
n= oDlg.getControl(“tab_g1”).CurrentColumn+ 1

x= Cint(z)
y= Cint(n)
mx=""
mx= "Linha: " + x + " Coluna: "+ y
msgbox mx
End Sub

Sub Value_Listener_disposing( oEv As com.sun.star.lang.EventObject)
End Sub
'======================================================================

Mário Reis <mariodosreyx@gmail.com> escreveu no dia segunda, 24/10/2022 à(s) 01:41:

Boa tarde,

Acredito que por formulário você esteja se referindo às caixas de diálogo do LibreOffice Basic. Nesse caso, os controles de tabela infelizmente não são acessíveis pela interface, apenas por código.

Abaixo coloco um exemplo de controle de tabela em diálogo:



**Código:**
REM  *****  BASIC  *****

Dim oDialogo As Object
Dim oTabela As Object

Sub IniciarDialogo
   DialogLibraries.LoadLibrary("Standard")
   'Usando a variável declarada no começo do módulo'
   oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("Dialogo1") )

   'Criar controle tabela'
   oTabela = oDialogo.Model.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
   with oTabela
     .PositionX = 10
     .PositionY = 10
     .Width = 171
     .Height = 85
   end with
    
   'Adicionar as colunas'
   oDoc = ThisComponent
   oPlan = oDoc.Sheets(0)
   
   oColunas = oTabela.ColumnModel
   oCol = oColunas.createColumn()
   oCol.Title = oPlan.getCellRangeByName("A1").String
   oCol.ColumnWidth = 20 'Definir largura'
   oCol.Flexibility = False 'Para fixar largura'
   oColunas.addColumn(oCol)
   
   oCol = oColunas.createColumn()
   oCol.Title = oPlan.getCellRangeByName("B1").String
   oColunas.addColumn(oCol)
   
   oCol = oColunas.createColumn()
   oCol.Title = oPlan.getCellRangeByName("C1").String
   oColunas.addColumn(oCol)
   
   oCol = oColunas.createColumn()
   oCol.Title = oPlan.getCellRangeByName("D1").String
   oCol.ColumnWidth = 30 'Definir largura'
   oCol.Flexibility = False 'Para fixar largura ao iniciar'
   oColunas.addColumn(oCol)
   
   'Inserir o controle tabela no diálogo'
   oDialogo.Model.insertByName("Tabela", oTabela)

   'Carregar'
   oDialogo.Execute()
   oDialogo.Dispose()
End Sub

Sub CarregarDados
   oDoc = ThisComponent
   oPlan = oDoc.Sheets(0)
   oIntervalo = oPlan.getCellRangeByPosition(0,1,3,UltimaLinha(oPlan))
   
   oTabela = oDialogo.getControl("Tabela").Model
   oDadosTab = oTabela.GridDataModel
   oDadosTab.removeAllRows
   mDados = oIntervalo.DataArray
   
   For i= 0 to UBound(mDados)
      oDadosTab.addRow("", mDados(i))
   Next i
End Sub

Function UltimaLinha( oPlan )
   oCursor = oPlan.createCursor
   oCursor.gotoEndOfUsedArea(True)
   UltimaLinha = oCursor.Rows.Count-1
End Function

Atte,
2 Likes

Bom dia Grafeno, cada vez me surpreendo mais com o que se pode fazer via programação com o libreoffice. Obrigado!

Posso parecer chato, mas gostaria que o amigo @Grafeno postasse a macro na resposta além do arquivo, por dois motivos: 1) A simples leitura do código já pode dar a luz na solução, 2) não corremos o risco de macro com problema ao baixar. Obrigado.

@ohallot, chato de maneira alguma. Em 99% das minhas postagens (com macro), coloco o código no corpo da resposta porque acho mais direto e também pelo motivos apresentados. Neste caso específico, como iria ficar um pouco grande, e estava com pressa, deixei sem. Ademais, retificado agora! Valeu!

O exemplo é muito bom. O problema é que acabo de chegar ao basic e às macros.
Necessito do mesmo exatamente mas para usar a partir do libre c/ swriter e com uma
tabela bem grandinha 300 mil linha com 20 colunas com “zip code” e selecionar uma linha
retornando cerca de metade dos campos; mas essa parte eu consegui fazer no meu form.
Como faço uma vez que não quero ter as linhas do scalc aberto por trás, mas apenas a consulta
à tabela e com parâmetros(para ter menos registos e ser mais rápida a consulta).
Fiz colocando a consulta no form e com visible/invisible. Funciona, mas apresenta-se
horrível(!) do ponto de vista estético. Alguém me pode ajudar.
Obrigado