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
Database: Åbne og lukke formular el. rapport fra en makro
Moderator: Lodahl
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:
Hvis man f.eks. har en formular med navnet frmTest, så kan den åbnes med programstumpen
Efter åbningen kan tildele egenskaber til den åbne formular, f.eks. en titel til rammen:
2) En rapport kan på analog måde åbnes med funktionen openReport:
Hvis man f.eks. har en rapport med navnet rptTest, så kan den åbnes med programstumpen
Man kan her ligeledes ændre f.eks. rammetitlen:
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):
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
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
Code: Select all
dim oForm as Object
oForm= openForm("frmTest")
Code: Select all
oForm.title= "Prøveåbning af formular"
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
Code: Select all
Dim oRapp as Object
oRapp= openReport("rptTest ")
Code: Select all
oRapp.CurrentController.Frame.Title= "Prøveåbning"
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
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