Database: Åbne og lukke formular el. rapport fra en makro

Brugerhjælp og support til databaser i LibreOffice Base

Moderator: Lodahl

Post Reply
Sveinir
Posts: 7
Joined: 29. Nov 2008 00:18
Location: 2000 Frederiksberg

Database: Åbne og lukke formular el. rapport fra en makro

Post by Sveinir »

Jeg har mange års erfaring i programmering og ca. 10 år erfaring med MS Access-databaser og hændelsesprocedurer. Jeg er for nylig begyndt at studere OpenOffice.org, og er specielt interesseret databaseformularer med tilhørende hændelsesprocedurer (altså makroer). Jeg har fundet masser af spredt dokumentation på internettet, men det er fragmentarisk og der er ikke meget, der rammer lige mit felt (Lodahl er udmærket men kun kortfattet introducerende, Pitonyak er omfattende men har ikke lige det, jeg skal bruge, api-wiki er overvældende men meget indforstået. Det kan muligvis ikke være anderledes med sådanne frivillige projekter (det får mig til at spekulere over, hvor brugbar al den spredte dokumentation, jeg selv har lavet i tidens løb, i grunden har været). Svaret på nogle få spørgsmål vil hjælpe mig til at komme i gang:

1) Hvordan åbner man en anden formular fra den aktive formular? (I MS Access kan det f.eks. hedde DoCmd.OpenForm "TastSerier").

2) Hvordan lukker man den aktive formular? Jeg har prøvet thisComponent.CurrentController.Frame.close(), men den låser databasen (får den til at "hænge"). (I MS Access hedder det bare DoCmd.Close).

3) Hvordan åbner man en rapport fra den aktive formular? (I MS Acces kan det f.eks. hedde DoCmd.OpenReport "R_ListSerierAlbum", acViewPreview, , "[interesse]>=3"). Alting er let, hvis man ved, hvad man skal skrive.

4) Det ser ud til, at makroerne i biblioteksholderen "Mine makroer" kan "ses" fra alle ens OOo-databaser. Passer det? Dér bør man i så fald kun anbringe generelle makroer.

Sveinir
Sveinir
Posts: 7
Joined: 29. Nov 2008 00:18
Location: 2000 Frederiksberg

Post by Sveinir »

Efter yderligere studier er jeg nu i stand til selv at svare på spørgsmål 1 og 3. Mine programmer forudsætter OOo 3.0 (bruger man version 2 skal ThisDatabaseDocument erstattes med noget andet).

1) En formular kan åbnes med funktionen openForm:

Code: Select all

sub openForm(FormName as string) as Object
' Open a form.

Dim sProperties(1) As New com.sun.star.beans.PropertyValue 
dim oFormContainer as Object
    
' Form container
oFormContainer = ThisDatabaseDocument.FormDocuments

' Form connection parameters
sProperties(0).Name = "ActiveConnection" 
sProperties(0).Value = ThisDatabaseDocument.CurrentController.ActiveConnection
sProperties(1).Name = "OpenMode" 
sProperties(1).Value = "open"

' Åbning
openForm = oFormContainer.loadComponentFromURL(FormName,"_blank",0,sProperties()) 
end sub
Hvis man f.eks. har en formular med navnet frmTest, så kan den åbnes med programstumpen

Code: Select all

dim oForm as Object
oForm= openForm("frmTest")
Efter åbningen kan tildele egenskaber til den åbne formular, f.eks. en titel til rammen:

Code: Select all

oForm.title= "Prøveåbning af formular"
2) En rapport kan på analog måde åbnes med funktionen openReport:

Code: Select all

sub openReport(ReportName as string) as Object
' Open a report

Dim sProperties(1) As New com.sun.star.beans.PropertyValue 
dim oReportContainer as Object
    
' Report container
oReportContainer = ThisDatabaseDocument.ReportDocuments

' Connection parameters. Use the connection of the database.
sProperties(0).Name = "ActiveConnection" 
sProperties(0).Value = ThisDatabaseDocument.CurrentController.ActiveConnection
sProperties(1).Name = "OpenMode" 
sProperties(1).Value = "open"

' Opening
openReport = oReportContainer.loadComponentFromURL(ReportName,"_blank",0,sProperties())
end sub
Hvis man f.eks. har en rapport med navnet rptTest, så kan den åbnes med programstumpen

