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
Cause: |
The <tab> character was used as a column delimiter. |
Solution: |
Do not use the <tab> character as a delimiter. |
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 |
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. |
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. |
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. |
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. |
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 }. |
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. |
Cause: |
The code attempted to modify a computed column. |
Solution: |
Remove the code that attempted to modify the computed column. |
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 |
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 } |
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. |
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. |
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. |
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")
|
Solution: |
Include the column name in the select statement. |
|
type ResultSet rs = Db.select("BAL,LNM,CID","DEP") |
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. |
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. |
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. |
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 { |
Cause: |
A command in the procedure does not permit the use of post-conditional expressions. |
|
if X new abc
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 } |
Cause: |
The two objects being compared by the Record.compare method are not
of the same class. |
Solution: |
None. |
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. |
Cause: |
This is an internal PSL compiler error and should not occur. |
Solution: |
Report the error to FIS PSL Support. |
Cause: |
The IO.write method is missing the first parameter, recordData. |
Solution: |
Add the first parameter to the IO.write method reference. |
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. |
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. |
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 |
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. |
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. |
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 |
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. |
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 |
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. |
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 |
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. |
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 |
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. |
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. |
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. |
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 |
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. |
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. |
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 |
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 |
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") |
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 |
Cause: |
The attempted cast is illegal because the classes are not compatible. |
Solution: |
None. |
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 |
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. |
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. |
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) |
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. |
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 |
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 |
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. |
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. |
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. |
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") |
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. |
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. |
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. |
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 |
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") |
Cause: |
The following conditions exist for a table to be deleted using the Schema.deleteTable method:
AND
|
Solution: |
Review the code. Either a table was not created by a Schema.createTable, or there are multiple Schema.deleteTable commands in the code. |
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. |
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,""""") |
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 |
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. |
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. |
Cause: |
The third parameter (i.e., leftNib) was not specified for the Number.complexUnpack
method. |
Solution: |
Specify the proper value for the third parameter. |
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. |
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") |
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 |
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. |
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. |
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. |
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. |
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) |
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) |
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 |
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") |
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. |
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. |
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. |
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. |
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()) |
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 } |
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 |
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{ |
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 |
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 |
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) |
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 |
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 |
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 |
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 |
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. |
Cause: |
When using the object.equals method, the objects are not of the same
class. |
Solution: |
The objects must be of the same class. |
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 |
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) |
Cause: |
The first parameter of the TranSet.postTset method (i.e., processingDate)
was not specified. |
Solution: |
Modify the code to include this required parameter. |
Cause: |
The second parameter of the TranSet.postTset method (i.e., branchCode)
was not specified. |
Solution: |
Modify the code to include this required parameter. |
Cause: |
The third parameter of the TranSet.postTset method (i.e., qualifier)
was not specified. |
Solution: |
Modify the code to include this required parameter. |
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 |
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. |
Cause: |
The first parameter of the TranSet.getTran method (i.e., transactionSeq)
was not specified. |
Solution: |
Modify the code to include this required parameter. |
Cause: |
Parentheses are mismatched. |
Solution: |
Ensure that you include the same number of closing parentheses as opening parentheses in the line. |
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. |
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 |
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 |
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. |
Cause: |
The timeout period qualifier to the READ command was not entered properly. |
Solution: |
Review and correct the timeout syntax. |
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. |
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. |
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 } |
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)) |
Cause: |
The resultSet parameter for the HTML.addCol and HTML.addRow methods
is required but was not specified. |
Solution: |
Specify the resultSet parameter. |
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. |
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. |
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 |
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. |
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() |
Cause: |
The user did not specify the required second parameter (i.e., signed)
for the Number.complexUnpack method. |
Solution: |
Specify the second parameter. |
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 |
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. |
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. |
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. |
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. |
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. |
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. |
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)) |
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. |
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. |
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") |
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() |
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). |
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 |
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. |
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") |
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 |
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. |
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 } |
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 |
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 |
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. |
Cause: |
This is an internal PSL compiler error and should not occur. |
Solution: |
Report the error to FIS PSL Support. |
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. |
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. |
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) |
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() |