Last active
August 4, 2020 18:05
-
-
Save AndyDaSilva52/a5ca3020ea8e91c978edb9626135c662 to your computer and use it in GitHub Desktop.
#MegaERP - Financeiro - Trigger para não deixar duplicar movimento vinculado no Contas à Receber
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
create or replace trigger MGCLI.T_CLI_FIN_MOVIMENTO | |
for insert or update on MGFIN.FIN_MOVIMENTO | |
compound trigger | |
vOwner sys.all_objects.owner%type := 'MGCLI'; | |
vObjeto sys.all_objects.object_name%type := 'T_CLI_FIN_MOVIMENTO'; | |
type typ_cli_rc_movimentos is record( | |
ORG_TAB_IN_CODIGO mgfin.fin_movimento.org_tab_in_codigo%type, | |
ORG_PAD_IN_CODIGO mgfin.fin_movimento.org_pad_in_codigo%type, | |
ORG_IN_CODIGO mgfin.fin_movimento.org_in_codigo%type, | |
ORG_TAU_ST_CODIGO mgfin.fin_movimento.org_tau_st_codigo%type, | |
MOV_TAB_IN_CODIGO mgfin.fin_movimento.mov_tab_in_codigo%type, | |
MOV_SEQ_IN_CODIGO mgfin.fin_movimento.mov_seq_in_codigo%type, | |
MOV_IN_NUMLANCTO mgfin.fin_movimento.mov_in_numlancto%type, | |
MOV_ST_DOCUMENTO mgfin.fin_movimento.mov_st_documento%type | |
); | |
type typ_cli_tb_movimentos is table of typ_cli_rc_movimentos | |
index by binary_integer; | |
rMOV typ_cli_tb_movimentos; | |
before each row is | |
i integer; | |
begin | |
--RAISE_APPLICATION_ERROR(-20101, | |
--'MOV['|| :NEW.MOV_TAB_IN_CODIGO ||';'|| :NEW.MOV_SEQ_IN_CODIGO ||';'|| :NEW.MOV_IN_NUMLANCTO ||'];' | |
--|| CHR(13) || 'SLD['|| :NEW.MOV_RE_SALDOCPACRE ||']' || ';' || 'VL['|| :NEW.MOV_RE_VALOR ||']' | |
--|| CHR(13) || CHR(13)||'[' || vOwner || '.' ||vObjeto || ']'); | |
i := rMOV.COUNT + 1; | |
rMOV(i).ORG_TAB_IN_CODIGO := :NEW.ORG_TAB_IN_CODIGO ; | |
rMOV(i).ORG_PAD_IN_CODIGO := :NEW.ORG_PAD_IN_CODIGO ; | |
rMOV(i).ORG_IN_CODIGO := :NEW.ORG_IN_CODIGO ; | |
rMOV(i).ORG_TAU_ST_CODIGO := :NEW.ORG_TAU_ST_CODIGO ; | |
rMOV(i).MOV_TAB_IN_CODIGO := :NEW.MOV_TAB_IN_CODIGO ; | |
rMOV(i).MOV_SEQ_IN_CODIGO := :NEW.MOV_SEQ_IN_CODIGO ; | |
rMOV(i).MOV_IN_NUMLANCTO := :NEW.MOV_IN_NUMLANCTO ; | |
end before each row; | |
after statement is | |
begin | |
if inserting or updating then | |
for i in nvl(rMOV.FIRST, 1) .. NVL(rMOV.LAST,0) loop | |
for cR in ( | |
select | |
R.REF_ORG_TAB_IN_CODIGO, | |
R.REF_ORG_PAD_IN_CODIGO, | |
R.REF_ORG_IN_CODIGO, | |
R.REF_ORG_TAU_ST_CODIGO, | |
R.REF_MOV_TAB_IN_CODIGO, | |
R.REF_MOV_SEQ_IN_CODIGO, | |
R.REF_MOV_IN_NUMLANCTO, | |
MB.TPD_ST_CODIGO, | |
MB.MOV_ST_DOCUMENTO, | |
MB.TREF_ST_CODIGO, | |
MB.MOV_CH_NATUREZA, | |
MB.MOV_RE_VALOR, | |
F.MOV_CH_ORIGEM AS REF_MOV_CH_ORIGEM, | |
F.TPD_ST_CODIGO AS REF_TPD_ST_CODIGO, | |
F.MOV_ST_DOCUMENTO AS REF_MOV_ST_DOCUMENTO, | |
F.MOV_ST_PARCELA AS REF_MOV_ST_PARCELA, | |
F.MOV_RE_SALDOCPACRE AS REF_MOV_RE_SALDOCPACRE, | |
CASE MB.MOV_CH_NATUREZA | |
WHEN 'C' THEN F.MOV_RE_SALDOCPACRE - MB.MOV_RE_VALOR | |
WHEN 'D' THEN F.MOV_RE_SALDOCPACRE + MB.MOV_RE_VALOR | |
ELSE F.MOV_RE_SALDOCPACRE | |
END AS REF_MOV_RE_SALDO, | |
F.MOV_RE_VALOR AS REF_MOV_RE_VALOR | |
from mgfin.fin_movimento mb | |
inner join mgfin.fin_referenciafin r | |
on MB.ORG_TAB_IN_CODIGO = R.ORG_TAB_IN_CODIGO AND | |
MB.ORG_PAD_IN_CODIGO = R.ORG_PAD_IN_CODIGO AND | |
MB.ORG_IN_CODIGO = R.ORG_IN_CODIGO AND | |
MB.ORG_TAU_ST_CODIGO = R.ORG_TAU_ST_CODIGO AND | |
MB.MOV_TAB_IN_CODIGO = R.MOV_TAB_IN_CODIGO AND | |
MB.MOV_SEQ_IN_CODIGO = R.MOV_SEQ_IN_CODIGO AND | |
MB.MOV_IN_NUMLANCTO = R.MOV_IN_NUMLANCTO | |
inner join mgfin.fin_movimento f | |
on F.ORG_TAB_IN_CODIGO = R.REF_ORG_TAB_IN_CODIGO AND | |
F.ORG_PAD_IN_CODIGO = R.REF_ORG_PAD_IN_CODIGO AND | |
F.ORG_IN_CODIGO = R.REF_ORG_IN_CODIGO AND | |
F.ORG_TAU_ST_CODIGO = R.REF_ORG_TAU_ST_CODIGO AND | |
F.MOV_TAB_IN_CODIGO = R.REF_MOV_TAB_IN_CODIGO AND | |
F.MOV_SEQ_IN_CODIGO = R.REF_MOV_SEQ_IN_CODIGO AND | |
F.MOV_IN_NUMLANCTO = R.REF_MOV_IN_NUMLANCTO | |
where | |
MB.ORG_TAB_IN_CODIGO = rMOV(i).ORG_TAB_IN_CODIGO AND | |
MB.ORG_PAD_IN_CODIGO = rMOV(i).ORG_PAD_IN_CODIGO AND | |
MB.ORG_IN_CODIGO = rMOV(i).ORG_IN_CODIGO AND | |
MB.ORG_TAU_ST_CODIGO = rMOV(i).ORG_TAU_ST_CODIGO AND | |
MB.MOV_TAB_IN_CODIGO = rMOV(i).MOV_TAB_IN_CODIGO AND | |
MB.MOV_SEQ_IN_CODIGO = rMOV(i).MOV_SEQ_IN_CODIGO AND | |
MB.MOV_IN_NUMLANCTO = rMOV(i).MOV_IN_NUMLANCTO | |
) loop | |
for cM in ( | |
select | |
MB.TPD_ST_CODIGO, | |
MB.MOV_ST_DOCUMENTO, | |
MB.TREF_ST_CODIGO, | |
R.REF_MOV_TAB_IN_CODIGO, | |
R.REF_MOV_SEQ_IN_CODIGO, | |
R.REF_MOV_IN_NUMLANCTO, | |
COUNT(*) AS "CNT", | |
LISTAGG(MB.MOV_IN_NUMLANCTO, ';') WITHIN GROUP (ORDER BY MB.MOV_IN_NUMLANCTO) AS "L_MOV" | |
from mgfin.fin_referenciafin r | |
inner join mgfin.fin_movimento mb | |
on MB.ORG_TAB_IN_CODIGO = R.ORG_TAB_IN_CODIGO AND | |
MB.ORG_PAD_IN_CODIGO = R.ORG_PAD_IN_CODIGO AND | |
MB.ORG_IN_CODIGO = R.ORG_IN_CODIGO AND | |
MB.ORG_TAU_ST_CODIGO = R.ORG_TAU_ST_CODIGO AND | |
MB.MOV_TAB_IN_CODIGO = R.MOV_TAB_IN_CODIGO AND | |
MB.MOV_SEQ_IN_CODIGO = R.MOV_SEQ_IN_CODIGO AND | |
MB.MOV_IN_NUMLANCTO = R.MOV_IN_NUMLANCTO | |
where | |
-- Tipo de Referência que vai ser validado | |
MB.TREF_ST_CODIGO IN ('ESTCREFIN', 'ESTCRE') | |
and | |
R.REF_ORG_TAB_IN_CODIGO = cR.REF_ORG_TAB_IN_CODIGO AND | |
R.REF_ORG_PAD_IN_CODIGO = cR.REF_ORG_PAD_IN_CODIGO AND | |
R.REF_ORG_IN_CODIGO = cR.REF_ORG_IN_CODIGO AND | |
R.REF_ORG_TAU_ST_CODIGO = cR.REF_ORG_TAU_ST_CODIGO AND | |
R.REF_MOV_TAB_IN_CODIGO = cR.REF_MOV_TAB_IN_CODIGO AND | |
R.REF_MOV_SEQ_IN_CODIGO = cR.REF_MOV_SEQ_IN_CODIGO AND | |
R.REF_MOV_IN_NUMLANCTO = cR.REF_MOV_IN_NUMLANCTO | |
and MB.MOV_SEQ_IN_CODIGO = rMOV(i).MOV_SEQ_IN_CODIGO | |
and MB.MOV_IN_NUMLANCTO <> rMOV(i).MOV_IN_NUMLANCTO | |
and MB.TPD_ST_CODIGO = cR.TPD_ST_CODIGO | |
and MB.MOV_ST_DOCUMENTO = cR.MOV_ST_DOCUMENTO | |
and MB.TREF_ST_CODIGO = cR.TREF_ST_CODIGO | |
group by | |
MB.TPD_ST_CODIGO, | |
MB.MOV_ST_DOCUMENTO, | |
MB.TREF_ST_CODIGO, | |
R.REF_MOV_TAB_IN_CODIGO, | |
R.REF_MOV_SEQ_IN_CODIGO, | |
R.REF_MOV_IN_NUMLANCTO | |
having count(*) >= 1 | |
) loop | |
RAISE_APPLICATION_ERROR(-20101, | |
'Tipo Doc.['|| cM.TPD_ST_CODIGO ||']' | |
|| 'Documento['|| cM.MOV_ST_DOCUMENTO || '] ' | |
|| 'já existe, não é permitido duplicidade para o ' | |
|| 'Tipo de Movimento ['|| cM.TREF_ST_CODIGO ||'].' | |
|| CHR(13) || CHR(13) | |
--|| 'L_MV['|| cM.L_MOV ||']CNT['|| cM.CNT || ']' | |
--|| 'REF['|| cM.REF_MOV_TAB_IN_CODIGO ||';'|| cM.REF_MOV_SEQ_IN_CODIGO ||';'|| cM.REF_MOV_IN_NUMLANCTO ||']' | |
|| CHR(13) || CHR(13) | |
||'[' || vOwner || '.' ||vObjeto || ']'); | |
end loop; -- cM | |
-- TODO: Quando atualização precisa refazer essa verificação para não apresentar problema! | |
IF (cR.TREF_ST_CODIGO IN ('ESTCREFIN', 'ESTCRE') AND cR.REF_MOV_RE_SALDO > cR.REF_MOV_RE_VALOR | |
) THEN | |
RAISE_APPLICATION_ERROR(-20101, | |
'Origem[' || cR.REF_MOV_CH_ORIGEM || ']' | |
|| 'Tipo Doc.[' || cR.REF_TPD_ST_CODIGO || ']' | |
|| 'Documento[' || cR.REF_MOV_ST_DOCUMENTO || ']' | |
|| 'Parcela[' || cR.REF_MOV_ST_PARCELA || '] ' | |
|| 'vai ter saldo ' | |
|| '['|| cR.REF_MOV_RE_SALDO ||'] ' | |
|| 'maior que o valor da parcela ' | |
|| '['|| cR.REF_MOV_RE_VALOR ||']. ' | |
|| CHR(13) || CHR(13) | |
||'[' || vOwner || '.' ||vObjeto || ']'); | |
END IF; | |
end loop; -- cR | |
end loop; -- rMOV | |
end if; | |
end after statement; | |
END; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment