SCNCLPIF        SCAN CLP IF                            TAACLQN

 The  Scan CLP  IF tool  is  designed as  an aid  to  assist in  finding
 potential year 2000 date problems.

 Most potential  year 2000 date problems will occur  when two 6 position
 date  variables  are compared  for  other than  'equal'  or 'non-equal'
 conditions.   If you compare  for an  equal condition, the  application
 should  work  the  same  in  the  year  2000.    However,  a  statement
 comparing  two date  variables in YYMMDD  format such  as the following
 will probably cause problems:

              IF            (&DATE1 *GT &DATE2) DO

 The SCNCLPIF tool  is designed to  find these potential  problems.   It
 scans for  variables with  a specified  length that are  used in  an IF
 command with  *GT, *LT etc.  *EQ/*NE type  comparisons are excluded.  A
 specific member, generic members,  or all members in  a file of  source
 type  CLP, CLLE,  or CLMOD  may  be scanned.   A  spooled  file of  the
 statements that match the criteria is produced.

 A typical command would be:

              SCNCLPIF    MBR(xxx) SRCFILE(QCLSRC) VARLEN(6)

 The command finds  the IF commands in the  source and determines if the
 variables  being  compared  are length  6.    Any *EQ  or  *NE  type of
 comparisons  are excluded.    If  it is  a  *CHAR  or *DEC  field  that
 matches  the length specified,  it is  printed.   *DEC type  fields are
 only considered if they have 0 decimals.

 Library list implications
 -------------------------

 SCNCLPIF  is directed  at a  source file.   If an  Externally described
 file exists in the  source, an attempt is  made to obtain the  variable
 definitions by using the library list.

 To  gain the  best benefit  of the  tool,  you should  ensure that  the
 library list includes the externally described files.

 Specific cases
 --------------

 You can have a compound IF statement such as:

              IF           ((&FLDA *EQ &FLDB) *AND +
                             (&FLDC *GT &FLDD)) DO

                       or

              IF           (&FLDA *EQ &FLDB *AND +
                             &FLDC *GT &FLDD) DO

 &FLDA and  &FLDB are not considered  because of the *EQ,  but &FLDC and
 &FLDD will still be checked for the length specified.

 Complex forms of the IF command are supported such as:

              IF           ((&FLDA *EQ &FLDB *OR &FLDA *EQ FLDC) *AND +
                             (&FLDC *GT %SST(&FLDX 1 6)) DO

 The operators such as ^> or | are also supported.

 You need  to determine  from the  listing and  looking  at your  source
 whether the fields are date fields.

 While SCNCLPIF  is not a  perfect solution  for determining where  your
 year 2000  problems exist, it can be very  effective in pinpointing the
 code where you are most likely to have problems.

 What is not found by SCNCLPIF
 -----------------------------

 The  length of  literals is  not considered  by SCNCLPIF.   However, as
 long as  a variable  in the  comparison matches  the length  specified,
 SCNCLPIF will  print the  statement.  For  example, SCNCLPIF  will find
 the following:

              DCL          &DATE *CHAR LEN(6)

              IF           (&DATE *GT '010101') DO

 The  %SST (substring  function) is  not completely  handled.   The only
 variable tested is the variable  to be used in the substring  operation
 (not  the  start  or length).    It  would  be  possible to  have  a  7
 character  date that  is  compared using  a substring  of  6 characters
 that would not be found by SCNCLPIF.

 For example, assume you make the following DCLs.

              DCL          &CYMD *CHAR LEN(7) /* CYYMMDD */
              DCL          &DATE *CHAR LEN(6)

 The following IF would not be found:

              IF           (%SST(&CYMD 2 6) *GT '010101') DO

 But, the  following IF  would be  found because  &DATE is  declared  as
 *CHAR LEN(6):

              IF           (%SST(&CYMD 2 6) *GT &DATE) DO

 Different forms  of concatenation are  not handled.   For example,  you
 could  generate   a  6  character  value  within   the  IF  command  by
 concatenating   month,  day,   and  year  variables   before  making  a
 comparison such as:

              DCL          &MTH *CHAR LEN(2)
              DCL          &DAY *CHAR LEN(2)
              DCL          &YR *CHAR LEN(2)

              IF           (&MTH *CAT &DAY *CAT &YR *GT '010101') DO

 This  would  not  be  found  by  SCNCLPIF.     However,  if  you  first
 concatenated &MTH, &DAY,  and &YR into a 6  character work variable and
 compared  the work variable or compared  against a 6 character variable
 instead of a literal, SCNCLPIF would find the statement.

 The IF command  allows the user  to specify a  very complex  expression
 involving  arithmetic,  built  in  functions,   *ANDs,  *ORs,  sets  of
 parenthesis,  etc.  Most  users do not  take advantage of  the complete
 syntactical capability.  It is  not expected that SCNCLPIF will  handle
 every valid IF statement, but typical coding solutions are handled.

 Other commands and functions
 ----------------------------

 Only the  IF command  is tested  for.   Few CL commands  other than  IF
 provide for direct comparisons of variables.

 The following are exceptions:

   **   OPNQRYF  command allows  an expression  in the  QRYSLT parameter
        which  can  compare dates.   To  check  for this  situation, you
        could use  the  SCNSRC  TAA Tool  to  determine all  the  source
        statements where you have specified OPNQRYF.

 OPNQRYF  also supports  the KEYFLD  parameter where  it is  possible to
 build an access path over a date field.

 The  SCNOPNQRYF tool will assist  you in identifying  all of the source
 that uses OPNQRYF.

   **   An access  path  may  be  built  over a  date  field  in  YYMMDD
        format.   This  can cause  problems although  CL would  normally
        not  be used to  read such  a file.   The SCNACCPTH tool  may be
        used to assist in determining if any such key fields exist.

   **   CPYF supports  INCCHAR which  allows  a relational  operator  of
        *GT,  *LT, etc.   A  scan  for INCCHAR  should  be effective  in
        finding any use of this function.

   **   The  FMTDTA  command  provides  a  sort capability  that  allows
        selection  based on *GT, *LT, etc.  You  can scan for the use of
        FMTDTA or if  you have all  FMTDTA specifications in a  specific
        source file  you could scan for  the characters GT, LT,  GE, and
        LE.

   **   The  SORTDB  TAA  Tool  provides  a  front  end  to  the  FMTDTA
        command.   It  supports  the  SEL1, SEL2,  and  SEL3  parameters
        which  allow *GT,  *LT, etc.   You  could  scan for  the use  of
        these keywords.

   **   Other Query  products may make date  comparisons which cannot be
        easily determined.

 Command parameters                                    *CMD
 ------------------

    MBR           The source member to be  scanned.  A single member,  a
                  generic name, or  the special value *ALL may  be used.

                  If  a generic name  or *ALL  is specified,  the source
                  types  checked are  CLP, CLLE,  and CLMOD.   The other
                  types are bypassed.

    SRCFILE       The qualified file  name of the  file.  The file  name
                  defaults  to QCLSRC.   The  library value  defaults to
                  *LIBL.  *CURLIB may also be used.

    VARLEN        The  variable length to be tested.   The default is 6.
                  Both *CHAR  and *DEC  type variables  are tested  for.
                  *DEC type  variables are  only tested  if they  have 0
                  decimals.  The value must be between 1 and 256.

    RQDEXTDSC     Determines  whether  any  externally  described  files
                  are required.

                  *NO is  the  default  which  means  if  an  Externally
                  Described file  exists, the  field specifications  are
                  used.    If  an  Externally  Described file  does  not
                  exist  on the library  list, no error  occurs, but the
                  information about some  of the fields may  be missing.

                  If  *YES  is  specified  and an  Externally  Described
                  file  is specified  in  the source,  it must  exist on
                  the library list or an error will occur.

    DLTSPLF       A *YES/*NO value  that defaults to  *NO.  *NO  retains
                  any spooled files created.

                  *YES  may be  specified to  delete  any spooled  files
                  that have no CLP type members.

 Restrictions
 ------------

 See the previous section on what is not found by SCNCLPIF.

 The correct  syntax of CL source must be  used (the source must compile
 into a program without serious errors).

 One of  the  base  tools  used  is  RTVCLPVAR.    It  has  restrictions
 regarding its ability to determine the attributes of a variable.

 Prerequisites
 -------------

 The following TAA Tools must be on your system:

      CHKGENERC       Check generic
      EDTVAR          Edit variable
      HLRMVMSG        HLL Remove message
      RTVMBRLST2      Retrieve member list 2
      RTVCLPVAR       Retrieve CLP variables
      RTVSYSVAL3      Retrieve system value 3
      SNDCOMPMSG      Send completion message
      SNDESCMSG       Send escape message
      SNDSTSMSG       Send status message

 Implementation
 --------------

 None, the tool is ready to use.

 Objects used by the tool
 ------------------------

    Object        Type    Attribute      Src member    Src file
    ------        ----    ---------      ----------    ----------

    SCNCLPIF      *CMD                   TAACLQN       QATTCMD
    TAACLQNC      *PGM       CLP         TAACLQNC      QATTCL
    TAACLQNC2     *PGM       CLP         TAACLQNC2     QATTCL
    TAACLQNR      *PGM       RPG         TAACLQNR      QATTRPG

Added to TAA Productivity Tools September 1, 1996


Home Page

Last modified on March 10, 2014 © 1995, 2014 - TAA Tools, Inc.