Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndyDaSilva52/a5ca3020ea8e91c978edb9626135c662 to your computer and use it in GitHub Desktop.
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
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