3

Weird switch issue

I'm using the MacOS app, so if I put this in a formula field:

switch Number do
case Number < 5:
10
case Number > 5:
20
end

with Number being a number field in the same table.

When I type in 0 I get 20. When I type in 1 I get 10, When I type in anything larger than 1 it goes blank.

I don't know if this happens in the cloud version or not. I sent an email to Ninox and they confirmed that it is an issue.

Ninox gave the following recommendation to make something like this to work:

switch true do
case Number < 5:
10
case Number > 5:
20
end

And that worked on my computer.

So to test it futher, I did something like:

switch true do
case Number < 5:
    10
case Number > 5 and Number < 8:
    20
case Number > 8 and Number < 12:
    30
default:
    0
end

And that works as well. Not intuitive, but if you need to get it something like this work.

5 replies

null
    • Ninox developper
    • Jacques_TUR
    • 2 yrs ago
    • Reported - view

    Thanks a lot for sharing Fred, I was looking for a way to do this yesterday!

    I hadn't thought of putting a boolean value in the Switch, that's just great. Did you find this in the documentation?

    To understand how it works, I went to see how Ninox transforms the script and JavaScript. The result is simple on the principle, it's a series of if...then...else with nested functions, but a bit complex to read and understand :

    function anonymous(ctx, db, n0, params, cb) {
        (function(cb) {
            (function(cb) {
                cb(true)
            })(function(v1) {
                (function(cb) {
                    cb((n0 && n0.C) < 5)
                })(function(v2) {
                    if (v1 == v2) {
                        (function(cb) {
                            cb(10)
                        })(cb)
                    } else {
                        (function(cb) {
                            cb((n0 && n0.C) > 5)
                        })(function(v2) {
                            if (v1 == v2) {
                                (function(cb) {
                                    cb(20)
                                })(cb)
                            } else {
                                cb(undefined)
                            }
                        })
                    }
                })
            })
        })(cb);
    }
    

    The important thing to remember is that Ninox sets the value passed to Switch in V1. In our case, True. Then it compares each Case (V2) with this value "if V1=V2 then...". If the Case is a calculation that returns a boolean (Number > 5), then it is like writing "if true = (Number > 5) then...".

      • Fred
      • 2 yrs ago
      • Reported - view

      I emailed Ninox and this is what they recommended.

      Thanks for the "behind the scene" look at Ninox.

    • Ninox developper
    • Jacques_TUR
    • 2 yrs ago
    • Reported - view

    And it allows you to do more complex Switch Cases such as testing whether Number is part of a given set of numbers:

    var n := Number;
    switch true do
    case [1, 3][= n] > 0:
        "option A"
    case [2, 4, 5][= n] > 0:
        "option B"
    default:
        "erreur"
    end

    In this example: "case [1, 3][= n] > 0" :

    - "[1, 3]" is an array of two values. 
    - "[= n]" searches n in this array.
    - All that remains is to test that the result is greater than zero ">0".

    • ninox.1
    • 2 yrs ago
    • Reported - view

    Looks like a bug to me. You should have to do coding gymnastics, or read source code, or whatever, to work around the internal Ninox implementation.

      • Ninox developper
      • Jacques_TUR
      • 2 yrs ago
      • Reported - view

      Mike I can understand your point of view 😄

      The idea here is not to bypass, but to fully use the capabilities of Ninox script. The fact that you can put code in the "Cases" gives a new flexibility. We see it as a workaround because no documentation talks about it, but it is standard code that we use here.

Content aside

  • 3 Likes
  • 2 yrs agoLast active
  • 5Replies
  • 767Views
  • 4 Following