Search code examples
ms-accessms-access-2007jet-sql

SWITCH Incorrect Argument Amount - Can't See Where


I'm trying to use the SWITCH function in MS Access and I keep getting told there aren't the right number of arguments. I'm new to the switch function but I understand the syntax.

Switch ( expression1, value1, expression2, value2, ... expression_n, value_n )

Am I doing something in the switch that can't be used, the sub-queries maybe? I've checked my commas, parentheses and that there is an expression and then a return value. Driving me crazy as I'm converting from T-SQL to jet and replacing a CASE statement that worked perfectly fine.

Switch(
        (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND eh.STARTDTE < sh.STARTDTE),
          "FAIL - Employment Start Date Before Service Start Date",
        (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND eh.ENDDTE > sh.ENDDTE),
          "FAIL - Employment End Date After Service End Date",
        (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND  (
                                                                                            SELECT
                                                                                                COUNT(*)
                                                                                            FROM
                                                                                                emphist AS eh2
                                                                                            WHERE
                                                                                                eh2.MEMBNO = sh.MEMBNO
                                                                                            AND eh2.EMPID = sh.EMPID
                                                                                            AND eh2.ENDDTE = DateAdd(dd,-1,eh.STARTDTE)
                                                                                          ) = 0),
          "FAIL - Previous Employment Period Corrupt or Missing",
        (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND  (
                                                                                            SELECT
                                                                                                COUNT(*)
                                                                                            FROM
                                                                                                emphist AS eh2
                                                                                            WHERE
                                                                                                eh2.MEMBNO = sh.MEMBNo
                                                                                            AND eh2.EMPID = sh.EMPID
                                                                                            AND eh2.ENDDTE = DateAdd(dd,-1,eh.STARTDTE)
                                                                                          ) = 0),
          "FAIL - Previous Employment Period Corrupt or Missing",
        (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND (
                                                                                            SELECT
                                                                                                COUNT(*)
                                                                                            FROM
                                                                                                emphist AS eh2
                                                                                            WHERE
                                                                                                eh2.MEMBNO = sh.MEMBNO
                                                                                            AND eh2.EMPID = sh.EMPID
                                                                                            AND eh2.STARTDTE = DateAdd(dd,1,eh.ENDDTE)
                                                                                          ) = 0),
          "FAIL - Next Employment Period Corrupt or Missing",
        (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE <> sh.ENDDTE AND (
                                                                    SELECT
                                                                        COUNT(*)
                                                                    FROM
                                                                        emphist AS eh2
                                                                    WHERE
                                                                        eh2.MEMBNO = sh.MEMBNO
                                                                    AND eh2.EMPID = sh.EMPID
                                                                    AND eh2.STARTDTE = DateAdd(dd,1,eh.ENDDTE)
                                                                  ) = 0),
          "FAIL - Next Employment Period Corrupt or Missing",
        (eh.STARTDTE <> sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND (
                                                                    SELECT
                                                                        COUNT(*)
                                                                    FROM
                                                                        emphist AS eh2
                                                                    WHERE
                                                                        eh2.MEMBNO = sh.MEMBNO
                                                                    AND eh2.EMPID = sh.EMPID
                                                                    AND eh2.ENDDTE = DateAdd(dd,-1,eh.STARTDTE)
                                                                  ) = 0),
          "FAIL - Previous Employment Period Corrupt or Missing",
        (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND  (
                                                                    SELECT
                                                                        COUNT(*)
                                                                    FROM
                                                                        emphist AS eh2
                                                                    WHERE
                                                                        eh2.MEMBNO = sh.MEMBNO
                                                                    AND eh2.EMPID = sh.EMPID
                                                                  ) <> 1),
          "FAIL - Too Many or No Employment History Records"
  ) AS "Reason"

UPDATED WITH ANSWERS

Switch(
        (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND eh.STARTDTE < sh.STARTDTE),
          "FAIL - Employment Start Date Before Service Start Date",
        (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND eh.ENDDTE > sh.ENDDTE),
          "FAIL - Employment End Date After Service End Date",
        (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND  (
                                                                                            SELECT
                                                                                                COUNT(*)
                                                                                            FROM
                                                                                                emphist AS eh2
                                                                                            WHERE
                                                                                                eh2.MEMBNO = sh.MEMBNO
                                                                                            AND eh2.EMPID = sh.EMPID
                                                                                            AND eh2.ENDDTE = DateAdd("dd",-1,eh.STARTDTE)
                                                                                          ) = 0),
          "FAIL - Previous Employment Period Corrupt or Missing",
        (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND  (
                                                                                            SELECT
                                                                                                COUNT(*)
                                                                                            FROM
                                                                                                emphist AS eh2
                                                                                            WHERE
                                                                                                eh2.MEMBNO = sh.MEMBNo
                                                                                            AND eh2.EMPID = sh.EMPID
                                                                                            AND eh2.ENDDTE = DateAdd("dd",-1,eh.STARTDTE)
                                                                                          ) = 0),
          "FAIL - Previous Employment Period Corrupt or Missing",
        (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND (
                                                                                            SELECT
                                                                                                COUNT(*)
                                                                                            FROM
                                                                                                emphist AS eh2
                                                                                            WHERE
                                                                                                eh2.MEMBNO = sh.MEMBNO
                                                                                            AND eh2.EMPID = sh.EMPID
                                                                                            AND eh2.STARTDTE = DateAdd("dd",1,eh.ENDDTE)
                                                                                          ) = 0),
          "FAIL - Next Employment Period Corrupt or Missing",
        (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE <> sh.ENDDTE AND (
                                                                    SELECT
                                                                        COUNT(*)
                                                                    FROM
                                                                        emphist AS eh2
                                                                    WHERE
                                                                        eh2.MEMBNO = sh.MEMBNO
                                                                    AND eh2.EMPID = sh.EMPID
                                                                    AND eh2.STARTDTE = DateAdd("dd",1,eh.ENDDTE)
                                                                  ) = 0),
          "FAIL - Next Employment Period Corrupt or Missing",
        (eh.STARTDTE <> sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND (
                                                                    SELECT
                                                                        COUNT(*)
                                                                    FROM
                                                                        emphist AS eh2
                                                                    WHERE
                                                                        eh2.MEMBNO = sh.MEMBNO
                                                                    AND eh2.EMPID = sh.EMPID
                                                                    AND eh2.ENDDTE = DateAdd("dd",-1,eh.STARTDTE)
                                                                  ) = 0),
          "FAIL - Previous Employment Period Corrupt or Missing",
        (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND  (
                                                                    SELECT
                                                                        COUNT(*)
                                                                    FROM
                                                                        emphist AS eh2
                                                                    WHERE
                                                                        eh2.MEMBNO = sh.MEMBNO
                                                                    AND eh2.EMPID = sh.EMPID
                                                                  ) <> 1),
          "FAIL - Too Many or No Employment History Records"
  ) AS "Reason"

Solution

  • It is not Switch but IsNull that raises the error. So replace all these faulty statements:

    IsNull(eh.ENDDTE,"")
    

    with:

    Nz(eh.ENDDTE)