divendres, 13 d’agost del 2010

OpenOffice.org Basic: Form per accedir a una BD registrada / 29 juliol 2010

OpenOffice.org Basic: Form per accedir a una BD registrada

En el post anterior accedia a una base de dades a través d'una macro i un diàleg. Ara accediré a la base de dades registrada posant la interfase d'usuari en un formulari.
Depenent de l'aplicació, Write, Draw, Impress, Calc o Base, hi hauran algunes diferències petites.

En cas de triar Write, Draw, Impress o Calc, poso els controls directament sobre el document.
En cas de triar Base, he de crear un objecte de formulari de la base de dades. I sobre aquest objecte poso els controls.

Visualitzo la paleta controls de formulari i la paleta de disseny de formulari. Si no els tinc actius, faig Visualitza-Barres d'eines i activo Controls de FormulariDisseny del Formulari.

Em poso en mode de disseny (fent clic al botó mode disseny de la paleta de disseny de formulari).

Poso un camp de text: Fent clic amb botó de la dreta sobre el camp, obro la finestra de propietats del control. AL control li poso el nom TextMostrar i indico que és multilínea
Poso tres botons. els anomeno BotoCarregar, BotoNetejar i BotoSortir i respectivament tenen les etiquetes "Carregar", "Netejar" i "Sortir".

Li dono nom al Formulari. Ara que ja tinc controls sobre el document, el botó formulari (situat a la paleta de disseny del formulari) ja estarà actiu. Faig clic i s'obre la finestra de propietats del formulari i li en dic FormulariProves1

Creo el codi. Com sempre això es fa amb Eines->Macros->Organitza les macros->OpenOffice.org BASIC.  En aquest cas, associo el codi de les macros al document  Writer, Calc, Draw o Impress segons el cas. Es dir: el codi de les macros es guarda en el fitxer del document.

Si hagués triat fer-lo a  "les meves macros" / Standard, la macro es guardaria a la carpeta de macros del meu directori home. En el meu cas, OpenOffice.org 3.2 sobre Ubuntu 10.04 Lucid Lynx, a la carpeta/home/albert/.openoffice.org/3/user/basic/Standard

El codi de les macros per a Writer, Draw, Impress i Base és en tots els casos el mateix:

REM  *****  BASIC  *****

' variables globals
' La DrawPage
Dim dpDrawPage As Object
' El Formulari
Dim Formulari As Object
' El camp de text
Dim TextMostrar As Object

Sub Main
    AccedeixBD
End Sub

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
    Dim sText as String
   
    ' BasicLibraries.loadLibrary("XrayTool")
    ' crea el context de BD
    Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
  
    'obté la BD
    DB=Context.getByName("proves-sqlite-01")
     
    ' obté la connexió
    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   
    Neteja()
   
    sText = TextMostrar.Text()
    While Result.next()       
        sText = sText & "id: " & Result.getInt(1) & "; valor: " & Result.getString(2) & chr(13)
    Wend
    TextMostrar.Text = sText
   
    ' tanca la connexió
    Conn.close
   
End Sub

Sub Neteja
    ' obté la DrawPage, el component en el que es dibuixen els controls
    dpDrawPage = ThisComponent.getDrawPage
    ' un cop té la drawPage, obté el formulari per nom
    Formulari = dpDrawPage.Forms.getByName("FormulariProves1")
    ' i del formulari, obté el control, també per nom
    TextMostrar = Formulari.getByName("TextMostrar")
    ' fa servir els mètodes i propietats del component.
    TextMostrar.Text=""
End sub

Sub Sortir
    ' Amb Close(True) tanca l'aplicació
    ThisComponent.Close(true)
End sub



Associo
procediment AccedeixBD a BotoCarregar
procediment Netejar a BotoNetejar
procediment Sortir al botó BotoSortir

Per a calc, cal tenir en compte que un mateix document pot tenir moltes fulles i que cada fulla pot tenir un formulari.  Aleshores, com he posat els components a la primera fulla, cal fer aquest tractament diferent

    ' obté la DrawPage, el component en el que es dibuixen els controls
    ' en el cas del writer, draw, impress i base, directament de ThisComponent,
    ' en cas de calc, cal primer obtenir la
sheet
    dpDrawPage = ThisComponent.Sheets.getByIndex(0).getDrawPage
    ' la resta és igual
    ' un cop té la drawPage, obté el formulari per nom
    Formulari = dpDrawPage.Forms.getByName("FormulariProves1")
    ' i del formulari, obté el control, també per nom
    TextMostrar = Formulari.getByName("TextMostrar")
    ' fa servir els mètodes i propietats del component.
    TextMostrar.Text=""



És dir, per a Writer, Draw, Impress i Base obtinc DrawPage (la capa de presentació de l'OpenOffice.org, per entendre'ns) directament del ThisComponent

dpDrawPage = ThisComponent.getDrawPage

En cas de Calc, hi ha una capa intermitja, la col·lecció de fulles. N'he de fer servir la primera que és on he posat els controls.

dpDrawPage = ThisComponent.Sheets.getByIndex(0).getDrawPage

Finalment, com tancar l'aplicació des d'una macro:

ThisComponent.Close(true)

Vet aquí el HelloWorld dels formularis amb OpenOffice.org

Cap comentari:

Publica un comentari a l'entrada