Pergunte aqui
0

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

perguntadas 2015-08-17 18:29:40 +0200

imagem do gravatar de LuizCarlos18RJ

updated 2016-04-17 03:06:51 +0200

imagem do gravatar de Grafeno

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...

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

2 Respostas

1

respondidas 2015-09-18 16:27:43 +0200

imagem do gravatar de LuizCarlos18RJ

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

editar assinalar como ofensivo Excluir Link mais
1

respondidas 2015-08-20 16:13:48 +0200

imagem do gravatar de Grafeno

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

editar assinalar como ofensivo Excluir Link mais

Comentários

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?

imagem do gravatar de LuizCarlos18RJLuizCarlos18RJ ( 2015-09-08 15:49:16 +0200 )editar

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?

imagem do gravatar de LuizCarlos18RJLuizCarlos18RJ ( 2015-09-14 18:57:24 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2015-08-17 18:29:40 +0200

Lidas: 227 vezes

Última atualização: Sep 18 '15