indiDatabase 1.2: Macros for the Office That Runs on Them
After 1.0, the question we heard most came from offices running big Lotus Approach applications. Thirty tables, hundreds of views, and hundreds of macros that years of somebody’s evenings went into. They liked what they saw, and then they asked the question that decides everything: what happens to my macros?
In 1.0 and 1.1, a button could run a short list of steps — go to a form, run a find, sort, set a field — with one test that could stop the rest. That covers a lot of buttons. It doesn’t cover an application built up over twenty years.
indiDatabase 1.2 is out today, and most of it is macros.
A library of macros, not a pile of buttons
An Approach file kept its macros as named things, and buttons ran them. That’s the right idea, so 1.2 does the same.
- Named macros. Each table keeps a library of macros on the new Macros screen: a name and a list of steps, written once. Any button on any form of that table runs one with the Run a macro step, and a macro can run other macros. Change the macro, and every button that runs it changes with it.
- Macros that can’t run forever. A macro that would end up running itself — directly, or through three others — is refused when you save it, and the refusal spells out the chain: “‘Tidy up’ runs ‘Close month’, which runs ‘Tidy up’, so it would never stop.” A button press always finishes.
- Macros that follow your design. Rename a field, a form, a find, a report or a saved query, and every macro that names it follows. A macro that tests a field protects that field: you can’t delete it, or change it to a type the test can’t use, until the test is changed. Quietly removing the test would change what every later press writes, and nobody should find that out at month-end.
Macros that run on their own
A form can now run a macro when it opens, and another when a new record starts. “Set Status to New and stamp today’s date” happens on every new card, whether the record was started with the New record button, with Ctrl+N, by a button, or by duplicating another record. An opening macro that would reopen its own form, or a new-record macro that would start another record, is refused when you save it — for the same reason as above.
A decision, and a run over every record
Two things Approach users built their bigger macros around, done in a way you can still read a year later:
- Run a macro if… A yes-or-no test about the record in front of you picks which of two named macros runs: if Balance > 0, run “Send reminder”, otherwise run “Thank them.” The second macro is optional.
- Run a macro on every record found. It asks first, with the count — “Run ‘Chase’ on all 342 records found?” — then works through the records one at a time, saving each as it goes, with a progress line and a Cancel button. A test inside the macro passes a record over rather than stopping the run: inside a run, “only go on if” means “only for the records where”. If a record refuses its change — a rule it breaks, a colleague editing it right now — the run stops there and tells you exactly how far it got, by name. Press the button again while indiDatabase is still open and it offers to carry on with the records not done yet, rather than doing the first ones twice. A thousand records take seconds.
Most of the loops in an Approach application do one thing: change a field on every record in the found set. For that there’s Set a field on every record found, which is quicker and safer than a run. It asks with the count, then saves every record at once — or, if one record refuses, none of them, so you’re never left with half a month marked as chased.
What we deliberately didn’t build: loops that repeat “while” something holds, and if/else blocks nested inside each other. That’s the line where a list of steps becomes a programming language, and the person who inherits your database should be able to read every macro in it without having been there when it was written.
Twenty-two things a button can do
On top of running macros, 1.2 adds seven steps:
- Save the record, exactly as the Save button does, so “Mark as paid” finishes in one press.
- Show related records — this customer’s invoices, this job’s parts — as an ordinary found set you can print, export or summarise.
- Print a report, straight to your printer’s dialog.
- Show a message worked out from the record: “Paid in full: ” & [Name]. The next step waits for OK.
- Put the cursor in a field, so typing lands where it belongs after a new record starts.
- Open a saved query — a kept Summarise worksheet — as the sidebar does.
- Duplicate the record, leaving out what has to be different on every record and what the file works out for itself.
Every step is still checked when you save the button or the macro, so a typo is caught then, not the morning somebody needs it. And a button that would change records is greyed out for anyone whose role can’t change them, rather than letting them press it and then telling them no.
Links that open
A text field that holds a web address now shows a small opener beside it, on the grid and on forms. Click it and the page opens in your browser. The same goes for an e-mail address written as mailto:, a phone number written as tel: (it opens in your phone or calling app), and a link to a file on your computer, which opens in whatever program owns that kind of file. A file link opens documents only; a link to a program is refused rather than run, and nothing opens until you click.
A button can open a link worked out from the record, too — "https://wiki.example.org/" & [Page] — so one button on a customer form reaches that customer’s page.
And formulas can now do the date arithmetic offices actually need: [Due] + 14 is a date two weeks after the due date.
The second month, handled
Every release, we run the new features the way an office does in its second month — the next import, the second desk, the renamed field, the backup from before the update — and fix what breaks. This round found a good deal:
- Importing next month into last month’s table no longer empties a longer name or a finer amount the first month’s sheet didn’t allow for. If you’re allowed to change the table’s design, the import offers to widen the field to fit, without losing anything. A blank required cell or a repeated customer number now names the row of the file it’s on, LibreOffice Calc times arrive as times, and every import refusal reads in your language.
- History stays true. A record added after another was deleted no longer inherits the deleted record’s history. A hidden field’s old values stay hidden after the field is removed. A change of field type that empties a value is in the record’s history. And looking inside a backup from before 1.1 no longer changes the backup.
- Very large whole numbers — serial numbers past nine quadrillion — are never quietly rounded to their neighbour. Where a value can’t be kept exactly, it’s counted and you’re told.
- Renaming the database reaches every desk in the office, and a computer connected to someone else’s database names that database in its sidebar.
- Report a problem now records failed imports, sharing being started, and failed sign-ins, so a support message says what actually happened.
- The nine languages read better: proper plurals for “1 character” and “1 decimal place”, each language’s own quotation marks, Japanese sentences that read as one sentence, and a message on screen that switches language when you do.
- Linux computers with an unusual regional setting no longer show a blank form.
Before you update
1.2 is a free update for everyone on 1.x.
One thing to know if you share a database with the office: opening a database in 1.2 upgrades its file, and earlier versions can’t open it afterwards. Update every computer in the office at the same time. Before it upgrades a file, indiDatabase saves a copy of the file as it was, right beside it, so the pre-1.2 version is never lost.
Getting it
indiDatabase 1.2 is on our download page for Windows 10 and 11 (code-signed) and Linux (AppImage, .deb and .rpm). macOS is coming later.
Single-user is $199. Multi-user, with every computer in the office, is $399. Upgrade from single-user for the $200 difference, never full price twice. Updates are free for all of 1.x.
Every copy starts with a 30-day free trial with everything turned on, sharing and macros included, and no credit card. If you’ve been putting off the move because of your macros, import your data, rebuild your busiest button as a macro, and see how it feels.
Buy it once. It keeps working.