Translate

Wednesday, 20 February 2013

SQR arrays

Requirement : produce an employee listing by department and
print the following departmental statistical information: the number of active employees,
the number of women, the number of men, and an average salary for the department.

!TEST12A.SQR
!USING ARRAYS IN SQR
#DEFINE STAT_ARRAY_SIZE 100
!***********************
BEGIN-SETUP
!***********************
CREATE-ARRAY NAME=STATISTICS SIZE ={STAT_ARRAY_SIZE}
FIELD=DEPTID:CHAR='999999'
FIELD=ACTIVE_EE:NUMBER
FIELD=WOMEN:NUMBER
FIELD=MEN:NUMBER
FIELD=TOTAL_SALARY:NUMBER
END-SETUP
!********************
BEGIN-HEADING 3
!********************
PRINT 'EMPLOYEE STATISTICS BY THE DEPARTMENT' (1,10)
PRINT 'DEPARTMENT ID' (2,1,)
PRINT 'EMPLOYEE ID' (,+2)
PRINT 'STATUS' (,+2)
PRINT 'SEX' (,+2)
PRINT 'ANNUAL RATE' (,+2)
PRINT ' ' (3,1)
END-HEADING
!********************
BEGIN-PROGRAM
!********************
LET #I=0
DO SELECT_EMPLOYEES
DO PRINT_SUMMARY
END-PROGRAM
!***********************************
BEGIN-PROCEDURE SELECT_EMPLOYEES
!***********************************
BEGIN-SELECT
A.DEPTID (+1,1,13) ON-BREAK
A.EMPLID (,+2,11)
A.EMPL_STATUS (,+2,6)
B.SEX (,+2,3)
A.ANNUAL_RT (,+2,12) EDIT $,$$$,$$$.00
     DO UPDATE_ARRAY
FROM PS_JOB A, PS_PERSONAL_DATA B
WHERE
A.EMPLID=B.EMPLID
AND A.EMPL_STATUS='A'
!AND A.DEPTID IN ('10200','21700')
AND A.EFFDT=(SELECT MAX(EFFDT) FROM PS_JOB
    WHERE EMPLID=A.EMPLID
    AND EMPL_RCD=A.EMPL_RCD
    AND EFFDT<=SUBSTRING(CONVERT(CHAR,GETDATE(),121), 1, 10))
AND A.EFFSEQ=(SELECT MAX(EFFSEQ) FROM PS_JOB
    WHERE EMPLID=A.EMPLID
    AND EMPL_RCD=A.EMPL_RCD
    AND EFFDT = A.EFFDT)
ORDER BY A.DEPTID,A.EMPLID
END-SELECT
END-PROCEDURE
!*******************************
BEGIN-PROCEDURE PRINT_SUMMARY
!*******************************
PRINT 'SUMMARY BY DEPARTMENT' (+2,10)
LET #I=0
WHILE #I <= {STAT_ARRAY_SIZE}
GET $DEPTID #ACTIVE #WOMEN #MEN #TOTAL_SALARY
FROM STATISTICS(#I)
IF $DEPTID='999999'
BREAK
ELSE
IF #ACTIVE <> 0
LET #AVERAGE_SALARY = #TOTAL_SALARY / #ACTIVE
END-IF
PRINT 'DEPARTMENT ' (+1,1)
PRINT $DEPTID (,+1)
PRINT 'NUMBER OF ACTIVE EMPLOYEES = ' (+1,1,33)
PRINT #ACTIVE (,+1) EDIT 9,999,999
PRINT 'NUMBER OF WOMEN = ' (+1,1,33)
PRINT #WOMEN (,+1) EDIT 9,999,999
PRINT 'NUMBER OF MEN = ' (+1,1,33)
PRINT #MEN (,+1) EDIT 9,999,999
PRINT 'AVERAGE SALARY = ' (+1,1,33)
PRINT #AVERAGE_SALARY (,+1) EDIT $$$,$$$,$$$.99
NEXT-LISTING NEED=4 SKIPLINES=1
END-IF
ADD 1 TO #I
END-WHILE
END-PROCEDURE
!*****************************

!*******************************
Begin-Procedure UPDATE_ARRAY
!*******************************
!Find an element in the array with Deptid = Selected Deptid
!If it's not there, create a new element in the array
Let $Found='N'
Let #j=0
While #j < {Stat_Array_Size}
Get $Deptid From Statistics(#j) Deptid
If $Deptid='999999'
Let #i=#j
Put &A.Deptid Into Statistics(#i) Deptid
Let $Found='Y'
Break
Else
If &A.Deptid = $Deptid
Let #i=#j
Let $Found = 'Y'
Break
End-If
End-If
Let #j=#j+1
End-While
If $Found='N'
Display 'ERROR: There are more than {Stat_Array_Size} departments in the array'
Stop
End-If
Array-Add 1 To Statistics(#i) Active_EE
Array-Add &A.Annual_Rt To Statistics(#i) Total_Salary
If &B.Sex='M'
Array-Add 1 to Statistics(#i) Men
Else
Array-Add 1 to Statistics(#i) Women
End-If
End-Procedure
!****************************************************
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                                      OUTPUT
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 EMPLOYEE STATISTICS BY THE DEPARTMENT
DEPARTMENT ID  EMPLOYEE ID  STATUS  SEX  ANNUAL RATE


               SFTRN067     A       U      $42,000.00
               SFTRN077     A       U      $42,000.00
               SFTRN087     A       U      $42,000.00
               SFTRN097     A       U      $42,000.00
               SFTRN107     A       U      $42,000.00
               SFTRN117     A       U      $42,000.00
               SFTRN127     A       U      $42,000.00
               SFTRN137     A       U      $42,000.00
               SFTRN147     A       U      $42,000.00
               SFTRN157     A       U      $42,000.00
T006           KUI059       A       M      $30,368.00

         SUMMARY BY DEPARTMENT
DEPARTMENT  10000
NUMBER OF ACTIVE EMPLOYEES =            304
NUMBER OF WOMEN =                       117
NUMBER OF MEN =                         187
AVERAGE SALARY =                   $1,757,008.79

No comments:

Post a Comment