周末,节假日和月末在Daily Ledger逻辑中发布数据

时间:2019-06-26 20:31:10

标签: oracle plsql

Holiday Table snapshot我一直在尝试编写一种逻辑,以将来自两个表的数据发布到每日分类帐中,以捕获后续记录。

1)我们将获取前一天的数据,因此我们将发布今天的最后一天的数据。例如:6月26日星期三,我们将发布6月25日的数据。但是,以下异常使其变得太复杂了

1.1)如果今天是星期一,则发布我们将在星期五收到的数据。例如,6月24日星期一;我们将发布6月20日(星期四)的数据,该数据是6月21日(星期五),星期五,星期六和星期日收到的。即从6月20日星期一开始执行程序时,将从6月20日开始发布与6月20日相同的数据。

1.2)如果是月末并且是周末,则其他团队在星期五或最后一个工作日EOD发送数据,但他们将日期设置为实际月末。例如,如果是2019年3月,则3月30日和3月31日是周末,因此发布应如下所示:

1.2.1),即3月29日(星期五)上午,我们将发布3月28日(星期四)的数据。

1.2.2)在3月29日(星期五)EOD,我们将收到他们将日期设置为3月31日的上个月日期的数据。因此,当我们在4月1日运行程序以关闭3月时,我们将发布周五,周六,周日(3月29日,30日,31日)的数据。星期五收到的数据定为3月31日,因此它将发布到星期五,星期六,星期日(3月29日,30日,31日)。

1.3)如果上个月是周末,下一个工作日是假日。例如,2019年9月2日是假期,8月31日和9月1日是周末。如果proc在9月3日(星期二)运行,则将8月30日(星期五)EOD接收的数据过帐到8月30日和9月1日的数据条目,其日期值设置为8月31日。

这些几乎都是企业共享的案例。这太令人困惑了,但是如果有人可以在这里分享逻辑,那就太好了。

--Query to get data is:

        V_SQL := 'SELECT A.ACCOUNT_TYPE, B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID, B.CMN_COA_ID, B.PROD1, B.PROD2, B.PROD3,
                 SUM(CURRENT_BAL) AS CB_SUM, SUM(AVG_BAL) AS AB_SUM, B.FLAG1 FROM DAILYGL_TEST A, AL_LOOKUP B '||
                 'WHERE A.GL_ACCOUNT_ID = B.GL_ACCT AND A.AS_OF_DATE = '||V_DATE_PARAM|| 
                 ' AND ROWNUM <=15 GROUP BY A.ACCOUNT_TYPE, B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID,B.CMN_COA_ID, B.PROD1, 
                 B.PROD2, B.PROD3, A.AS_OF_DATE, B.FLAG1';

--V_DATE_PARAM is date for which logic needs to written as per above conditions.


---function to insert data

                IF (V_END_BAL <> 0 OR V_AVG_BAL <>0) THEN  
                         IF V_ACCT_TYPE = 1 OR V_ACCT_TYPE = 5 OR V_ACCT_TYPE = 10 OR V_ACCT_TYPE = 90 THEN    

                                V_FIN1 := SUBSTR(V_FIN,1,2) || '100';

                                DBMS_OUTPUT.PUT_LINE('POST_DAILY_LEDGER..INSIDE 2 IF IN POST_DAILY_GL');

                                IN_LEDGER_STAT_DAILY(V_IDENTITY_CODE,V_CONSOLIDATION_CD,V_FIN1,V_ORG_UNIT_ID,V_GL_ACCOUNT_ID,V_CMN_COA_ID,
                                                    V_PROD1, V_PROD2, V_PROD3,V_DATE,V_SWITCH * V_END_BAL);

                                IN_LEDGER_STAT_DAILY(V_IDENTITY_CODE,V_CONSOLIDATION_CD,V_FIN,V_ORG_UNIT_ID,V_GL_ACCOUNT_ID,V_CMN_COA_ID,
                                                    V_PROD1, V_PROD2, V_PROD3,V_DATE,V_SWITCH * V_AVG_BAL);                      
                         ELSE
                                IN_LEDGER_STAT_DAILY(V_IDENTITY_CODE,V_CONSOLIDATION_CD,V_FIN,V_ORG_UNIT_ID,V_GL_ACCOUNT_ID,V_CMN_COA_ID,
                                                    V_PROD1, V_PROD2, V_PROD3,V_DATE,V_SWITCH * V_END_BAL);  


--This needs to be run as per above logic. so if it's sep 3rd this will run for aug 30, 31 and sep 1 as per above conditions.

--complete proc for posting is as following

PROCEDURE POST_DAILY_GL(V_RUN_DATE NUMBER DEFAULT 0) AS


V_IDENTITY_CODE CONSTANT NUMBER(6):=112233;
V_CONSOLIDATION_CD   CONSTANT NUMBER(3):=100;

-- variables store result of dynamic cursor
V_SQL   VARCHAR2(2500);

TYPE  V_CURSOR IS REF CURSOR;

seq  V_CURSOR;

