Inputar dados no banco de dados ODB via formulário Calc

Boa tarde Pessoal,

Seria possível criar um formulário no calc com as seguintes campos:

Data, Turno, Código, Defeito A, Defeito B, Total Def, Total Prod, Máquina?

E depois eu resgatar essas informações para montar um relatório? É muita informação para criar uma outra aba e inputar tudo, teria que ser em banco de dados mesmo porque é mais seguro.

Sds,

Boa noite,


Veja a resposta (e comentários) da questão abaixo :

Edição 13/08: Correção do exemplo


BancoDefeitos.odb (Exemplo - Registre antes de usar a planilha)

PlanilhaFonte.ods (Com a macro abaixo)

Sub SalvarDadosBD()
Dim oPlan As Object, oDBC As Object, oBD As Object, oConexao As Object, oDeclaracao As Object
Dim oBloco As Object, vData As Double
Dim sData As String, sTurno As String, sCodigo As String, sMaquina As String 
Dim sDefeitoA As String, sDefeitoB As String, sDefeitoC As String, sDefeitoD As String
Dim sQtdTotalRef As String, sTotal As String, sNome_Tabela As String, sCampos As String
Dim sValores As String, sSQL As String, sBanco As String

   ' Obter a planilha com campos'
   oPlan = ThisComponent.Sheets.getByName("PlanForm")   
   
   ' Pegar o valor do campo data'
   vData = oPlan.getCellRangeByName("C2").Value
   ' Sair se o campo data estiver vazio'
   If vData = 0 Then Exit Sub
   ' Formatar a data para inserir no banco'
   sData = Year(vData) & "-" & Month(vData) & "-" & Day(vData)
   ' Recuperar os demais campos da planilha'
   sTurno = oPlan.getCellRangeByName("C3").String
   sCodigo = oPlan.getCellRangeByName("C4").String
   sMaquina = oPlan.getCellRangeByName("C5").String
   sDefeitoA = oPlan.getCellRangeByName("C6").String
   sDefeitoB = oPlan.getCellRangeByName("C7").String
   sDefeitoC = oPlan.getCellRangeByName("C8").String
   sDefeitoD = oPlan.getCellRangeByName("C9").String
   sQtdTotalRef = oPlan.getCellRangeByName("C10").String
   sTotal = oPlan.getCellRangeByName("C11").String
   
   ' Preparar a instrução SQL'
   sNome_Tabela = " ""Defeitos"" " 
   sCampos = """Data"",""Turno"",""Codigo"",""Maquina"",""DefeitoA""," & _
             """DefeitoB"",""DefeitoC"",""DefeitoD"",""QtdTotalRef"",""Total"""
   sValores = "'" & sData & "','" & sTurno & "','" & sCodigo & "','" & sMaquina & _
              "','" & sDefeitoA & "','" & sDefeitoB & "','" & sDefeitoC & "','" & _
              sDefeitoD & "','" & sQtdTotalRef & "','" & sTotal & "'"
   ' Tratar as células em branco com Null'
   sValores = Replace( sValores, "''","Null")
   ' Configurar a cláusura INSERT INTO'
   sSQL = "INSERT INTO " & sNome_Tabela & " (" & sCampos & ") VALUES (" & sValores & ")" 
   
   ' Obter a conexão ao Banco Defeitos'
   sBanco = "BancoDefeitos" 'O banco PRECISA estar registrado.
   oDBC = createUnoService( "com.sun.star.sdb.DatabaseContext" )
   If Not oDBC.hasByName( sBanco ) Then
      Msgbox "É preciso registrar o banco '" & sBanco & "' antes de prosseguir.",64
      Exit Sub
   End If
   oBD = oDBC.getByName( sBanco )
   oConexao = oBD.getConnection( "","" )
   
   ' Executar o SQL'
   oDeclaracao = oConexao.createStatement()
   oDeclaracao.executeUpdate( sSQL )
   
   ' Fechar a conexão e liberar a memória'
   oDeclaracao.close()
   oConexao.close()
   oDeclaracao = Nothing
   oConexao = Nothing
   
   MsgBox "Dados salvos na tabela '" & sNome_Tabela & "'!",0
   
   ' Limpar as células'
   '   Parâmetro: Valor(1)+Data/Hora(2)+Texto(4) = 7'
   oBloco = oPlan.getCellRangeByName("C2:C11")
   oBloco.ClearContents( 7 )
End Sub


Para resgatar as informações, você pode usar o método descrito na resposta a:
Atte,

Exemplo.ods

Boa noite @grafeno!

Peso sinceras desculpas por não ter conseguindo responder ontem… Seria mais o menos como está nesse exemplo, não consegui montar o banco de dados… Minha ideia é a partir depois montar uma caixa de dialogo que os campos.

Se puder me ajudar eu fico grato.

Obrigado!

@mdiego, para adaptar a macro precisamos saber qual o tipo de dados que cada campo terá no banco de dados. Por exemplo, o campo “Máquina” receberá texto, inteiro ou decimal? O ideal é você montar o banco odb de exemplo, com alguns registros já inseridos e anexar na sua pergunta para que possamos ajudar.

@mdiego, se possível teste o exemplo. Desculpe a demora em responder.

@Grafeno

Boa tarde Antônio,

Show de bola… Conhecimento invejável! Deu certinho… Agora minha pergunta é: Seria possivel eu resgatar essas informações do banco de dados? Exemplo, selecionar máquina Z e de data X a Y

Máquina CNC Período 21/02/2016 - até 21/07/2017?

Testei e deu erro caso um dos campos esteja Vazio “”. Seria possível corrigir?

Muito obrigado!

@mdiego, acabei de ajustar a macro da planilha para tratar os valores das células em branco como Null. Agora não ocorrerá mais o erro.

O resgate de info. que vc pretende é possível, desde que se use as Consultas. Daí sugiro que busque a documentação disponível do Base a respeito e SQL. A partir do momento que você comece a se familiarizar com estes temas, vai conseguir extrair todo poder do BD. Só queria destacar que as consulta salvas podem ser importadas pelo método que mostrei na resp.

@grafeno, Show de bola mestre!

Que conhecimento…

Por gentileza, poderia me informar onde encontro a documentação do base?

Vou começar estudar.

Obrigado.

@mdiego, o ponto de partida é seção Documentação em português do site da LibreOffice. Consulte o Guia de Introdução e o Introdução ao OpenOffice.org Base.