質問する

LuizCarlos18RJ's profile - activity

2019-06-05 20:10:05 +0200 バッジを受け取った  卓越した質問 (source)
2019-01-25 17:42:57 +0200 バッジを受け取った  ネクロマンサー (source)
2018-10-01 02:49:45 +0200 ベストアンサーマーク Como recriar esta macro do VBA / MSAccess para o OoBasic do LibreOffice Base?

Fala galera, to tentando migrar um bd de Access para Base, mas possui macro VBA e nunca vi material na net que ensinasse o OooBasic, ele não tem o recurso que o access tinha de ao digitar o "." ponto) abrir uma janela com métodos e propriedades que a gente podia usar ali no controle. segue o código.

Private Sub btnExcluir_Click()
On Error GoTo Err_btnExcluir_Click

   Dim item As Variant
   Dim S As String
   Dim M As String

   For Each item In lstSoftware.ItemsSelected
      S = "'" & lstSoftware.ItemData(item) & "'"
      M = "'" & txtMicro & "'"
      DoCmd.RunSQL ("DELETE * FROM licenca " _
                  & "WHERE cod_hw = " & M & " AND software = " & S & ";")
    Next item

   lstSoftware.Requery

Exit_btnExcluir_Click:
   Exit Sub

Err_btnExcluir_Click:
   MsgBox "Exclusão Cancelada"
   Resume Exit_btnExcluir_Click
End Sub
Private Sub btnIncluir_Click()
On Error GoTo Err_btnIncluir_Click

    DoCmd.RunSQL ("INSERT INTO licenca (cod_hw,software) " _
                 & "VALUES (txtMicro, txtSoftware);")
    txtSoftware = ""
    lstSoftware.Requery

Exit_btnIncluir_Click:
    Exit Sub

Err_btnIncluir_Click:
    MsgBox ("Inclusão Cancelada")
    Resume Exit_btnIncluir_Click

End Sub

Private Sub txtMicro_AfterUpdate()
   lstSoftware.Requery
End Sub

Private Sub txtMicro_Change()

End Sub
Private Sub btnFechar_Click()
On Error GoTo Err_btnFechar_Click

    DoCmd.Close

Exit_btnFechar_Click:
    Exit Sub

Err_btnFechar_Click:
    MsgBox Err.Description
    Resume Exit_btnFechar_Click

End Sub

------------------------------------------------------------------------------------

Option Compare Database
Option Explicit
Private Sub btnFechar_Click()
On Error GoTo Err_btnFechar_Click

    DoCmd.Close

Exit_btnFechar_Click:
    Exit Sub

Err_btnFechar_Click:
    MsgBox Err.Description
    Resume Exit_btnFechar_Click

End Sub

Private Sub txtSoftware_AfterUpdate()
   lstMicro.Requery
   txtLic = txtSoftware.Column(1)
   txtInst = lstMicro.ListCount
   If IsNumeric(txtLic) Then
      txtSaldo = txtLic - txtInst
    Else
       txtSaldo = ""
    End If
End Sub

------------------------------------------------------------------------------------

Option Compare Database
Option Explicit

Private Sub txtMicro_AfterUpdate()
   lstSoftware.Requery
End Sub

Private Sub txtMicro_Change()


End Sub
Private Sub btnFechar_Click()
On Error GoTo Err_btnFechar_Click

    DoCmd.Close

Exit_btnFechar_Click:
    Exit Sub

Err_btnFechar_Click:
    MsgBox Err.Description
    Resume Exit_btnFechar_Click

End Sub


-----------------------------------------------------------------------

Por favor esse código em VBA em compreendo, mas não sei nada na sintaxe do OoBasic, as macros em Basic são completamente malucas pq não sei como é a API UNO do Libre.

2018-10-01 02:49:41 +0200 バッジを受け取った  ネクロマンサー (source)
2018-10-01 02:49:41 +0200 バッジを受け取った  自己学習者 (source)
2017-04-04 16:23:21 +0200 バッジを受け取った  有名な質問 (source)
2016-11-22 00:42:35 +0200 バッジを受け取った  有名な質問 (source)
2016-10-10 20:33:33 +0200 バッジを受け取った  人気の質問 (source)
2016-09-19 20:30:43 +0200 質問をする Como aumentar o zoom do "controle de tabela"?

