ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Débito, crédito e saldo Firebird?
Ir à página Anterior  1, 2, 3, 4, 5  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Fev 23, 2021 4:53 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Fev 23, 2021 4:57 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Fev 23, 2021 5:42 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Fev 23, 2021 6:23 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 24, 2021 10:22 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 24, 2021 11:24 am    Assunto: Responder com Citação

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
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 24, 2021 2:08 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 24, 2021 7:30 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Fev 25, 2021 9:37 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Fev 25, 2021 9:44 am    Assunto: Responder com Citação

imex escreveu:
Você quer desconsiderar o saldo de contas que não tiveram movimento no período selecionado, mesmo que essas contas estejam entre as selecionadas?
Isso, se não fica estranho o total geral, pois não entrou no periodo as contas
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Fev 25, 2021 10:28 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Fev 25, 2021 11:09 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Fev 25, 2021 1:46 pm    Assunto: Responder com Citação

Parece que assim da certo
Código:
IF (INICIO_CONTA = 'S') THEN
              BEGIN
                INICIO_CONTA = 'N';
                TOTAL_GERAL = cast(TOTAL_GERAL as numeric(15,2)) + SALDO;
              END
            ELSE
                TOTAL_GERAL = cast(TOTAL_GERAL as numeric(15,2)) + DEPOSITO - PAGAMENTO;


Mais deixando somente esse campo como numeric, e não todos como tinha feito antes.
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Fev 25, 2021 2:15 pm    Assunto: Responder com Citação

Boa tarde,

Acho que a preferência seria evitar o uso do tipo double pois ele possui problemas de precisão.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 26, 2021 5:36 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página Anterior  1, 2, 3, 4, 5  Próximo
Página 4 de 5

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB