Senin, 06 April 2020

Looping Dalam Looping (3) - PostgreSQL

delete from temporary.tmp_bukubesar_final where iduser = 564;

do $$
DECLARE nomorakun VARCHAR;

DECLARE rownumber BIGINT ;
DECLARE debet1 BIGINT ;
DECLARE kredit1 BIGINT ;
DECLARE saldoakhir1 BIGINT ;
DECLARE tipeakun INTEGER ;

loopakun cursor for select nomor_akun from acc_account_number where "level"=3 and nomor_akun between '1.100.01.001' and '1.270.02.001' order by nomor_akun;

hitungsaldo CURSOR FOR SELECT
    ROW_NUMBER,
    debet,
    kredit,
    saldoakhir
FROM
    temporary.tmp_bukubesar where iduser = 564
ORDER BY
    ROW_NUMBER ;

begin
open loopakun;
loop

FETCH  next from loopakun INTO nomorakun;    
    EXIT WHEN NOT FOUND;

--- tampung data detail tiap akun
delete from temporary.tmp_bukubesar where iduser = 564;
INSERT INTO temporary.tmp_bukubesar SELECT
    ROW_NUMBER () OVER (

        ORDER BY
            tanggal_jurnal,
            kodejurnal
    ),
    564,
    kodejurnal,
    tanggal_jurnal,
    debet,
    kredit,
    saldoakhir,
    nomor_rekening,
    keterangan,
    nomorakun
FROM
    (
        SELECT
            '' kodejurnal,
            (
                SELECT
                    CAST ('2020-04-01' AS DATE) - INTERVAL '1 day'
            ) tanggal_jurnal,
            NULL debet,
            NULL kredit,
            (
                SELECT
                    COALESCE (
                        SUM (
                            acc_end_of_month_detail.end_balanace
                        ),
                        0
                    ) AS saldoeom
                FROM
                    acc_end_of_month_detail
                JOIN acc_account_number ON acc_end_of_month_detail.nomor_akun = acc_account_number. ID
                WHERE
                    acc_account_number.nomor_akun = nomorakun
                AND acc_end_of_month_detail.ending_date = (
                    SELECT
                        COALESCE (
                            MAX (acc_end_of_month.tgl_eom),
                            '2000-01-01'
                        )
                    FROM
                        acc_end_of_month
                    WHERE
                        acc_end_of_month.tgl_eom < '2020-04-01'
                    AND acc_end_of_month_detail.year_month = (
                        SELECT
                            MAX (year_month)
                        FROM
                            acc_end_of_month_detail
                        WHERE
                            acc_end_of_month_detail.year_month < '202004'
                        AND acc_end_of_month_detail.id_bpr = 1
                        AND acc_end_of_month_detail.id_bpr_cabang  = 1
                    )
                    AND acc_end_of_month.id_bpr = 1
                    AND acc_end_of_month.id_bpr_cabang  = 1
                )
                             AND acc_end_of_month_detail.id_bpr = 1
                AND acc_end_of_month_detail.id_bpr_cabang  = 1
            ) + (
                SELECT
                    COALESCE (
                        SUM (
                            CASE
                            WHEN acc_account_number.tipe_akun = 0
                            OR acc_account_number.tipe_akun = 3 THEN
                                (
                                    acc_journal_detail.debet_amount - acc_journal_detail.credit_amount
                                )
                            ELSE
                                (
                                    acc_journal_detail.credit_amount - acc_journal_detail.debet_amount
                                )
                            END
                        ),
                        0
                    )
                FROM
                    acc_journal_detail
                             JOIN acc_account_number ON acc_journal_detail.id_akun = acc_account_number. ID
                JOIN acc_journal ON acc_journal. ID = acc_journal_detail.id_jurnal
                WHERE
                    CAST (tanggal_jurnal AS DATE) > (
                        SELECT
                            COALESCE (
                                (
                                    MAX (
                                        acc_end_of_month_detail.ending_date
                                    )
                                ),
                                '2000-01-01'
                            )
                        FROM
                            acc_end_of_month_detail
                        JOIN acc_account_number ON acc_end_of_month_detail.nomor_akun = acc_account_number. ID
                        WHERE
                            acc_account_number.nomor_akun = nomorakun
                        AND acc_end_of_month_detail.ending_date <= '2020-04-01'
                        AND acc_end_of_month_detail.year_month = (
                            SELECT
                                MAX (year_month)
                            FROM
                                acc_end_of_month_detail
                            WHERE
                                acc_end_of_month_detail.year_month < '202004'
                            AND acc_end_of_month_detail.id_bpr = 1
                            AND acc_end_of_month_detail.id_bpr_cabang  = 1
                        )
                        AND acc_end_of_month_detail.id_bpr = 1
                        AND acc_end_of_month_detail.id_bpr_cabang  = 1
                    )
                             AND CAST (tanggal_jurnal AS DATE) < '2020-04-01'
                AND acc_account_number.nomor_akun = nomorakun
                AND acc_journal.id_bpr = 1
                AND acc_journal.id_bpr_cabang  = 1
            ) saldoakhir,
            '-' nomor_rekening,
            'Saldo Awal' keterangan
        UNION ALL
            SELECT
                aj.kode_jurnal,
                aj.tanggal_jurnal,
                ajd.debet_amount,
                ajd.credit_amount,
                0 saldoakhir,
                ajd.nomor_rekening,
                aj.deskripsi
            FROM
                acc_journal_detail ajd
            JOIN acc_journal aj ON ajd.id_jurnal = aj."id"
            JOIN acc_account_number acn ON ajd.id_akun = acn."id"
            WHERE
                aj.id_bpr = 1
            AND aj.id_bpr_cabang  = 1
            AND aj.tanggal_jurnal >= '2020-04-01'
            AND aj.tanggal_jurnal < CAST ('2020-04-02' AS DATE) + INTERVAL '1 day'
            AND acn.nomor_akun = nomorakun
            ORDER BY
                tanggal_jurnal
    ) bukubesar