Mais uma vez aqui precisando da ajuda de vcs.

Criei um form em branco e dentro dele adicionei o controle chamado "controle de tabela" que exibe os resultados de uma consulta a qual foi indicada em seu campo "fonte de dados".

O problema é que eu consigo redimensionar o controle e alterar a cor de fundo, mas na exibição dos dados em si, os caracteres saem muito pequenos a ponto de ser horrível visualizá-los.

Nas propriedades desse controle de tabela, tentei alterar o tamanho da fonte, altura da linha, porém sem sucesso, embora o controle permite ajuste de novos valores, na hora de visualizar e modo dinâmico, nada acontece.

Minha versão do libre é Versão: 5.1.3.2 ( windows 7 professional edition )

Alguém pode me ajudar?

2016-08-17 19:36:26 +0200 バッジを受け取った  卓越した質問 (source)
2016-07-31 16:02:16 +0200 バッジを受け取った  卓越した質問 (source)
2016-07-30 01:14:17 +0200 バッジを受け取った  人気の質問 (source)
2016-07-26 20:50:29 +0200 質問をする Como criar uma macro que copia uma tabela em outro BD?

Minha dúvida é a seguinte:

  • Eu abro arquivos .csv no meu banco de dados .odb, mas quando se "vincula" eles não são editáveis ( modo leitura )e por causa disso quando se faz consultas mais complexas, o Libreoffice não dá suporte as funções.

Eu queria se através de macro tem como automatizar a tarefa de copiar uma tabela (tabela1 - campos e valores ) de um banco ( BD1.odb ) cuja essa tabela vem da vinculação de um arquivo( arquivo1.csv ) na mesma pasta.

Eu queria uma macro no meu segundo banco ( BD2.odb ) que executasse ums instrução sql ou comandos internos de macro que copiasse a estrutura e dados da tabela1 em BD1.odb e colasse como uma nova tabela tabela2 em BD2.odb.

Mas por que isso?

R: Porque a "tabela2" em "BD2.odb" seria editável e eu poderia ter a liberdade de fazer minhas consultas livremente ao invés do "BD1.odb" cuja "tabela1" é a vinculação de um arquivo .csv (arquivo1.csv ) cujo modo é somente leitura e atrapalha na hora de criar consultas.

È possível isso? Uma macro para copiar e colar uma tabela de um banco em outro?

Desde já agradeço...

2016-07-26 20:29:35 +0200 バッジを受け取った  有名な質問 (source)
2016-05-31 18:50:37 +0200 コメント付き回答 Consultas no Base - como agrupar registros?

Grafeno, acho que descobri algo: a minha tabela não é nativa, eu "importo" um arquivo de texto .csv, será que tabelas vinculadas o base não consegue aplicar funções? meu caso é parecido com o deste link:

Vincular texto

Tem algum modo de escrever em "HSQLDB" para "copiar" a tabela tipo:

SELECT * INTO newtable FROM oldtable ou CREATE newtable AS (SELECT * FROM oldtable)

pois caso fosse possível criar

2016-05-31 15:50:23 +0200 バッジを受け取った  見習い編集者 (source)
2016-05-31 14:43:51 +0200 質問に回答する Consultas no Base - como agrupar registros?

Oi grafeno Obrigado pela ajuda...

Vou repostar aqui a resposta excluída afins de consultas futuras...

No Access ela ficava assim:

Descrição da imagem

em SQL:

SELECT DISTINCTROW TOP 5 relatorio.usuario, relatorio.dept, relatorio.status, Sum(relatorio.qtd) AS [Soma De qtd]
FROM relatorio
GROUP BY relatorio.usuario, relatorio.dept, relatorio.status
HAVING (((relatorio.status)="Completed"))
ORDER BY Sum(relatorio.qtd) DESC;

Oi grafeno, infelizmente aqui não deu certo olha o erro:

Descrição da imagem

Descobri algo: minha tabela "RELATORIO" é um arquivo vinculado do tipo .csv testei que numa tabela não-nativa, as consultas não aceitam FUNÇÕES.

