14-Mar-2022 ================= WPS RELEASE NOTES ================= Version 4.1.10-GA-release (4.1.10.0.18452-GA-release) Information about important fixes and enhancements delivered in the latest version of WPS. In this document, text shown between paired angle brackets is variable, and can be replaced by required text. For example, indicates that you should specify the required path-name to a device. ======================================================================= CONTENTS ======================================================================= - What's new - Known issues - Upgrade notes - Undocumented updates - Closed issues - Getting support ======================================================================= WHAT'S NEW ======================================================================= Workflows ========= This version includes many improvements Workflows to enhance usability and performance, including the following: - You can now add comments to a workflow. - You can create local database data source references. - You can use centrally defined database data source references (libnames) stored in WPS Hub. - Correlation analysis has been added to the Data Profiler. - The Join block has been updated to enable you to visually create connections between input datasets. - The Filter block now supports simple and advanced filters. - The Python language, R language and SAS language blocks now list input datasets and variables in the Configure dialog box. - Multiple Workflow Engines are now instantiated to enable workflows to be run in parallel. - The Decision Tree Block has additional tabs. The Table tab contains tabular representations of the tree. The Scoring Tab contains the output probability value in SAS language or SQL. - The Decision Tree block now enables you to export the tabular representation of the decision tree to an Excel (.xlsx) file. - The Text File Import block now allows you to import delimited data from file with any filename extension. - If you copy and paste multiple blocks, the relative positions of the blocks are now maintained. - The underlying SAS code that is created when a workflow is created can now be exported to a file - You can now select multiple variables Decision Tree block and specify their treatment. - You can now duplicate a workflow block through a right-click menu - In the Mutate Block, you can now drag functions and variables into the expression editor. - The Analyse Models block now supports continuous variables. - In the Database Block: - You can now configure SSL for MySQL. - Various improvements have been made for ODBC configuration to help you more easily configure databases. This release includes new blocks: - For import: - Database import - For data preparation: - Aggregate - Binning - Rank - Sample - Sort - Code blocks: - SQL. - For model training: - Decision Forest - Linear Regression - MLP - For export: - Chart Builder - Delimited File Export - Excel Export Data Engines ============ The following Data Engines have been enhanced in this release: Oracle ------ - Now supports all ORACLE encodings. - Has been modified to create GLOBAL temporary tables. - The DBCOMMIT option now enables multiple commits. ODBC ---- - DBINDEX is now supported in ACCESS ODBC (Access 2013 and Access 2016 only). - Can now connect to the Amazon Athena Query Service. SQLSERVER --------- - For multi-threaded SQLSERVER, the SQL generation option INSERT_SQL is now supported. DATA step functions =================== The following DATA step functions are new at this release: - JARO - JAROWINKLER - NGRAM - SYSEXIST - EUROCURR The following DATA step functions have been enhanced in this release: - All WALD distribution functions now support the lambda option. Output Delivery System (ODS) updates ==================================== - The ExcelXP tagset now supports the following options: - BLACKANDWHITE - CENTER_HORIZONTAL - EMBED_FOOTNOTES_ONCE - PAGES_FITHEIGHT - PAGES_FITWIDTH - ODS EXCEL destination is now supported for .xlsx format files. - Graphics procedures now use a global counter to generate image filenames. LISTING ------- - The ODS Listing destination has been refactored to improve performance and expand the supported options. Experimental support for the new listing destination has been added to this release. If you want to test the new listing destination, please contact support@worldprogramming.com for assistance. - An empty ODS LISTING statement will now close an open, named, listing file. System options ============== The following system options have been added at this release: - CONNECTPAGEBREAK - CONNECTTIMEOUT - CONNECTTRANSCODEWARNINGS - CONSIDERXLSXCOLWIDTHS - DB2PLAN - DBIDIRECTEXEC - DYNAMICNOBS - EMAILMASQUERADEHOST - FILECONTAINERCACHESIZE - HUB_AUTOLIBS - HUB_TOKEN - LEGACYDB2ENGINE - LEGACYNETEZZAENGINE - LEGACYODBCENGINE - LEGACYORACLEENGINE - LEGACYSQLSERVERENGINE - LEGACYSQLSERVRENGINE - LEGACYSQLSVRENGINE - LINKINITSTMT - LINKTERMSTMT - NETEZZACHARCOLUMNTYPE - ODSLISTINGDEST - PREFERLEGACYTABLETEMPLATES - SCANDEFAULTMODIFIERS - TAGSETSTREAMVARSIZE - TLS_CACERTS - TLS_HOSTVALIDATION - WPDDASDLIBNAMEINFO - WPSCOMENCRYPTKEY - WPSSCATTERCOMP - WPSSCATTERLIMIT1 - WPSSCATTERLIMIT2 Macros ====== - The &= varname form of macro variable expansion is now supported. - The following macro statements can now be used in a SAS language program outside a #%MACRO...%MEND block: - %IF - %THEN - %ELSE - %DO, including %DO iterative, %DO %WHILE, and %DO %UNTIL - %END General procedures ================== The following general procedure is new at this release: - FONT The following general procedures have been enhanced at this release: - REPORT - DEFINE statement now supports: - ID - PROBT (alias for PRT) - MODE - COMPUTE code block. The default justification of LINE statement is now CENTER. - NOPRINT - OPTIONS - Now supports details of where set. - PYTHON - Command line arguments can now be specified on the EXECUTE statement. - R - Command line arguments can now be specified on the EXECUTE statement. - FORMAT - The output of the PICTURE statement is now right-justified. - TABULATE Now supports EXCLNPWGT. - TRANSPOSE Leading and trailing spaces in variable names are removed, even if the VALIDVARNAME=ANY system option is set. - UNIVARIATE, the HISTOGRAM statement now supports: - MAXNBIN - NROWS - NCOLS Graphing procedures =================== The following graphing procedures are new at this release: - GINSIDE - GPROJECT - SGPLOT - SGPANEL Machine Learning procedures =========================== The following machine learning procedures are new at this release: - DECISIONFOREST - SEGMENT Operational research ==================== The following operational research procedure is new at this release: - LP Quality control =============== The following quality control procedure is new at this release: - CAPABILITY Statistical procedures ====================== The following statistical procedures are new at this release: - ASSOCRULES - GAM - LP - PLAN - QUANTREG - ROBUSTREG - RSREG - TPSPLINE The following statistical procedures have been enhanced at this release: - NPARWAY1 - Now supports the EXACT statement. - SURVEYSELECT - Now uses the Mersenne twister algorithm by default to generate samples. - Now supports the FREQ statement. - The PROC SURVEYSELECT statement now supports the following options: - GROUPS - METHOD. The following methods are now supported: - BALBOOT - BERNOULLI - POISSON - PPS - PPS_BREWER - PPS_MURTHY - PPS_SAMPFORD - PPS_SEQ - PPS_SYS - PPS_WR - SEQ_POISSON - SRS - SYS - RANUNI, which can be used to reproduce results generated using WPS version 4.0. - REP, which has the REPNAME = name option added - ROUND - STRATUMSEED - The STRATA statement now has support for the following options: - ALLOC - ALLOCMIN - ALPHA - COST - MARGIN - NOSAMPLE - STATS - GENMOD - MODEL statement now supports the TRUNC and NOTRUNC options. For details, see 'Undocumented updates' in these release notes. Time series procedures ====================== The following time series procedure is new at this release: - AUTOREG Workbench ========= The following features are new at this release: - You can now drag a file from the File Explorer and drop it in a library. - You can now specify in Preferences that the log is cleared each time a program or step is run. - You can now open encrypted databases and prompt for a key through a dialog. - You can now run the step that currently contains the cursor using either 'Run Step' or 'Run Step On' options on the program editor context menu. - Encrypted datasets can be opened from File Explorer, Server Explorer and Project Explorer. - Shortcuts are added to open files System Explorer from Project/File views. - Shortcuts are added to open files in System Explorer from the editor tab content menu. WPS Communicate =============== The following changes have been made in this release: - You can now nest RSUBMIT and ENDRSUBMIT blocks. - Every submit from the Workbench is marked in the log output with pre and post timestamp that also contain the remote username for ease of use. - The client end now checks the version of the server to see if the capability of encryption or compression is present and outputs an error if it is not. - You can now use macro variables in the LOG statement in scripts. ======================================================================= WPS known issues and getting support ======================================================================= This section contains information about known issues in this version of WPS and how to get technical support. ----------------------------------------------------------------------- Critical known issues ----------------------------------------------------------------------- None ----------------------------------------------------------------------- Major known issues ----------------------------------------------------------------------- ODBC ==== Updating or deleting rows using the ODBC engine now uses cursor-based updates via the "WHERE CURRENT OF" clause that is supported by some ODBC drivers. We currently only support this functionality for DB2 and SQL Server connections using the ODBC library engine. Python procedure ================ - When using the Python procedure, any Python program call that stops the Python interpreter -- such as sys.exit() or os.exit() -- will stop processing in WPS, and the WPS server will need to be restarted. DBCS/multibyte ============== - DBCS/multibyte session encoding is not supported on z/OS. - UTF-16 with automatic detection of byte order from the Byte Order Mark for external file encoding is not supported. Explicit UTF-16BE and UTF-16LE are supported, however, and will tolerate the byte order mark. - Performance may be an issue with some of the functions, formats and informats. - WPS Engine for Sand does not currently support multibyte encodings. ----------------------------------------------------------------------- Minor Known Issues ----------------------------------------------------------------------- Workbench ========= - If you drag a file from File Explorer to Project Explorer, the file is now copied and opened. - The Code Analyzer does not handle files in which the lines end with numbers; these are typically mainframe files. - If you attempt to apply a license to a server that has been specified on a path that does not contain an installation of WPS, the license application will fail, but not cleanly, and messages referring to unknown errors are displayed. - On Linux, dialog boxes might be hidden behind other windows. - On Linux, the Browse button used to change a pre-existing engine on a Windows remote server so that it points to the software installation on the remote VM does not work. - The file import preview might truncate data because the rows returned by the preview row limit might not contain information sufficient to determine a variable's length. File naming =========== - If you create or rename a file on the Windows operating system and the filename contains characters that cannot be represented in the current WPS session encoding, the characters that cannot be represented will be replaced or omitted. By default, they are replaced. This is for display in WPS procedures and functions only. For example, if you use the DATASETS procedure to list the members of a library, a filename with characters that cannot be represented will be listed with substitution characters. However, you cannot perform any operations on the file using the filename, as the filename does not represent the actual filename. - You can change how WPS functions with such filenames using the CHARTRANUNMAPPABLE system option; you can, for example, specify that characters are substituted with an escape character, or ignored. Data engines - multithreaded ============================ NETEZZA ------- If your SAS language programs use the LIBNAME statement to connect to Netezza, and the statement contains any of the following options, you must replace NETEZZA with NETEZZAOLD in the LIBNAME statement: - DELETE_MULT_ROWS - IGNORE_READ_ONLY_COLUMNS - STRINGDATES - UPDATE_MULT_ROWS - USE_ODBC_CL - UTILCONN_TRANSIENT ODBC ---- If your SAS language programs use the LIBNAME statement to connect ODBC, and the statement contains any of the following options, you must replace ODBC with ODBCOLD in the LIBNAME statement: - BL_LOG - BL_OPTIONS - BULKLOAD - BCP - CURSORTYPE - DELETE_MULT_ROWS - INSERT_SQL - KEYSET_SIZE - QUERY_TIMEOUT - QUOTE_CHAR - STRINGDATES - UPDATE_MULT_ROWS - UPDATE_SQL - USE_ODBC_CL - UTILCONN_TRANSIENT SQLSERVER --------- If your SAS language programs use the LIBNAME statement connect to SQL Server, and the statement contains any of the following options, you must replace SQLSERVER with SQLSERVEROLD in the LIBNAME statement: - CURSOR_TYPE - DELETE_MULT_ROWS - INSERT_SQL - KEYSIZE_SET - QUERY_TIMEOUT - QUOTE_CHAR - STRINGDATES - UPDATE_MULT_ROWS - UPDATE_SQL - USE_ODBC_CL - UTILCONN_TRANSIENT Broker configuration for WPS Web services ========================================= - It is highly recommended that configuration settings in the file broker.cfg, located in //web/cgi-bin, are ordered in such a way that ALL 'WPSPowered*' (where "*" is a wildcard) named settings appear before 'Service' settings in that file. Echo statements in .bashrc files when using WPS Link ==================================================== If your shell initialisation scripts echo text during a non-interactive login, WPS Link will fail to start. Such echo statements should therefore either be removed, or made conditional on the shell being interactive, as follows: * Check the 'interactive' flag For example: case $- in *i*) echo "This is an interactive shell"; esac * Use the TTY utility to detect an interactive shell For example: if tty > /dev/null 2>&1 do echo "We have an interactive session" fi * Check the value of the $SSH_TTY environment variable if [ "$SSH_TTY" ] then echo "We have an interactive session" fi JAVAOBJ DATA step component on z/OS =================================== The JAVAOBJ DATA step component is supported on z/OS only when WPS is invoked via the USS interface. WPS searches for the Java classes to be loaded in the directories named in the CLASSPATH environment variable, which exists when running via the USS interface but not when running via TSO or as a submitted job. XLSX Data Engine on z/OS ======================== The XLSX data engine is supported on z/OS only when WPS is invoked via the USS interface. ======================================================================= Upgrade Notes ======================================================================= ----------------------------------------------------------------------- YEARCUTOFF Option ----------------------------------------------------------------------- The default value for the YEARCUTOFF system option is now 1926. The range of two-digit dates is, by default, 01-January-1926 through to 31-December-2025. As a result of this change, any WPS Analytics functionality to which a two-digit year value is specified - for example, the MDY() DATA step function - might output different results. To return to the behaviour of previous versions of WPS Analytics, specify the YEARCUTOFF system option value of 1920. ----------------------------------------------------------------------- Workspace Upgrade ----------------------------------------------------------------------- - When you use WPS Workbench 4.1 to open a workspace that was created using an earlier version of WPS Workbench, a dialog might be displayed asking you to confirm that the workspace can be automatically upgraded. This enables Workbench to read the workspace correctly. Such automatic upgrades should not cause any problems. ======================================================================= Undocumented Updates ======================================================================= The GENMOD procedure ==================== - PROC GENMOD can now fit a Poisson, negative binomial, zero-inflated Poisson, zero-inflated negative binomial, or geometric distribution if non-integer numbers are specified rather than integer numbers. - The TRUNC and NOTRUNC options have been added to the MODEL statement used to specify these distributions. TRUNC specifies that integers are used, and non-integer numbers are truncated appropriately. Specify NOTRUNC to use decimal numbers. The default is NOTRUNC. ======================================================================= Deprecated functionality ======================================================================= The following functionality is deprecated at this release and the features will be unavailable in a future version of WPS Analytics. Any SAS language programs using these features should be modified to use the recommended alternative: - ODS OLDHTML statement - Use the ODS HTML statement - LIBNAME ORACLEOLD statement - Use the LIBNAME ORACLE statement - LIBNAME DB2OLD statement - Use the LIBNAME DB2 statement - WPS support for the SQLSRV32 ODBC Driver is to be removed. You should install and use the Microsoft ODBC Driver for SQL Server in preference. ======================================================================= Closed Issues ======================================================================= Core ==== General ------- - The DATA step now correctly concatenates strings that include array members. - A program can now contain non-printing characters; these characters are no longer replaced with spaces. - Encryption keys (such as those supplied to the ENCRYPTKEY dataset option or ENCRYPTKEY system option) are now obfuscated in the log. - An error message is now reported if an empty macro-variable name is used in DATA step macro CALL routines. - Improved performance when a large compiled macro catalog is used. - WPS Analytics is now distributed with the OpenJDK. - Added the PLAIN authentication option for EMAIL SMTP servers. - WPS Analytics no longer runs indefinitely when a macro is called with an undefined named parameter. - A note is now created in the log when a missing value as either the numerator or denominator in a division calculation. - The derivatives of functions are now computed correctly in nested IF ELSE statements. - The number of records replaced using the modify statement is now correctly reported. - The validity of one-part and two-part dataset names is now checked to ensure they conform with the value specified in the DATASTMTCHK system option. - WPS Analytics can now be used with R version 4. - Specifying the _LAST_ system variable no longer causes WPS Analytics to fail if the referenced library is no longer valid. - WPS Analytics no longer fails if a HITER Component references a deleted HASH Component. - The calculation of sort run block sizes is now correct when sorting a dataset that contains exactly 2 observations. FILENAME URL ------------ - Now handles numeric values larger than 2^31 coming from the server using 64-bit representations. Cleanwork utility ----------------- - The utility on Windows: - Now supports the force (-f), verbose (-v) and list (-n) options. - Now supports the -ff option to select a temporary directory more effectively than the -f switch does. Configuration files -------------------- - The default wps.cfg configuration file for Windows now uses the CSIDL_MYDOCUMENTS environment variable instead of CSIDL_PERSONAL for the default SASUSER location. - System options that contain the underscore (_) character in the name are now allowed in a configuration file. Macros ====== - If the MCOMPILENOTE system option is set to AUTOCALL or CALL, the macro compilation message now reports the correct number of instructions. - The %LET statement now has a maximum recursion limit of 1000000 elements. - The DESC and MINDELIMITER options in macro definitions now allow spaces between the option and the assigned value. - Macro names for statement style macros are now limited to eight characters. - Infinite recursion checks are now improved when macros are expanded and invoked. - Comments can now be used in Macro code. Text-Replacement macro ---------------------- - An exact self-reference expansion now deletes the referenced macro. - A macro name now replaces exact matches only, and the name must be no longer than 8 characters. For example MACRO abcdefgh % no longer matches against 'abcdefgh' and 'abcdefghijklm'. - Self-recursive text macro definitions are now correctly expanded. - In some circumstances, specifying text-expansion macro directives as global statements might cause an error during evaluation. System options -------------------- - AUTOEXEC locations can now be correctly concatenated using APPEND and INSERT. - IMPORTDELIMTRIM is a new system option that enables you to specify how the IMPORT procedure handles values in an imported CSV file that have a space after the comma. - INPUTCASTNUMTOCHAR is a new system option that enables you to specify how the first argument of the INPUT statement is treated. - NOS99NOMIG now functions as expected. - VALIDVARNAME=ANY now functions correctly. - When ERRORABEND is specified, an out-of-memory error when parsing a SAS language program now correctly causes ABEND. - Can now correctly read a dataset using an index created when IBUFSIZE was smaller than the current value - The WPSCOMPR alias can now be used for the WPSCOMPROTOCOL system option. Global statements ----------------- - You can now specify whether an error message is returned for SMTP failure reply codes generated by FILENAME EMAIL. - WPS now completes successfully if a %INCLUDE statement is followed by OPTIONS LRECL. - You can now control the behaviour of WPS if an email server failure occurs when using FILENAME EMAIL SMTP. A dataset SMTPRESPONSE is used to list server return codes and the corresponding WPS behaviour. The default responses are in the dataset SMTPRESPONSE in the SASHELP library. You can specify your own responses to return codes in the dataset SMTPRESPONSE in the SASUSER library , which will be read before the dataset in SASHELP. The macro variables SYSSMTPREPLYCODE and SYSSMTPREPLYTEXT are now also provided. These are set to the returned SMTP code and text when an email server failure occurs. - RESETLINE now functions correctly as a global statement. - FILENAME HTTP no longer sends the port number in the HOST: request header. - FILENAME FTP now uses the .netrc file on LINUX platforms. - FILNAME URL now handles numeric values coming from the server larger than 2^31, using 64 bit representations. Datasets -------- - A dataset can now be sorted without out-of-memory conditions occurring. The performance of RLE compression in WPD3 datasets has been improved. - Dataset names can now be longer than 32 characters. Dataset views ------------- - DICTIONARY.VIEWS and SESHELP.VIEW now report the view engine correctly. - The name of the view is included in the output from the DESCRIBE statement. DATA step components -------------------- - The HASH component no longer fails in some circumstances. DATA step statements -------------------- - The SET statement now works correctly when used with the RENAME and WHERE dataset options. - An error no longer occurs when processing chains of views that contain variables with specified format names. - If the LIST statement is specified, and the output extends onto a second or subsequent page, the page rule is now placed correctly. - RENAME now functions as expected when specified as the RENAME DATA step statement or in the KEEP or DROP statements. - The KEY and END options can now be used together on the SET statement, and work as expected. - The _FILE_ option to the FILE statement can now be used when accessing a VSAM dataset. - The _INFILE_ option to the INFILE statement can now be used when accessing a VSAM dataset. - DATA step components can now only be declared once in a step. DATA step functions -------------------- - RAND('BERNOULLI') now correctly returns 1 for success and 0 for failure. - RAND('UNIFORM') now correctly returns a value of x where 0 < x < 1. - The LOGCDF function and LOGSDF function now return the correct result for the NORMALMIX option. - The ROUND function now rounds correctly if the decimal part of the number to be rounded falls within the epsilon of the function. - JOHNSON SU distribution functions now have no lower bound on the input value. - JOHNSONSB - LOGPDF now returns 0 (zero) if an input is out of range. - EUROCURR now contains the fixed-rate exchange rates for when the Euro replaced the Latvian Lats and Lithuanian Latis. - TWEEDIE distribution functions no longer return missing values if optional arguments are not supplied. - An error message is now reported if an empty macro-variable name is used in DATA step macro CALL routines. - The SUBPAD function no longer writes out of bounds and corrupt memory. - The HTMLDECODE function now correctly decodes the   HTML entity. - The HOLIDAY function now returns the correct date when UKEASTERMONDAY is specified. - The URLENCODE() and URLDECODE() functions now convert to and from UTF-8 or work entirely in session encoding, depending on the value of URLENCODING system option. - The FINANCE('COUPDAYSNC') function now correctly calculates when the basis argument is 0 (zero). - Distribution-based functions now correctly calculate Poisson, Binomial, Multivariate, T, and Negative Binomial distributions that contain a very large number of events. - Geometric distribution functions now return the accurate value for p=1 - RAND("NORMAL"). Now validates that the standard deviation is positive. - RAND("GEOMETRIC") will now return integers. - GETOPTION function. Can now be used to retrieve password options. - The LOGPDF, LOGCDF and LOGSDF logistic distribution functions now return the correct value rather than a missing value if the result is less than CONSTANT ('LOGSMALL') Formats and informats --------------------- - An error no longer occurs if: - Formats have zero length. - A long format is specified using w.d. - An error message is sent to the log output when the maximum character format is exceeded. - The minimum length of the B8601DT format is now 15 characters, corresponding to the shortest form of the ISO 8601 yyyymmddThhmmss format. - NENGO has been updated to enable the formatting of dates in the new era. - The IEEE format has been added to enable the formatting of numbers in IEEE floating-point format. - When using the INPUT DATA step statement, a warning is now generated if the $VARYING format is applied to a variable with an inferred numeric type. - Formats applied to negative numbers now output asterisks (*) rather than 0 (zero) if the specified width is too narrow for the variable value. - Informats B8601LZ and E8601LZ now output the correct offset time value. - The ANYDTDTM format now correctly interprets the MMM DD YYYY HH:MM:SS format. - WEEKU, WEEKV and WEEKW formats now apply format to dates at the beginning and end of the range allowable in WPS. - WEEKU, WEEKV and WEEKW formats now add trailing spaces to fill the specified width. Library Engines =============== - The XML library engine now closes in the correct order at program termination. - The JSON Engine now enables the generation of the ALLDATA dataset to be disabled with the NOALLDATA option. Data engines ============ - Implicit pass-through now hands off correctly-serialised quoted strings. - The maximum and minimum allowed dates are now handled correctly. - Spooling is now available. The way in which spooling can be used depends on the engine. For details see the WPS Reference for Language Elements. - TIMESTAMP values before 01 January 1582 are now returned as missing values when retrieved through DB2, Oracle and ODBC database connections. ORACLE ------ - In the ORACLE data engine: - The DB_LENGTH_SEMANTICS_BYTE option now correctly handles server encoding character sizes. - The UPDATEBUFF statement now works correctly. - Inserts/updates of binary fields are now working correctly in Oracle on the Windows 32-bit product. - A reserved word in ORACLE might also be used as an alias in PROC SQL while querying an ORACLE database. To prevent the alias from reporting an error and stopping the query, the alias is now wrapped in quotes. - The ORACLE data engine now correctly: - Handles the situation in which no variable is specified to a SELECT, but the engine still needs to fetch each selected record. - Binds character and binary columns when reading into fields that are shorter than the column length. - A sequential scan Oracle curser can now be rewound. ORACLEOLD --------- - ORACLEOLD can now insert data into a table using PROC APPEND when the column name is an Oracle keyword. ODBC ---- - The COMPLETE, REQUIRED, PROMPT and NOPROMPT options now work correctly with MySQL and DB2. - The COMPLETE and REQUIRED options now work correctly with SQLServer. Now supports transactions to Google BigQuery. - The ODBC engine now supports: - DBINDEX in ACCESS ODBC (Access 2013 and Access 2016 only). - PROMPT, NOPROMPT, COMPLETE and REQUIRED in MySQL. - COMPLETE, REQUIRED, and PROMPT with popup window in DB2. - REQUIRED and COMPLETE with popup window in SQL Server. NETEZZA ------- - When bulk-loading data, CHAR, VARCHAR and LONG VARCHAR column types now use the internal encoding of Latin 9; NCHAR, NVARCHAR and LONG NVARCHAR column types now use the internal encoding of UTF-8. SQLSERVER --------- - Now supports the following options: - DBSLICE - DBSLICEPARM - INSERT_SQL ACCESS ------ - Can now export numbers formatted without decimals (for example, w.) even if the number has decimals. EXCEL ----- - Now provides a warning message if a source file contains unmappable Shift-JIS characters. DB2 --- - DB2 on z/OS now enables SPOOL=YES|NO|DBMS. - Now correctly joins columns. PostgreSQL ---------- - Data is now loaded correctly into Postgres when BULKLOAD=YES is specified. Teradata DB ----------- - All remaining connections are now closed when a session disconnects from a Teradata database. XLSX ---- - Multiple libraries now function as expected when concatenated in a new LIBNAME XLSX statement. ODS === - Invalid FORMAT values in TTI templates now cause a warning. - If table templates contain faulty expressions, no log warnings are generated. - MSOFFICE tagset output type now correctly set to HTML. - Output for invalid UNICODE characters is now consistent across output destinations. - HEADER and FOOTER template START and END statements now accept variables. - The TRANSLATE statement is no longer ignored if it is defined in the parent's template. - LISTING now better handles row-spanning cells in tables. - MARKUP: - Now correctly applies FONTSIZE values as relative font sizes. - FONTSIZE values outside of the allowable range now return an error in the log. - ODS EXCEL and EXCELXP now shrink specified title and footnotes to fit when using the sub-options TITLES_SHRINK_TO_FIT and FOOTERS_SHRINK_TO_FIT. - User-defined formats now support style attribute values. - The GTITLE and GFOOTNOTE options can now suppress the title/footnote in the output written to an ODS destination. EXCELXP ------- - Has new options for printing. - Now correctly displays data when SHEET_INTERVAL is changed. - A blank row is no longer written between a text specified by TITLE or FOOTNOTE and a table. - PDF now correctly handles Title and Footnote alignment on the system title style element. - Tab characters in comma-separated sub-options are now correctly parsed. PDF --- - No longer reports a warning if it fails to remove a font resource. - Now correctly handles non-printing characters. General procedures ================== APPEND ------ - Where the dataset is a DB2 table, parameter indexes are now correctly set. CATALOG ------- - The NEW statement now functions correctly when the target catalog already exists. - The EXCHANGE statement now functions correctly with newly-created catalogs. COMPARE ------- - Variables observed to contain both missing and non-missing differences are now only counted once in results. - The ID field name is now used rather than the label when producing summary information. CONTENTS -------- - The options OUTZEROVARDATASETS and NOOUTZEROVARDATASETS have been added to the PROC CONTENTS statement. These control how the contents of empty datasets appear when created. - The ID field name is now used rather than the label when producing summary information. COPY ---- - LRECL RECFM handling of catalog file entries has been improved. - Now completes successfully if catalogs specified with record formats other than "S" are copied. DATASETS -------- - Enables the use of colon wildcards (such as "ABC:") and range-based wildcards (such as "TMP4-TMP7"). - now supports MEMTYPE=DATA. This can be used when a single library member name is specified, and overrides the default member type for that member name. This option is now the default; scripts that rely on the old default must be updated. - Now includes compiled data step programs in the output list. DELETE ------ - Supports Colon wildcards (such as "ABC:") and range-based wildcards (such as "TMP4-TMP7") - Files are now correctly exported when the variable names contain single- or double-quotation marks. - The LIBRARY option now specifies a default library. Individual member names can override this default. EXPORT ------ - Now correctly performs an XLSX export when the filename is quoted. - Now exports temporary files without adding a file extension. FREQ ---- - When an observation contains a negative weight, only frequency values are calculated. - Now gives consistent results rather results depending upon the order of input data. - Now correctly utilises user defined formats on output. - Now accurately processes the ALL option for the TABLES statement. IMPORT ------ - Files are now correctly imported when the variable names contain single- or double-quotation marks. HTTP ---- - Uses the default User-Agent string WPS/URL, to match the behaviour of the other WPS HTTP clients. - Enables the user agent string sent in the HTTP request to be controlled by the USERAGENT option. - Now correctly handles multiple user-provided headers. IMPORT ------ - The new option DELIMTRIM enables you to specify how values in imported CSV files that have a space after the comma should be handled. - Files are now correctly exported when the variable names contain single- or double-quotation marks. - Now imports UTF-8 encoded files that contain invalid UTF-8 characters. JSON ---- - Now writes null when . (missing value) is specified in the WRITE VALUES statement. MEANS ----- - Computing the mode statistic of a class variable containing no valid observations no longer causes the processing engine to fail. - Now truncates frequency variables to integer values during percentile calculations. - The BY iterator can now be created and process the 0 (zero) records when a dataset is not specified to the DATA option. - The default value for the QMARKERS option on the PROC MEANS statement is now 5 rather than 0 (zero). - Now adds the SUMWGT statistic to the output when a weight variable is specified in the VAR statement. - Specifying the OUTPUT statement now writes the correct labels for Q1 and Q3 statistical options. OPTIONS ------- - DEFINE OPTION now supports details of where set. - LOGNUMBERFORMAT now correctly formats the number with commas. - OPTION=SCANDEFAULTMODIFIERS now correctly returns a text description. - The LONG DEFINE VALUE option now prints the correct value for the maximum number of characters in a string. PYTHON ------ - The input date data types are now correctly preserved in a Pandas DataFrame. PRINT ----- - The SUMLABEL option can now use BY variable labels instead of names. - Now supports the MINIMUM value for the WIDTH statement. - For table templates the option to turn PDF PRINT=off now works correctly. - Now applies the format of the BY variable to the SUM line. - No longer reprints column headers after each "N = count" if option N is set and all BY variables are ID columns. - The formatting of the BY variable is now maintained in SUM rows. - The PAGEBY option can now be used with ID variables. - Now outputs the correct number of decimal places for values with exact powers of 2. PWENCODE -------- - Now puts the encoded string in the _PWENCODE global macro variable. REPORT ------ - Supports SKIP for old listings. - No longer causes a corrupt catalog error if a dataset contains simple numeric format specifications. - Outputs a line even if the line is empty (null). - Supports overline (OL) and underline (UL) options to the BREAK statement. - Correctly positions tables on the page. - Now rejects a COLUMN statement where a spanned header cannot identify columns to output to and gives a warning in the log. - Supports the ID option of the DEFINE statement. - Supports for Listing destinations REPORT LINE statement correct justification. - System option [NO]CENTER has no effect on the placement: - LINE 'text'; writes text central on the page line - LINE @1 'text'; writes text starting in (1st) text column - Formatting has been improved when format width, COLWIDTH, single headline, header wrapping, and repeat character support are specified. - If HEADLINE is specified, multi-line rendering has been improved. - Specifying LABEL=" " now clears any existing LABEL value. - Now allows non-printing columns that occur before the last printing column to affect the style for table row. SUMMARY ------- - No longer fails if an unknown variable is specified to the FREQ statement. TABULATE -------- - ODS NEWLISTING now functions correctly when outputting tables spanning multiple pages. - Now outputs the correct number of tables when the PRELOADFMT and EXCLUSIVE options are used together in the CLASS statement TEMPLATE -------- - If you sort the list of templates using the LIST option, the sort ignores case. - PRINT statement now implemented for the FOOTER Template. - Error message changed so it refers to the DEFINE FOOTER statement instead. TRANSPOSE --------- - Now honours the VALIDVARNAME system option. UNIVARIATE ---------- - Is now more robust when fitting a curve. - Now correctly calculates triangular kernels. - The curve is now properly fitted when specified parameters are estimated. - The GAMMA distribution no longer ignores ALPHAINITIAL option. - The QQPLOT ROTATE and PCTLAXIS options now work correctly together. - The PPPLOT, PROBPLOT and QQPLOT statements now enable you to specify only one distribution. - For the PROBPLOT statement, the scale of the X axis is now correct. - For the PPPLOT, PROBPLOT and QQPLOT statements, a line is only drawn if requested. - The PPPLOT statement now only plots the top point when several observations have the same value. - Kernel density curves are now correctly labelled. - The KERNEL option of the HISTOGRAM statement now functions correctly if all data values are the same. - Plots are no longer drawn twice. - OVERLAY is no longer ignored. - An error message is displayed if options have an invalid type. - The W2(SLOPE) option to the QQPLOT and PROBPLOT options is no longer ignored. - Plots generated by the CDFPLOT statement are now correctly positioned. - The NEXTRVAL or ALL (which sets NEXTRVAL=5) options no longer cause an error if the dataset has fewer than twice as many observations than the value chosen. - Datasets specified to OUTHISTOGRAM or OUTKERNEL are now correctly applied. - No longer incorrectly assigns OUTHISTOGRAM or OUTKERNEL datasets when there are multiple HISTOGRAM statements, and those statements apply to specified variables rather than to all variables. - You can now provide a list of values to the ROUND option. The rounding value you specify is also now properly applied. - The speed and accuracy of the IGAUSS quantiles calculation are now improved. - Empty histogram bins are no longer created if the most extreme point lies exactly on a bind boundary, and there are rounding errors. - Now creates the correct ODS paths for all graphs and graphing-related tables. - Goodness of fit tests now function correctly. - Numeric evaluation of derivatives is now handled correctly in if-then-else structures. - The Johnson distributions now have no lower bound on the input value. - The NOVTICK and NOHTICK options of the CDFPLOT statement now correctly disable both tick values and tick labels. - If both a CLASS and a HISTOGRAM statement are specified using the HANG and KERNEL options, graphs are now rendered correctly. - Messages are now written to the log if the HISTOGRAM statement contains a variable that is not in the VAR variable list or is not a default variable. - Histogram bins: - Are now extended to cover all data if MIDPOINTS or ENDPOINTS are specified incorrectly. - Can now only be specified with evenly-spaced midpoints, and listed in increasing order. - Are now handled better when the number of bins to be plotted is extreme. - The datasets that can be created from output objects now contain columns additional to those displayed in the ODS outputs. The columns are not displayed in ODS outputs such as HTML and PDF. The following columns are added: - "Varname" in all datasets. - "Class" in all datasets if the CLASS statement is set. - "Histogram" and "Distribution" in all distribution-related datasets if the HISTOGRAM statement is set. - "Histogram" in all other, non-distribution-related, datasets when the HISTOGRAM statement is set. - "Kernel" in all datasets related to kernel density estimates. - The NOPRINT option now correctly disables printing only from the PROC UNIVARIATE statement, not also from the HISTOGRAM statement. - The conditions used for the mean and standard deviation for the Generalised Pareto distribution are now correct. - Now works correctly with sequential datasets. - No longer crashes or produces invalid output where there are many missing values.  - Now uses specified mu0 value when testing trimmed and Winsorized mean values. - The full calculated value of the Shapiro-Wilk p-Value is now displayed in the Tests for Normality table. SORT ---- - The output dataset now has the same compression status as the input dataset when COMPRESS=BINARY is globally defined. APPSRV ------ - Now produces an overlay message on error. Graphing procedures =================== General ------- - Catalog and entry are now checked for validity before graphing. GPLOT - Now supports multiple PLOT statements in RUN groupings. SQL Procedure ============= - The SQL procedure now correctly: - Places a correlated SELECT clause when the outer query contains one or more joins. - Handles modified equality as a join condition. - Sets the length of non-matching variables in SET operations. - Evaluates expressions after a UNION JOIN. - Resolves: - Correlated variable references. - Correlated SELECT item columns. - Nested queries on the same table name. - SELECT ITEM aliases in GROUP BY clauses when they have the same name as columns in the source tables. - Serialises: - All-true and all-false conditions during an implicit pass-through. - An empty IN clause in an implicit pass-through such that the database can still evaluate it. - Hands off DELETE statements to the database engines when a: - DATA step function returning a character value is used in the WHERE clause. - Non-correlated subquery is used in the WHERE clause. - Processes chains of views, including those created with the DATA statement and the SQL procedure, that contain variables with specified format names. - Pads set operations with unequal numbers of fields on either side. - Displays the reason for an I/O error. - Joins inline views. - Supplies labels for computed columns in views if no labels are supplied. - If a WHERE database option is specified, a WHERE clause is no longer ignored. - Error messages for faulty SELECT syntax have been improved. - The output dataset is no longer marked as sorted when a query with a DISTINCT statement has been serialised to a database. - The operator precedence for the syntax WHERE NOT x IN (1,2,3) is now equivalent to WHERE x NOT IN (1,2,3). - An error is reported if the table correlation names of a query are ambiguous. - The state of random functions is now reset between invocations of the procedure. - Uses only the BEST(8) format to write numeric values to INTO macro variables in the SELECT statement. - The EXECUTE (query) BY statement now correctly executes the query when an automatic database connection is created for the query. - Returns an error message if the procedure attempts to return a value to a read-only macro variable. - MATCH and SPRINGFIELD joins now work as expected. - Preserves formats applied to the source dataset when creating a new dataset. - The ALTER TABLE now correctly sets the sort option information. - Using the LIKE and ESCAPE options in the WHERE statement with a CREATE VIEW table now works as expected. - Column labels containing quotation marks are now supported when specifying a view using the CREATE VIEW statement. - Using a WHERE clause to query a VIEW now functions correctly. - Specifying a non-existent variable in a CASE statement no longer causes WPS Analytics to disconnect from the database server. - The VALIDVARNAME system option is now works as expected. - When using implicit passthrough, trailing spaces are now removed from strings to enable the target database to perform comparisons between string literals and variable-length character fields. Machine Learning procedures =========================== DECISIONFOREST -------------- - The PROC DECISIONFOREST statement now includes the CLASSCOMB option that specifies how to combine the predicted probabilities from each tree in a classification forest. DECISIONTREE ------------ - The CODE statement now passes variable names as string literals in scoring code. MLP --- - The CODE statement now passes variable names as string literals in scoring code. - No longer fails if the TRAININGSETORDERSEED sub-option of the MODEL statement is set to zero. Statistical procedures ====================== General ------- - Comparison adjustment calculations have been improved in the ESTIMATE statement of the LIFEREG, LOGISTIC, PHREG, and PROBIT procedures: - The two-sided adjusted p-value and confident intervals for the ADJUST=SIMULATE method. - The adjustment results for the ADJUST=SCHEFFE method. - The adjustment results when there are non-estimable entries in contrast matrix L. - The SYSERR variable is now correctly set if there is a syntax error when parsing the GENMOD, NLIN and PHREG procedures. BIN --- - If input variables are specified as string literals, the names that appear in the Binned Variable column of the Mapping table in the ODS outputs now correspond to the variable names in the output dataset. CORRESP ------- - Now functions correctly when the number of observations in the input data set is greater than the dimension of resultant Burt table when running MCA with VAR statement. FACTOR ------ - Now correctly takes a correlation or covariance matrix created from a CORR procedure as an input dataset. GENMOD ------ - Now correctly calculates the chi-square probability associated with the ESTIMATE statement. - The STDRESDEV option of the OUTPUT statement now returns a calculated value rather than a missing value. - Existence of VARIANCE and DEVIANCE functions is now checked when DIST=USER is specified. - The default response sort ordering is now INTERNAL when a multinomial distributed model with numerical response is specified. - The RORDER option now supports FREQ and INTERNAL. - The AGGREGATE option setting is now taken into account when calculating the TYPE1 deviance statistics. - The FREQ statement now interacts with distributions in the expected manner. - The CODE statement now passes variable names as string literals in scoring code. - The test for Hessian convergence using a Hessian matrix from a previous iteration rather than the one associated with the current parameter estimates. - Errors generated by functions and other Statements are now handled as expected. GLM --- - MERGEDLEGEND updates no longer breaks the legend in the MEANPLOT. - The ADJUST option of the LSMEANS statement now works as expected when the contrast matrix has non-estimable entries. - Specifying the LSMEANS statement to calculate least square mean values now generates more accurate results when WEIGHT or the FREQ variable contains missing values. GLMSELECT --------- - The LASSO method now correctly reports degrees of freedom in an ANOVA table. - Can now select more than one effect variable when the NOINT option is used with FORWARD and STEPWISE selection methods. - No longer fails if doing backward model selection with linearly-dependent regressors. KDE --- - Now generates correct print paths for bi-variate graphics. LIFEREG ------- - Now correctly performs non-parametric simultaneous equal-precision confidence limit calculations. - Survival plots are now consistently labelled correctly. - Can now use a previously calculated OUTEST dataset to the INEST option of a subsequent procedure invocation. LIFETEST -------- - No longer fails if the STRATA statement contains a variable that has an associated input format. LOGISTIC -------- - Performance has been enhanced. - No longer fails when a BY statement and the OUTROC option are used together. - The Type 3 Wald Chi-Square statistics is now correctly calculated when GLOGIT link function specified. - Now: - Finds variables that contain invalid SAS language characters in the INEST dataset. - Sets the correct reference category when loading a logistic model that contains the LINK=GLOGIT option from file. - The CODE statement now passes variable names as string literals in scoring code. - The equation in the linear dependency tables is now limited to 2000 characters. - The ODS output table Logistic.Type3 is now renamed to Logistic.ModelANOVA - Now ensures the final covariance matrix is positive. MI -- - No longer creates datasets with duplicate variable names. MIANALYZE --------- - The ParameterEstimates table now has field labels of 95% confidence limit. - No longer becomes stuck in an infinite loop. - Now functions correctly if the MODELEFFECTS statement is not included with every effect from a model. - Now correctly matches PARMINFO parameters in multiple imputations. - No longer outputs an empty dataset if the input dataset contains insufficient information. MIXED ----- - The ADJUST option of the LSMEANS statement now works as expected when the contrast matrix has non-estimable entries. - No longer runs out of memory when fitting a large GLM model. - No longer fails when an intercept term is specified as a repeated effect in REPEATED statement. - Now creates a correct variance-covariance matrix when the DDFM=KENWARDROGER option is specified in the MODEL statement. - Specifying the LSMEANS statement to calculate least square mean values now generates more accurate results when WEIGHT or the FREQ variable contains missing values. MLP --- - Error messages generated by the INITWEIGHTS option have been updated. - Now writes a final history dataset that contains the history up to and including the final complete state. - The history dataset now provides normalized error measures. NLIN ---- - Now reports observation numbers for errors more accurately when BY groups are used. - The DER statement of the NLIN procedure no longer causes an assertion failure if the case of the specified model parameter does not match the case of the actual model parameter, or if the parameter is not specified. Instead, an error occurs. - By groups no longer cause a failure if not the first item in the dataset. - The model (dependent) variable can now be a character item. - Sum statements are now correctly displayed when the LIST option of the PROC NLIN statement is specified. NLMIXED ------- - Errors generated by functions and other Statements are now handled as expected. NPAR1WAY -------- - Two-Sample Test and StatFactoid tables output has been reformatted for readability. - ODS output now only specifies that average scores were used for ties when there are ties. OPTIMALBIN ---------- - No longer drops missing observations; missing observations are only dropped if the EXCLUDEMISS option is specified. PHREG ----- - Grouped direct adjusted survival curves are now labelled correctly. - Now displays coefficient tables correctly. - Now works as expected with singular covariance and backward model selection. POWER ----- - Tests using the ONESAMPLEFREQ statement and multiple MARGIN options are now reported correctly. PROBIT ------ - The CODE statement now passes variable names as string literals in scoring code. REG --- - The START option for the MODEL statement must now be greater than zero when CP, ADJRSQ or RSQUARE is specified for the SELECTION option. STANDARD -------- - The REPLACE option can now be specified on its own, and if it is, any missing values are replaced with the computed mean. TTEST ----- - Now functions correctly if the same variable is paired. - No longer outputs missing values for a 2-sample ratio test where the mean is negative. - Crossover design statistics now show the correct period number. VARCLUS ------- - Now correctly takes a correlation or covariance matrix created from a CORR procedure as an input dataset. Quality control procedures ========================== CAPABILITY ---------- - The NOPRINT option now correctly disables printing only from the PROC UNIVARIATE statement, not also from the HISTOGRAM statement. - You can now specify a seed (EDFSEED option) to be used for random number generation for goodness of fit tests for all distributions. - Now uses the correct column names in ODS output produced for the basic measures table. - When invoked on z/OS, an incomplete BETA function now correctly converges. - WEIBULL2 plots now plot specification lines in the correct place. z/OS ==== - On z/OS, the wrong code is no longer generated when the optimiser is at its highest level. - To reduce the amount of memory used by data processing procedures, the ICU character set conversion libraries are only loaded when necessary. - If a WORK dataset is not specified, a temporary dataset is now used. - Colour coding of log messages now works correctly. - During a dataset upload, a WPS client now correctly handles the log message from the server. - RLS options now correctly interact with each other. - When using RLS VSAM, datasets can now be read sequentially. - Now supports CSSMTP for email with no attachments and inline only body content. - RSUBMIT no longer fails when connecting to an AIX server. - The UPLOAD and DOWNLOAD procedures from a z/OS client to an AIX server now work correctly. - WPS no longer fails to read a configuration if the value of an AUTOEXEC option on an APPEND or INSERT statement contains parentheses. - The MODULEN function now works correctly. - The CONFIG option processing for JREOPTIONS is not cumulative. To support additive operations, APPEND and INSERT need to be used. - The TSOWPS CLIST now forms the members of the concatenation that is used for the DD allocation using the sequence { installation-config-file, user-config-file }. Previously, it was { user-config-file, installation-config-file }. This ensures that restricted system options cannot be changed locally. - WPS can now use a CPU count greater than four. - The IEC1451I 413-18 IO Abend is no longer triggered when a data step writes a dataset to a blank tape. - Using a LIBNAME statements with empty path location now generates a warning message. - The value of the DB2 libname SERVER option is automatically converted to uppercase. - Incorrect command line arguments to TSO WPS startup on z/OS could cause incorrect failure. - An Abend is no longer generated when reading an MVS file using an Infile or File User Exit and either the DSCB or CCHHR option. - The DSCB variable is filled with blanks when no DSCB can be read for an MVS dataset referenced by an INFILE or FILE statement in a DATA step. - The STARTTLS system options are now supported. - Messages and EXIT statements in RINST REXX installer have been renumbered. - The TSOWPS CLIST now binds the output DD cards when in DMR mode, - The TSOWPS CLIST now provides a binding for SASLOG in DMR mode. - The DMRSAVEOUTPUT option enables default bindings for all unbound outputs. - A B37 I/O abend in a DATA step is now handled as expected when closing a DATA step. - FILEBLKSIZE(3490E) now supports sizes up to 256K. - A FILENAME declared to a single element HLQ causing the HLQ to be considered a DD name now works as expected. - The SASDASD library can now contain compressed files with zero pages. - No longer causes an out of memory error if the format name is incorrect. - Sending Email attachments now works as expected. - Incorrect FILENAME statements now fail gracefully. - An error is now generated when reading a concatenation with an# unknown PDS member. - There is now improved detection of the use of EAV disks for WPD library storage on z/OS. EAV volumes are currently not supported for library storage. WPS Communicate =============== - The UPLOAD and DOWNLOAD procedures now correctly upload and download very wide datasets. - The UPLOAD and DOWNLOAD procedures can now use wildcards at any position in a filename. - The WPS Communicate server port number is now stored in the TCPPORTSERVER automatic variable. Web === - The Load Manager now has correct timeout values. Workbench ========= - You are now able to manually export a WPD dataset from the SAS language perspective manually when using Citrix. - The import wizard is now able to import over a remote connection. - The data grid viewer now behaves correctly when viewing datasets with filter and column sorting active if compression is enabled. - The xlsx file import now handles quotes within a column header correctly. - Output to ODS NEWLISTING containing Unicode characters is now correctly paged. Workflow ======== - The Mutate block now only executes if a name is specified for a variable. - The Data Profiler Report now reflects the name of dataset block label (if the Data Profiler was opened on a block). Otherwise it is the name of the dataset. - The Impute block now requires a percentage expressed as a fraction for Winsorization means and trimmed mean. ======================================================================= Getting Support ======================================================================= How you access technical support for your WPS software depends on how you purchased your software. You can rest assured that WPS always comes with maintenance and support. If you made a standard purchase of WPS software, you have an annual subscription licence that entitles you to unlimited free upgrades throughout the twelve months, and free email support via support@worldprogramming.com. We always attempt to respond to emails promptly. Larger customers might have additional support arrangements in place. In this case, we might often provide access to our online Issue Tracking System. Your organisation might also have nominated superusers through whom all technical support requests are handled. Resolutions to problems might include suggested workarounds or might require you to update your WPS software installation. Because of the complex nature of the language of SAS, interaction might be required between you and World Programming to identify and resolve the exact causes of the problems. (c) 2022 World Programming