ORDER BY
    tanggal_jurnal,
    kodejurnal;
    --- tampung data detail tiap akun
   
    open hitungsaldo;
    loop

    FETCH NEXT FROM    hitungsaldo INTO rownumber,    debet1,    kredit1,    saldoakhir1 ;
    EXIT WHEN NOT FOUND ;
   
    SELECT
    tipe_akun INTO tipeakun
    FROM    acc_account_number WHERE    nomor_akun = nomorakun;
   
    --- hitung saldo akhir pada setiap detail akun
IF tipeakun IN (0, 3) THEN
    UPDATE temporary.tmp_bukubesar
SET saldoakhir = (
    SELECT
        saldoakhir
    FROM
        temporary.tmp_bukubesar
    WHERE
        ROW_NUMBER < rownumber AND iduser = 564
    ORDER BY
        ROW_NUMBER DESC
    LIMIT 1
) + debet1 - kredit1
WHERE
    ROW_NUMBER = rownumber
AND ROW_NUMBER > 1
AND iduser = 564 ;
END IF ;

IF tipeakun IN (1, 2) THEN
    UPDATE temporary.tmp_bukubesar
SET saldoakhir = (
    SELECT
        saldoakhir
    FROM
        temporary.tmp_bukubesar
    WHERE
        ROW_NUMBER < rownumber AND iduser = 564
    ORDER BY
        ROW_NUMBER DESC
    LIMIT 1
) - debet1 + kredit1
WHERE
    ROW_NUMBER = rownumber
AND ROW_NUMBER > 1
AND iduser = 564 ;
END
IF ;
    --- hitung saldo akhir pada setiap detail akun


END LOOP;
CLOSE hitungsaldo ;

--- insert data bukber tiap akun ke tabel final
insert into temporary.tmp_bukubesar_final
select * from temporary.tmp_bukubesar where iduser = 564 and noakun=nomorakun order by tanggal_jurnal, kodejurnal;

END LOOP;
CLOSE loopakun ;
END $$;


select * from temporary.tmp_bukubesar_final where iduser = 564 order by noakun, tanggal_jurnal, kodejurnal;

Tidak ada komentar:

Posting Komentar

Dynamic Query - SQL Server

Berikut adalah contoh dari bentuk dari Dynamic Query di SQL Server yang dibungkus ke dalam Store Procedure:  USE [Data00] GO SET ANSI_NULLS ...

Popular Posts