Code: Select all

Dim oRapp as Object
oRapp= openReport("rptTest ")
Man kan her ligeledes ændre f.eks. rammetitlen:

Code: Select all

oRapp.CurrentController.Frame.Title= "Prøveåbning"
Min lærdom har jeg fra Andrew Pitonyak: "Using Macros with OOo Base" (kan downloades fra http://www.pitonyak.org/database/ fra ordet AndrewBase. Man kan ikke åbne dokumentet ved at dobbeltklikke i stifinderen i Windows; man skal åbne OOo og åbne et tekstdokument derfra), fra bidrag fra DrewJensen i det engelsksprogede OOo-forum (http://user.services.openoffice.org/en/ ... cro#p11593), fra Xray-værktøjet og fra min erfaring fra MS Access.

Under min udforskning havde jeg glæde af en makro, jeg lavede, til at se, hvilke tabeller, forespørgsler, forumarer og rapporter en database indeholder (det fremmede også min forståelse for tankegangen bag komponenterne i OOo):

Code: Select all

' At vise, hvilke tabeller, forespørgsler, formularer og rapporter,
' der er i databasen.
' Svend Larsen, 13/12-08.


sub ElementOversigt
' Uddraget fra andre steder 13/12-085, Svend Larsen.

dim oTables as Object
dim sTableNames() as string

dim oQueries as Object
dim sQueryNames() as string

dim oForms as Object    ' Det er en struktur omhandlende alle formularer (form container)
dim sFormNames() as string

Dim oRapps as Object
dim sRappNames() as string

dim tekst as string
dim NL as string
dim nr as integer
NL= chr(10)


tekst= "Databasenavn: " & ThisDatabaseDocument.title

' Tabeller
oTables= ThisDatabaseDocument.DataSource.Tables
tekst= tekst & NL & "Databasen har " & oTables.Count & " tabel(ler):"

if oTables.Count>0 then
   sTableNames= oTables.ElementNames
   for nr = 0 to oTables.Count-1
      tekst= tekst & NL & "   " & nr+1 & ". " & sTableNames(nr)
   next nr
end if

' Forespørgsler
oQueries= ThisDatabaseDocument.DataSource.QueryDefinitions
tekst= tekst & NL & "Databasen har " & oQueries.Count & " forespørgsel(er):"

if oQueries.Count>0 then
   sQueryNames= oQueries.ElementNames
   for nr = 0 to oQueries.Count-1
      tekst= tekst & NL & "   " & nr+1 & ". " & sQueryNames(nr)
   next nr
end if

' Formularer
oForms= ThisDatabaseDocument.FormDocuments
tekst= tekst & NL & "Databasen har " & oForms.Count & " formular(er):"

if oForms.Count>0 then
   sFormNames= oForms.ElementNames
   for nr = 0 to oForms.Count-1
      tekst= tekst & NL & "   " & nr+1 & ". " & sFormNames(nr)
   next nr
end if

' Rapporter
oRapps= ThisDatabaseDocument.ReportDocuments
tekst= tekst & NL & "Databasen har " & oRapps.Count & " rapport(er):"
if oRapps.Count>0 then
   sRappNames= oRapps.ElementNames
   for nr = 0 to oRapps.getCount()-1
      tekst= tekst & NL & "   " & nr+1 & ". " & sRappNames(nr)
      next nr
end if

msgbox tekst

end sub
Man kunne mene, at mit indlæg hørte hjemme under OOo-forums komponent makroprogrammering, men emnerne der handler om alt andet end databaser, derfor placerede jeg det her, fordi jeg synes, at emnet er meget databasespecifikt.

Begge funktionerne openForm og openReport mangler efter min mening en ekstra parameter, der kan bruges som filter, i form at en SQL-WHERE-sætning (uden WHERE). Det har jeg ikke fundet ud af endnu; heller ikke hvordan man laver et filter. Jeg synes, at makrofaciliteten i OOo mangler en overbygning til at gøre det lettere at lave database-anvendelser, uden at man behøver at kende til eller skrive så mange detaljer; så ville man få sit arbejde hurtigere gjort. De to ovenstående funktioner kunne være en del heraf.

Jeg mangler stadigvæk løsningen til mit spørgsmål 3), nemlig at lukke den aktive formular via en makro.

Sveinir
Post Reply