Troubleshooting Compiler Errors

To view the causes and solutions of PSL compilation errors, click the first letter of the error message text:

A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z

<tab> delimiter is illegal

Cause:

The <tab> character was used as a column delimiter.
 

Solution:

Do not use the <tab> character as a delimiter.

$$NEW^%ZT is obsolete in Profile01

Cause:

The $$NEW^%ZT function is not available in PSL in Profile v6.4 and later.
 

Solution:

This utility and SET^%ZT were used to trap errors. Replace these functions with a catch block.

 

main // Main subroutine

    catch xyz {

        write !,"Tag main:",xyz.type," Thrown at:",xyz.thrownAt

        }

    do subr

    type RecordDEP dep = Db.getRecord("DEP",1212)

    quit

subr //

    catch error{

        write !,"Tag subr:",error.type," Thrown at: ",error.thrownAt

        throw MyError

        }

    if x // will generate %GTM_E_UNDEF

quit

$$ Extrinsic not supported: <atom>

Cause:

String methods are not supported on extrinsic functions.

 

     set x = a.extract(1)

     set x = "String".extract(1)

     set x = $$tag^rou().extract(1)

     

Solution:

Modify the code to not specify a string method for an extrinsic function.

Argumentless Kill is not supported

Cause:

A Kill statement does not specify the required arguments.
 

Solution:

PSL manages several variables in the background. If programmers kill all variables, that would result in undefined errors on those variables.

Instead, set a break in the program at the location where the kill is intended. Determine which variables are related to the processing, and kill each individually.

Assigning a value to a read-only system variable:"_atom"

Cause:

An attempt was made to assign a value to a read-only system variable. In the following example, UserName is a system keyword that identifies the name used by the user when he or she signed on to the operating system. This value cannot be manually changed.

 

set %UserName=12

 

Solution:

Do not use a system keyword in an assignment statement.

Assignment function is not supported

Cause:

The fourth parameter of the piece method (i.e., Boolean ignoreQuoted) was used on the left side of an assignment command.
 

Solution:

Do not use the ignoreQuoted parameter on the left side of an assignment command using the piece method.

Block initiator expected

Cause:

The beginning of a catch of code was not delimited by a { character.
 

Solution:

Add the appropriate { to mark the beginning of the block of code; enter the necessary lines of code; and close the block with a closing }.

Cannot assign: <table> to: <class>

Cause:

The class of an object being assigned the result of a Dbset.getRecord does not match the table used in the Db.selectDbset.
 

Solution:

Review the object class, and correct it to match the table within the Db.selectDbset.

Cannot modify computed data item <table>.<property>

Cause:

The code attempted to modify a computed column.
 

Solution:

Remove the code that attempted to modify the computed column.

Cannot use an array identifier as a secondary point: <variable>

Cause:

Multiple identifiers can be assigned to a single object. However, the second identifier cannot be an array.

 

type RecordDEP dep = Db.getRecord ("DEP",":CID")

type RecordDEP dep2 = dep

type RecordDEP a()

set a(1)=dep

 

Solution:

Do not assign an array as a secondary identifier in an object.

 

type RecordDEP dep = Db.getRecord ("DEP",":CID")

type RecordDEP dep2 = dep

type RecordDEP dep3 = dep

Casting terminator expected

Cause:

An object is being cast as another Record class, but does not have the appropriate casting terminator (i.e., }).

 

type RecordACN acn = Db.getRecord ("ACN","CID")

