Using my last post of how to breakout an employee's PTO request into durations, we can now use that SQL as a basis of seeing the how picture of the employee's schedule.  If we use the employee's assigned schedule and join it to schedule calendar Table, this will break out the employee Time and Labor Schedule by duration.  If we go a step further and join the employee's holiday schedule from the job record, then we can account for Holiday's.  Now all we need to get a clear picture of the employee's schedule is the PTO Request broken up by duration. 
In the SQL below the PS_ZZ_PSFT_PTO is a populated via the sql the previous post.
WITH Schedule ( Emplid, Empl_Rcd, Dur, Wrkday_Id, Daynum, Hol_Descr) AS ( 
 SELECT E.EMPLID 
 , E.EMPL_RCD 
 ,DUR 
 , WRKDAY_ID 
 , DAYNUM 
 , ( 
 SELECT H.DESCR 
  FROM PS_HOLIDAY_DATE H 
 WHERE H.HOLIDAY = DUR 
   AND H.HOLIDAY_SCHEDULE =A.HOLIDAY_SCHEDULE) 
  FROM Ps_Sch_Assign E, Ps_Sch_Clnd_Dtl_Vw F, Ps_JOB A 
 WHERE E.Emplid = A.Emplid 
   AND E.Empl_Rcd = A.Empl_Rcd 
   AND A.EFFDT = ( 
 SELECT MAX(A_ED.EFFDT) 
  FROM PS_JOB A_ED 
 WHERE A.EMPLID = A_ED.EMPLID 
   AND A.EMPL_RCD = A_ED.EMPL_RCD 
   AND A_ED.EFFDT <= SYSDATE) 
   AND A.EFFSEQ = ( 
 SELECT MAX(A_ES.EFFSEQ) 
  FROM PS_ZZ_JOB_CUST A_ES 
 WHERE A.EMPLID = A_ES.EMPLID 
   AND A.Empl_Rcd = A_Es.Empl_Rcd 
   AND A.EFFDT = A_ES.EFFDT) 
   AND E.EFFDT = ( 
 SELECT MAX(E_ED.EFFDT) 
  FROM PS_SCH_ASSIGN E_ED 
 WHERE E.EMPLID = E_ED.EMPLID 
   AND E.EMPL_RCD = E_ED.EMPL_RCD 
   AND E_ED.EFFDT <= TO_DATE(SYSDATE)) 
   AND F.SETID = E.SETID 
   AND F.SCH_ADHOC_IND = E.SCH_ADHOC_IND 
   AND F.SCHEDULE_ID = E.SCHEDULE_ID 
   AND F.ROTATION_ID = E.ROTATION_ID 
   AND F.EFFDT = ( 
 SELECT MAX(F_ED.EFFDT) 
  FROM PS_SCH_CLND_DTL_VW F_ED 
 WHERE F.SETID = F_ED.SETID 
   AND F.SCH_ADHOC_IND = F_ED.SCH_ADHOC_IND 
   AND F.SCHEDULE_ID = F_ED.SCHEDULE_ID 
   AND F.ROTATION_ID = F_ED.ROTATION_ID 
   AND F.DUR = F_ED.DUR 
   AND F.Shiftnum = F_Ed.Shiftnum 
   AND F_Ed.Effdt <= To_Date(Sysdate)) ) 
 SELECT s.Emplid 
 , s.Empl_Rcd 
 , s.Dur 
 , s.Wrkday_Id 
 , s.Daynum 
 , s.Hol_Descr 
 , P.zz_requested 
 , P.SCHED_HRS 
 ,to_char(S.DUR 
 ,'dd') 
 , CASE NVL(HOL_DESCR 
 ,'NULL') WHEN 'NULL' THEN CASE WRKDAY_ID WHEN 'OFF' THEN 'O' ELSE CASE WHEN NVL(ZZ_REQUESTED 
 ,0) > 0 THEN CASE WHEN SCHED_HRS > ZZ_REQUESTED THEN 'P' ELSE 'A' END ELSE 'S' END END ELSE 'H' END 
 ,'<td style="background-color:'||CASE NVL(HOL_DESCR 
 ,'NULL') WHEN 'NULL' THEN CASE WRKDAY_ID WHEN 'OFF' THEN 'WHITE' ELSE CASE WHEN NVL(ZZ_REQUESTED 
 ,0) > 0 THEN CASE WHEN SCHED_HRS > ZZ_REQUESTED THEN 'YELLOW;color:black' ELSE 'RED;color:white' END ELSE 'GREEN;color:white' END END ELSE 'BLUE;color:white;" title="'||replace(HOL_DESCR 
 ,chr(39) 
 ,''')||'' END||'"><div style=''width:30px;height:20;''>'||to_char(S.DUR 
 ,'dd')||'</td>' 
 ,'<td '||CASE NVL(HOL_DESCR 
 ,'NULL') WHEN 'NULL' THEN '' ELSE 'title="'||replace(HOL_DESCR 
 ,chr(39) 
 ,''')||'" ' END || 'style="background-image:url(''' 
 , '</td>' 
  FROM Schedule S LEFT OUTER JOIN PS_ZZ_PSFT_PTO P ON P.EMPLID = S.EMPLID 
   And P.Bgn_Dt = S.Dur 
    ORDER BY s.dur;
Using this Query I created a view and used the SQL to generate the data for an HTML table that allows managers and associates to view their teams schedule.  It will even let manager's drill down into indirect reports schedules to view availability of their indirect reports team's. 

 
No comments:
Post a Comment