midrange.com code scratchpad
Name:
DATE_DIM creation
Scriptlanguage:
Plain Text
Tabwidth:
4
Date:
01/20/2016 10:49:15 pm
IP:
Logged
Description:
Builds the DATE_DIM table
Code:
  1.        //========================================================================*
  2.        // PROGRAM NAME...: DATE_DIMCV                      TEMPLATE: STD10BRG
  3.        // AUTHOR.........: Matt Tyler
  4.        // DATE...........: 05/04/2015
  5.        // PCR #..........: 13539 00
  6.        // FUNCTION/DESC..: Build DATE_DIM records
  7.        //------------------------------------------------------------------------
  8.        //    MODIFICATIONS:
  9.        //------------------------------------------------------------------------
  10.        // MOD#  PCR#    PGMR   DATE   DESCRIPTION
  11.        // /M01               MM/DD/YY Changes...
  12.        //========================================================================*
  13.      H EXTBININT( *YES )
  14.       /COPY QCPYSRC,HSPECLE
  15.  
  16.        DCL-F PRINT PRINTER(132) USAGE(*OUTPUT) OFLIND(*INOF);
  17.  
  18.       // Prototypes
  19.       ***/COPY QCPYSRC,QCMDEXCPR
  20.       ***/COPY QCPYSRC,MSGTOOLSCL
  21.       ***/COPY QCPYSRC,UTL10ARGPR
  22.       ***/COPY QCPYSRC,UTL25ACLPR
  23.  
  24.       // General tools
  25.       ***/COPY QCPYSRC,UTL000RGPR
  26.       ***/COPY QCPYSRC,SQLUDFPR
  27.  
  28.       // Data Structures
  29.       ***/COPY QCPYSRC,DSPGMINF4
  30.       ***
  31.       // Result Set Container
  32.        DCL-DS RS_A EXTNAME( 'DATE_DIM' ) INZ ALIAS;
  33.        END-DS;
  34.  
  35.       //----------------------------------------------------------------------
  36.       // Stand Alone Fields
  37.       //----------------------------------------------------------------------
  38.        DCL-S EOF IND;
  39.        DCL-S ERRINDSQL IND;
  40.        DCL-S workfield varchar(100);
  41.  
  42.       //----------------------------------------------------------------------
  43.       // Mainline
  44.       //----------------------------------------------------------------------
  45.       //  This SQL statment is REQUIRED for this program to run correctly.
  46.  
  47.        // Set SQL Options
  48.        EXEC SQL SET OPTION DATFMT = *ISO
  49.                           ,TIMFMT = *ISO
  50.                           ,ALWCPYDTA = *OPTIMIZE
  51.                           ,CLOSQLCSR = *ENDMOD
  52.                           ,COMMIT = *NONE
  53.                           ,DLYPRP = *YES;
  54.  
  55.        EXSR PROCESS;
  56.        EXSR SetCurrent13Weeks;
  57.        EXSR AddHolidays;
  58.  
  59.        EXSR EXIT;
  60.  
  61.  
  62.        //---------------------------------------------------------------------
  63.        // SQL error processing
  64.        //---------------------------------------------------------------------
  65.        BEGSR ERRORSQL;
  66.  
  67.          ERRINDSQL = *ON;
  68.  
  69.        //////  EVALR MSGTOOLS.ID = %EDITW(SQLCODE:'     0    ');
  70.        //////  IF %SUBST(MSGTOOLS.ID:3:1) = *BLANK;
  71.        //////    %SUBST(MSGTOOLS.ID:1:3)='SQL';
  72.        //////  ELSE;
  73.        //////    %SUBST(MSGTOOLS.ID:1:2) ='SQ';
  74.        //////  ENDIF;
  75.        //////
  76.        //////  MSGTOOLS.DATA = MSGTOOLS.ID + ' (' + SQLSTT +') '
  77.        //////    + 'Please contact the Helpdesk.';
  78.        //////  EXCEPT ERRORSQLP;
  79.        //////
  80.        //////  MSGTOOLS.DATA = MSGRTVLVL1(MSGTOOLS.ID: SQLERRMC: 'QSQLMSG');
  81.        //////  MSGTOOLS.DATA = MSGTOOLS.ID + ' (' + SQLSTT + ') '
  82.        //////    + %TRIM(MSGTOOLS.DATA);
  83.        //////  EXCEPT ERRORSQLP;
  84.        //////
  85.        ENDSR;
  86.        //---------------------------------------------------------------------
  87.        // Exit the program
  88.        //---------------------------------------------------------------------
  89.        BEGSR EXIT;
  90.  
  91.          *INLR = *ON;
  92.          RETURN;
  93.  
  94.        ENDSR;
  95.  
  96.        //---------------------------------------------------------------------
  97.        // Process
  98.        //---------------------------------------------------------------------
  99.        BEGSR PROCESS;
  100.  
  101.          Exec sql Drop Table Qtemp/Date_Dim_dates;
  102.          Exec sql Drop Table Qtemp/Date_Dim_fiscal;
  103.          Exec sql Drop Table Qtemp/Date_Dim_calendar;
  104.  
  105.          // 693596 is the integer you can pass to DATE() in sql
  106.          // to generate '1900-01-01';
  107.  
  108.          // Build a list of all dates between 1900-01-01 AND 2099-12-31
  109.          Exec sql Create Table Qtemp/Date_Dim_Dates
  110.            ( D_DATE_SK, D_DATE,D_MONTH_SEQ, D_WEEK_SEQ)
  111.          AS (
  112.            WITH TEMPDATE (LDATE, LDATEID) AS (
  113.            VALUES( DATE(693596  ), 693596 )
  114.            union select DATE(LDATEID) + 1 DAY, LDATEID+1
  115.            FROM TEMPDATE WHERE DATE(LDATEID) < date('2099-12-31')
  116.            )
  117.            select Distinct LDATEID,  Ldate
  118.            , DENSE_RANK() OVER( ORDER BY YEAR(LDATE), MONTH(LDATE) )
  119.            , DENSE_RANK() OVER( ORDER BY (LDATEID + (7- dayofweek(LDATE))))
  120.            From TEMPDATE
  121.          ) WITH DATA INCLUDING DEFAULTS;
  122.          If SqlCode <> 0;
  123.            EXSR ERRORSQL;
  124.          Endif;
  125.  
  126.          // Build table with all fiscal years, Number of Weeks,
  127.          //  Begin Date, and End Date
  128.          Exec Sql Create Table Qtemp/Date_Dim_Fiscal
  129.            (D_FISCAL_YEAR, D_FISCAL_BEGIN, D_FISCAL_END, D_FISCAL_WEEKS) As (
  130.            With t1 (D_Year) as (
  131.              Select Year(D_DATE) From Qtemp/Date_Dim_Dates Group By Year(D_Date)
  132.            ), T2 (D_Year, D_BEG, D_END) As (
  133.            Select D_Year
  134.            , ((SELECT T2.D_DATE_SK
  135.               + (CASE Dayofweek(T2.D_DATE)
  136.                 WHEN 1 THEN -1 WHEN 2 THEN -2 WHEN 3 THEN -3
  137.                 WHEN 4 THEN  3 WHEN 5 THEN  2 WHEN 6 THEN  1 WHEN 7 THEN 0 END)
  138.                FROM Qtemp/Date_Dim_Dates T2
  139.                WHERE T2.D_DATE = DATE('03/31/'|| T1.D_Year)
  140.              )+1 )  /* D_FISCAL_BEGIN */
  141.            , ((SELECT T2.D_DATE_SK
  142.                  + (CASE Dayofweek(T2.D_DATE)
  143.                  WHEN 1 THEN -1 WHEN 2 THEN -2 WHEN 3 THEN -3
  144.                  WHEN 4 THEN 3 WHEN 5 THEN 2 WHEN 6 THEN 1 WHEN 7 THEN 0 END)
  145.                FROM Qtemp/Date_Dim_Dates T2
  146.                WHERE T2.D_DATE = DATE('03/31/'|| (T1.D_Year+1))
  147.              )) /* D_FISCAL_END */
  148.            From T1)
  149.            Select D_Year, D_BEG, D_END, ((D_end-(d_beg-1))/7) From T2
  150.            ) With Data Including Defaults
  151.            ;;
  152.          If SqlCode <> 0;
  153.            EXSR ERRORSQL;
  154.          Endif;
  155.  
  156.          // Build table with calendar dates.
  157.          Exec Sql Create Table Qtemp/Date_Dim_calendar
  158.          (D_CAL_YEAR, D_CAL_WEEKS
  159.          , D_Cal_Week, D_CAL_WEEK_SEQ
  160.          , D_CAL_BEGIN, D_CAL_END
  161.          , D_PERIOD, D_PERIOD_SEQ
  162.          , D_QOY, D_QTRWEEK, D_QUARTER_SEQ) As (
  163.            With TempWeek (Weeknumber) as ( VALUES( 1)
  164.              union select Weeknumber + 1 From TempWeek Where Weeknumber < 53 )
  165.            , WeekNum (Weeknumber) As (Select Distinct Weeknumber From TempWeek)
  166.            , YearWeek (cyear, cweeks) as (
  167.              SELECT D_FISCAL_YEAR, D_FISCAL_WEEKS
  168.                FROM Qtemp/Date_Dim_Fiscal
  169.                WHERE D_FISCAL_YEAR IN (1998,1999,2003,2004)
  170.              Union SELECT D_FISCAL_YEAR+1, D_FISCAL_WEEKS
  171.                FROM Qtemp/Date_Dim_Fiscal
  172.                WHERE D_FISCAL_YEAR NOT IN (1997,1998,2002,2003)
  173.              Union Values ( 1900,  52))
  174.            , T3 (D_CAL_YEAR, D_CAL_WEEKS, D_Cal_Week, D_CAL_WEEK_SEQ) AS (
  175.              Select Cyear, Cweeks, Weeknumber,
  176.              Row_NUmber() Over(Order By Cyear, Weeknumber) As WkIdx
  177.              From YearWeek
  178.              Cross Join WeekNum
  179.              Where Weeknumber <= cweeks)
  180.           Select D_CAL_YEAR, D_CAL_WEEKS, D_Cal_Week, D_CAL_WEEK_SEQ
  181.           , (Select Min(D_Date_sk)
  182.                From Qtemp/Date_Dim_Dates
  183.                Where D_WEEK_SEQ = T3.D_CAL_WEEK_SEQ)
  184.           , (Select Max(D_Date_sk)
  185.                From Qtemp/Date_Dim_Dates
  186.                Where D_WEEK_SEQ = T3.D_CAL_WEEK_SEQ)
  187.           , INT(0) D_PERIOD, INT(0) D_QOY
  188.           , INT(0) AS D_QTRWEEK
  189.           , INT(0) AS D_QUARTER_SEQ
  190.           , INT(0) AS D_PERIOD_SEQ
  191.           From T3
  192.           ) With Data Including Defaults;
  193.          If SqlCode <> 0;
  194.            EXSR ERRORSQL;
  195.          Endif;
  196.  
  197.          Exec sql Update  Qtemp/Date_Dim_calendar
  198.            SET D_PERIOD =
  199.            (CASE WHEN D_CAL_YEAR >= 2010 AND D_CAL_WEEKS = 53  THEN
  200.              (Case When D_Cal_Week In (1,2,3,4) Then 1
  201.              When D_Cal_Week In (5,6,7,8) Then 2
  202.              When D_Cal_Week In (9,10,11,12,13,14) Then 3
  203.              When D_Cal_Week In (15,16,17,18) Then 4
  204.              When D_Cal_Week In (19,20,21,22) Then 5
  205.              When D_Cal_Week In (23,24,25,26,27) Then 6
  206.              When D_Cal_Week In (28,29,30,31) Then 7
  207.              When D_Cal_Week In (32,33,34,35) Then 8
  208.              When D_Cal_Week In (36,37,38,39,40) Then 9
  209.              When D_Cal_Week In (41,42,43,44) Then 10
  210.              When D_Cal_Week In (45,46,47,48) Then 11
  211.              When D_Cal_Week In (49,50,51,52,53) Then 12
  212.              END)
  213.            WHEN D_CAL_WEEKS = 53 THEN
  214.              (Case When D_Cal_Week In (1,2,3,4) Then 1
  215.              When D_Cal_Week In (5,6,7,8) Then 2
  216.              When D_Cal_Week In (9,10,11,12,13) Then 3
  217.              When D_Cal_Week In (14,15,16,17) Then 4
  218.              When D_Cal_Week In (18,19,20,21,22) Then 5
  219.              When D_Cal_Week In (23,24,25,26,27) Then 6
  220.              When D_Cal_Week In (28,29,30,31) Then 7
  221.              When D_Cal_Week In (32,33,34,35) Then 8
  222.              When D_Cal_Week In (36,37,38,39,40) Then 9
  223.              When D_Cal_Week In (41,42,43,44) Then 10
  224.              When D_Cal_Week In (45,46,47,48) Then 11
  225.              When D_Cal_Week In (49,50,51,52,53) Then 12
  226.              END)
  227.  
  228.            ELSE /*WHEN D_CAL_WEEKS = 52 THEN*/
  229.              (Case When D_Cal_Week In (1,2,3,4) Then 1
  230.              When D_Cal_Week In (5,6,7,8) Then 2
  231.              When D_Cal_Week In (9,10,11,12,13) Then 3
  232.              When D_Cal_Week In (14,15,16,17) Then 4
  233.              When D_Cal_Week In (18,19,20,21) Then 5
  234.              When D_Cal_Week In (22,23,24,25,26) Then 6
  235.              When D_Cal_Week In (27,28,29,30) Then 7
  236.              When D_Cal_Week In (31,32,33,34) Then 8
  237.              When D_Cal_Week In (35,36,37,38,39) Then 9
  238.              When D_Cal_Week In (40,41,42,43) Then 10
  239.              When D_Cal_Week In (44,45,46,47) Then 11
  240.              When D_Cal_Week In (48,49,50,51,52) Then 12
  241.              END)
  242.            END)
  243.            WHERE D_PERIOD = 0;
  244.          If SqlCode <> 0;
  245.            EXSR ERRORSQL;
  246.          Endif;
  247.  
  248.          Exec Sql  UPDATE Qtemp/Date_Dim_calendar
  249.            SET D_QOY = (Case When D_PERIOD >= 10 Then 4
  250.              When D_PERIOD >= 7 Then 3
  251.              When D_PERIOD >= 4 Then 2
  252.              Else 1
  253.              End)
  254.            Where D_QOY = 0;
  255.          If SqlCode <> 0;
  256.            EXSR ERRORSQL;
  257.          Endif;
  258.  
  259.          Exec Sql MERGE INTO Qtemp/Date_Dim_calendar T1
  260.              USING (
  261.                Select D_CAL_WEEK_SEQ
  262.              , Row_number()
  263.                Over(Partition By D_CAL_YEAR, D_QOY
  264.                     Order By D_CAL_WEEK_SEQ)
  265.              , Dense_rank() Over(Order By D_CAL_YEAR,D_QOY )
  266.              , Dense_rank() Over(Order By D_CAL_YEAR,D_PERIOD )
  267.              from Qtemp/Date_Dim_calendar
  268.              ) T2 (D_CAL_WEEK_SEQ, D_QTRWEEK, D_QUARTER_SEQ, D_PERIOD_SEQ)
  269.              ON T1.D_CAL_WEEK_SEQ=T2.D_CAL_WEEK_SEQ
  270.              WHEN MATCHED THEN
  271.              UPDATE SET T1.D_QTRWEEK = T2.D_QTRWEEK,
  272.                T1.D_QUARTER_SEQ= T2.D_QUARTER_SEQ,
  273.                T1.D_PERIOD_SEQ=T2.D_PERIOD_SEQ;
  274.          If SqlCode <> 0;
  275.            EXSR ERRORSQL;
  276.          Endif;
  277.  
  278.          Exec Sql Insert Into DATE_DIM (  D_DATE_SK
  279.            ,D_DATE
  280.            ,D_MONTH_SEQ
  281.            ,D_WEEK_SEQ
  282.            ,D_QUARTER_SEQ
  283.            ,D_PERIOD_SEQ
  284.            ,D_YEAR
  285.            ,D_DOW
  286.            ,D_DAYOFWEEKINMONTH
  287.            ,D_MOY
  288.            ,D_DOM
  289.            ,D_WOY
  290.            ,D_WEEKYEAR
  291.  
  292.            ,D_PERIOD
  293.            ,D_QOY
  294.            ,D_QTRWEEK
  295.            ,D_FISCAL_YEAR
  296.            ,D_FISCAL_QUARTER
  297.            ,D_FISCAL_PERIOD
  298.  
  299.            ,D_FIRST_DOM
  300.            ,D_LAST_DOM
  301.            ,D_FIRST_DOW
  302.            ,D_LAST_DOW
  303.  
  304.            ,D_SAME_DAY_LY
  305.            ,D_SAME_DAY_LQ
  306.            ,D_SAME_WEEK_LY
  307.  
  308.            ,D_DAY_NAME
  309.            ,D_MONTH_NAME
  310.            ,D_MONTH_ABRV
  311.            ,D_MONTH_YEAR
  312.            ,D_QUARTER_NAME
  313.            ,D_FISCAL_QUARTER_NAME
  314.  
  315.        //    ,D_HOLIDAY
  316.        //    ,D_FOLLOWING_HOLIDAY
  317.            ,D_WEEKEND
  318.            ,D_MONTH_FIRST_SAT
  319.            ,D_MONTH_FIRST_FULL_WEEK
  320.            ,D_MONTH_LAST_SAT
  321.            ,D_MONTH_LAST_FULL_WEEK
  322.        //    ,D_CURRENT_13_WEEKS
  323.            ,D_DATEYYMD
  324.            ,D_DATEMDYY
  325.            ,D_DATECYMD
  326.            ,D_JULIAN
  327.            ,D_CENTURY
  328.            ,D_Year2
  329.            )
  330.  
  331.            SELECT T1.D_DATE_SK
  332.            , T1.D_DATE
  333.            , T1.D_MONTH_SEQ
  334.            , T1.D_WEEK_SEQ
  335.            , T3.D_QUARTER_SEQ
  336.            , T3.D_PERIOD_SEQ
  337.            , YEAR(T1.D_DATE) D_YEAR
  338.            , DAYOFWEEK(T1.D_DATE) D_DOW
  339.            , (FLOOR(DAY(T1.D_DATE)/7)
  340.               + CASE WHEN MOD(DAY(T1.D_DATE),7) > 0 THEN 1 ELSE 0 END)
  341.                 D_DAYOFWEEKINMONTH
  342.            , MONTH(T1.D_DATE) D_MOY
  343.            , DAY(T1.D_DATE) D_DOM
  344.            , T3.D_Cal_Week D_WOY
  345.            , T3.D_cal_year D_WEEKYEAR
  346.            , T3.D_PERIOD
  347.            , T3.D_QOY
  348.            , T3.D_QTRWEEK
  349.            , T2.D_FISCAL_YEAR
  350.            , (MOD( T3.D_QOY +2, 4) +1  ) D_FISCAL_QUARTER
  351.            , (MOD( T3.D_PERIOD + 8, 12) +1) D_FISCAL_PERIOD
  352.            , (T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE) +1) D_FIRST_DOM
  353.            , (T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE)
  354.               + DAYOFMONTH(LAST_DAY(T1.D_DATE))) D_LAST_DOM
  355.            , (T1.D_DATE_SK- DAYOFWEEK(T1.D_DATE) +1) D_FIRST_DOW
  356.            , (T1.D_DATE_SK- DAYOFWEEK(T1.D_DATE) +7) D_LAST_DOW
  357.  
  358.            , (T1.D_DATE_SK- ((CASE WHEN T3.D_cal_year = 1900 THEN NULL
  359.                                    WHEN T3.D_cal_year = 1994 then 53
  360.                                    ELSE 52 END)*7)) D_SAME_DAY_LY
  361.  
  362.            , (T1.D_DATE_SK -(CASE WHEN T3.D_cal_year = 1900 THEN NULL
  363.                                    Else 91 End)) D_SAME_DAY_LQ
  364.  
  365.            , (T3.D_CAL_WEEK_SEQ -(CASE WHEN T3.D_cal_year = 1900 Then NULL
  366.                                        WHEN T3.D_cal_year = 1994 Then 53
  367.                                        ELSE 52 END)) D_SAME_WEEK_LY
  368.  
  369.            , CAST(DAYNAME(T1.D_DATE) AS CHAR(9)) D_DAY_NAME
  370.  
  371.            , MONTHNAME(T1.D_DATE) D_MONTH_NAME
  372.  
  373.            , UCASE(Substr(Monthname(T1.D_DATE), 1,3)) D_MONTH_ABRV
  374.  
  375.            , UCASE(Substr(Monthname(T1.D_DATE), 1,3)) ||' '|| YEAR(T1.D_DATE)
  376.               D_MONTH_YEAR
  377.  
  378.            , ('Q' || DIGITS(DEC(T3.D_QOY,1,0)) || ' '|| T3.D_CAL_YEAR )
  379.              D_QUARTER_NAME
  380.  
  381.            , ('Q' || DIGITS(DEC((MOD( T3.D_QOY +2, 4) +1  ),1,0))
  382.                   || ' '|| T2.D_FISCAL_YEAR ) D_FISCAL_QUARTER_NAME
  383.  
  384.        //    , NULLIF(0,0) AS D_HOLIDAY
  385.        //    , NULLIF(0,0) AS D_FOLLOWING_HOLIDAY
  386.            , CASE WHEN DAYOFWEEK(T1.D_DATE) IN (1,7) THEN 'Y' END D_WEEKEND
  387.            , CASE WHEN DAY(T1.D_DATE) < 8
  388.              AND DAYOFWEEK(T1.D_DATE) = 7
  389.              THEN 'Y' END D_MONTH_FIRST_SAT
  390.            , (
  391.        //* IF the first day of the month is dow 1 then week 1, else week 2 */
  392.              CASE WHEN DAYOFWEEK(DATE(T1.D_DATE_SK-DAYOFMONTH(T1.D_DATE)+1))= 1
  393.                 AND WEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE)+1))
  394.                 =WEEK(T1.D_DATE)
  395.               THEN 'Y'
  396.               WHEN DAYOFWEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE) +1)) > 1
  397.                 AND (WEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE) +1))+1)
  398.                 =WEEK(T1.D_DATE) THEN 'Y'
  399.               END) D_MONTH_FIRST_FULL_WEEK
  400.            , (CASE WHEN DAY(T1.D_DATE) > DAYOFMONTH(LAST_DAY(T1.D_DATE))-7
  401.                 AND DAYOFWEEK(T1.D_DATE) = 7
  402.               THEN 'Y'
  403.               END) D_MONTH_LAST_SAT
  404.            , (
  405.        //* IF the LAST day of the month is dow 7 then LAST week, else LAST WEEK-1 */
  406.              CASE WHEN DAYOFWEEK( DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE)
  407.                + DAYOFMONTH(LAST_DAY(T1.D_DATE))))=7
  408.                AND WEEK(DATE(T1.D_DATE_SK -DAYOFMONTH(T1.D_DATE)
  409.                + DAYOFMONTH(LAST_DAY(T1.D_DATE))))=WEEK(T1.D_DATE)
  410.              THEN 'Y'
  411.              WHEN DAYOFWEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE)
  412.                + DAYOFMONTH(LAST_DAY(T1.D_DATE)))) < 7
  413.                AND (WEEK(DATE(T1.D_DATE_SK - DAYOFMONTH(T1.D_DATE)
  414.                + DAYOFMONTH(LAST_DAY(T1.D_DATE))))-1)=WEEK(T1.D_DATE)
  415.              THEN 'Y'
  416.              END) D_MONTH_LAST_FULL_WEEK
  417.        //    , NULLIF(0,0) AS D_CURRENT_DAY
  418.        //    , NULLIF(0,0) AS D_CURRENT_WEEK
  419.        //    , NULLIF(0,0) AS D_CURRENT_MONTH
  420.        //    , NULLIF(0,0) AS D_CURRENT_QUARTER
  421.        //    , NULLIF(0,0) AS D_CURRENT_YEAR
  422.        //    , NULLIF(0,0) AS D_CURRENT_13_WEEKS
  423.  
  424.            ,(YEAR(T1.D_DATE)*10000
  425.              +DEC(MONTH(T1.D_DATE),2,0)*100
  426.              +DEC(DAY(T1.D_DATE),2,0)) D_DATEYYMD
  427.  
  428.            , (DEC(MONTH(T1.D_DATE),2,0)*1000000
  429.              +DEC(DAY(T1.D_DATE),2,0)*10000
  430.              +YEAR(T1.D_DATE)) D_DATEMDYY
  431.  
  432.            ,((YEAR(T1.D_DATE)-1900)*10000
  433.              +DEC(MONTH(T1.D_DATE),2,0)*100
  434.              +DEC(DAY(T1.D_DATE),2,0)) D_DATECYMD
  435.  
  436.            , (DEC( YEAR(T1.D_DATE) *1000 + DAYOFYEAR(T1.D_DATE) ,7,0))  D_JULIAN
  437.            , DEC(SUBSTR(DIGITS(DEC(YEAR(T1.D_DATE),4,0)),1,2),2,0) D_CENTURY
  438.            , DEC(SUBSTR(DIGITS(DEC(YEAR(T1.D_DATE),4,0)),3,2),2,0) D_Year2
  439.  
  440.              From Qtemp/Date_Dim_dates T1
  441.              Left join Qtemp/Date_Dim_fiscal T2
  442.              On T1.D_date_sk Between T2.D_FISCAL_BEGIN And T2.D_FISCAL_END
  443.              Join Qtemp/Date_Dim_calendar T3
  444.              On T1.D_date_sk Between T3.D_CAL_BEGIN And T3.D_CAL_END
  445.          ;
  446.          If SqlCode <> 0;
  447.            EXSR ERRORSQL;
  448.          Endif;
  449.  
  450.        Endsr;
  451.        //---------------------------------------------------------------------
  452.        // Set Current 13 weeks as of the last movement week
  453.        //---------------------------------------------------------------------
  454.        Begsr SetCurrent13Weeks;
  455.  
  456.          Exec Sql Merge Into Date_Dim T1
  457.            Using (
  458.              Select T1A.D_date_SK
  459.              ,(CASE WHEN (
  460.                  (Select TX.D_Week_Seq
  461.                  From Date_dim TX
  462.                  Join STCLPRPF S1
  463.                  On TX.D_WOY= S1.SLWEEK AND MOD(TX.D_WEEKYEAR,100) = S1.SLYEAR
  464.                  Order By TX.d_date_sk Desc Fetch First 1 Rows Only)
  465.                Between T1A.D_Week_Seq and T1A.D_Week_Seq+12)
  466.                Then 'Y' Else Null End )
  467.             From Date_Dim t1A
  468.            ) T2 (D_DATE_SK, D_CURRENT_13_WEEKS)
  469.            On T1.D_DATE_SK=T2.D_DATE_SK
  470.            When MATCHED
  471.            And ( T1.D_CURRENT_13_WEEKS IS NULL
  472.              AND T2.D_CURRENT_13_WEEKS IS NOT NULL
  473.              OR  T1.D_CURRENT_13_WEEKS IS NOT NULL
  474.              AND T1.D_CURRENT_13_WEEKS <> T2.D_CURRENT_13_WEEKS
  475.            )
  476.            THEN UPDATE SET T1.D_CURRENT_13_WEEKS = T2.D_CURRENT_13_WEEKS
  477.            ;
  478.          If SqlCode <> 0;
  479.            EXSR ERRORSQL;
  480.          Endif;
  481.  
  482.        Endsr;
  483.        //---------------------------------------------------------------------
  484.        // Add US Holidays
  485.        //---------------------------------------------------------------------
  486.        Begsr AddHolidays;
  487.  
  488.          Exec Sql Update Date_Dim
  489.            Set D_HOLIDAY_NAME ='Thanksgiving Day'
  490.          Where D_MOY = 11
  491.          And D_DAYOFWEEKINMONTH = 4
  492.          And D_DOW = 5;
  493.          If SqlCode <> 0;
  494.            EXSR ERRORSQL;
  495.          Endif;
  496.  
  497.          Exec Sql Update Date_Dim
  498.            Set D_HOLIDAY_NAME ='Christmas Day'
  499.          Where D_MOY = 12
  500.          And D_DOM = 25;
  501.          If SqlCode <> 0;
  502.            EXSR ERRORSQL;
  503.          Endif;
  504.  
  505.          Exec Sql Update Date_Dim
  506.            Set D_HOLIDAY_NAME ='Independance Day'
  507.          Where D_MOY = 7
  508.          And D_DOM = 4;
  509.          If SqlCode <> 0;
  510.            EXSR ERRORSQL;
  511.          Endif;
  512.  
  513.          Exec Sql Update Date_Dim
  514.            Set D_HOLIDAY_NAME = 'New Year''s Day'
  515.          Where D_MOY = 1
  516.          And D_DOM = 1;
  517.          If SqlCode <> 0;
  518.            EXSR ERRORSQL;
  519.          Endif;
  520.  
  521.          Exec Sql Update Date_Dim
  522.            Set D_HOLIDAY_NAME = 'Memorial Day'
  523.          Where D_Date_Sk In (
  524.            Select Max(D_Date_Sk)
  525.            From Date_Dim
  526.            Where D_MOY = 5 And D_DOW = 2
  527.            Group By D_Year, D_Moy);
  528.          If SqlCode <> 0;
  529.            EXSR ERRORSQL;
  530.          Endif;
  531.  
  532.          //*Labor Day - First Monday in September*/
  533.          Exec Sql Update Date_Dim
  534.            Set D_HOLIDAY_NAME = 'Labor Day'
  535.          Where D_Date_Sk In (
  536.            Select Max(D_Date_Sk)
  537.            From Date_Dim
  538.            Where D_MOY = 9 And D_DOW = 2
  539.            Group By D_Year, D_Moy);
  540.          If SqlCode <> 0;
  541.            EXSR ERRORSQL;
  542.          Endif;
  543.  
  544.          Exec Sql Update Date_Dim
  545.            Set D_HOLIDAY_NAME = 'Valentine''s Day'
  546.          Where D_MOY = 2 And D_DOM = 14;
  547.          If SqlCode <> 0;
  548.            EXSR ERRORSQL;
  549.          Endif;
  550.  
  551.          Exec Sql Update Date_Dim
  552.            Set D_HOLIDAY_NAME = 'Saint Patrick''s Day'
  553.          Where D_MOY = 3 And D_DOM = 17;
  554.          If SqlCode <> 0;
  555.            EXSR ERRORSQL;
  556.          Endif;
  557.  
  558.          Exec Sql Update Date_Dim
  559.            Set D_HOLIDAY_NAME = 'Martin Luthor King Jr Day'
  560.          Where D_MOY = 1 And D_DOW = 2 And D_Year >= 1983
  561.          And D_DAYOFWEEKINMONTH = 3;
  562.          If SqlCode <> 0;
  563.            EXSR ERRORSQL;
  564.          Endif;
  565.  
  566.          Exec Sql Update Date_Dim
  567.            Set D_HOLIDAY_NAME = 'President''s Day'
  568.          Where D_MOY = 2 And D_DOW = 2
  569.          And D_DAYOFWEEKINMONTH = 3;
  570.          If SqlCode <> 0;
  571.            EXSR ERRORSQL;
  572.          Endif;
  573.  
  574.          Exec Sql Update Date_Dim
  575.            Set D_HOLIDAY_NAME = 'Mother''s Day'
  576.          Where D_MOY = 5 And D_DOW = 1
  577.          And D_DAYOFWEEKINMONTH = 2;
  578.          If SqlCode <> 0;
  579.            EXSR ERRORSQL;
  580.          Endif;
  581.  
  582.          Exec Sql Update Date_Dim
  583.            Set D_HOLIDAY_NAME = 'Father''s Day'
  584.          Where D_MOY = 6 And D_DOW = 1
  585.          And D_DAYOFWEEKINMONTH = 3;
  586.          If SqlCode <> 0;
  587.            EXSR ERRORSQL;
  588.          Endif;
  589.  
  590.          Exec Sql Update Date_Dim
  591.            Set D_HOLIDAY_NAME = 'Halloween'
  592.          Where D_MOY = 10 And D_DOM = 31;
  593.          If SqlCode <> 0;
  594.            EXSR ERRORSQL;
  595.          Endif;
  596.  
  597.          //*Election Day - The first Tuesday after the first Monday in November*/
  598.          Exec Sql Update Date_Dim
  599.            Set D_HOLIDAY_NAME = 'Election Day'    
  600.          Where D_Date_Sk In (
  601.            Select Max(D_Date_Sk)+1
  602.            From Date_Dim
  603.            Where D_MOY = 11 And D_DOW = 2
  604.            And D_DAYOFWEEKINMONTH = 1
  605.            Group By D_Year, D_Moy);
  606.          If SqlCode <> 0;
  607.            EXSR ERRORSQL;
  608.          Endif;
  609.  
  610.          Exec Sql Update Date_Dim
  611.            Set D_HOLIDAY_NAME = 'April Fools'' Day'
  612.          Where D_MOY = 4 And D_DOM = 1;
  613.          If SqlCode <> 0;
  614.            EXSR ERRORSQL;
  615.          Endif;
  616.  
  617.  
  618.          // Easter is fun
  619.          // These are the dates copied from this webpage.
  620.          // http://www.timeanddate.com/holidays/us/easter-sunday
  621.          Exec Sql Update Date_Dim
  622.            Set D_HOLIDAY_NAME = 'Easter'
  623.          Where D_Date In
  624.           ('1900-04-15' ,'1901-04-07' ,'1902-03-30' ,'1903-04-12'
  625.            ,'1904-04-03' ,'1905-04-23' ,'1906-04-15' ,'1907-03-31'
  626.            ,'1908-04-19' ,'1909-04-11' ,'1910-03-27' ,'1911-04-16'
  627.            ,'1912-04-07' ,'1913-03-23' ,'1914-04-12' ,'1915-04-04'
  628.            ,'1916-04-23' ,'1917-04-08' ,'1918-03-31' ,'1919-04-20'
  629.            ,'1920-04-04' ,'1921-03-27' ,'1922-04-16' ,'1923-04-01'
  630.            ,'1924-04-20' ,'1925-04-12' ,'1926-04-04' ,'1927-04-17'
  631.            ,'1928-04-08' ,'1929-03-31' ,'1930-04-20' ,'1931-04-05'
  632.            ,'1932-03-27' ,'1933-04-16' ,'1934-04-01' ,'1935-04-21'
  633.            ,'1936-04-12' ,'1937-03-28' ,'1938-04-17' ,'1939-04-09'
  634.            ,'1940-03-24' ,'1941-04-13' ,'1942-04-05' ,'1943-04-25'
  635.            ,'1944-04-09' ,'1945-04-01' ,'1946-04-21' ,'1947-04-06'
  636.            ,'1948-03-28' ,'1949-04-17' ,'1950-04-09' ,'1951-03-25'
  637.            ,'1952-04-13' ,'1953-04-05' ,'1954-04-18' ,'1955-04-10'
  638.            ,'1956-04-01' ,'1957-04-21' ,'1958-04-06' ,'1959-03-29'
  639.            ,'1960-04-17' ,'1961-04-02' ,'1962-04-22' ,'1963-04-14'
  640.            ,'1964-03-29' ,'1965-04-18' ,'1966-04-10' ,'1967-03-26'
  641.            ,'1968-04-14' ,'1969-04-06' ,'1970-03-29' ,'1971-04-11'
  642.            ,'1972-04-02' ,'1973-04-22' ,'1974-04-14' ,'1975-03-30'
  643.            ,'1976-04-18' ,'1977-04-10' ,'1978-03-26' ,'1979-04-15'
  644.            ,'1980-04-06' ,'1981-04-19' ,'1982-04-11' ,'1983-04-03'
  645.            ,'1984-04-22' ,'1985-04-07' ,'1986-03-30' ,'1987-04-19'
  646.            ,'1988-04-03' ,'1989-03-26' ,'1990-04-15' ,'1991-03-31'
  647.            ,'1992-04-19' ,'1993-04-11' ,'1994-04-03' ,'1995-04-16'
  648.            ,'1996-04-07' ,'1997-03-30' ,'1998-04-12' ,'1999-04-04'
  649.            ,'2000-04-23' ,'2001-04-15' ,'2002-03-31' ,'2003-04-20'
  650.            ,'2004-04-11' ,'2005-03-27' ,'2006-04-16' ,'2007-04-08'
  651.            ,'2008-03-23' ,'2009-04-12' ,'2010-04-04' ,'2011-04-24'
  652.            ,'2012-04-08' ,'2013-03-31' ,'2014-04-20' ,'2015-04-05'
  653.            ,'2016-03-27' ,'2017-04-16' ,'2018-04-01' ,'2019-04-21'
  654.            ,'2020-04-12' ,'2021-04-04' ,'2022-04-17' ,'2023-04-09'
  655.            ,'2024-03-31' ,'2025-04-20' ,'2026-04-05' ,'2027-03-28'
  656.            ,'2028-04-16' ,'2029-04-01' ,'2030-04-21' ,'2031-04-13'
  657.            ,'2032-03-28' ,'2033-04-17' ,'2034-04-09' ,'2035-03-25'
  658.            ,'2036-04-13' ,'2037-04-05' ,'2038-04-25' ,'2039-04-10'
  659.            ,'2040-04-01' ,'2041-04-21' ,'2042-04-06' ,'2043-03-29'
  660.            ,'2044-04-17' ,'2045-04-09' ,'2046-03-25' ,'2047-04-14'
  661.            ,'2048-04-05' ,'2049-04-18' ,'2050-04-10' ,'2051-04-02'
  662.            ,'2052-04-21' ,'2053-04-06' ,'2054-03-29' ,'2055-04-18'
  663.            ,'2056-04-02' ,'2057-04-22' ,'2058-04-14' ,'2059-03-30'
  664.            ,'2060-04-18' ,'2061-04-10' ,'2062-03-26' ,'2063-04-15'
  665.            ,'2064-04-06' ,'2065-03-29' ,'2066-04-11' ,'2067-04-03'
  666.            ,'2068-04-22' ,'2069-04-14' ,'2070-03-30' ,'2071-04-19'
  667.            ,'2072-04-10' ,'2073-03-26' ,'2074-04-15' ,'2075-04-07'
  668.            ,'2076-04-19' ,'2077-04-11' ,'2078-04-03' ,'2079-04-23'
  669.            ,'2080-04-07' ,'2081-03-30' ,'2082-04-19' ,'2083-04-04'
  670.            ,'2084-03-26' ,'2085-04-15' ,'2086-03-31' ,'2087-04-20'
  671.            ,'2088-04-11' ,'2089-04-03' ,'2090-04-16' ,'2091-04-08'
  672.            ,'2092-03-30' ,'2093-04-12' ,'2094-04-04' ,'2095-04-24'
  673.            ,'2096-04-15' ,'2097-03-31' ,'2098-04-20' ,'2099-04-12')
  674.          ;
  675.          If SqlCode <> 0;
  676.            EXSR ERRORSQL;
  677.          Endif;
  678.  
  679.          Exec Sql Update Date_DIm
  680.              Set D_HOLIDAY = CASE
  681.                WHEN D_Holiday_Name is null then null
  682.                Else 'Y' End;
  683.          If SqlCode <> 0;
  684.            EXSR ERRORSQL;
  685.          Endif;
  686.  
  687.        ENDSR;
  688.        //---------------------------------------------------------------------
  689.        // Initialization routine
  690.        //---------------------------------------------------------------------
  691.        BEGSR *INZSR;
  692.  
  693.        //////  UTL10ARG( UTL10A.NAME );
  694.        //////  UTL25ACL( PROCNAME :'*LIBL ' :'*PGM ' :Utl25ac.Text :UTL25AC.SIZE );
  695.  
  696.        ENDSR;
  697.        //---------------------------------------------------------------------
  698.        // Report header
  699.        //---------------------------------------------------------------------
  700.      OPRINT     EF           PRTHDR         1 03
  701.      O****                       UTL10A.NAME         40
  702.      O***                       JOBUSR              91
  703.      O***                       PGMNAM             101
  704.      O                       *DATE              111 '  /  /    '
  705.      O***                       PGMTIM             121 '  .  .  '
  706.      O                                          127 'Page'
  707.      O                       PAGE          Z    132
  708.  
  709.      O          EF           PRTHDR         2
  710.      O****                       UTL25AC.TEXT        50
  711.  
  712.      O          EF           PRTHDR         0
  713.  
  714.      O          EF           PRTHDR         2
  715.  
  716.       // Report Detail
  717.      O          EF           PRTDTL         1
  718.  
  719.       // SQL Error
  720.      O          EF           ERRORSQLP      1
  721.      O***                       MSGTOOLS.DATA      132
  722.  
© 2004-2019 by midrange.com generated in 0.008s valid xhtml & css