divendres, 13 d’agost del 2010

OpenOffice.org Basic: Macro i diàleg per accedir a una BD registrada / 27 juliol 2010

OpenOffice.org Basic: Macro i diàleg per accedir a una BD registrada

Aquest post segueix l'estil dels dos anteriors: es tracta d'accedir a una base de dades que tingui registrada a l'OpenOffice amb una macro i un diàleg genèrics. És dir, es tracta d'una macro i un dialeg que es podran invocar des de qualsevol de les aplicacions de la suite: calc, writer, draw, base o impress.

El fet de registrar la base de dades a l'OpenOffice em permet fer abstracció del mètode d'accés. Totes les bases de dades registrades s'accedeixen igual.

Per registrar una base de dades, o bé la creo amb OpenOffice.org Base, o bé aprofito una d'existent (i que reconegui OOo Base) i, en ambdós casos, marco el checkbox de registrar-la.

Un cop tinc la base de dades registrada aquesta passa a ser una base de dades del Base i ja no m'he de preocupar del que hi hagi per sota (o, si més no, no me n'he de preocupar gaire!).

Una informació interessant és saber quines són les bases de dades registrades i quin són els seus noms de registre. Això ho podem saber mirant Eines->Opcions->OpenOffice.org Base->Bases de Dades, que ens mostra la llista de noms de registre de les  bases de dades registrades i el path fins el fitxer .odb corresponent a cada base de dades.

Amb OpenOffice.org Basic (OOoBasic, d'ara endavant, per a fer-ho més curt), podem obtenir la llista de noms de registre amb un procediment com aquest:

sub ObteLListaBDRegistrades
    ' variables
    Dim Noms
   
    ' obté el context de base de dades
    Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")

    ' obté la col·lecció d'elements
    Noms = Context.getElementNames()
   
    ' itera a través de la llista de bases de dades registrades
    For i = 0 To UBound(Noms())
      MsgBox Noms(i)
    Next i
end sub


El que faré ara és crear una interfase d'usuari similar a la dels posts anteriors, és dir, tres botons: Obtenir, Netejar i Sortir
Obtenir: Carregarà les dades de la taula en una camp de text multi-línia
Netejar: esborrarà el camp de text
Sortir: en aquest cas, tancarà el diàleg.

Ara bé una pregunta interessant: On creo aquesta interfase? en realitat, amb OpenOffice.org puc arribar a posar botons, etiquetes, camps de text i elements d'interfase gràfica d'usuari a molts llocs:
En Calc, Writer, Draw i Impress, al mateix document
En Base, a formularis de base de dades
En totes les aplicacions: en els diàlegs

triar posar els controls en el document o en diàlegs ha de seguir criteris funcionals: per exemple, si el que estem fent és un full de càlcul en el que ens interessa executar una macro que afecta a cel·les del full, o que ha de conèixer l'estructura del full, aleshores té sentit emplaçar al mateix document els controls.

Si, en canvi, estem creant una macro d'utilitat general, és dir, una macro que posariem al menú general que comparteixen les aplicacions d'OpenOffice, aleshores té sentit posar els controls en un diàleg.

Per facilitat, aquí posaré la interfase gràfica en un diàleg, i invocaré la macro que l'obre des del menú principal.

Per a crear un diàleg he de fer: Eines->Macros->Organitza els diàlegs, en "Els meus diàlegs"-"Standard" en creo un de nou fent click al botó de mateix nom. Al nou Dialeg li en dic Dialog1

Afegeixo un camp de text gran i els botons, per exemple com en la imatge:




Ara creo el codi.  El posaré al "Module1" de "Standard" de "Les meves macros" (els valors per defecte!)
Em calen:

Un parell de variables globals (sí, ja se que podria fer-ho millor).
' variables globals
' variables per al diàleg
' Dlg apunta al diàleg
' Ctl apunta al textbox
Dim Dlg As Object
Dim Ctl As Object



1. el procediment  que obre el diàleg i que invocaré des del menú principal

sub ObrirDialeg   
    ' carrega la llibraria de diàlegs estandard
    DialogLibraries.LoadLibrary("Standard")
   
    ' carrega el Diàleg "Dialog1"
    Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   
    ' i el mostra
    Dlg.Execute()
end sub


2. la càrrega de les dades en la textbox. Els comentaris del codi són prou explicatius.
Sub AccedeixBD
    ' obre la base de dades actual i fa una inserció de dades
    Dim Context
    Dim DB
    Dim Conn
    Dim Stmt
    Dim Result
    Dim strSQL As String
   
    ' crea el context de BD
    Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
  
    'obté la BD. He de posar el nom de registre de la base de dades que vull tractar
    ' DB=Context.getByName("proves-dbase")
    DB=Context.getByName("proves-sqlite-01")
     
    ' obté la connexió. En aquest cas, una SQLite, no calen logins/passowrds
    Conn=DB.getConnection("","")
   
    ' crea una statement
    Stmt=Conn.createStatement()

    ' crea string amb query
    strSQL="SELECT * FROM Taula1"

    ' executa i obté a un ResultSet
    Result=Stmt.executeQuery(strSQL)
   
    ' neteja la text box (i, de pas, inicialitza Ctl per aque apunti al textbox) 
    Neteja()
   
    While Result.next()
        REM for now, let us just use the getString() method to get the
        REM columns. Note that they are being accessed by index       
        Ctl.text = Ctl.text & "id: " & Result.getInt(1) & "; valor: " & Result.getString(2) & chr(13)
    Wend
   
    ' tanca la connexió
    Conn.close
   
End Sub


3. la neteja de la text box
Sub Neteja
    Ctl = Dlg.getControl("TextField1")
    Ctl.text = ""
End sub


4. el tancament del diàleg
Sub Sortir
    Dlg.endExecute()
End sub


Aleshores només cal associar
al botó ExecutaMacro, el procediment 'AccedeixBD'
al botó Netejar, el procediment 'Neteja'
al botó Sortir, el procediment 'Sortir'

Com? en l'editor de diàlegs fem doble clic a cada botó  i en la pestanya esdeveniments trio "En prémer el botó del ratolí" i li associo el mètode  corresponent

Queda, finalment, obrir el diàleg des del menú principal:

Eines->Personalitza premo el botó 'Nou', indico el nom del nou Menú, per exemple "Les meves macros" i premo el botó D'acord.
Tornem-hi:
Eines->Personalitza, sel·lecciono a la llista desplegable el nou menú que to just he creat. Ara premo el botó afegeix i trio el procediment  ObrirDialeg. Per a trobar-lo he sel·leccionar en la caixa de Categoria: Macros de l'OpenOffice.Org-> Les meves macros->Standard->Module1 i en la caixa Ordre:ObrirDialeg. Premo D'acord.
Finalment, faig un altre cop:
Eines->Personalitza, sel·lecciono "les meves macros" a la llista desplegable de menú; a la llista de contingut sel·lecciono "ObrirDialeg" i premo el botó "Modifica" i Canvia el nom. Poso "Exemple de diàleg". Premo d'acord.

Encara podem dir si volem que aquest menú sigui per a document actual o per a tots els documents del tipus de l'aplicació actual. Ho fariem amb Eines-Personalitza. i triant l'opció de Desa a document actual o a OpenOffice.org aplicació.

Cap comentari:

Publica un comentari a l'entrada