|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 23, 2021 4:53 pm Assunto: |
|
|
Imex, se eu fizer assim, não reconheceu o campo no SELECT DO FOR
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA integer,
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT double precision,
DEPOSITO double precision,
PAGAMENTO double precision,
SALDO double precision,
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR double precision,
D_C char(1))
as
BEGIN
SALDO = 0;
FOR
SELECT
mc.id_conta,
replace (CT.nome, ' ', ' ') AS NOME_CONTA,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
CC.NOME,
PC.NOME,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(CASE WHEN MC.TIPO IN (0, 3) THEN
MC.VALOR
ELSE
0
END),
SUM(CASE WHEN MC.TIPO IN (1, 2) THEN
MC.VALOR
ELSE
0
END),
SUM(CASE WHEN MC.TIPO IN (0, 3) THEN
MC.valor
WHEN MC.TIPO IN (1, 2) THEN
- MC.valor
end) AS VALOR,
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
INNER JOIN PLANODECONTAS PC ON PC.ID = MC. ID_PLANCONTA
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
--LEFT JOIN CENTRODECUSTO CC ON CC.ID = MC.ID_CCUSTO
LEFT JOIN CONTA CT ON CT.id = MC.id_conta
WHERE --MC.ID_CONTA = : PID_CONTA
--AND
MC.Data <= : PDATA2
AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
(UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : id_conta, : nome_conta, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO, : NOME_CCUSTO, : NOME,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
SALDO_ANT = SALDO;
IF (: STATUS <> 30) THEN
SALDO = SALDO + DEPOSITO - PAGAMENTO;
IF (: DATA >= : PDATA1) THEN
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO :NOME_CCUSTO;
SUSPEND;
END
END |
Erro nesta linha no FOR
CC.NOME,
Outra coisa, seá que da pra somar o total de cada conta ? _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 23, 2021 4:57 pm Assunto: |
|
|
Se eu retirar tudo que refere a ele, veio um select gigante, com dados que não deveria vir
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA integer,
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT double precision,
DEPOSITO double precision,
PAGAMENTO double precision,
SALDO double precision,
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR double precision,
D_C char(1))
as
BEGIN
SALDO = 0;
FOR
SELECT
mc.id_conta,
replace (CT.nome, ' ', ' ') AS NOME_CONTA,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
PC.NOME,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(CASE WHEN MC.TIPO IN (0, 3) THEN
MC.VALOR
ELSE
0
END),
SUM(CASE WHEN MC.TIPO IN (1, 2) THEN
MC.VALOR
ELSE
0
END),
SUM(CASE WHEN MC.TIPO IN (0, 3) THEN
MC.valor
WHEN MC.TIPO IN (1, 2) THEN
- MC.valor
end) AS VALOR,
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
INNER JOIN PLANODECONTAS PC ON PC.ID = MC. ID_PLANCONTA
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
LEFT JOIN CONTA CT ON CT.id = MC.id_conta
WHERE --MC.ID_CONTA = : PID_CONTA
--AND
MC.Data <= : PDATA2
AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
(UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : id_conta, : nome_conta, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO, : NOME,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
SALDO_ANT = SALDO;
IF (: STATUS <> 30) THEN
SALDO = SALDO + DEPOSITO - PAGAMENTO;
IF (: DATA >= : PDATA1) THEN
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO :NOME_CCUSTO;
SUSPEND;
END
END |
Lembrando também se tem como somar o total do SALDO de cada conta. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Fev 23, 2021 5:42 pm Assunto: |
|
|
O retorno foi alterado porque está faltando o Begin / End do código que foi sugerido anteriormente. Segue sugestão para testes:
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA integer,
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT double precision,
DEPOSITO double precision,
PAGAMENTO double precision,
SALDO double precision,
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR double precision,
D_C char(1))
as
DECLARE VARIABLE ID_CONTA_ANT INTEGER;
BEGIN
ID_CONTA_ANT = 0;
FOR
SELECT
mc.id_conta,
replace (CT.nome, ' ', ' ') AS NOME_CONTA,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
PC.NOME,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(CASE WHEN MC.TIPO IN (0, 3) THEN
MC.VALOR
ELSE
0
END),
SUM(CASE WHEN MC.TIPO IN (1, 2) THEN
MC.VALOR
ELSE
0
END),
SUM(CASE WHEN MC.TIPO IN (0, 3) THEN
MC.valor
WHEN MC.TIPO IN (1, 2) THEN
- MC.valor
end) AS VALOR,
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
INNER JOIN PLANODECONTAS PC ON PC.ID = MC. ID_PLANCONTA
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
LEFT JOIN CONTA CT ON CT.id = MC.id_conta
WHERE --MC.ID_CONTA = : PID_CONTA
--AND
MC.Data <= : PDATA2
AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
(UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : id_conta, : nome_conta, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO, : NOME,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
IF (ID_CONTA <> ID_CONTA_ANT) THEN
BEGIN
ID_CONTA_ANT = ID_CONTA;
SALDO = 0;
END
SALDO_ANT = SALDO;
IF (: STATUS <> 30) THEN
SALDO = SALDO + DEPOSITO - PAGAMENTO;
IF (: DATA >= : PDATA1) THEN
BEGIN
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO :NOME_CCUSTO;
SUSPEND;
END
END
END |
Espero que ajude |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 23, 2021 6:23 pm Assunto: |
|
|
Deu certo agora, mais não ficou mais rápido não, acho que por causa dessas somas e do banco ser grande
Pq se eu filtrar os id_conta assim
WHERE MC.ID_CONTA IN (3598,36606,92720) ele é instantâneo.
Mais ainda preciso da soma geral do saldo das contas
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA integer,
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT double precision,
DEPOSITO double precision,
PAGAMENTO double precision,
SALDO double precision,
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR double precision,
D_C char(1),
TOTAL_GERAL double precision)
as
declare variable ID_CONTA_ANT integer;
BEGIN
ID_CONTA_ANT = 0;
FOR
SELECT
mc.id_conta,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (1, 2) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE -1 END),
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
WHERE --MC.ID_CONTA = : PID_CONTA
--AND
MC.Data <= : PDATA2
AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
(UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
GROUP BY 1,2,3,4,5,6,7,8,9,10,11
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : id_conta, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
IF (ID_CONTA <> ID_CONTA_ANT) THEN
BEGIN
ID_CONTA_ANT = ID_CONTA;
SALDO = 0;
END
SALDO_ANT = SALDO;
IF (: STATUS <> 30) THEN
SALDO = SALDO + DEPOSITO - PAGAMENTO;
IF (: DATA >= : PDATA1) THEN
BEGIN
SELECT REPLACE (CT.NOME, ' ', ' ') AS NOME_CONTA
FROM CONTA CT
WHERE CT.ID = :ID_CONTA
INTO : NOME_CONTA;
SELECT PC.NOME
FROM PLANODECONTAS PC
WHERE PC.ID = :ID_PLANCONTA
INTO : NOME;
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO : NOME_CCUSTO;
SUSPEND;
END
END
END |
Não sei como pegar esse valor.
Aqui esta vindo 3 ID_Conta
3598, 3606 e 9270 preciso da soma do saldo dassas 3 contas para o resultado final
E também no delphi como passo o IN das contas que vou precisar no parametro PID_CONTA?
Posso filtrar por uma conta, por todas ou multi-contas
Aqui nesse filtro
Código: | WHERE CAST(MC.ID_CONTA as varchar(255)) IN (3598, 3606, 92720) |
Aproveitando estou querendo deixar nomes com mais de um espaço nom eio ficar com apenas um espaço independente do tamanho do espaço, o replace aqui não esta dando certo
Código: | SELECT REPLACE (CT.NOME, ' ', ' ') AS NOME_CONTA | Tem outro jeito? _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Fev 24, 2021 10:22 am Assunto: |
|
|
Segue uma sugestão para testes que deve retornar o saldo total:
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA integer,
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT double precision,
DEPOSITO double precision,
PAGAMENTO double precision,
SALDO double precision,
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR double precision,
D_C char(1),
TOTAL_GERAL double precision)
as
declare variable ID_CONTA_ANT integer;
BEGIN
ID_CONTA_ANT = 0;
TOTAL_GERAL = 0;
FOR
SELECT
mc.id_conta,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (1, 2) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE -1 END),
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
WHERE --MC.ID_CONTA = : PID_CONTA
--AND
MC.Data <= : PDATA2
AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
(UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
GROUP BY 1,2,3,4,5,6,7,8,9,10,11
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : id_conta, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
IF (ID_CONTA <> ID_CONTA_ANT) THEN
BEGIN
ID_CONTA_ANT = ID_CONTA;
SALDO = 0;
END
SALDO_ANT = SALDO;
IF (: STATUS <> 30) THEN
BEGIN
SALDO = SALDO + DEPOSITO - PAGAMENTO;
TOTAL_GERAL = TOTAL_GERAL + DEPOSITO - PAGAMENTO;
END
IF (: DATA >= : PDATA1) THEN
BEGIN
SELECT REPLACE (CT.NOME, ' ', ' ') AS NOME_CONTA
FROM CONTA CT
WHERE CT.ID = :ID_CONTA
INTO : NOME_CONTA;
SELECT PC.NOME
FROM PLANODECONTAS PC
WHERE PC.ID = :ID_PLANCONTA
INTO : NOME;
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO : NOME_CCUSTO;
SUSPEND;
END
END
END |
Sobre o filtro para as contas com o In, na segunda página desse tópico postei uma sugestão para o campo Status que pode ser utilizada nesse caso também.
Sobre o espaço no meio do nome, se esse Replace não resolveu talvez o caractere seja outro e não exatamente um espaço em branco.
Espero que ajude |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Fev 24, 2021 2:08 pm Assunto: |
|
|
adriano_servitec escreveu: | Bom dia Imex,
Não bateu o total_geral
Tenho nesse relatoior 3 contas
Saldo Final de cada conta (campo SALDO)
1) -435.276,28
2) -49.535,60
3) -665.175,40
TOTAL_GERAL -1.149.987,28
O resultado TOTAL_GERAL que veio da SP -231.720.021,89 |
Esse valor ai pode ser que esteja ligado a soma total de todas as contas, pois agora fiz com filtro nas 3 contas que tem valor no período de 01/02 a 28/02 do ano 21 e trouxe a soma correta.
Por tanto o problema é se pedir para filtrar por "TODAS" as contas, que ai não bate o total com o que vem no relatorio pois no filtro a data vem assim
Código: | MC.Data <= : PDATA2 |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Fev 24, 2021 7:30 pm Assunto: |
|
|
Dificil de resolver isso, não estou conseguindo
Tentei ver se um select ajudava, mais não deu não
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA varchar(1025),
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT double precision,
DEPOSITO double precision,
PAGAMENTO double precision,
SALDO double precision,
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR double precision,
D_C char(1),
TOTAL_GERAL double precision)
as
declare variable ID_CONTA_ANT integer;
BEGIN
ID_CONTA_ANT = 0;
TOTAL_GERAL = 0;
FOR
SELECT
mc.id_conta,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (1, 2) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE -1 END),
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
WHERE POSITION(cast(MC.ID_CONTA as varchar(255)) || ',', :PID_CONTA) > 0 AND
MC.DATA <= : PDATA2
AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
(UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
GROUP BY 1,2,3,4,5,6,7,8,9,10,11
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : id_conta, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
IF (ID_CONTA <> ID_CONTA_ANT) THEN
BEGIN
ID_CONTA_ANT = ID_CONTA;
SALDO = 0;
END
SALDO_ANT = SALDO;
IF (: STATUS <> 30) THEN
BEGIN
FOR SELECT DISTINCT ID_CONTA
FROM MOVCONTA
WHERE DATA >= :PDATA1
AND POSITION(CAST(ID_CONTA as varchar(255)) || ',', :PID_CONTA) > 0
INTO :ID_CONTA
DO BEGIN
IF (id_conta > 0) then
TOTAL_GERAL = TOTAL_GERAL + DEPOSITO - PAGAMENTO;
END
SALDO = SALDO + DEPOSITO - PAGAMENTO;
END
IF (: DATA >= : PDATA1) THEN
BEGIN
SELECT REPLACE (CT.NOME, ' ', ' ') AS NOME_CONTA
FROM CONTA CT
WHERE CT.ID = :ID_CONTA
INTO : NOME_CONTA;
SELECT PC.NOME
FROM PLANODECONTAS PC
WHERE PC.ID = :ID_PLANCONTA
INTO : NOME;
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO : NOME_CCUSTO;
SUSPEND;
END
END
END |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Fev 25, 2021 9:37 am Assunto: |
|
|
Você quer desconsiderar o saldo de contas que não tiveram movimento no período selecionado, mesmo que essas contas estejam entre as selecionadas? |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Fev 25, 2021 10:28 am Assunto: |
|
|
Experimente dessa forma:
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA integer,
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT double precision,
DEPOSITO double precision,
PAGAMENTO double precision,
SALDO double precision,
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR double precision,
D_C char(1),
TOTAL_GERAL double precision)
as
declare variable ID_CONTA_ANT integer;
declare variable INICIO_CONTA CHAR(1);
BEGIN
ID_CONTA_ANT = 0;
TOTAL_GERAL = 0;
FOR
SELECT
mc.id_conta,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (1, 2) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE -1 END),
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
WHERE --MC.ID_CONTA = : PID_CONTA
--AND
MC.Data <= : PDATA2
AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
(UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
GROUP BY 1,2,3,4,5,6,7,8,9,10,11
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : id_conta, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
IF (ID_CONTA <> ID_CONTA_ANT) THEN
BEGIN
ID_CONTA_ANT = ID_CONTA;
INICIO_CONTA = 'S';
SALDO = 0;
END
SALDO_ANT = SALDO;
IF (: STATUS <> 30) THEN
SALDO = SALDO + DEPOSITO - PAGAMENTO;
IF (: DATA >= : PDATA1) THEN
BEGIN
IF (INICIO_CONTA = 'S') THEN
BEGIN
INICIO_CONTA = 'N';
TOTAL_GERAL = TOTAL_GERAL + SALDO;
END
ELSE
TOTAL_GERAL = TOTAL_GERAL + DEPOSITO - PAGAMENTO;
SELECT REPLACE (CT.NOME, ' ', ' ') AS NOME_CONTA
FROM CONTA CT
WHERE CT.ID = :ID_CONTA
INTO : NOME_CONTA;
SELECT PC.NOME
FROM PLANODECONTAS PC
WHERE PC.ID = :ID_PLANCONTA
INTO : NOME;
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO : NOME_CCUSTO;
SUSPEND;
END
END
END |
Espero que ajude |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Fev 25, 2021 11:09 am Assunto: |
|
|
Bom dia Imex,
Sim da certo.
Sabe dizer se tem alguma função para soma exata?
Exemplo
Tenho um que selecionei o retorno veio assim
-665.190,80
-49.535,60
--------------
-714.710,99 (Foi o resultado do SP)
Mais se somar o resultado seria
-714.711,00
Ai tentei o ROUND() mais não da certo em certos resultados, nesse da certo, mais outro que o resultado é
-1.149.987,28
com o ROUND() fica -1.149.988,00
Tem uma forma exata de soma?
Se mudo de DOUBLE PRECISION para NUMERIC ai muda toda a soma, e não bate com o sistema. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Fev 25, 2021 2:15 pm Assunto: |
|
|
Boa tarde,
Acho que a preferência seria evitar o uso do tipo double pois ele possui problemas de precisão. |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sex Fev 26, 2021 5:36 pm Assunto: |
|
|
Boa tarde, vou precisar se possível o total geral de debito e credito também
criei esses dois
total_geral_debito = 0;
total_geral_credito = 0;
Tentei assim
Código: | create or alter procedure SP_REL_MOVIMENTACAO (
PID_CONTA varchar(1025),
PDATA1 date,
PDATA2 date,
PSTATUS varchar(255),
PCONDICAO varchar(255),
PNAOMOSTRARSALDO integer,
PUSUARIO varchar(100))
returns (
ID_CONTA integer,
NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR,
ID integer,
DATA date,
NUMERO varchar(20),
ID_CLIENTE integer,
FAVORECIDO varchar(100) character set WIN1252 collate WIN_PTBR,
ID_PLANCONTA integer,
NOME varchar(100) character set WIN1252 collate WIN_PTBR,
HISTORICO varchar(200) character set WIN1252 collate WIN_PTBR,
SALDO_ANT numeric(15,2),
DEPOSITO numeric(15,2),
PAGAMENTO numeric(15,2),
SALDO numeric(15,2),
TIPO integer,
STATUS integer,
ID_CCUSTO integer,
NOME_CCUSTO varchar(100) character set WIN1252 collate WIN_PTBR,
VALOR numeric(15,2),
D_C char(1),
TOTAL_GERAL numeric(15,2),
SALDO_POR_CONTA numeric(15,2),
TOTAL_GERAL_DEBITO numeric(15,2),
TOTAL_GERAL_CREDITO numeric(15,2))
as
declare variable ID_CONTA_ANT integer;
declare variable INICIO_CONTA char(1);
BEGIN
ID_CONTA_ANT = 0;
TOTAL_GERAL = 0;
total_geral_debito = 0;
total_geral_credito = 0;
FOR
SELECT
MC.ID_CONTA,
MC.ID,
MC.DATA,
MC.NUMERO,
MC.ID_CLIENTE,
CASE WHEN MC.FAVORECIDO IS NULL THEN
C.NOMEFANTASIA
ELSE
MC.FAVORECIDO
END,
MC.ID_PLANCONTA,
MC.ID_CCUSTO,
MC.HISTORICO,
MC.STATUS,
MC.TIPO,
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (1, 2) THEN 1 ELSE 0 END),
SUM(MC.VALOR * CASE WHEN MC.TIPO IN (0, 3) THEN 1 ELSE -1 END),
IIF( MC.TIPO IN (1, 2), 'D', 'C')
FROM MOVCONTA MC
LEFT JOIN CLIENTE C ON C.ID = MC.ID_CLIENTE
INNER JOIN USUARIOCONTAS UC ON UC.CONTA_ID = MC.ID_CONTA
WHERE POSITION(cast(MC.ID_CONTA as varchar(255)) || ',', :PID_CONTA) > 0 AND
MC.Data <= : PDATA2
-- AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
-- (UPPER(MC.FAVORECIDO) LIKE :PCONDICAO))
AND UC.CD_USUARIO LIKE :PUSUARIO
GROUP BY 1,2,3,4,5,6,7,8,9,10,11
ORDER BY mc.id_conta, MC.DATA, MC.ID
INTO : ID_CONTA, : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
: ID_PLANCONTA, : ID_CCUSTO,
: HISTORICO, : STATUS, : TIPO,
: DEPOSITO, : PAGAMENTO,
: VALOR, : D_C
DO BEGIN
IF (ID_CONTA <> ID_CONTA_ANT) THEN
BEGIN
ID_CONTA_ANT = ID_CONTA;
INICIO_CONTA = 'S';
SALDO = 0;
saldo_por_conta = 0;
END
if (:PNAOMOSTRARSALDO = 0) then
begin
SALDO_ANT = SALDO;
end
else
saldo_ant = 0;
IF (: STATUS <> 30) THEN
if (: data >= : pdata1 ) then
saldo_por_conta = saldo_por_conta + DEPOSITO - PAGAMENTO;
if (:PNAOMOSTRARSALDO = 0) then
begin
SALDO = SALDO + DEPOSITO - PAGAMENTO;
end
else
SALDO = 0;
IF (: DATA >= : PDATA1) THEN
BEGIN
IF (INICIO_CONTA = 'S') THEN
BEGIN
INICIO_CONTA = 'N';
TOTAL_GERAL = TOTAL_GERAL + SALDO;
if (saldo > 0) then
total_geral_credito = total_geral_credito + saldo;
ELSE
total_geral_debito = total_geral_debito + SALDO;
END
ELSE
if (:PNAOMOSTRARSALDO = 0) then
begin
TOTAL_GERAL = TOTAL_GERAL + DEPOSITO - PAGAMENTO;
end
else
TOTAL_GERAL = 0;
total_geral_credito = total_geral_credito + deposito;
total_geral_debito = total_geral_debito + pagamento;
SELECT REPLACE (CT.NOME, ' ', ' ') AS NOME_CONTA
FROM CONTA CT
WHERE CT.ID = :ID_CONTA
INTO : NOME_CONTA;
SELECT PC.NOME
FROM PLANODECONTAS PC
WHERE PC.ID = :ID_PLANCONTA
INTO : NOME;
SELECT CC.NOME
FROM CENTRODECUSTO CC
WHERE CC.ID = :ID_CCUSTO
INTO : NOME_CCUSTO;
SUSPEND;
END
END
END |
Mais parece não dar certo
Outra coisa, tenho alguns dados que são o saldo de abertura da conta que preciso incluir, mais ao incluir esse filtro:
ESSE REGISTRO NÃO POSSUI ID_CLIENTE
Código: | -- AND ( (UPPER(C.NOMEFANTASIA) LIKE :PCONDICAO) OR
-- (UPPER(MC.FAVORECIDO) LIKE :PCONDICAO)) |
Não deixa mostrar, ai comentei ele, mais preciso desse filtro também. Eu não sei porque não deixa mostrar. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Editado pela última vez por adriano_servitec em Sáb Fev 27, 2021 8:03 am, num total de 1 vez |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|