Antes de podermos usar um banco de dados, precisamos registrar a fonte de dados no OpenOffice.org. Pela interface gráfica esta tarefa é executada no diálogo Administração das Fontes de Dados (Menu Ferramentas / Fonte de Dados). Neste diálogo, notamos que uma fonte de dados contém quatro tipos básicos de informações:
a) Geral – sobre os aspectos da conexão com o banco de dados; b) Tabelas – quais tabelas serão utilizadas;
c) Consultas – os comandos SQL disponíveis;
d) Vínculos – ligações com documentos do OpenOffice.org, por exemplo formulários.
Os principais serviços e interfaces da API do OpenOffice.org, relacionados com banco de dados estão agrupados nos módulos:
Versão 2 Banco de Dados
Vejamos alguns serviços, relacionados com as fontes de dados. O ponto de entrada é o contexto de banco de dados, representado pelo serviço com.sun.star.sdb.DatabaseContext. Para criar um objeto DatabaseContext, chamamos a função createUnoService ( ):
oContexto = createUnoService ( “com.sun.star.sdb.DatabaseContext” )
Podemos obter as fontes de dados registradas, usando os métodos relacionados com as interfaces XNameAccess e XEnumeration, eis alguns deles:
hasByName ( sNome As String ) As Boolean getByName ( sNome As String ) As Variant getElementNames ( ) As String ( )
hasElements ( ) As Boolean hasMoreElements ( ) As Boolean nextElement ( ) As Variant
Lembre-se que, antes de usar os métodos de XEnumeration, uma enumeração deve ser criada com uma chamada ao método createEnumeration ( ).
Já temos as ferramentas necessárias para escrever um exemplo. Vamos exibir os nomes das fontes de dados registradas em nosso contexto de banco de dados. Digite a Sub
contextoBancoDados, abaixo, e execute para ver o resultado.
Sub contextoBancoDados '
Dim oContexto As Variant Dim sNomes() As String '
' cria o contexto de banco de dados
oContexto = createUnoService("com.sun.star.sdb.DatabaseContext") If oContexto.hasElements() Then
' obtem os nomes das fontes de dados sNomes = oContexto.getElementNames() ' exibe os nomes das fontes de dados sMsg = ""
For i = LBound(sNomes) to UBound(sNomes) sMsg = sMsg + sNomes(i) + Chr$(13) Next i
MsgBox sMsg Else
MsgBox "Nenhuma fonte registrada" End If
'
End Sub
Outro serviço da linha de frente é com.sun.star.sdb.DataSource, que representa um objeto fonte de dados. Ele tem várias propriedades e oferece diversas interfaces.
Antes de adicionar uma nova fonte de dados ao contexto, precisamos criar um objeto DataSource. Isto pode ser feito de duas maneiras:
oFonte = oDataContext.createInstance ( ) ' em desuso
oFonte = createUnoService ( “com.sun.star.sdb.DataSource” )
Para obter, apagar ou registrar uma fonte de dados no contexto de banco de dados, devemos usar os métodos da interface com.sun.star.uno.XNamingService do objeto DatabaseContext. getRegisteredObject ( sNome As String ) As < com.sun.star.uno.XInterface >
retorna o objeto fonte de dados com o nome sNome
registerObject ( sNome As String, oFonte As < com.sun.star.uno.XInterface >) registra o objeto oFonte como uma fonte de dados com o nome sNome
revokeObject ( sNome As String )
revoga a fonte de dados com o nome sNome
Eis algumas das propriedades do serviço com.sun.star.sdb.DataSource:
Propriedade Descrição
Name Nome da fonte de dados
URL URL do banco de dados (sdbc:subprotocolo:subname
ou jdbc ...)
User Nome de login do usuário
Password Senha do usuário
IsPasswordRequired Se True, uma senha será necessária IsReadOnly Se True, acesso somente para leitura
Vamos retomar o nosso exemplo e acrescentar código para adicionar uma nova fonte de dados ao contexto de banco de dados. Acrescente o código abaixo na Sub contextoBancoDados, execute a macro e verifique, através de Ferramentas – Fonte de Dados, se a nova fonte foi criada.
' ADICIONA UMA NOVA FONTE DE DADOS Dim oFonte As Variant
' cria uma instancia de fonte de dados
oFonte = createUnoService("com.sun.star.sdb.DataSource") ' oFonte = oContexto.createInstance()
' testa se a fonte já está registrada If oContexto.hasByName("Minha_Fonte") Then MsgBox "Minha_Fonte já registrada!" Exit Sub
Else
' registra a nova fonte no contexto
oContexto.registerObject("Minha_Fonte", oFonte)
' define a propriedade URL >>>> ALTERE PARA O SEU SISTEMA <<<< oFonte.setPropertyValue("URL", _
"sdbc:dbase:file:///D:/NAD/OPENOFFICE/BDados") End If
Versão 2 Banco de Dados
O objeto DataSource suporta algumas interfaces relacionadas com os tipos básicos de informações da fonte de dados, seguem as principais:
A interface com.sun.star.util.XFlushable, relacionada com o fluxo de dados entre o objeto e o banco de dados, contendo os métodos:
flush ( )
encaminha os dados do objeto conectado para o banco de dados addFlushListener ( )
removeFlushListener ( )
adiciona e remove “listeners” para o evento “flushed”
A interface com.sun.star.sdb.XQueryDefinitionsSupplier, com o método: getQueryDefinitions ( ) As < com.sun.star.container.XNameAccess > retorna o recipiente com as consultas definidas numa fonte de dados.
Através da interface com.sun.star.sdb.XBookmarksSupplier, podemos obter os vínculos dos documentos associados a uma fonte de dados, com uma chamada ao método:
getBookmarks ( ) As < com.sun.star.container.XNameAccess >
retorna uma coleção de cadeias com a localização dos documentos vinculados.
Vamos obter a nossa recém-criada fonte de dados e fazer algumas verificações. Crie a sub- rotina Sub infoFonteDados e execute, observando a saída.
Sub infoFonteDados '
Dim oContexto As Variant Dim oFonte As Variant Dim oConsultas As Object Dim oVinculos As Object Dim sNomes() As String '
' cria o contexto de banco de dados
oContexto = createUnoService("com.sun.star.sdb.DatabaseContext") ' obtem o objeto fonte de dados
oFonte = oContexto.getRegisteredObject("Minha_Fonte") '
' obtem a propriedade TableFilter sMsg = "Tabelas: " + Chr$(10) sNomes = oFonte.getPropertyValue("TableFilter") If UBound(sNomes) > 0 Then For i = 0 To UBound(sNomes) sMsg = sMsg + sNomes (i) + Chr$(10) Next i MsgBox sMsg Else
MsgBox "Nenhuma Tabela para visualizar" End If
'
' verifica consultas
oConsultas = oFonte.getQueryDefinitions() If oConsultas.getCount() > 0 Then
Else
MsgBox "Nenhuma consulta definida." End If
'
' verifica vínculos
oVinculos = oFonte.getBookmarks() If oVinculos.getCount() > 0 Then
MsgBox Str$(oVinculos.getCount()) + " vínculos definidos" Else
MsgBox "Nenhum vínculo definido." End If
'
End Sub
Note que as tabelas a serem visualizadas pela fonte de dados é uma propriedade de DataSource, enquanto as consultas e vínculos são obtidos através de métodos específicos.