V_ORG_UNIT_ID           LEDGER_STAT_DLY.ORG_UNIT_ID%TYPE;
V_GL_ACCOUNT_ID         LEDGER_STAT_DLY.GL_ACCOUNT_ID%TYPE;
V_CMN_COA_ID            LEDGER_STAT_DLY. COMMON_COA_ID%TYPE;
V_PROD1                 LEDGER_STAT_DLY.PRODUCT_1_ID%TYPE;
V_PROD2                 LEDGER_STAT_DLY.PRODUCT_ID%TYPE;
V_PROD3                 LEDGER_STAT_DLY.PRODUCT_3_ID%TYPE;
V_DATE                  DAILYGL.AS_OF_DATE%TYPE;
V_DATE_PARAM            DATE;
V_END_BAL               NUMBER;
V_AVG_BAL               NUMBER;
V_SWITCH                NUMBER(1);
V_FLAG                  AL_LOOKUP.FLAG1%TYPE;
V_FIN                   AL_LOOKUP.FIN_ELEM%TYPE;
V_FIN1                  AL_LOOKUP.FIN_ELEM%TYPE;
V_ACCT_TYPE             NUMBER(2);


BEGIN

IF V_RUN_DATE = 0  THEN
    SELECT INSTR_AS_OF_DATE INTO V_DATE FROM AS_OF_DATE;
ELSE
    V_DATE := TO_DATE(LPAD(V_RUN_DATE, 8, '0'),'mmddyyyy');
END IF;

        V_DATE_PARAM := RETURN_DATE(V_DATE);        

        V_SQL := 'SELECT A.ACCOUNT_TYPE, B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID, B.CMN_COA_ID, B.PROD1, B.PROD2, B.PROD3,
                 SUM(CURRENT_BAL) AS CB_SUM, SUM(AVG_BAL) AS AB_SUM, B.FLAG1 FROM DAILYGL_TEST A, AL_LOOKUP B '||
                 'WHERE A.GL_ACCOUNT_ID = B.GL_ACCT AND A.AS_OF_DATE = '||V_DATE_PARAM|| 
                 ' AND ROWNUM <=15 GROUP BY A.ACCOUNT_TYPE, B.FIN_ELEM, A.ORG_UNIT_ID, A.GL_ACCOUNT_ID,B.CMN_COA_ID, B.PROD1, 
                 B.PROD2, B.PROD3, A.AS_OF_DATE, B.FLAG1';


    DBMS_OUTPUT.PUT_LINE(V_DATE_PARAM);

    DBMS_OUTPUT.PUT_LINE(V_SQL);


    OPEN seq FOR V_SQL using V_RUN_DATE;

            LOOP
                V_SWITCH := 1;           
                FETCH seq INTO
                            V_ACCT_TYPE,   
                            V_FIN,
                            V_ORG_UNIT_ID,
                            V_GL_ACCOUNT_ID,
                            V_CMN_COA_ID,
                            V_PROD1, 
                            V_PROD2, 
                            V_PROD3,
                            V_END_BAL,
                            V_AVG_BAL,
                            V_FLAG;                                 
                EXIT WHEN seq%NOTFOUND;

            DBMS_OUTPUT.PUT_LINE('POST_DAILY_LEDGER.. OPEN SEQ..AFTER FETCH');





            -- CHANGE SIGN FOR CREDITS AND ADD 2 RECORDS FOR BS

                IF V_FLAG = 'Y' THEN
                    V_SWITCH :=  -1;
                ELSE
                    V_SWITCH := 1;
                END IF;

                IF V_ACCT_TYPE = 5 OR V_ACCT_TYPE = 10 OR V_ACCT_TYPE = 20 OR V_ACCT_TYPE = 35 THEN
                    V_SWITCH := V_SWITCH * -1;
                END IF;


                IF (V_END_BAL <> 0 OR V_AVG_BAL <>0) THEN  
                         IF V_ACCT_TYPE = 1 OR V_ACCT_TYPE = 5 OR V_ACCT_TYPE = 10 OR V_ACCT_TYPE = 90 THEN    

                                V_FIN1 := SUBSTR(V_FIN,1,2) || '100';

                                DBMS_OUTPUT.PUT_LINE('POST_DAILY_LEDGER..INSIDE 2 IF IN POST_DAILY_GL');

                                IN_LEDGER_STAT_DAILY(V_IDENTITY_CODE,V_CONSOLIDATION_CD,V_FIN1,V_ORG_UNIT_ID,V_GL_ACCOUNT_ID,V_CMN_COA_ID,
                                                    V_PROD1, V_PROD2, V_PROD3,V_DATE,V_SWITCH * V_END_BAL);

                                IN_LEDGER_STAT_DAILY(V_IDENTITY_CODE,V_CONSOLIDATION_CD,V_FIN,V_ORG_UNIT_ID,V_GL_ACCOUNT_ID,V_CMN_COA_ID,
                                                    V_PROD1, V_PROD2, V_PROD3,V_DATE,V_SWITCH * V_AVG_BAL);                      
                         ELSE
                                IN_LEDGER_STAT_DAILY(V_IDENTITY_CODE,V_CONSOLIDATION_CD,V_FIN,V_ORG_UNIT_ID,V_GL_ACCOUNT_ID,V_CMN_COA_ID,
                                                    V_PROD1, V_PROD2, V_PROD3,V_DATE,V_SWITCH * V_END_BAL);               

                         END IF;
                END IF;

            END LOOP;

    CLOSE seq;

END POST_DAILY_GL; 

0 个答案:

没有答案