if acn.cls = "D" do {

    set acn = {RecordDEP.acn

}

 

Solution:

Insert the casting terminator following the Record class.

 

type RecordACN acn = Db.getRecord ("ACN","CID")

if acn.cls = "D" do {

    set acn = {RecordDEP}.acn

}

Class is not instantiable: <class>

Cause:

A program attempts to instantiate a class that cannot be used to instantiate objects. That is, the Not Instantiable Flag (OBJECT.NOINSTANT) for that class is selected. For example, the Db class has this flag set because the class is used to provide methods to access the database. Those methods are used on objects created under other classes.

This error only occurs when using the Class.new method.

 

type Db x = Class.new("Db")

 

Solution:

There is no reason to instantiate an object of class Db.

Column class property is read-only

Cause:

The properties of the Column class are read-only (e.g., DES, KEY, LEN, OLDVAL,TYPE).
 

Solution:

Remove the code that is attempting to set those properties.

Column expression: <expression> is not in the select list: <columnList>

Cause:

A column reference was made in a Row or ResultSet class object that does not exist in the list of columns associated with that object.
 

Solution:

Remove the column reference, or ensure that the column name is part of the list of columns for the object.

Column name: <name> is not in the select list: <list>

Cause:

A column name is referenced in the ResultSet.getCol method that has not previously been selected using Db.select ro Db.selectDbSet.

 

type ResultSet rs = Db.select("LNM,CID","DEP")
while rs.next() do {
write !,rs.getCol("bal")," ",rs.getCol("lnm")
}

 

Solution:

Include the column name in the select statement.

 

type ResultSet rs = Db.select("BAL,LNM,CID","DEP")
while rs.next() do {
write !,rs.getCol("bal")," ",rs.getCol("lnm")
}

Column names can only be used in the instantiating scope

Cause:

The ResultSet.getCol method used the columnName parameter in a subroutine other than where the result set is instantiated.

 

xxx

type ResultSet rs = Db.select("IRN","DEP")

if rs.isEmpty() quit

while rs.next() do {

     do XXX(.rs)

     if rs.getCol("IRN") = 5 quit

     }

quit

XXX(ResultSet rs)

     if rs.getCol("IRN") = 5 quit

     quit

 

Solution:

Use the columnNumber parameter in subroutines other than where the result set is instantiated.

Column parameter required

Cause:

The getCol method was used without providing either the column name or its ordinal position within the result set.
 

Solution:

Review the use of the method, and add either a column name or numeric pointer to the column needed.

Column reference (col1) is greater than selected columns (col2)

Cause:

A resultSet.getCol method lists one number of columns, while the resultset lists a larger number of columns.
 

Solution:

Review the getCol method used. The sequence number entered is greater than the number of columns in the select command.

Command delimiter expected

Cause:

A catch statement is not followed by a block delimiter "{".

 

catch error:RECNOF

 

Solution:

Enter a delimiter in the catch statement.

 

catch error:RECNOF {

Command does not support a post-conditional expression: <command>

Cause:

A command in the procedure does not permit the use of post-conditional expressions.

 

if X new abc

OR

new abc:x

 

Commands that do not support the use of post-conditional expressions include CATCH, ELSE, FOR, IF, NEW, and TYPE.

 

Solution:

Remove the post-conditional expression from the offending command. You may need to modify the program logic to perform the same task as the post-conditional expression.

 

if X do {

            new abc

            do more

}

Compare class must be the same

Cause:

The two objects being compared by the Record.compare method are not of the same class.
 

Solution:

None.

Compiler cannot interpret SQL

Cause:

The Db.nextVal, Db.currVal, and Db.preVal methods must generate a single line of code that can order through the requested table. The PSL compiler uses the Profile SQL code generator to generate this code. This error occurs when the code generator produces code that is more than one line.
 

Solution:

Review the table as well as the keys used in the method to ensure that the correct number of keys were used for the method.

Compiler Error: Copy^UCPATCH

Cause:

This is an internal PSL compiler error and should not occur.
 

Solution:

Report the error to FIS PSL Support.

Data variable required

Cause:

The IO.write method is missing the first parameter, recordData.
 

Solution:

Add the first parameter to the IO.write method reference.

Db class is read-only under Literal scope

Cause:

The user attempted to update a Literal scope object in the Db class.
 

Solution:

Convert the Literal scope object to be instantiated at run time.

Dynamic isDefined is not supported

Cause:

The Db.isDefined method was used. However, the compiler cannot determine the table or access keys (e.g., variables were specified instead of literal values).
 

Solution:

None. The closest equivalent is to create a result set using Db.select, and verify the results with the isEmpty method.

Equal sign expected

Cause:

An expression does not contain an equal sign. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP",12345)

 

set dep.bal 100

quit

 

Solution:

Modify the PSL source code to use an equal sign where you make an assignment. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP",12345)

 

set dep.bal = 100

quit

Error creating temporary table <table>

Cause:

The code specifies the schema.createTable method. However, during table creation in a relational database, a failure occurred. This error occurs only when using a non-M database.
 

Solution:

None.

Error deleting temporary table <table>

Cause:

The code specifies the schema.deleteTable method. However, during table creation in a relational database, a failure occurred. This error occurs only when using a non-M database.
 

Solution:

None.

Error type parameter is required

Cause:

The error type (i.e., from the Errors system table (ET)) must be specified when throwing a run-time error.
 

Solution:

Specify the error type when throwing the error.

 

catch ERROR {

set ET = ERROR.type

set CONTEXT = ERROR.context

Exclusive new's are not allowed: <expression>

Cause:

A user attempted to use an exclusive new statement.

 

new (XYZ)

 

Solution:

PSL does not permit exclusive new statements as they can cause memory leaks as well as unusual undefined errors when an object name is include in the protect list without the PSL internal object array.

In M code, FIS discourages their use. In PSL code, they are prohibited.

Expression expected

Cause:

A valid M or PSL expression was expected but not found. For example,

 

new dep

type RecordDEP dep

set Db.getRecord("DEP",12345)

 

set dep.bal =

quit

 

Solution:

Modify the source code to ensure the line contains valid M or PSL expressions. Check for missing expressions or extra delimiters (e.g., space, comma, colon).

 

new dep

type RecordDEP dep

set Db.getRecord("DEP",12345)

 

set dep.bal = bal + tamt

quit

Expression must return a class: <expression>

Cause:

A method does not return a class, when it is required to do so.

 

x = dep.newMethod()

 

Solution:

Modify the code to return a class.

Expression not allowed in group set: <expression>

Cause:

A $ variable was included as part of a group of columns within one command.

 

set ($ZT) = 12

 

Solution:

Do not set these special GTM variables as part of a group of columns in one command.

 

set $ZT = 12

Global name cannot exceed 8 characters

Cause:

The global name specified in the Schema.createTable method parameter list is greater than 8 characters in length.
 

Solution:

Specify a global name that is less than or equal to 8 characters in length.

Goto command is invalid in object scope

Cause:

The GOTO command is invalid in the object scope. For example,

 

abc //

     type RecordDEP dep

     set dep = Db.getRecord("DEP",CID)

     set bal = dep.bal

     go def

     quit

 

def //

     set bal = bal + tamt

     quit

 

Solution:

Modify the source code to eliminate the GOTO command at the specified line. You may need to modify the logic as a result of this change. For example,

 

abc //

     type RecordDEP dep

     set dep = Db.getRecord("DEP",CID)

     set bal = dep.bal

 

def //

     set bal = bal + tamt

     quit

Identifier class must be a Record<class>: <variable class>

Cause:

The Record.copy method can be used to copy records from one Record class to another Record class. However, do not use it to copy from a Record class to a totally different class.

 

type String xxx

type RecordUTBLBRCD brcd = Db.getRecord("UTBLBRCD","X")

set xxx = brcd.copy()

 

Solution:

Declare xxx as class RecordUTBLBRCD.

Identifier must be local scope for dynamic SQL: <name>

Cause:

The ResultSet is defined in one label passed to another, where the columns being selected are dynamic.

 

type ResultSet rs

do xxx(.rs)

quit

 

xxx(ResultSet rs)

     #warn

     type Public String IRN

     set rs = Db.select(IRN,"DEP")

     if rs.isEmpty() quit

     while rs.next() do {

     quit

 

Solution:

Move the type statement for the result set into the xxx level.

Illegal reference to abstract class: <class>

Cause:

When using the Class.new method to create a new object, the object is defined for an abstract class. An abstract class is defined by selecting the Abstract Class Flag (OBJECT.ABSTRACT) option. Abstract classes should not be associated with a particular instance of an object. For example, the Record class is used to instantiate many different types of Table objects and should therefore not be associated with a particular instance of an object.
 

Solution:

Use a valid class.

Illegal sentinel character

Cause:

Reference was made to a variable that contains sentinel characters (i.e., the characters vo in the variable name). For example,

 

new dep

type RecordDEP dep

set Db.getRecord("DEP",12345)

 

set dep.bal = 100

s vo = 100

quit

 

Solution:

Rename the variable that begins with the characters "vo". These characters are sentinel characters, and are reserved for use by the PSL compiler. For example,

 

new dep

type RecordDEP dep

set Db.getRecord("DEP",12345)

 

set dep.bal = 100

s amt = 100

quit

Incorrect Change value entered

Cause:

A value other than SYSTEM or USER was specified as the second parameter (i.e., changeType) for the Record.isChanged method.
 

Solution:

Correct the value of the second parameter.

Incorrect number of keys

Cause:

The number of keys specified for the Db.isDefined method is less than the number of keys defined for the table.
 

Solution:

Use the correct number of keys.

Invalid $SELECT syntax

Cause:

An invalid $SELECT syntax exists. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP",12345)

 

set dep.bal = 100

set dep.bal = $SELECT(dep.bal>100,100)

quit

 

Solution:

Check the syntax for $S[ELECT]. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP",12345)

 

set dep.bal = 100

set dep.bal = $SELECT(dep.bal>100,1:100)

quit

Invalid assignment function

Cause:

An instrinsic function was used on the left side of an expression.

 

set $E(FFF,"|",2) = 3

 

Solution:

The only intrinsic function that may appear on the left side of an expression is the $piece function. Review the code. It is possible that the programmer meant to use a $piece function.

 

set $P(FFF,"|",2) = 3

Invalid assignment on array: <expr>

Cause:

An attempt was made to assign an array to a value with a type command.

 

type RecordDEP dep() = Db.getRecord("DEP",":CID")

 

Solution:

Remove the array assignment from the type command.

 

type RecordDEP dep = Db.getRecord("DEP",":CID")

Invalid block termination

Cause:

The system attempted to terminate a block that had not been opened. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP",12345)

 

set dep.bal = 100

 

do {

     set dep.bal = 100

}

}

quit

 

Solution:

Modify the PSL source code to ensure that each block of code that opens with a left curly bracket { character also terminates with a right curly bracket } character. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP",12345)

 

set dep.bal = 100

 

do {

     set dep.bal = 100

}

quit

Invalid cast - Class: <class> cannot be cast as: <cast>

Cause:

The attempted cast is illegal because the classes are not compatible.
 

Solution:

None.

Invalid command

Cause:

A specified M command does not exist. For example,

 

x = y

 

Solution:

Modify the PSL source code to include a valid M command (e.g., set, if, for, else) on the specified line. For example,

 

set x = y

Invalid DATA-QWIK table: <tableName>

Cause:

A Record<class> specified in the code does not exist in the database dictionary.

 

x = y

 

Solution:

Verify the spelling and case of the table specified in the object declaration. For example, the following statement produces this error because dep is not a valid DATA-QWIK table. Use DEP instead.

 

type Recorddep deposit

 

If referencing a new table, verify that it exists in DATA-QWIK.

Invalid expression: <expression>

Cause:

PSL cannot evaluate a part of a line of code. The compiler attempts to determine if the expression is a variable, function, or intrinsic M variable. For example, this error occurs when an intrinsic M variable has not been added to the PSL compiler, or if certain combinations of operators are used (e.g., x = y//3).
 

Solution:

Review and correct the expression. If a valid case can be made for adding an intrinsic M variable to the PSL compiler, PSL will be changed to include it.

Invalid function

Cause:

A specified M function does not exist. For example,

 

set x = $K(abc)

 

Solution:

Modify the PSL source code to include a valid M function (e.g., $P[iece], $G[et], $D[ata], $L[ength], etc.). For example,

 

set x = $L(abc)

Invalid identifier: <key>

Cause:

The column name specified as an access key in a Db class method is not a key used to access the record.
 

Solution:

Review the key list used, and remove any column names that are not keys.

Invalid in multiple command lines

Cause:

A compiler command was used on a line with other application code.

 

if X = 3 #IF condition

 

Solution:

Modify the code so that the compiler command appears by itself on a line of code.

 

#if condition

      if X = 3...

 

#ENDIF

Invalid inside nested structures

Cause:

A GOTO command appears within a nested DO block. For example,

 

     do {

          set x = x + 1

          if x > 10 goto abc

     }

     exit

 

abc set er = 1

     exit

 

Solution:

Remove the GOTO command within a nested DO block. This may require a change to the logic contained within the DO block. For example,

 

      do {

          set x = x + 1

      }

      if x > 10 set er = 1

      exit

Invalid map expression: <expression>

Cause:

The format of the colMap parameter in the Record.copy method is incorrect.
 

Solution:

The correct format of the colMap parameter is column name = column name. Ensure that neither column name is null and the equal sign appears in the parameter expression.

Invalid method for data type: <type>

Cause:

The Db.nextVal method was used against a table to calculate the sequence number of the next record to insert into the database. However, the table's last key is defined as text, upper_case, frequency, or logical. Therefore, the system cannot calculate a numeric next value.
 

Solution:

This method cannot be used for the table. Determine another alternative for setting the value.

Invalid method for table: <table>

Cause:

The Db.nextVal, Db.currVal, or Db.preVal method was used on a table (e.g., CUVAR) that is defined as a single record table. The primary key on such tables is typically listed as "*".
 

Solution:

None, do not use these methods on single record tables.

Invalid object identifier: <atom>

Cause:

An array of objects was declared and set with a single command.

 

type RecordACN acn(1) = Db.getRecord("ACN","CID=:CID")

 

Solution:

Declare the array and instantiate objects on separate lines.

 

type RecordACN acn()

set acn(1) = Db.getRecord("ACN","CID=:CID")

Invalid ORDER BY keyword in WHERE clause

Cause:

In a non-M database environment, the Db.select method contains the words "Order by" in its orderBy parameter. This error does not occur in an M environment.
 

Solution:

Remove the words "Order by" from the Db.select method statement.

Invalid SQL expression (<expression>), <message>

Cause:

When using the Db.select method, the parameters supplied do not make a syntactically correct SQL statement.
 

Solution:

Review the Db.select method statement to ensure that its parameters are correct. The SQL utility call will provide additional details, which can help identify the specific scenario causing the error.

Invalid SQL syntax (<expression>), <message>

Cause:

When using the Db.delete method, the parameters supplied do not make a syntactically correct SQL statement.
 

Solution:

Review the Db.delete method statement to ensure that its parameters are correct. The SQL utility call will provide additional details, which can help identify specific scenario causing the error.

Invalid Subroutine name: <expression>

Cause:

A subroutine label contains parameters and is either missing the closing parenthesis or does not terminate a parameter with a comma.

 

label(parameter1            // Parameter #1

         parameter 2)         // Parameter #2

 

Solution:

Insert missing parenthesis or comma.

 

label(parameter1,            // Parameter #1

         parameter 2)          // Parameter #2

Invalid syntax

Cause:

The syntax of a method is incorrect.

 

s data = Db.getOneRow("ACN,TAXID","CIF","")

 

Solution:

Correct the syntax to match the prescribed method format.

 

s data = Db.getOneRow("ACN,TAXID","CIF","XACN")

Invalid table name

Cause:

The following conditions exist for a table to be deleted using the Schema.deleteTable method:

  • The date the table was last updated (DBTBL1.LTD) is blank, AND the user ID of the person who last updated the table (DBTBL.USER) is blank.
    OR

    The user ID (DBTBL.USER) is ZZZZZZ.

AND

  • The file type associated with the table (DBTBL.FILETYP) is 5 (Dummy Table).

Solution:

Review the code. Either a table was not created by a Schema.createTable, or there are multiple Schema.deleteTable commands in the code.

Invalid void method in nested syntax: <atom>

Cause:

A void method has been specified in a nested expression.

 

type RecordDEP dep=Db.getRecord("DEP",":CID")

set x = dep.bal.curVal().len

set x = dep.save().extract(1)

 

Solution:

Modify the code to remove the void method from the nested expression.

Key expression required

Cause:

The Db.prevVal method did not specify a value for the second parameter (i.e., accessKeys).

 

set TRC = Db.prevVal("TTX")

 

Solution:

Add data for the second parameter to define the WHERE clause.

 

set X=Db.prevVal("TTX","TTP,BRCD,XYZ,""""")

Label already exists: <label>

Cause:

A label appears multiple times within the same source module. For example,

 

label set x = y

label set y = z

 

Solution:

Rename one of the label references within the source module. For example,

 

label set x = y

label1 set y = z

Label called does not exist: <??>

Cause:

Within the PSL element being compiled, a subroutine is being called that does not exist in the element.
 

Solution:

Either add the subroutine, or remove the call.

Label Expected: <expression>

Cause:

A Literal scope variable has a null value. This error occurs in the following example if the value of CUVAR.PGM is null.

 

xecute "DO ^"_CUVAR.PGM"

 

Solution:

Modify the code to ensure that the proper values are assigned at the time of compilation.

Left nibble position required

Cause:

The third parameter (i.e., leftNib) was not specified for the Number.complexUnpack method.
 

Solution:

Specify the proper value for the third parameter.

Length required

Cause:

The Number, unpack, Number.unpack2, or Number.zero method did not specify a value for the first parameter, which is the length of the return data.
 

Solution:

Specify the first parameter value.

Literal parameter expected: <parameter>

Cause:

A method requires a literal as one of its parameters. However, the literal does not exist in the code. For example,

 

new ts

 

type TranSet ts

set ts = Class.new()

 

Solution:

Include the missing literal in the method’s parameter list. For example,

 

new ts

 

type TranSet ts

set ts = Class.new("TranSet")

Literal scope not allowed in group set: <atom>

Cause:

A variable is typed as a Literal variable and subsequently initialized in a group set.

 

type Literal String dim

set (x,dim) = 1

 

Solution:

Remove the variable typed as a Literal from the group, and set it individually.

 

type Literal String dim

set x = 1

set dim = 1

M global reference: <atom>

Cause:

This message identifies a place where a global reference was included. This message appears as a warning in versions prior to Profile version 7.0, and as an error in version 7.0 and later.
 

Solution:

Modify the code to avoid the use of globals.

Method can not be applied to local scope object: <objectName>

Cause:

The RecordClass.setCreateOnly() or RecordClass.setUpdateOnly method was used with an object that is local scope.
 

Solution:

These methods can only be used for objects that are either Public scope or passed in as a formal parameter.

Method is invalid for Primitive objects

Cause:

When using the object.storeValue method, the user specified a reference object of primitive type (e.g., Blob, Boolean, Date, Memo, Number, String, or Time).

 

type Number xyz

do xyz.storeValue("ABC")

 

Solution:

None, you cannot use the method.

Missing actual keys: <keys>

Cause:

Database access methods (except Db.select) fail to provide all the keys necessary to retrieve the record from the database.

 

type RecordHIST hist = Db.getRecord("HIST","CID")

 

Solution:

Review the key list, and add missing keys to the second parameter.

Missing label name

Cause:

A label is Public and includes parameters. However, the label was not named as such.
 

Solution:

Include a label name in the line of code.

 

Public (xcv)

Missing parameter terminator: <rec>

Cause:

Subroutine parameters span multiple lines. However, each line of parameters is not terminated with either a comma or closing parentheses.

 

XYZ(abc

        def

 

Solution:

Insert the missing comma or closing parentheses at the end of each line in the parameter list.

 

XYZ(abc,

       def)

Missing QUIT from previous subroutine: <subroutine>

Cause:

A subroutine that instantiated an object did not include a quit command prior to the start of another label that receives parameters.

 

XYZ

   type RecordDEP dep=Db.getRecord("DEP","cid")

 

tyu("xyt")

   quit

 

Solution:

PSL inserts a line with a Quite prior to the label.

OR

You can insert a quit command prior to the start of the second label.

 

XYZ

   type RecordDEP dep=Db.getRecord("DEP","cid")

   quit

 

tyu("xyt")

   quit

Missing table name

Cause:

The method did not include the table name in its parameter list.

 

s data = Db.getOneRow("ACN,TAXID","","XACN")

 

Solution:

Include the necessary table name in the method parameter list.

 

s data = Db.getOneRow("ACN,TAXID","CIF","XACN")

Mode parameter required

Cause:

The parameter for the Record.setMode method was not specified.
 

Solution:

Specify a value of 0 (insert) or 1 (update) to indicate the mode of the object.

More actual parameters than formal parameters

Cause:

A routine is attempting to pass more parameters to a label than the label has defined.
 

Solution:

Review parameters of the label being called and the routine calling that label. Determine which has the correct number of parameters. If you need to modify the label being called, review all routines calling that label to ensure that they pass the correct number of parameters.

Multi-node records must be the same class

Cause:

When using the Record.copy method, one or both of the tables being copied are type 10, and the tables are not the same.
 

Solution:

None, this method cannot be used in this way.

Multiple dynamic selects or variable name conflict (exe,vsql)

Cause:

A dynamic select was used, but the local variables "exe" or "vsql" are already in scope. This can occur in either of the following ways:

(1) The programmer used the names "exe" or "vsql".

(2) There is already a dynamic select used in the same scope as this one.
 

Solution:

Correct the error as follows based on the cause listed above:

(1) Do not use the variable names "exe" or "vsql".

(2) Do not use more than one dynamic select in the same scope.

Multiple reference at parameters: <param1> and : <param2>

Cause:

The same parameter was passed more than once.

 

label(RecordDEP dep(), RecordDEP dep())

 

Solution:

Modify the code to pass the parameter only once.

 

label(RecordDEP dep())

MUMPS structured block syntax is not supported

Cause:

The code includes a period (.) in a DO structure block.

 

FOR I=1:1:10 DO

.S D = 3

 

Solution:

Implement a DO block with the { } syntax.

 

for I=1:1:10 DO {

    S D = 3

    }

Object cast cannot be conditionally executed

Cause:

A cast expression cannot be placed into a conditional expression, because logical conditions cannot be tested at compile time. This error occurred because a cast expression was placed in a conditional expression.

 

type RecordACN acn = Db.getRecord("ACN","CID=:AREF")

if acn.cls = "L" set acn = {RecordLN}acn

 

Solution:

Modify the code to separate the conditional statement from the casting statement.

 

type RecordACN acn = Db.getRecord("ACN","CID=:AREF")

if acn.cls = "L"

   set acn = {RecordLN}acn

Object identifier required

Cause:

An object name (i.e., identifier) was not specified when attempting to catch a run-time error.

 

CATCH

 

Solution:

Enter the correct syntax for the CATCH command.

 

CATCH vError{

Object invalid in FOR expression

Cause:

A FOR command argument is not of the String data type. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

for I = 1:1:dep set x = x + 1

 

 

You cannot use the dep object in the above position in a FOR statement.
 

Solution:

Remove the object from the FOR command, and use one of the following alternative statements:

 

Example 1

for I = 1:1:10 set x = x + 1
 

Example 2

for I = 1:1:dep.trmd set x = x + 1
 

Object invalid in relational expression

Cause:

A relational operand is not of the String data type. The code attempts to compare an M variable to an object. For example,

 

new dep,x

set x = "TEST"

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

if x = dep quit

 

Solution:

Use a field from the object for the test. For example,

 

new dep,x

set x = "TEST"

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

if x = dep.title1 quit

Object is already instantiated: <objectName>

Cause:

This error may occur if you re-instantiate an object. For example, the following code attempts to instantiate an object that already exists for a given identifier within a given M scope:

 

t RecordDEP dep

set dep = Db.getRecord("DEP",rs.getCol(1))

set dep = Db.getRecord("DEP",rs.getCol(2))

At run-time, the second assignment produces this error.

 

Solution:

If you want to use the same identifier for two assignments, use the following coding structure:

 

tagA

type RecordDEP dep

set dep = Db.getRecord("DEP",someKey)

do tag(.dep)

quit

 

tagB(RecordDEP dep)

if ‘$D(dep) set dep = Db.getRecord("DEP",someKey)

Object is already referenced: <objectName>

Cause:

The object has been previously referenced within this subroutine.

 

tag(RecordDEP dep)            //

            set x = dep.bal

            do dep.setUpdateOnly()

            quit

 

Solution:

Place this method at the top of the subroutine.

 

tag(RecordDEP dep)            //

            do dep.setUpdateOnly()

            set x = dep.bal

            quit

Object is an invalid subscript

Cause:

An array subscript is not of the String data type. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

set x(dep) = 2

 

 

Because dep is an object name, you cannot use it as a subscript to an array.
 

Solution:

Either do not use the object name as a subscript, or use a field from the object. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

set x(dep.cid) = 2

Object is invalid function argument

Cause:

An M function parameter is not of the String data type. For example, the compiler does not enable commands such as $EXTRACT to extract data from an object.

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

set xyz = $E(dep,1,2)

 

Solution:

Change the object reference to a column within the object. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

set xyz = dep.title1

Object reference required

Cause:

The objectName parameter is missing from the Class.isValid method.

 

if Class.isValid() quit

 

Solution:

Specify the name of the object to validate.

 

if Class.isValid(dep) quit

Object scope is not visible: this.<reference>

Cause:

A compiler method scopes a variable that has the same name as a property of the compiler.

 

type String objectName

if this.objectName.isLiteral() writer "wow"   

    //compiler property has the same name as the local identifier

 

Solution:

Do not use property names as variable names.

Objects must be the same type

Cause:

When using the object.equals method, the objects are not of the same class.
 

Solution:

The objects must be of the same class.

Objects must be passed by reference

Cause:

An object that was passed to a subroutine as an actual parameter must be passed by reference.

 

if Class.isValid() quit

 

Solution:

When passing an object to a label, insert a dot (.) before the object name to pass the object by reference. For example,

 

type RecordDEP dep

     set dep = Db.getRecord("DEP","CID")

     do abc(.dep)

 

abc(RecordDEP dep)

     quit

Parameter <parameter> is multiply defined

Cause:

An object was passed twice to a subroutine.

 

type RecordDEP dep=Db.getRecord("DEP","CID")

D XXX(x.,.dep,.dep)

quit

 

XXX(x,RecordDEP dep,RecordDEP dep)

 

Solution:

Pass the parameter only once to the subroutine.

 

type RecordDEP dep=Db.getRecord("DEP","CID")

D XXX(x.,.dep)

quit

 

XXX(x,RecordDEP dep)

Parameter 1 required - postTSet

Cause:

The first parameter of the TranSet.postTset method (i.e., processingDate) was not specified.
 

Solution:

Modify the code to include this required parameter.

Parameter 2 required - postTSet

Cause:

The second parameter of the TranSet.postTset method (i.e., branchCode) was not specified.
 

Solution:

Modify the code to include this required parameter.

Parameter 3 required - postTSet

Cause:

The third parameter of the TranSet.postTset method (i.e., qualifier) was not specified.
 

Solution:

Modify the code to include this required parameter.

Parameter list contains duplicate references

Cause:

A variable or array reference appears more than once in a formal or actual parameter list. For example, parameter dep() below is multiply defined.

 

     do subr(dep,.dep(),.dep(),CID1,CID2)

 

subr(RecordDEP dep, ReocrdDEP dep(), CID1,CID2)

     quit

 

Solution:

PSL allows a variable to be multiply defined in the actual parameters but not in the formal parameters. In order to support array passing by dimension, PSL does not support duplicate references in the actual parameters. Remove the duplicate references.

 

     do subr(dep,.dep(),CID1,CID2)

 

subr(RecordDEP dep, ReocrdDEP dep(), CID1,CID2)

     quit

Parameter list is too long: <expression>

Cause:

The parameter list (including parameters and delimiters) for a subroutine has more than 1024 characters.
 

Solution:

Review the code to determine a better method to pass the data. Perhaps rewrite the code in smaller function calls. If you cannot rewrite the code, shorten parameter names. If the columns being passed are from an object, consider passing the object instead of the individual columns.

Parameter required

Cause:

The first parameter of the TranSet.getTran method (i.e., transactionSeq) was not specified.
 

Solution:

Modify the code to include this required parameter.

Parenthesis expected

Cause:

Parentheses are mismatched.
 

Solution:

Ensure that you include the same number of closing parentheses as opening parentheses in the line.

Property is not an index: <reference>

Cause:

The code refers to an object as though the Array Flag (OBJECTPROP.ARRAY) is selected, indicating that the class is a container class.

 

object.tts{SEQ}.tamt

 

Solution:

Rewrite the code without {} references when referring to an object property.

Property name expected

Cause:

An object was instantiated, but a reference was made to the object without indicating the property of the object.

 

type RecordDEP dep = Db.getRecord("DEP,"CID")

set x=dep

 

Solution:

Add the property reference.

 

type RecordDEP dep = Db.getRecord("DEP,"CID")

set x=dep.bal

Property: <reference> does not exist in class: <class>

Cause:

A user made a reference to a property on an object from a class other than the Record class.

 

type IO io = Class.new("IO")

set io.xyz = 3

 

Solution:

Only use properties with objects for which they are valid.

 

type IO io = Class.new("IO")

set io = 3

Read length or timeout expected

Cause:

An error occurred in either the timeout or maximum length syntax. This error may occur in the READ command.
 

Solution:

Review and correct the timeout and length syntax.

Read timeout expected

Cause:

The timeout period qualifier to the READ command was not entered properly.
 

Solution:

Review and correct the timeout syntax.

Record does not exist

Cause:

This error occurs on a table when the record being instantiated during the compile does not exist. (Most literal instantiation of tables within PSL will occur on the CUVAR table, which should always exist.)
 

Solution:

Review the literal instantiation of the record. If it does not exist during the compilation of the element, is should not be a compile time instantiation.

Recursive loop, Label called by label within lower level of stack list: <list>

Cause:

Subroutine "a" calls subroutine "n" which calls subroutine "a".

 

a                  // Subroutine a

   do n

   quit

n                 // Subroutine n

   do a

   quit

 

Solution:

Do not structure code for infinite loops.

Reference cannot be on for/while line <expression>

Cause:

Embedded within the PSL DbSet class is a capability to refer to a single property directly without specifically instantiating the record. This error occurs if that functionality is used on the same line as a FOR or WHILE command.

 

type DbSet ds = Db.selectDbSet('DEP")

while ds.next() set bal = bal + ds.getRecord().bal

 

Solution:

Add a structure block after the next() method, and move the setting of bal into the structured block.

 

type DbSet ds = Db.selectDbSet('DEP")

while ds.next() do {

      set bal= bal + ds.getRecord().bal

}

Reference parameter is not supported in post-conditional expression: <atom>

Cause:

A user attempted to update an array object reference or object property in a post-conditional expression.

 

do:true tag(.array(ref))

 

Solution:

Rewrite the code.

 

if true do tag(.array(ref))

ResultSet expected: <variable>

Cause:

The resultSet parameter for the HTML.addCol and HTML.addRow methods is required but was not specified.
 

Solution:

Specify the resultSet parameter.

Return type expected

Cause:

The called method requires a return type. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

do Db.isDefined("DEP","CID")

 

 

The isDefined method uses the following syntax, expecting a value to be returned:

 

if Db.isDefined("DEP","CID")

 

Solution:

Review the correct use of the method. Rewrite the code to reflect the correct syntax.

Return type not expected

Cause:

The called method does not require a return type. For example,

 

new dep

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

set x = dep.toArray("%A(CID")

 

 

The toArray method is called using the following syntax:

 

do dep.toArray("%A(CID")

 

Solution:

Review the correct use of the method. Rewrite the code to reflect the correct syntax.

Right Index delimiter '}' Expected: <reference>

Cause:

A class is defined as an array (i.e., the Array Flag (OBJECTPROP.ARRAY) is selected). However, a reference to the array does not include the closing delimiter.

 

object.tts{SEQ.tamt

 

Solution:

Insert the closing delimiter in the array reference.

 

object.tts{SEQ}.tamt

Routine does not exist: <routine>

Cause:

A routine being called does not exist.
 

Solution:

Review the code to determine why the section being called is missing. Modify the element calling it, or create the code that is missing.

Scope mismatch between: <var> and: <lvn>

Cause:

An array expression does not have the same scope as the variable name.

 

type Public ResultSet abc

type ResultSet abc()

 

Solution:

Modify the code so that the variable and array expression have the same scope.

 

type Public ResultSet abc

type Public ResultSet abc()

Signed indicator required

Cause:

The user did not specify the required second parameter (i.e., signed) for the Number.complexUnpack method.
 

Solution:

Specify the second parameter.

Space character expected

Cause:

A FOR loop is written incorrectly. For example,

 

for I=1:1:3:4

 

Solution:

The compiler expects to find a space at the position where the third colon (:) appears. For example,

 

for I=1:1:3

Sub-sequence must have value SYSTEM or SECONDARY

Cause:

The user specified a value other than SYSTEM or SECONDARY for the fourth parameter (i.e., secTran) of the tranSet.copyTran parameter.
 

Solution:

Specify either SYSTEM or SECONDARY for the fourth parameter.

Subroutine name required

Cause:

Part of the method building code is building a buffer of code that is then inserted into the program. The buffer.insert method did not specify the subroutine name in the first parameter.
 

Solution:

Determine where in the code the buffer.insert() method was used. Add the subroutine name as a parameter.

Subroutine does not exist within routine: <label>^<routine>

Cause:

A subroutine being called does not exist.
 

Solution:

Review the code to determine why the section being called is missing. Modify the element calling it, or create the code that is missing.

Table parameter is required

Cause:

The Dbset.selectDbset method did not specify a table name. The Dbset.getRecord method does not require a table name. However, if the table name is not supplied to this method, it will get the table name from the Dbset.selectDbset method.
 

Solution:

Review the use of the Dbset.selectDbset and Dbset.getRecord methods. Add the missing table names for those methods.

Table parameter: <actual> does not match: <table>

Cause:

The table named in the Dbset.getRecord method does not match the table named in the Record class definition.

 

type RecordTTXFDT ttxfdt = ds.getRecord("TTX")

 

Solution:

Make the table names the same.

Tag parameter is required

Cause:

The first parameter (i.e., Tag) of the object.storeValue is missing.
 

Solution:

Review the use of the object.storeValue method, and add the required Tag parameter.

Thrown object must be class Error

Cause:

An attempt was made to throw an error for an object that is not defined in the Error class.

 

if XETC = "" throw INVLDTC($$^MSG(2692))

 

Solution:

Define the object in the Error class.

 

if XETC = "" throw Class.new("INVLDTC",$$^MSG(2692))

Too many access keys

Cause:

The keys for the Db.getRecord method are not named, and more than the number of keys were provided to the method.
 

Solution:

Review the keys provided, and reduce them to the correct number of keys.

Transaction ID required

Cause:

The first parameter of the runtime.start method is a Transaction ID that indicates if the process is batch or client/server. This message indicates that the related batch or client/server was not added.
 

Solution:

Review the runtime.start method reference. Add the necessary process.

Type command cannot be conditionally executed

Cause:

The type command appears on the same line as a conditional if statement.

 

if x = 3 type RecordDEP dep = Db.getRecord

 

Solution:

The type command must appear on its own line. In the following example, the assumption is made that dep will be instantiated using either a class.new or getRecord method. Run-time errors will occur if you do not instantiate the object.

 

type RecordDep dep

if x = 3 set dep = Db.getRecord("DEP","CID")

Type <eClass> can not be assigned to type <aClass>

Cause:

This error appears when any of the following conditions exist:

(1) The identifier <aClass> is declared as a different type than the assignment expression <eClass>. For example, the following code generates this error, because it attempts to assign LN to dep, which has been defined as type RecordDEP.

 

type RecordDEP dep

set dep = Db.getRecord("LN","CID")

 

 

(2) The object is not defined. For example, the following code generates this error, because the dep identifier type was not defined.

 

set dep = Db.getRecord("DEP","CID")

 

 

(3) An attempt is made to copy an object of one class to an object of another class.

 

type RecordACN acn = Db.getRecord("ACN","CID")

type RecordLN ln = acn.copy()

 

Solution:

Correct the error as follows based on the cause listed above:

(1) Either change the class specified type statement to match the class of the object in the getRecord method, or vice versa. That is, either change RecordDEP to RecordLN, or change the "LN" in the getRecord method to "DEP".

(2)  Insert a type statement prior to the set statement defining the type of the identifier. For example,

 

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

 

 

(3)  Only copy an object of one class to another object in the same class. For example,

 

type RecordACN acn = Db.getRecord("ACN","CID")

type RecordACN acn1 = acn.copy()

Undefined class: <class or cast or type>

Cause:

There are multiple causes of this error:

 

(1) When an object is cast from one class to another, the new class is not a valid class.

 

type recordACN acn = Class.new("RecordACN")

set acn = {DEP}acn

 

(2) An invalid class of objects is found within the parameters of a subroutine.

 

SUB(Str xyz)

 

(3) The class of an object being instantiated is not valid.

 

type RecordXYZ acn

 

Solution:

Corresponding solutions are:

 

(1) Change the class value in the brackets {} to a valid class (e.g., RecordDEP).

 

(2) Correct the class in the parameter list (e.g., String xyz).

 

(3) Change the class to a valid class (e.g., RecordACN).

Undefined instance variable: <var>

Cause:

The instance variable was declared as a single variable but is referenced as an array. For example,

 

type RecordTTX ttx

set ttx(seq) = x

 

Solution:

Either correct the object declaration if using multiple elements, or correct the expression to reference the object as a single element. For example,

 

type RecordTTX ttx()

set ttx(seq) = x

Undefined method: <method>

Cause:

The method does not exist in the OBJECTMET table.
 

Solution:

Verify the spelling and case of the specified method. Method names are case-sensitive. Also, review the valid list of methods. If you specify a new method, verify that it also appears in the OBJECTMET table.

Unexpected character: <character>

Cause:

There is a mismatch of quotes in a method statement. In the following example, TJD is intended to be a literal string. The rules for defining a literal string require two sets of quotes around it. The error reported will display T from TJD, because it is in the location where the second quote should be.

 

do Schema.createTable("TMPREGDD",""TJD",JOB,PERS,REGD,CAT","BAL", tmpregd")

 

Solution:

Enter the appropriate number of quotes.

 

do Schema.createTable("TMPREGDD","""TJD"",JOB,PERS,REGD,CAT","BAL", tmpregd")

Unexpected compiler command: <command>

Cause:

A # appears in front of code that is not one of the valid compiler commands.

 

#set x = x + 1

 

Solution:

Determine the intent of the statement. Either add a compiler command that is valid, or remove the # symbol.

 

set x = x + 1

Unexpected expression: <expression>

Cause:

The PSL parser could not interpret an expression. This can occur, for example, when GT.M special variables are used but not coded into PSL.

 

quit:'$T

 

Solution:

Review the code. GT.M special variables that have not been accounted for are probably intentionally not part of PSL and therefore should not be used.

Unexpected expression after catch block: <xrec>

Cause:

The catch statement syntax does not allow for coding to follow the { on the same line.

 

CATCH verror { q:x

   do ^xxx

   }

 

Solution:

Move the extra code from the CATCH statement line to its own line.

 

CATCH verror {

   do ^xxx

   }

Unexpected return expression in FOR loop

Cause:

You cannot return a variable when quitting a FOR loop. For example,

 

set x = 2

for i=1:1 quit:x > 2 x do {

     code…

}

 

Solution:

Rewrite the code to quit with the value after the loop finishes processing. For example,

 

set x = 2

for i=1:1 quit:x > 2 do {

     code…

}

quit x

Uninstantiated object: <objectName>

Cause:

An object has been typed but not instantiated.

 

type RecordDEP dep

set x = dep.bal

 

Solution:

Modify the code to also instantiate the object.

 

type RecordDEP dep

set dep = Db.getRecord("DEP","CID")

set x = dep.bal

Unknown compiler switch: <atom>

Cause:

PSL supports compiler switches by prefixing the command with a # symbol. This error indicates that a # prefixed a command that is not defined as a valid compiler switch.
 

Solution:

Remove the # symbol. Review the code to determine whether additional changes are required to obtain the desired functionality.

Unknown cache logic, PSL error

Cause:

This is an internal PSL compiler error and should not occur.
 

Solution:

Report the error to FIS PSL Support.

Unsupported method under static scope: <method>

Cause:

A table such as CUVAR has been instantiated in static scope, thereby prohibiting the use of many methods on the object.

 

do CUVAR.save()

 

Solution:

Change CUVAR to lowercase, and instantiate the record. Set the appropriate properties, and then use the save method.

Unsupported table in RecordSet class: <table>

Cause:

A DbSet class method has specified a table with only one record (e.g., CUVAR table).
 

Solution:

Instantiate the record using the Db.getRecord method.

Variable expected: <expression>

Cause:

This error may occur for several reasons. For example,

(1) You use a global reference in Profile version 7.0.

(2) The new command is used improperly with a special M variable (e.g., $H).

(3) A column is excluded from a table.column reference.

 

set DSP2 = $$DSPRT(crcd.finspot,crcd.)

 

Solution:

The solution depends on the cause of the error:

(1) Write the code without a global.

(2) Review the use of the new command. Consider converting to a type class variable.

(3) Include the missing column reference.

 

set DSP2 = $$DSPRT(crcd.finspot,crcd.crcd)

Void method expected

Cause:

A method that is not a void method is used incorrectly.

 

type IO io = Class.new("IO")

do io.read()

 

Solution:

Modify the code to use the method correctly.

 

type IO io = Class.new("IO")

set x = io.read()