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