Fiz o teste "importando" os dados para uma tabela HSQLDB nativa e deu certo, o meu problema é que o usuário gera um arquivo do tipo .csv de uma página web e é a partir dele que eu conecto o meu bando de dados, aí neste caso fica a seguinte pergunta:

1 - Tem alguma maneira ou macro de "importar" os dados automaticamente? Pois não queria "vincular" a tabela a partir de um arquivo externo de texto e sim "importá-lo" via macro para criar tabelas nativas de modo que as consultas SQL funcionem a contento.

2016-05-30 03:32:33 +0200 バッジを受け取った  卓越した質問 (source)
2016-05-25 22:50:39 +0200 バッジを受け取った  人気の質問 (source)
2016-05-25 14:06:22 +0200 質問に回答する Consultas no Base - como agrupar registros?

A consulta ficou assim no modo sql:

SELECT "qtd" "qtd", "usuario" "usuario", "dept" "dept", "status" "status" FROM "relatorio" WHERE "qtd" > 5 AND "status" <> 'Cancelled' ORDER BY "qtd" DESC

e no modo design:

Descrição da imagem

Agradeço desde já...


Oi Grafeno, obrigado, mas essa execução não deu certo o campo soma aparece em branco como na imagem:

Descrição da imagem

O que pode ser? eu fiz no MSAccess e deu certo, mas como passo essa sql do access pro base, olha só:

No Microsoft Access


SELECT DISTINCTROW TOP 5 relatorio.usuario, relatorio.dept, relatorio.status, Sum(relatorio.qtd) AS [Soma De qtd]
FROM relatorio
GROUP BY relatorio.usuario, relatorio.dept, relatorio.status
HAVING (((relatorio.status)<>"Cancelled"))
ORDER BY Sum(relatorio.qtd) DESC;


-------------------------------------------------------------


No LibreOffice Base:


SELECT DISTINCT "T1"."usuario",
  (SELECT SUM("relatorio"."qtd")
   FROM "relatorio"
   WHERE "relatorio"."usuario" = "T1"."usuario"
     AND "relatorio"."status" <> 'Cancelled'
   ) AS "soma",
  "T1"."dept",
  "T1"."status"
FROM "relatorio" AS "T1"
WHERE "qtd" > 5
  AND "status" <> 'Cancelled'
ORDER BY "soma" DESC
  LIMIT 5

veja na imagem:

Descrição da imagem

egue em anexo o link com a minha tabela, pra ver se vc consegue.

Basta importar como tabela no base

relatorio.xls

Agradeço desde já

2016-05-25 14:04:04 +0200 質問に回答する Função do Data Base do LibreOffice

A consulta ficou assim no modo sql:

SELECT "qtd" "qtd", "usuario" "usuario", "dept" "dept", "status" "status" FROM "relatorio" WHERE "qtd" > 5 AND "status" <> 'Cancelled' ORDER BY "qtd" DESC

e no modo design:

Descrição da imagem

Agradeço desde já...

2016-05-25 13:25:38 +0200 質問に回答する Criar Executável - BASE

Infelizmente O LibreOffice ainda não tem o recurso que o MSAccess tinha de criar um arquivo ".mde" ( executável ) a partir de um .mdb, porém tem sim como ter um banco multiusuário.

O Segredo é ao invés de vc fazer o formulário e as tabelas somente no LibreOffice Base usando o HLSQL que é "nativo", "local", vc usa um SERVIÇO DE BANCOS DE DADOS rodando online num servidor tipo o MYSQL, POSTGREE, MARIADB, ORACLE todos esses são SGBDS nos quais vc pode criar as tabelas e elas ficarem disponíveis na rede para acessar de qualquer estação de trabalho, e a parte de "Front End" ( formulários, consultas e relatórios, enfim a interface com o usuário ) vc fazer no LibreOffice Base.

Quem usa LibreOffice, normalmente quer gasto mínimo com software proprietário, deste modo usar o MYSQL que é livre como serviço de Banco de dados pra guardar tabelas e o LibreOffice Base como front end, é uma solução muito viável.

