LibreOffice Base, como excluir mais de um registro ao mesmo tempo?

tenho as seguintes macros:

1 - Para excluir todos os registros:

Sub btn_excluir_sw_all

Dim Form1, SubForm_1, oConsulta, cmb_softw, cons_subtab As Object, sSQL1, sSQL2 As String

Set Form1=Forms("frm_licenca_sw")
Set SubForm_1 = Form1.Controls("Subform")
Set cons_subtab = SubForm_1.form.Controls("Controle_de_tabela_1")
Set cmb_softw=Form1.Controls("txtSoftware")
oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("cons_subtab_licenca_sw")
nome_soft = cmb_softw.Value
sSQL1 = ("DELETE FROM `c06`.`tab_licenca` WHERE `software` = '" & cmb_softw.Value & "';")
RunSQL(sSQL1)

mClose(acForm, "frm_licenca_sw")
OpenForm "frm_licenca_sw"

End Sub 

2 - Para excluir um registro selecionado:

Sub btn_excluir_sw_selec

Dim Form1, SubForm_1, oConsulta, cmb_softw, cons_subtab, txtM, txtS As Object, sSQL As String

Set Form1=Forms("frm_licenca_sw")
Set SubForm_1 = Form1.Controls("Subform")
Set cons_subtab = SubForm_1.form.Controls("Controle_de_tabela_1")
Set txtM = cons_subtab.Controls("TextField1")
Set txtS = cons_subtab.Controls("TextField2")
Set cmb_softw=Form1.Controls("txtSoftware")
oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("cons_subtab_licenca_hw")
nome_soft = cmb_softw.Value
sSQL = ("DELETE FROM `c06`.`tab_licenca` WHERE `cod_hw` = '" & txtM.Value & "' AND `software` = '" & txtS.Value & "';")
RunSQL(sSQL)

mClose(acForm, "frm_licenca_sw")
OpenForm "frm_licenca_sw"

End Sub 

Minha dúvida é: Se eu utilizo as variáveis txtM para armazenar o valor da célula na coluna (Textfield1) e txtS para armazenar o valor da célula na coluna (Textfield2) do controle de tabela no subformulário, como armazenar mais valores se eu selecionar mais de 1 registro para excluir?

Do jeito que tá ele só deleta 1 registro, no caso o que está com o foco, mesmo selecionando manualmente vários registros.

Desde já agradeço…

Olá,

O problema parece não ser questão de armazenamento em variáveis. O fato é que para conseguir quais foram os registros selecionados manualmente é preciso acessar o Controlador do Controle Tabela.

No código abaixo, depois de uma pesquisa e uma mistura entre o framework Acess2Base e a API UNO original do LibO, consegui que os registros selecionados fossem exibidos.

Você pode adaptá-lo, executando uma instrução “DELETE” dentro do Loop For Each…Next:

Sub BotExcluirSelecoes_Click()
Dim mRegistrosSel() As Variant, nRegistro As Variant
Dim oForm As Object, oModelTab As Object
Dim oCtrldorTab As Object, oRcdSet2 As Object
Dim sRegistro As String, sTmp As String
	
	
	oForm = Forms("FormProdutos") 'Formulário
	oModelTab = oForm.Controls("CtrleTabela1").ControlModel 'Model Controle Tabela
	oRcdSet2 = oForm.RecordSet.Clone() 'Clone do Recordset do Form
	
	'Obter o controlador do Ctrle Tabela (API UNO original)
	oCtrldorTab = ThisComponent.CurrentController.getcontrol( oModelTab )
	mRegistrosSel = oCtrldorTab.getSelection 'Registros selecionados
	
	If ubound( mRegistrosSel ) = -1 Then 
		MsgBox "Por favor, selecione o(s) registro(s) que deseja excluir!",48
		Exit sub
	End If
	
	For Each nRegistro in mRegistrosSel 'Para cada registro selecionado 
  		oRcdSet2.AbsolutePosition = nRegistro 'pula para o registro
  		sRegistro = oRcdSet2.Fields(1).Value 'String da Coluna "Nome"
 		sTmp = sTmp & nRegistro & ". " & sRegistro & Chr(10)
	Next

	MsgBox sTmp
End Sub


Print do código em ação:

Descrição da imagem

Atte,
Grafeno

Oi grafeno…muito obrigado mesmo por ter respondido a minha pergunta, e desculpe tanto tempo que demorei pra responder, acontece tive fora uns tempos, porém retornei com esse problema , eu testei aqui e funcionou, porém no meu projeto, esse controle de tabela fica num subformulário e naum no form principal, como apontar para o subform?

O subform, o controle de tabela, não tem o método recordset…só form principal, aí na hora de aparecer a caixa , ela lista registros da fonte de dados do form princpal o que não é o que eu quero, e sim a fonte de dados da grid…pode me ajudar?

Obrigado pela Ajuda Grafeno.

Consegui adaptar o código de forma a apontar o recorset para o subformulário e programar a instrução delete dentro do laço, segue a solução:

Sub btn_excluir_sw_selec()
Dim mRegistrosSel(), nRegistro As Variant
Dim oForm, SubForm_1, oModelTab, oCtrldorTab, oRcdSet2, oRcdSet1, cmb_softw As Object
Dim sRegistro, mRegistro As String

    oForm = Forms("frm_licenca_sw") 'Formulário
    SubForm_1 = oForm.Controls("Subform")
    cmb_softw=oForm.Controls("txtSoftware") 
    oModelTab = SubForm_1.form.Controls("Controle_de_tabela_1").ControlModel 'Model Controle Tabela
    Set oRcdSet1 = Application.CurrentDb().OpenRecordset("cons_subtab_licenca_sw")
    Set oRcdSet2 = oRcdSet1.Clone()  
    
    'Obter o controlador do Ctrle Tabela (API UNO original)
    oCtrldorTab = ThisComponent.CurrentController.getcontrol( oModelTab )
    mRegistrosSel = oCtrldorTab.getSelection 'Registros selecionados

    If ubound( mRegistrosSel ) = -1 Then 
        MsgBox "Por favor, selecione o(s) registro(s) que deseja excluir!",48
        Exit sub
    End If

    For Each nRegistro in mRegistrosSel 'Para cada registro selecionado 
        oRcdSet2.AbsolutePosition = nRegistro 'pula para o registro
        mRegistro = oRcdSet2.Fields(0).Value 'String da Coluna "Maquina"
        sRegistro = oRcdSet2.Fields(1).Value 'String da Coluna "Software"
        sSQL = ("DELETE FROM `c06`.`tab_licenca` WHERE `cod_hw` = '" & mRegistro & "' AND `software` = '" & sRegistro & "';")
		RunSQL(sSQL)
		        
    Next
	
	nome_soft = cmb_softw.Value
    mClose(acForm, "frm_licenca_sw")
	OpenForm "frm_licenca_sw"
	
End Sub

Só não sei porque instrução “requery” no meu Libreoffice 5 não atualiza o formulário e a instrução “reload” também não é reconhecida, por isso eu tenho que fechar o formulário (“mClose”) para depois reabrí-lo (“OpenForm”), porém ainda sim ele realiza a contento o objetivo de excluir registros selecionados.

Muito obrigado mesmo