Number comparisons in conditional text

I'm trying to print certificates for a group of athletes and need to have them reflect their standing in the event. The certificate has a number of conditional text fields, such as to translate their gender from M/F to male/female, which are working.

However the ones that are doing numeric comparisons aren't. The comparison always seems to return "true" so the "then" condition is printed. For example Run Results.Race.place == 1 is the condition but the translation text is always "first place", never empty. Since I have 5 different conditions (first 3 positions, participate, supported), I get a lot of text printed that shouldn't.

The slightly more complex Run Results.Race.age > 18 AND Run Results.Race.age < 60 always prints adult. At one point I had it print an else (senior) but that branch was never taken even when the age was well past 60.

I've checked the Run Results.odb file (which links to a spreadsheet) and the age & place fields are both of type decimal.

What am I doing wrong?

I've tried it with Debian/Stretch v5.1.2.2.0+ and Windows 7 v5.1.3. If I was running anything old or unusual, I would have noted it. The document is simple, as is the spreadsheet and the base file that connects them.

I tried changing the numbers to text but Base doesn't seem to allow that. It's decided that the columns for age and place are decimal numbers.

So far as I can see, either the number comparisons operate differently from the text comparisons (which the documentation doesn't mention) or the number comparisons are broken. Normally I'd consider that unlikely, but my past experience with printing "form letters" and labels is that these areas don't get a lot of attention.

Reportedly, as of LO 5.1 you can create a mail merge without a Base file -
reference this: http://vmiklos.hu/blog/mail-merge-embedding.html You might
try to recreate your Certificate mail merge without the Base file being
careful to select cell formats for your data that work with Writer. (If
you have good spreadsheet skills you could likely get the job done entirely
in Calc.)

I can browse to a spreadsheet directly without first attaching it to a database, but that's just a kludge. LibreOffice creates the base file when you select the spreadsheet, which brings me back to the same problem.

The first option is what I have been doing - it uses a calc file to drive a mailing list. The logic is in the document, not in the calc file, so that I can bring in new data without a lot of effort - the raw data can just be a .csv file.

The second option, using a "smart" calc file, moves the logic to the data file which is what I don't want to do. It means importing the data or calculation into a calc file each time. The second option, moving the logic into a base file seems more promising.

However, after much wailing and gnashing of teeth, I have to question whether base can do what I want. I can't get it to take a query using a BETWEEN criterion (e.g., youth is AGE between 0 AND 18).

It won't (apparently) do any queries on calc sheets. Fortunately copy/pasting to create a new base table is easy enough. Unfortunately without being able to match the main table (containing participant information) against age categories, etc., it's not much good.

I suppose I can use a brute force technique and create a table row for every possible age (for example) but that seems like a ludicrous kludge when the basic problem is that Writer's form letter functions can't compare numbers.

Gary,
See attached for a working case when in LO Base. You do have to be very
careful when using Base Queries (SQL) that everything is exactly correct
like where commas are placed (or not) and how quotes / half quotes are used
(or not). So setting this up in Base will likely take more time than in
Calc. You will have to judge if the final result in Base is best for your
needs. Good Luck!

Thanks Bruce. I appreciate the help. I was trying values from a table that translates age ranges into text. I hate hard coding numbers, let alone the number of ranges, because I handle events for two different groups who have their own definitions. They used to be encoded in the different certificates...

My sql was

SELECT "results".*, "Categories".* FROM { oj "results" LEFT OUTER JOIN "Categories" ON "results"."age" BETWEEN "Categories"."low" AND "Categories"."high" }

which doesn't work but does work when I use "results"."age" = "Categories"."low", leading to my complaint that BETWEEN doesn't work.

Your use of a CASE statement with just the one table looks like it will do the trick, even if the code will be ugly. I'll need 2 different CASE statements with a total of 8 different cases to do the translations.

A (more difficult) method to use the age ranges from their own table
(separate from the other data) would be to use a correlated subquery. Then
you could have "cleaner" SQL. You can find examples of this on the web.

OR I think there may be limited support for saving query formatting like
discussed here:
https://forum.openoffice.org/en/forum/viewtopic.php?f=61&t=39997
but I don't have any experience with how this works or its limitations.

The final query isn't too bad. Unfortunately Base doesn't like pretty-printing so a raw view is hard to read. Here's what I finally used. I just need to copy the raw spreadsheet into a Base table then print against the query. It still means the code is split across two documents (the certificate and the database) since I still need conditional text to insert a middle initial and it's still simpler to handle gender in the document.

SELECT "event_name", "first_name", "middle_initial", "last_name", "sex", "age", "email", "place",
     CASE WHEN "age" BETWEEN 0 AND 18 THEN 'Youth'
               WHEN "age" BETWEEN 19 AND 59 THEN 'Adult'
               ELSE 'Senior'
     END "Group",
     CASE WHEN "place" = 0 THEN 'supporting'
              WHEN "place" = 1 THEN 'first'
              WHEN "place" = 2 THEN 'second'
              WHEN "place" = 3 THEN 'third'
              WHEN "place" >= 4 THEN 'participating'
     END "Finish"
FROM "Results"