Como Front End vc pode disponibilizar o arquivo ".odb" do LibreOffice Base na Rede ( samba se o servidor for linux ou Active directory na Microsoft ou Novell ) e cada usuário criar um "atalho" ou até mesmo fazer uma cópia para sua própria estação de trabalho, deste modo a aplicação se torna multiusuário.

2016-05-24 19:25:53 +0200 質問をする Consultas no Base - como agrupar registros?

Oi eu tenho uma consulta assim:

Descrição da imagem

gostaria de agrupar registros com o mesmo nome de usuário e SOMANDO as quantidades do mesmo usuário, desse modo a fazer uma consulta "TOP 5" usuários que mais tem pontos, como fazer?

2016-05-23 04:44:20 +0200 バッジを受け取った  人気の質問 (source)
2016-05-21 14:41:10 +0200 バッジを受け取った  自己学習者 (source)
2016-05-20 18:12:42 +0200 質問に回答する Consultas no Base - Como retornar registros apenas do mês atual?

Pra quem precisar futuramente, ficou assim:

consulta base mês atual.PNG

Descrição da imagem

2016-05-20 18:11:08 +0200 コメント付き回答 Consultas no Base - Como retornar registros apenas do mês atual?

Obrigado mesmo, era isso, não sabia da existência do CURDATE().

2016-05-20 18:09:58 +0200 コメント付き質問 como manipular dispatcher?

Sim... me perdoe, eu a repostei sem querer, eu queria aprender a navegar no site da api uno que é muito confuso.

2016-05-19 20:09:37 +0200 質問をする Consultas no Base - Como retornar registros apenas do mês atual?

essa é a minha dúvida, no calc pode fazer assim:

MONTH(NOW())

Mas e no Base? eu quia colocar como critério de consulta no modo design uma função para registros apenas do mês corrente e não sei como, pode tb ser por sql.

Alguém pode me ajudar?

2016-05-19 20:06:37 +0200 質問をする como manipular dispatcher?

Existe algum material que explicasse melhor essas chamadas ao UNO para eu poder invocar botões, grids e usar suas propriedades, as ferramentas msi e Xray não me listam nada só quando o objeto é invocado por serviços tipo ( "con.sun.star..." ), mas se eu uso a sintase do access2base, Ex:

Sub Calcular

Dim soma, var1, var2 as integer, form1, txt1, txt2,scrol,resultado as Object

Set form1=Forms("frm_jogadores") txt1=form1.Controls("Campo numérico 1") txt2=form1.Controls("Campo numérico 2") scrol1=form1.Controls("Barra de rolagem 1") resultado=form1.Controls("result")

var1=txt1.Value

var2=txt2.Value

soma=(var1+var2)*2

resultado.Value= soma scrol1.Value=50 form1.Refresh End Sub

Se eu usar o MRI ou o Xray para form1, txt1,scrol1 ( como no exemplo acima ) ele não me lista método, nem propriedade nenhuma ele só lista em objetos invocados com "con.sun.star..."

tipo assim: oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("cons_subtab_licenca")

aí sim se seu uso o MRI ou X-ray para oConsulta, eles funcionam...

e Daí que vem a minha dúvida: o senhor tem material que me ensinem como invocar e saber quais serviços existem no UNO tipo:

"con.sun.star.frame.DispachHelper" "con.sun.star.container.XNameAcess" "com.sun.star.style.ParagraphStyle" 'com.sun.star.view.XSelectionSupplier" "com.sun.star.text.TextField.PageNumber" "com.sun.star.style.NumberingType.ARABIC" "com.sun.star.text.FieldMaster" Era isso o que eu precisava to a quase 1 ano e nada, sou noob, iniciante em linux, não sei inglês e apesar de estar estudando, to muito frustrado...

Agradeço pela atenção...

Atenciosamente

2016-05-05 14:16:32 +0200 編集された回答 Relatório entre 2 datas variáveis

Caro colega...

Vc pode criar uma consulta com datas como critério, assim também como pode crirar uma "consulta parâmetro" que abre uma caixa de diálogo pedindo o valor assim como se faz no MSAccess.

No LibreOffice base para manipular os critérios de data ou parâmetro, ou ambos vc pode utilizar:

No modo Design:

>= :A_Informe_Data_Inicial AND <= :B_Informe_Data_Final

No Modo SQL:

SELECT "campo1" "campo2", "campoN" FROM "SUATABELA" WHERE "data" >= :A_Informe_Data_Inicial AND "data" <= :B_Informe_Data_Final ORDER BY "data" ASC

Espero ter ajudado...

2015-12-04 02:39:18 +0200 バッジを受け取った  有名な質問 (source)
2015-11-04 03:00:03 +0200 バッジを受け取った  有名な質問 (source)
2015-09-29 18:05:25 +0200 コメント付き回答 Como usar a API UNO para escrever macros?

eu queria entender como navegar nesse site tb...

2015-09-28 18:47:57 +0200 バッジを受け取った  卓越した質問 (source)
2015-09-24 20:50:11 +0200 バッジを受け取った  人気の質問 (source)
2015-09-23 15:26:40 +0200 ベストアンサーマーク 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...

2015-09-23 15:26:39 +0200 バッジを受け取った  自己学習者 (source)
2015-09-23 15:26:39 +0200 バッジを受け取った  ネクロマンサー (source)
2015-09-19 19:43:03 +0200 質問に回答する Como obter o número da linha de um grid?

Veja a minha pergunta: "LibreOffice Base, como excluir mais de um registro ao mesmo tempo?"

https://ask.libreoffice.org/pt-br/que...

Nessa minha pergunta, o nosso amigo Grafeno gentilmente me forneceu um trecho de código que resolveu meu problema, eu apenas tive que adaptar alguma coisa a realidade do meu formulário, porém nesse código ele exibe a linha do número de um registro selecionado na grid, que é o que vc quer.

Segue o código:

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

Então basicamente pra resumir vc deve seguir os passos:

1 - Além de crirar variáveis do tipo "Object" para referenciar os controles do formulário como no caso o formulário princial ( ou no seu caso a planilha )e o objeto grid, vc tb deve criar variváveis do tipo "variant" para variáveis que vão usar os métodos "getselect" ( registro selecionado ) e "absoluteposition" ( valor da posição absoluto )

2 - Referenciar os controles e criar um "RecordSet.Clone()" da fonte de dados da sua grid que se for a mesma do formulário o código seria:

    oForm = Forms("FormProdutos")                                                 'Referencia seu Formulário principal
    oModelTab = oForm.Controls("CtrleTabela1").ControlModel          'Referencia sua grid
    oRcdSet2 = oForm.RecordSet.Clone() '                                        'Clone do Recordset do Form

 'Referencia o controlador da sua gris ( necessário)
    oCtrldorTab = ThisComponent.CurrentController.getcontrol( oModelTab )

    mRegistrosSel = oCtrldorTab.getSelection                                   'Registros selecionados

   For Each nRegistro in mRegistrosSel 'Para cada registro selecionado 
        oRcdSet2.AbsolutePosition = nRegistro                                   'recebe o valor da linha da grid selecionada
        sRegistro = oRcdSet2.Fields(1).Value                                     'String uma coluna qualquer"

 ' exibe assim:  Número da linha . texto qualquer do(s) registro(s) selecionado(s)

        sTmp = sTmp & nRegistro & ". " & sRegistro & Chr(10)   

    Next

    MsgBox sTmp

Saída: ( NO CASO DE 3 REGISTROS SELECIONADOS)

 1.texto1
13.texto13
22.texto22 

mas se a grid tiver outra fonte de dados como uma consulta por exemplo vc referencia assim:

 oForm = Forms("FormProdutos")                                                                                  'Referencia Form principal
 oModelTab = oForm.Controls("CtrleTabela1").ControlModel                                           'Referencia sua grid
 Set oRcdSet1 = Application.CurrentDb().OpenRecordset("nome_da_consulta_da_grid")   ' Referencia dados da grid
 Set oRcdSet2 = oRcdSet1.Clone()                                                                                'Clona o recordset

No segundo caso o restante do código é o mesmo do primeiro, no fim ia exbir a(s) linha(s) selecionada(s) e a posição dessa(s) linha(s).

Espero ter ajudado...