[Base, Python] Tiny Macro Refreshing Forms, List/Combo Boxes

Creating Extension - Shared Libraries
Forum rules
For sharing working examples of macros / scripts. These can be in any script language supported by OpenOffice.org [Basic, Python, Netbean] or as source code files in Java or C# even - but requires the actual source code listing. This forum is not for asking questions about writing your own macros.

[Base, Python] Tiny Macro Refreshing Forms, List/Combo Boxes

Postby Villeroy » Sat May 20, 2017 3:10 pm

Hands-on example for testing
Open movies_5.odb with 2 forms. Both forms reflect a many-to-many relation between movies and genres. One form lets you assign movies to genres, the other lets you assign genres to movies. No macro involved. Just an ordinary many-to-many relation, reflected in both directions by 2 Base forms.
This is the database relation between movies and genres

This is the form hierarchy between the genres in main form, movies in a subform and an additional form to add new movies.
GenreMovies_FormNavo.png (17.67 KiB) Viewed 727 times

Both forms have an additional form to add new genres or movies respectively.
After you have saved a genre name, you can go back to the grid of genres belonging to the current movie, refresh the list box in that grid and then assign the newly inserted genre to that move.
In the other form: After you saved a full set of movie attributes, you can go back to the grid of movies belonging to the current genre, refresh the list box in that grid and then assign the newly inserted movie to that genre.
The navigation toolbar provides a second refresh button when a combo box or list box is focussed. This button allows you to refresh only the focussed list/combo box without reloading the entire form.

How to refresh the list boxes of genres/movies automatically?

1. Extract the attached pyDBA_AutoRefresh.zip to your profile folder as Scripts/python/pyDBA/AutoRefresh.py
Windows: %APPDATA%\OpenOffice\4\user\Scripts\python\pyDBA\AutoRefresh.py
Mac: /Users/<user name>/Library/Application Support/OpenOffice/4/user\Scripts\python\pyDBA\AutoRefresh.py
Linux: ~/.openoffice/4/user/Scripts/python/pyDBA/AutoRefresh.py
LibreOffice on Linux: ~/.config/libreoffice/4/user/Scripts/python/pyDBA/AutoRefresh.py

2. Use the form navigator to add a new hidden control named "AutoRefresh" (case sensitive) to the "NewMovie" form (or to the "NewGenre" respectively) and add the following hierarchical path to the item you want to refresh, so the value reads ../MainForm/SubForm/SubForm_Grid/MovieID (or with trailing /GenreID if you are editing the other form).
From its containing form, the path goes one level up (..) to the parent container "Forms", then down to the MainForm/SubForm/SubForm_Grid and the list box named "MovieID" or "GenreID respectively.

3. Assign the above macro [MyMacros > pyDBA > AutoRefresh > formAction] to the form's event "After Record Action". Do not assign the code to any form control's event!

4. Save and reload the form document.

How does it work?
The little macro is triggered by form event "After Record Action". A form's record action is either one of insert, delete or update (in other words adding, removing, editing of a whole record). In this particular example it is row insertion since this is the only action provided by the "NewGenre"/NewMovie" forms.
When this has happened, the macro reads the text value from the named control "AutoRefresh", navigates from the containing form to the form control that is specified by the hierarchical path name and refreshes that item.
Without any modifications to the Python code, this tiny macro is able to refresh forms, combo boxes and list boxes. The same form event can refresh multiple items. Just separate their path names with semicolons. All you need is a form event, a hidden control "AutoRefresh" (case sensitive) with one or more path names (case sensitive) pointing to one or more refreshable items (forms, combo/list boxes).

There is barely any error handling. You get plain Python errors as message boxes.
no-such-element errors when an addressed item does not exist
attribute errors when you use control events instead of form events or when the addressed item is not refreshable (not a form, combo, list box).
Little Python macro to refresh forms, list boxes and combo boxes
(467 Bytes) Downloaded 63 times
Please, edit this topic's initial post and add "[Solved]" to the subject line if your problem has been solved.
Ubuntu 16.04, OpenOffice 4.x & LibreOffice 5.x
User avatar
Posts: 24652
Joined: Mon Oct 08, 2007 1:35 am
Location: Germany

Return to Code Snippets

Who is online

Users browsing this forum: No registered users and 3 guests