15851
Commento:
|
10230
ready for #70
|
Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
Linea 4: | Linea 4: |
= Testo inglese = LibreOffice Part 23: Base Form Enhancements with Macros by Elmer Perry For the previous four parts of this series, we have slowly built a database document using LibreOffice's Base module. We have a database with forms to enter our data, and queries and reports for extracting the data. We now have a usable document for recording our book library. However, our current design has one flaw we need to overcome. If we need to enter a new author or media type while we are in the books form, we have to close the book form and open one of the others. If we could enter new authors and media types directly from the books form, it would behave more like an application and make data entry even easier. We can accomplish this through a few short macros. The LibreOffice Basic language is very similar to other Basic languages, such as Visual Basic for Applications. To manipulate the underlying LibreOffice document, we access the Uno framework controlling the document. The Uno framework is quite complex, but I will explain, as best I can, the properties and objects we will use. The goal is not to teach you how to write LibreOffice macros, but how you can use them. Macro Security and Options While macros allow us to do cool things in our documents, they can also cause problems. Some people use macros to compromise other people's systems, therefore, we need to take a few minutes to talk about macro security. Whether you are running LibreOffice on Linux, Mac, or Windows, malicious code in a macro can compromise your data and possibly your entire system. Macro security in LibreOffice is simple. Tools > Options opens the Options dialog for LibreOffice. Under LibreOffice, select Security. Click on the Macro Security button to pop up the macro security options. You have four options. Never use the Low security option – it will run macros without asking you. I recommend the Medium security level. With this level, you are prompted whether to run the macros when you open a document containing macros. The High and Very High options require a certificate or folder you designate as trusted. While this is great, I believe nothing trumps the instincts of the user. You usually know whether you were expecting a document to contain macros. When in doubt, click No. Click OK to save your choice and OK to close the options dialog. Now, on to the fun stuff. The Macros We will write four macros for our database document. Three will deal with opening forms, and the last will update the list boxes for authors and media types. The general idea behind macros is to accomplish tasks that are not built into the program, or to simplify complex tasks. Our macros really accomplish both, as we will simplify the tasks of adding authors and media types and provide functionality not built into the program. Before we can begin to write our macros, we need a container to hold them. Macros are contained in a module. Modules can live in the program itself or within a document. Since our macros are specific to our database file, we will embed them in the document. Macros embedded in a document are available only when the document is loaded. Macros contained in the program are available as long as the program is running. Tools > Macros > Organize Macros > LibreOffice Basic. The LibreOffice Basic Macros dialog pops up. Select book.odb from the Macro from-list. Click the New button. A dialog pops up asking you for a name for the module. Name it FormCalls. Click OK. This brings up the LibreOffice macro editor. The macro comes with a default main subroutine. We will not use this subroutine. Highlight Sub main and End Sub and press the backspace key to delete them. Our first macro is a generalized subroutine for opening a form. A generalized subroutine is written for reuse. We will call this routine twice from other routines we write. Type this subroutine into the editor: {{{ Sub OpenAForm (FormName as String) Dim GetForm as Object GetForm = ThisDatabaseDocument.FormDocuments.GetByName(FormName) GetForm.Open End Sub }}} The first line of the subroutine is called the signature. The signature determines how the subroutine is called. A signature starts with the keyword Sub, which defines this call as a subroutine. Next, the name of the subroutine. In our case, OpenAForm is the name of the subroutine. Finally in the parenthesis, we have the arguments used when calling this subroutine. In our case, we have a variable named FormName which is a type String. In the second line of the subroutine, Dim is another keyword. Dim initializes a variable as a type, and, optionally, a value. We define a variable named GetForm as a type Object. The third line assigns a value to the variable GetForm through a chain of commands in the Uno framework. ThisDatabaseDocument refers to the currently open database document. In our case, book.odb. FormDocuments is a collection of all the forms in the document. Finally, GetByName retrieves a specific form object from the collection. Notice, we pass the variable FormName from the signature to this method. Once the call is complete, the variable GetForm is the object of the form name passed to the subroutine. The fourth line calls the Open method of the form. On the fifth line, we tell Basic this is the end of the subroutine with the command End Sub. We will call the OpenAform subroutine twice. Once to open the authors form, and once to open the media form. Add these two subroutines to your editor: {{{ Sub OpenAuthorsForm(oEv As Object) OpenAForm("Authors") End Sub Sub OpenMediaForm(oEv As Object) OpenAForm("Media") End Sub }}} The signature on these two subroutines are a little different. Since we will call them from a control within a form, we need to pass the object making the call as an argument, even though we do not use it. The argument oEv is a reference to the object making the call. We will use this to our advantage later, in the last subroutine, but here we do it because it is required. These two subroutines are pretty simple. We just make a call to OpenAForm passing the name of the form we want to open, Authors or Media. The final subroutine deals with our problem of refreshing the data in the list boxes for authors and media when we add authors or media using the two subroutines above: {{{ Sub ListRefresh(oEv as Object) oEv.source.model.Refresh End Sub }}} Once again, since we will call this subroutine from a control, we need a reference to the control making the call. However, this time we will actually use the object. This subroutine makes a method call to the underlying model of the list box and refreshes the data in the list, thus updating our list of authors or media types. Save your module and close the Basic editor. Making Connections to Macros At this point, our macros do nothing. We need to connect them to objects in our form to activate them when needed. First, we will connect the open form subroutines to buttons in our form, and then we will connect the ListRefresh to the list boxes. In the database pane, click on Forms. Right-click the Books form and select edit. Add two push buttons to the form, one under the Authors table and another under the Media table. Right-click the button under the Authors table and select Control to bring up the buttons properties dialog. On the General tab, change the name to AddAuthors and the Label to Add Authors. On the Events tab, click the ellipses (…) button next to Execute Action – which brings up the Assign Action dialog. Click the Macro button to bring up the Macro Selector dialog. In the tree list under Library, select book.odb > Standard > FormCalls. Select OpenAuthorsForm from the Macro Name list and click OK. Click OK to close the Assign Action dialog. Close the buttons properties dialog. Do the same with the button under the Media table, only name it AddMedia, make the label Add Media Type, and assign the macro OpenMediaForm to the Execute Action event. Finally, we need to add the refresh subroutine to our list boxes. Right-click the Authors column in the authors table and select Column. On the Events tab, click the ellipse (…) button beside “When receiving focus”. In the Assign Action button, use the Macro button to assign the ListRefresh macro to the action. This will cause the list to update data from the Authors table when you click on a list box in the column. Do the same for the Media column in the media table. Save your changes to the Books form and close it. Testing Your Changes Any time we make changes to our forms, we will want to test them and make sure we got everything right, especially in cases where we have used macros. One simple typo could cause things to not work. Double-click the Books form to open it. Add a new book with an author and media type you have not added already. Click the Add Authors button to make sure it opens the form. Add some authors. Close the Authors form. Click on the authors dropdown list box and verify that the authors you added are there. Do the same test with the Add Media Type button and listbox. Final Thoughts and References Again, I would like to emphasize that writing macros in LibreOffice Basic is complex. Documentation is pretty sparse, but it is out there. If you are interested in taking up the challenge, here are some references to get you started: LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt Andrew Pitonyak's OpenOffice Macro Information: http://www.pitonyak.org/oo.php You can find the macros used in this How-To on pastebin.com at http://pastebin.com/MU2Ztizi Next time, we will move on to another part of the LibreOffice suite and explore the Math module. |
|
Linea 6: | Linea 73: |
I database sono utilizzati per immagazzinare informazioni riguardo oggetti o dati. Nel precedente tutorial, abbiamo mappato come dovrebbe apparire il nostro database di libri. Abbiamo progettato tabelle per i nostri dati, e definito relazioni tra queste tabelle. Ora metteremo in atto la nostra pianificazione creando veramente il file del database, aggiungendo le tabelle e creando le relazioni. Creare il file del database Come ho menzionato prima Base non è un database ma una interfaccia per accedere e manipolare un file di database. Anche se è possibile connettersi a a molti differenti tipi di database, useremo il database di default per il nostro database di libri. Per fare partire la creazione guidata del database, selezionate Database dalla pagina iniziale di LibreOffice o File > Nuovo > Database. La prima schermata della creazione guidata del database ci lascia scegliere se vogliamo aprire un database esistente o crearne uno di nuovo. Selezionate Creare un Nuovo Database e premete Prossimo. La seconda schermata della creazione guidata ci chiederà se vogliamo registrare il database e che cosa vogliamo fare una volta che il database è stato creato. Registrare un database in LibreOffice lo rende disponibile a tutti i nostri documenti. Non ne abbiamo bisogno per il nostro database, così selezionate No – Non registrare il database. Selezionate Aprire il Database per modifica e premete fine. Libre Office aprirà una finestra di dialogo per definire una posizione e un nome per il database. Ho nominato semplicemente il file: libri. Una volta che avete un nome e una posizione per il file di database, la finestra principale di Base si apre. In basso a sinistra, avete i differenti pezzi con cui potete realizzare un file di database. In cima a destra vi permette di accedere alle differenti azioni che potere intraprendere per ciascuna parte, e in basso a destra mostra gli oggetti già creati. Tipi di campo Prima che creiamo la nostra prima tabella, abbiamo bisogno di discutere alcuni dei tipi di campo comuni per un database. Quando voi selezionate un tipo per un campo, vi vengono presentate molte opzioni per il tipo. Molti dei tipi sono identici e sono qui per ragioni di compatibilità. I tipi più comuni sono: Integer (ndt Intero) – un numero intero per esempio 123 VarChar – un stringa di caratteri di lunghezza variabile. Definirete la lunghezza massima per il VarChar. Date – una data, naturalmente, per esempio 10-15-2012 ( il formato esatto è specifico per la locazione) Time- un valore di tempo come 09:15:25 decimal - un numero reale composto da una parte intera e dalla parte frazionari, eg 123.45 (il separatore della parte intera e decimale è specifico per la locazione). Per i nostri scopi useremo Integer e VarChar. Creare le Tabelle Base ha tre modi differenti per creare le tabelle: attraverso la creazione guidata di tabelle, attraverso la vista di progetto e con istruzioni SQL. La creazione guidata è buona solo per creare specifici tipi di tabelle presi da un elenco di nomi di campo predefiniti. Il metodo SQL richiede la conoscenza e la comprensione del linguaggio SQL ed è oltre lo scopo di questo articolo. La vista di progettazione è di solito la scelta migliore e vi presenta una lista che voi riempirete per creare la vostra tabella. Useremo la vista di progettazione per creare le nostre tabelle per questo progetto. Cominceremo con la tabella Books (ndt Libri). Selezionate Tabelle dal pannello Database sulla sinistra. Nel pannello dei task, premete su Creare Tabella nella Vista di Progettazione. In cima avete etichette per ciascuno degli elementi di un campo: il Nome del Campo, il Tipo di Campo e la Descrizione. La Descrizione è opzionale ma è utile per prendere delle note su come è usato un campo. In basso vediamo le Proprietà del Campo. Questa sezione cambierà in funzione del tipo di campo che abbiamo selezionato. Nel primo campo inserite il nome BookID. Dalla lista a selezione, selezionate Integer. Inserire una descrizione spetta a voi. Sotto le proprietà del campo cambiate AutoValue a Sì. Questo metterà una icona nel riquadro a lato del record del campo mostrando che è l'indice ( o la chiave ) primario. Nella seconda riga digitate Titolo per il nome. Assegnate a questo un tipo VarChar. Ancora la descrizione spetta a voi. Nelle proprietà del campo lasciate la lunghezza a 100, il valore predefinito per VarChar. Il terzo campo è Published (ndt Pubblicato) con un tipo VarChar. Cambiate la lunghezza nelle proprietà del campo a 12. Ho scelto VarChar piuttosto che una data perché vogliamo soltanto l'anno e se l'anno di pubblicazione di un libro è sconosciuto posso semplicemente inserire “Sconosciuto”. Premete sulla icona per salvare e Base vi chiederà di inserire il nome della tabella. Inserite Books. Le nostre tabelle per Authors e Media sono create pressapoco nello stesso modo: per Authors create due campi: AuthorID , integer (AutoValue:Yes); e Name, VarChar (lunghezza 50). Per Media, MediaID, integer (AutoValue:Yes); e Type , VarChar ( lunghezza 25). Le nostre due tabelle per le chiavi esterne richiedono un trattamento leggermente differente, create due campi interi di nome BookID e AuthordID. Premete sul riquadro dell'icona a fianco del primo record. Tenendo premuto il tasto Shift, premete sul riquadro dell'icona del secondo. A questo punto dovreste avere entrambi i record selezionati. Premete sul pulsante destro sul riquadro dell'icona e selezionate Chiave Primaria dal menu contestuale. Questo crea una chiave combinata. I due valori insieme creano una chiave primaria, che identifica univocamente ciascun record della tabella. Per la tabella BooksMedia, create due campi interi dal nome BookID e MediaID. Selezionate entrambi i campi, premete sul pulsante destro e selezionate Chiave Primaria. Creare Relazioni Una volta che abbiamo definito tutte le nostre tabelle, possiamo creare le relazioni che collegano tutto insieme. Creeremo relazioni tra le nostre tre tabelle principali e le nostre tabelle con le chiavi esterne. La direzione in cui trascinate i campi è importante, così fate molta attenzione al modo in cui lo fate. Per far partire la finestra di dialogo Progettazione Relazioni andate a Strumenti > Relazioni. Vi saranno presentata una lista di tabelle. Selezionate una tabella e premete Aggiungi per aggiungere la tabella alla Progettazione delle Relazioni. Aggiungete le tabelle nel seguente ordine per farla facile: Authors, BooksAuthors, Books, BooksMedia, Media. Una volta che tutte le tabelle sono stte aggiunte, selezionate Close. Trascinate il campo BookID in Books su BookId in BooksAuthors. Un dialogo Relazione spunta fuori. Sotto l'opzione Aggiorna pigliate Update cascade e OK. Questo farà in modo di aggiornare il cmpao quando la tabella Books si aggiorna. Trascinate l'AuthorID in Authors a AuthordID in BooksAuthors: Selezionate Update cascade nel dialogo Relazione. Quindi trasicnate il BookID in Books a BookID in BooksMedia. Selezionate Update cascade. Infine trascinate MediaID in Media a MediaID in BooksMedia. Selezionate Update cascade. Il vostro progetto di relazione dovrebbe sembrare come quello fotograto sotto. Con le nostre tabelle e relazioni create, siamo pronti a lavorare sulla creazione di moduli per l'inserimento dei dati. Nel nostro prossimo How -To creeremo i moduli per l'inserimento dei dati. Tutto insieme contribuirà a creare un sistema usabile per l'inserimento dei dati. |
|
Linea 56: | Linea 78: |
HOW-TO – LibreOffice Parte 20 - Base Scritto da Elmer Perry I database sono utilizzati per immagazzinare informazioni riguardo oggetti o dati. Nel precedente tutorial, abbiamo mappato come dovrebbe apparire il nostro database di libri. Abbiamo progettato tabelle per i nostri dati, e definito relazioni tra queste tabelle. Ora metteremo in atto la nostra pianificazione creando veramente il file del database, aggiungendo le tabelle e creando le relazioni. Creare il file del database Come ho detto in precedenza, Base non è un database ma un'interfaccia per accedere e manipolare un file di database. Anche se è possibile connettersi a molti differenti tipi di database, useremo il database HSQL predefinito per il nostro database di libri. Per fare partire la creazione guidata del database, selezionate Database dalla pagina iniziale di LibreOffice o File > Nuovo > Database. La prima schermata della creazione guidata del database ci lascia scegliere se aprire un database esistente o crearne uno nuovo. Selezionate Creare un Nuovo Database e premete Prossimo. La seconda schermata della creazione guidata ci chiederà se vogliamo registrare il database e che cosa vogliamo fare una volta che il database è stato creato. Registrare un database in LibreOffice lo rende disponibile a tutti i nostri documenti. Non è necessario per il nostro database, per cui selezionate No – Non registrare il database. Selezionate Aprire il Database per modificare e premete Fine. LibreOffice aprirà una finestra di dialogo per definire una posizione e un nome per il database. Ho nominato il file semplicemente “libri”. Una volta che avete un nome e una posizione per il file di database, la finestra principale di Base si apre. In basso a sinistra, avete i differenti pezzi con cui potete realizzare un file di database. In cima a destra potete accedere alle differenti azioni da intraprendere per ciascuna parte, e in basso a destra sono illustrati gli oggetti già creati. Tipi di campo Prima di creare la nostra prima tabella, abbiamo bisogno di discutere alcuni dei tipi di campo più comuni per un database. Quando selezionate un tipo per un campo, vi vengono presentate molte opzioni per tale tipo. Molti dei tipi sono identici, e questo per ragioni di compatibilità. I tipi più comuni sono: Integer (ndt Intero) – un numero intero per esempio 123 VarChar – un stringa di caratteri di lunghezza variabile. Definirete la lunghezza massima per il VarChar. Date – una data, ovviamente, per esempio 10-15-2012 (il formato esatto dipende dalla locazione) Time- un valore di tempo come 09:15:25 decimal - un numero reale composto da una parte intera e dalla parte decimale, es. 123.45 (il separatore della parte intera e decimale è specifico per la locazione). Per i nostri scopi useremo Integer e VarChar. Creare le Tabelle Base ha tre modi differenti per creare le tabelle: attraverso la creazione guidata di tabelle, attraverso la vista di progetto e con istruzioni SQL. La creazione guidata è buona solo per creare specifici tipi di tabelle presi da un elenco di nomi di campo predefiniti. Il metodo SQL richiede la conoscenza e la comprensione del linguaggio SQL ed è oltre lo scopo di questo articolo. La vista di progettazione è di solito la scelta migliore e vi presenta una lista da riempire per creare la vostra tabella. Per creare le nostre tabelle per questo progetto useremo la vista di progettazione . Cominceremo con la tabella Libri. Selezionate Tabelle dal pannello Database sulla sinistra. Nel pannello delle azioni, premete su Creare Tabella nella Vista di Progettazione. In cima avete etichette per ciascuno degli elementi di un campo: il Nome del Campo, il Tipo di Campo e la Descrizione. La Descrizione è opzionale ma è utile per prendere delle note su come è usato un campo. In basso vediamo le Proprietà del Campo. Questa sezione cambierà in funzione del tipo di campo che abbiamo selezionato. Nel primo campo inserite il nome LibriID. Dal menu a tendina del Tipo di Campo selezionate Integer. Inserire una descrizione spetta a voi. Sotto le proprietà del campo cambiate AutoValue a Sì. Questo inserirà una icona nel riquadro a lato del record del campo mostrando che è l'indice (o la chiave) primario. Nella seconda riga digitate Titolo per il nome. Assegnate a questo un tipo VarChar. Ancora una volta, la descrizione spetta a voi. Nelle proprietà del campo lasciate la lunghezza a 100, il valore predefinito per VarChar. Il terzo campo è Pubblicato, con tipo VarChar. Cambiate la lunghezza nelle proprietà del campo a 12. Ho scelto VarChar piuttosto che una data perché vogliamo soltanto l'anno e se l'anno di pubblicazione di un libro è sconosciuto possiamo semplicemente inserire “Sconosciuto”. Premete sull'icona per salvare e Base vi chiederà di inserire il nome della tabella. Inserite Libri. Le nostre tabelle per Autori e Media sono create pressapoco nello stesso modo: per Autori create due campi: AutoriID , integer (AutoValue: Sì); e Nome, VarChar (lunghezza 50). Per Media, MediaID, integer (AutoValue: Sì); e Tipo , VarChar ( lunghezza 25). Le nostre due tabelle per le chiavi esterne richiedono un trattamento leggermente differente, in AutoriLibri create due campi interi di nome LibriID e AutoriID. Premete sul riquadro dell'icona a fianco del primo record. Tenendo premuto il tasto Shift, premete sul riquadro dell'icona del secondo. A questo punto dovreste avere entrambi i record selezionati. Premete sul pulsante destro sul riquadro dell'icona e selezionate Chiave Primaria dal menu contestuale. Questo crea una chiave combinata. I due valori insieme creano una chiave primaria, che identifica univocamente ciascun record della tabella. Per la tabella LibriMedia, create due campi interi dal nome LibriID e MediaID. Selezionate entrambi i campi, premete sul pulsante destro e selezionate Chiave Primaria. Creare Relazioni Una volta che abbiamo definito tutte le nostre tabelle, possiamo creare le relazioni che collegano tutto insieme. Creeremo relazioni tra le nostre tre tabelle principali e le nostre tabelle con le chiavi esterne. La direzione in cui trascinate i campi è importante, per cui fate molta attenzione al modo in cui lo fate. Per favviare la finestra di dialogo Progettazione Relazioni andate su Strumenti > Relazioni. Vi sarà presentata una lista di tabelle. Selezionate una tabella e premete Aggiungi per aggiungere la tabella alla Progettazione delle Relazioni. Per farla facile, aggiungete le tabelle nel seguente ordine: Autori, AutoriLibri, Libri, LibriMedia, Media. Una volta che tutte le tabelle sono state aggiunte, selezionate Chiudi. Trascinate il campo LibriID in Libri su LibriID in AutoriLibri. Verrà fuori un avviso sulla Relazione. Sotto l'opzione Aggiorna clic su Aggiorna cascata e OK. Questo farà in modo di aggiornare il campo quando la tabella Libri si aggiorna. Trascinate l'AutoreID in Autori su AutoreID in LibriAutori: Selezionate Aggiorna cascata nell'avviso Relazione. Quindi trascinate il LibriID in Libri su LibriID in LibriMedia. Selezionate Aggiorna cascata. Infine trascinate MediaID in Media su MediaID in LibriMedia. Selezionate Aggiorna cascata. Il vostro progetto di relazione dovrebbe sembrare come quello nell'immagine sotto. Con le nostre tabelle e relazioni appena create, siamo pronti a lavorare sulla creazione di moduli per l'inserimento dei dati. Li creeremo nel nostro prossimo How -To. Tutto insieme contribuirà a creare un sistema usabile per l'inserimento dei dati. La storia lavorativa, di programmazione e informatica di Elmer Perry include un Apple IIE, con alcuni Amiga, un generoso aiuto di DOS e Windows e una spolverata di Unix, il tutto ben mescolato con Linux e Ubuntu. |
Testo inglese
LibreOffice Part 23: Base Form Enhancements with Macros
by Elmer Perry
For the previous four parts of this series, we have slowly built a database document using LibreOffice's Base module. We have a database with forms to enter our data, and queries and reports for extracting the data. We now have a usable document for recording our book library. However, our current design has one flaw we need to overcome. If we need to enter a new author or media type while we are in the books form, we have to close the book form and open one of the others. If we could enter new authors and media types directly from the books form, it would behave more like an application and make data entry even easier. We can accomplish this through a few short macros. The LibreOffice Basic language is very similar to other Basic languages, such as Visual Basic for Applications. To manipulate the underlying LibreOffice document, we access the Uno framework controlling the document. The Uno framework is quite complex, but I will explain, as best I can, the properties and objects we will use. The goal is not to teach you how to write LibreOffice macros, but how you can use them. Macro Security and Options
While macros allow us to do cool things in our documents, they can also cause problems. Some people use macros to compromise other people's systems, therefore, we need to take a few minutes to talk about macro security. Whether you are running LibreOffice on Linux, Mac, or Windows, malicious code in a macro can compromise your data and possibly your entire system.
Macro security in LibreOffice is simple. Tools > Options opens the Options dialog for LibreOffice. Under LibreOffice, select Security. Click on the Macro Security button to pop up the macro security options. You have four options. Never use the Low security option – it will run macros without asking you. I recommend the Medium security level. With this level, you are prompted whether to run the macros when you open a document containing macros. The High and Very High options require a certificate or folder you designate as trusted. While this is great, I believe nothing trumps the instincts of the user. You usually know whether you were expecting a document to contain macros. When in doubt, click No. Click OK to save your choice and OK to close the options dialog. Now, on to the fun stuff. The Macros
We will write four macros for our database document. Three will deal with opening forms, and the last will update the list boxes for authors and media types. The general idea behind macros is to accomplish tasks that are not built into the program, or to simplify complex tasks. Our macros really accomplish both, as we will simplify the tasks of adding authors and media types and provide functionality not built into the program. Before we can begin to write our macros, we need a container to hold them. Macros are contained in a module. Modules can live in the program itself or within a document. Since our macros are specific to our database file, we will embed them in the document. Macros embedded in a document are available only when the document is loaded. Macros contained in the program are available as long as the program is running. Tools > Macros > Organize Macros > LibreOffice Basic. The LibreOffice Basic Macros dialog pops up. Select book.odb from the Macro from-list. Click the New button. A dialog pops up asking you for a name for the module. Name it FormCalls. Click OK. This brings up the LibreOffice macro editor. The macro comes with a default main subroutine. We will not use this subroutine. Highlight Sub main and End Sub and press the backspace key to delete them. Our first macro is a generalized subroutine for opening a form. A generalized subroutine is written for reuse. We will call this routine twice from other routines we write. Type this subroutine into the editor:
Sub OpenAForm (FormName as String) Dim GetForm as Object GetForm = ThisDatabaseDocument.FormDocuments.GetByName(FormName) GetForm.Open End Sub
The first line of the subroutine is called the signature. The signature determines how the subroutine is called. A signature starts with the keyword Sub, which defines this call as a subroutine. Next, the name of the subroutine. In our case, OpenAForm is the name of the subroutine. Finally in the parenthesis, we have the arguments used when calling this subroutine. In our case, we have a variable named FormName which is a type String. In the second line of the subroutine, Dim is another keyword. Dim initializes a variable as a type, and, optionally, a value. We define a variable named GetForm as a type Object. The third line assigns a value to the variable GetForm through a chain of commands in the Uno framework. ThisDatabaseDocument refers to the currently open database document. In our case, book.odb. FormDocuments is a collection of all the forms in the document. Finally, GetByName retrieves a specific form object from the collection. Notice, we pass the variable FormName from the signature to this method. Once the call is complete, the variable GetForm is the object of the form name passed to the subroutine. The fourth line calls the Open method of the form. On the fifth line, we tell Basic this is the end of the subroutine with the command End Sub. We will call the OpenAform subroutine twice. Once to open the authors form, and once to open the media form. Add these two subroutines to your editor:
Sub OpenAuthorsForm(oEv As Object) OpenAForm("Authors") End Sub Sub OpenMediaForm(oEv As Object) OpenAForm("Media") End Sub
The signature on these two subroutines are a little different. Since we will call them from a control within a form, we need to pass the object making the call as an argument, even though we do not use it. The argument oEv is a reference to the object making the call. We will use this to our advantage later, in the last subroutine, but here we do it because it is required. These two subroutines are pretty simple. We just make a call to OpenAForm passing the name of the form we want to open, Authors or Media. The final subroutine deals with our problem of refreshing the data in the list boxes for authors and media when we add authors or media using the two subroutines above:
Sub ListRefresh(oEv as Object) oEv.source.model.Refresh End Sub
Once again, since we will call this subroutine from a control, we need a reference to the control making the call. However, this time we will actually use the object. This subroutine makes a method call to the underlying model of the list box and refreshes the data in the list, thus updating our list of authors or media types. Save your module and close the Basic editor.
Making Connections to Macros
At this point, our macros do nothing. We need to connect them to objects in our form to activate them when needed. First, we will connect the open form subroutines to buttons in our form, and then we will connect the ListRefresh to the list boxes. In the database pane, click on Forms. Right-click the Books form and select edit. Add two push buttons to the form, one under the Authors table and another under the Media table. Right-click the button under the Authors table and select Control to bring up the buttons properties dialog. On the General tab, change the name to AddAuthors and the Label to Add Authors. On the Events tab, click the ellipses (…) button next to Execute Action – which brings up the Assign Action dialog. Click the Macro button to bring up the Macro Selector dialog. In the tree list under Library, select book.odb > Standard > FormCalls. Select OpenAuthorsForm from the Macro Name list and click OK. Click OK to close the Assign Action dialog. Close the buttons properties dialog. Do the same with the button under the Media table, only name it AddMedia, make the label Add Media Type, and assign the macro OpenMediaForm to the Execute Action event. Finally, we need to add the refresh subroutine to our list boxes. Right-click the Authors column in the authors table and select Column. On the Events tab, click the ellipse (…) button beside “When receiving focus”. In the Assign Action button, use the Macro button to assign the ListRefresh macro to the action. This will cause the list to update data from the Authors table when you click on a list box in the column. Do the same for the Media column in the media table. Save your changes to the Books form and close it.
Testing Your Changes
Any time we make changes to our forms, we will want to test them and make sure we got everything right, especially in cases where we have used macros. One simple typo could cause things to not work. Double-click the Books form to open it. Add a new book with an author and media type you have not added already. Click the Add Authors button to make sure it opens the form. Add some authors. Close the Authors form. Click on the authors dropdown list box and verify that the authors you added are there. Do the same test with the Add Media Type button and listbox. Final Thoughts and References
Again, I would like to emphasize that writing macros in LibreOffice Basic is complex. Documentation is pretty sparse, but it is out there. If you are interested in taking up the challenge, here are some references to get you started: LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt Andrew Pitonyak's OpenOffice Macro Information: http://www.pitonyak.org/oo.php You can find the macros used in this How-To on pastebin.com at http://pastebin.com/MU2Ztizi Next time, we will move on to another part of the LibreOffice suite and explore the Math module.
Traduzione italiana
Note alla traduzione
Revisione
Note alla revisione