Lógica para congelamentos de dados
Galera tenho uma tabela de CONTAS A RECEBER, preciso fazer filtros que simule um congelamento. Por exemplo: Dia 01/04 tinha no Contas a Receber em aberto 500.000,00, e no dia 07/04 fazer o mesmo filtro para saber quanto tinha em aberto no dia 01/04, embora ja tenha tido movimentações, entrado titulo, baixados, baixas parciais, cancelamentos. O importante é saber quanto tinha lançado em aberto naquele dia.
Tenho um campo status que identifico: 'NÃO CONCILIDADO' = Titulo aberto, 'CONCILIADO' = titulo baixado, e no campo CONREC_NUM_DOC se tiver a letra 'P', quer dizer que foi um titulo gerado por uma baixa parcial.
Estou fazendo o seguite select, mas os valores estão mudando, ou seja, não esta o mesmo valor do período. Se algum poder me ajudar na lógica, agradeço.
Estrutura da View
Estrutura da Tabela
Tenho um campo status que identifico: 'NÃO CONCILIDADO' = Titulo aberto, 'CONCILIADO' = titulo baixado, e no campo CONREC_NUM_DOC se tiver a letra 'P', quer dizer que foi um titulo gerado por uma baixa parcial.
Estou fazendo o seguite select, mas os valores estão mudando, ou seja, não esta o mesmo valor do período. Se algum poder me ajudar na lógica, agradeço.
SELECT conrec_id,
ped_id,
data_cad,
data_emissao,
data_pag,
CONREC_NUM_DOC,
conrec_valor_parcela parcela,
conrec_valor_pago pago,
conrec_acrescimo juros,
conrec_desconto desconto,
recebido_total recebido_total,
Iif((status = 'NÃO CONCILIADO') OR (status = 'CANCELADO'), COALESCE(conrec_valor_parcela, 0),
recebido_total) as valorCongelado
FROM vw_rel_contasreceber
WHERE ( ( ( Cast(data_emissao AS DATE) <= :dt_fim )
AND ( status = 'NÃO CONCILIADO' ) )
OR ( ( Cast(data_emissao AS DATE) <= :dt_fim )
AND ( Cast(data_pag AS DATE) > :dt_fim )
AND ( ( status = 'CONCILIADO' )
OR ( status = 'CANCELADO' ) ) ) )
AND ( loj_id = :loja )
Estrutura da View
CREATE OR ALTER VIEW VW_REL_CONTASRECEBER(
CONREC_ID,
CONREC_NUM_DOC,
DATA_CAD,
DATA_EMISSAO,
DATA_PAG,
CLI_ID,
CLI_RAZAO,
CLI_CPF_CNPJ,
ENDERECO,
CLI_BAIRRO,
CLI_CIDADE,
CLI_FONE1,
CLI_FONE2,
CLI_FONE3,
ROT_ID,
ROTA,
SET_ID,
SET_DESCRICAO,
CLI_INTINERARIO,
FUN_ID,
FUN_APELIDO,
STATUS,
CONREC_MOTIVO_CANCELAMENTO,
CONREC_HISTORICO,
CONREC_VALOR_PARCELA,
CONREC_VALOR_TOTAL,
NDA,
CONREC_VALOR_PAGO,
CONREC_ACRESCIMO,
CONREC_DESCONTO,
RECEBIDO_TOTAL,
ARECEBER,
CONREC_NUM_PARCELA,
CONREC_DATA_VENCIMENTO,
FGPTO_ID,
FPGTO_DESCRICAO,
CPGTO_ID,
CPGTO_DESCRICAO,
PED_ID,
LOJ_ID,
LOJ_NOME,
USU_ID,
CEN_ID,
CENTRO,
CON_ID,
CON_NOME,
NFE_ID,
USU_NOME,
CONREC_OBS)
AS
select distinct
contasreceber.conrec_id,
contasreceber.conrec_num_doc,
contasreceber.data_cad,
contasreceber.data_emissao,
contasreceber.data_pag,
contasreceber.cli_id,
clientes.cli_razao,
clientes.cli_cpf_cnpj,
clientes.cli_endereco || ', '||clientes.cli_numero as endereco,
clientes.cli_bairro,
clientes.cli_cidade,
clientes.cli_fone1,
clientes.cli_fone2,
clientes.cli_fone3,
clientes.rot_id,
(select rot_descricao from rotas where rot_id = clientes.rot_id) as rota,
(SELECT first 1 sp_getsetor.set_id FROM SP_GETSETOR(clientes.rot_id)),
(SELECT first 1 sp_getsetor.set_descricao FROM SP_GETSETOR(clientes.rot_id)),
clientes.cli_intinerario,
case
when contasreceber.ped_id > 0 then
pedidos.fun_id
else
(select first 1 funcionarios.fun_id from funcionarios where funcionarios.set_id = (SELECT sp_getsetor.set_id FROM SP_GETSETOR(clientes.rot_id)))
end as fun_id,
case
when contasreceber.ped_id > 0 then
(select first 1 funcionarios.fun_apelido from funcionarios where funcionarios.fun_id = pedidos.fun_id)
else
(select first 1 funcionarios.fun_apelido from funcionarios where funcionarios.set_id = (SELECT sp_getsetor.set_id FROM SP_GETSETOR(clientes.rot_id)))
end as fun_apelido,
case
when contasreceber.status = 0 then 'NÃO CONCILIADO'
when contasreceber.status = 2 then 'CANCELADO'
when contasreceber.status = 1 then 'CONCILIADO'
end as status,
contasreceber.conrec_motivo_cancelamento,
contasreceber.conrec_historico,
coalesce(contasreceber.conrec_valor_parcela,0) as conrec_valor_parcela,
coalesce(contasreceber.conrec_valor_total,0) as conrec_valor_total,
case
when (current_date - cast(contasreceber.conrec_data_vencimento as date)) < 0 then 0 || ' Dias'
else
(current_date - cast(contasreceber.conrec_data_vencimento as date))|| ' Dias'
end as nda,
coalesce(contasreceber.conrec_valor_pago,0) as conrec_valor_pago,
coalesce(contasreceber.conrec_acrescimo,0) as conrec_acrescimo,
coalesce(contasreceber.conrec_desconto,0) as conrec_desconto,
case
when coalesce(contasreceber.conrec_acrescimo,0) > 0 then
coalesce(contasreceber.conrec_valor_pago,0) - coalesce(contasreceber.conrec_acrescimo,0)
else
coalesce(contasreceber.conrec_valor_pago,0)
end as Recebido_Total,
case
when
coalesce(contasreceber.conrec_valor_pago,0) + coalesce(contasreceber.conrec_acrescimo,0) >
coalesce(contasreceber.conrec_valor_parcela,0) then 0
when
coalesce(contasreceber.conrec_valor_pago,0) + coalesce(contasreceber.conrec_desconto,0) =
coalesce(contasreceber.conrec_valor_parcela,0) then 0
else
coalesce(contasreceber.conrec_valor_parcela,0) - coalesce(contasreceber.conrec_valor_pago,0)
end,
contasreceber.conrec_num_parcela,
contasreceber.conrec_data_vencimento,
contasreceber.fgpto_id,
forma_pagamento.fpgto_descricao,
contasreceber.cpgto_id,
condicao_de_pagamento.cpgto_descricao,
contasreceber.ped_id,
contasreceber.loj_id,
lojas.loj_nome,
contasreceber.usu_id,
contasreceber.cen_id,
centros.centro,
contasreceber.con_id,
contas.con_nome,
pedidos.nfe_id,
usuarios.usu_nome,
contasreceber.conrec_obs
from contasreceber
inner join forma_pagamento on (contasreceber.fgpto_id = forma_pagamento.fpgto_id)
inner join condicao_de_pagamento on (contasreceber.cpgto_id = condicao_de_pagamento.cpgto_id)
inner join clientes on (contasreceber.cli_id = clientes.cli_id)
left join pedidos on (contasreceber.ped_id = pedidos.ped_id)
inner join usuarios on (contasreceber.usu_id = usuarios.usu_id)
left join contas on (contasreceber.con_id = contas.con_id)
left join centros on (contasreceber.cen_id = centros.cen_id)
inner join lojas on (contasreceber.loj_id = lojas.loj_id)
;
Estrutura da Tabela
CREATE TABLE CONTASRECEBER (
CONREC_ID INTEGER NOT NULL PRIMARY KEY,
CONREC_NUM_DOC VARCHAR(25),
DATA_CAD TIMESTAMP,
DATA_EMISSAO TIMESTAMP,
DATA_ALT TIMESTAMP,
DATA_PAG TIMESTAMP,
STATUS INTEGER,
CONREC_MOTIVO_CANCELAMENTO VARCHAR(100),
CONREC_HISTORICO VARCHAR(150),
CONREC_VALOR_PARCELA "DValor" /* "DValor" = NUMERIC(12,2) DEFAULT 0 */,
CONREC_VALOR_TOTAL "DValor" /* "DValor" = NUMERIC(12,2) DEFAULT 0 */,
CONREC_NUM_PARCELA VARCHAR(6),
CONREC_DATA_VENCIMENTO DATE,
CONREC_VALOR_PAGO "DValor" /* "DValor" = NUMERIC(12,2) DEFAULT 0 */,
CONREC_ACRESCIMO "DValor" /* "DValor" = NUMERIC(12,2) DEFAULT 0 */,
CONREC_DESCONTO "DValor" /* "DValor" = NUMERIC(12,2) DEFAULT 0 */,
FGPTO_ID INTEGER,
CPGTO_ID INTEGER,
CLI_ID INTEGER,
PED_ID INTEGER,
LOJ_ID INTEGER,
USU_ID INTEGER,
CEN_ID INTEGER,
CON_ID INTEGER,
EXCLUIDO CHAR(1),
CONREC_OBS VARCHAR(150),
DATA_CANCELAMENTO "DDataHora" /* "DDataHora" = TIMESTAMP */
);
Sidney Abreu
Curtidas 0
Respostas
Sidney Abreu
09/04/2015
Uma coisa que notei foi as baixas canceladas, que estão influenciando, mas como corrigir esse select?
GOSTEI 0