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
imex
Moderador
Moderador


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

MensagemEnviada: Sex Jan 15, 2021 2:33 pm    Assunto: Responder com Citação

Para a data especificamente, verifique se o formato da data retornada com o Cast para varchar é o mesmo do parâmetro, e se o parâmetro nesse caso não contem o sinal de percentual já que está sendo utilizado o sinal de igual.
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: Seg Fev 22, 2021 2:32 pm    Assunto: Responder com Citação

Esta SP aqui
Código:
create or alter procedure SP_REL_MOVIMENTACAO (
    PID_CONTA integer,
    PDATA1 date,
    PDATA2 date,
    PSTATUS varchar(255),
    PCONDICAO varchar(255))
returns (
    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,
    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,
    ID_CONTA integer,
    VALOR double precision,
    D_C char(1),
    NOME_CONTA varchar(100) character set WIN1252 collate WIN_PTBR)
as
BEGIN SALDO = 0;
    FOR
    SELECT
    mc.id_conta,
    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,
    MC.valor,
    IIF( MC.TIPO IN (0, 3), 'D', 'C'),
    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)
    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 BETWEEN : PDATA1 AND : PDATA2
    AND POSITION(cast(MC.STATUS as varchar(255)) || ',', :PSTATUS) > 0
    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,15
    ORDER BY mc.id_conta, MC.DATA, MC.ID
    INTO : id_conta,  : ID, : DATA, : NUMERO, : ID_CLIENTE, : FAVORECIDO,
    : ID_PLANCONTA, : ID_CCUSTO, : NOME_CCUSTO,  : NOME,
    : HISTORICO, : STATUS, : TIPO, : VALOR, : d_c,
    : nome_conta,
    : DEPOSITO, : PAGAMENTO
    DO BEGIN
        IF (: STATUS <> 30) THEN
            SALDO = SALDO + DEPOSITO - PAGAMENTO;
    SUSPEND;
    END
END


Esta dando erro
Citação:
conversion error from string "BB CLUBE 7232.118-9".
At procedure 'SP_REL_MOVIMENTACAO' line: 29, col: 5.



E também...

Como faço para ter saldo anterior a data informada?

Exemplo se eu executar de 19/02/2021 a 22/02/2021 mostrar da forma que esta ai, porém tudo antes desta data venha como soma de saldo anterior no inicio, tem como?
_________________
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: Seg Fev 22, 2021 4:24 pm    Assunto: Responder com Citação

Sobre o erro, acho que você tem que conferir se a ordem dos parâmetros na clausula Into está de acordo com a ordem dos campos no Select.

Sobre o saldo, tente deixar o filtro de data da query da seguinte forma:

Código:
    MC.Data <= : PDATA2


E acrescente um If antes do Suspend para que os registros anteriores a data inicial não sejam retornados:

Código:
    IF (MC.Data >= : PDATA1)
      SUSPEND;


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: Seg Fev 22, 2021 4:42 pm    Assunto: Responder com Citação

imex escreveu:
Sobre o erro, acho que você tem que conferir se a ordem dos parâmetros na clausula Into está de acordo com a ordem dos campos no Select.

Sobre o saldo, tente deixar o filtro de data da query da seguinte forma:

Código:
    MC.Data <= : PDATA2


E acrescente um If antes do Suspend para que os registros anteriores a data inicial não sejam retornados:

Código:
    IF (MC.Data >= : PDATA1)
      SUSPEND;


Espero que ajude


Boa tarde,

Sobre o erro era isso mesmo
Agora não entendi como trago nessa SP uma linha inicial com o saldo anterior a data filtrada. E tmb não deu certo colocar anste do suspend esse if.

Olha como esta agora a SP
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,
    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,
    CT.nome,
    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,
    MC.valor,
    IIF( MC.TIPO IN (0, 3), 'D', 'C'),
    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)
    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
    MC.Data BETWEEN : PDATA1 AND : PDATA2
    AND POSITION(cast(MC.STATUS as varchar(255)) || ',', :PSTATUS) > 0
    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,15
    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, : VALOR, : d_c,
    : DEPOSITO, : PAGAMENTO
    DO BEGIN
        IF (: STATUS <> 30) THEN
            SALDO = SALDO + DEPOSITO - PAGAMENTO;
    SUSPEND;
    END
END


Outra coisa mudando a posição das colunas de retorno não deveria vir na mesma posição o return?
_________________
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 9:31 am    Assunto: Responder com Citação

adriano_servitec escreveu:


Boa tarde,

Agora não entendi como trago nessa SP uma linha inicial com o saldo anterior a data filtrada. E tmb não deu certo colocar anste do suspend esse if.

Alias o saldo anterior deve ser somado e deixado em uma coluna ao vado com seu nome do campo que ai posso extrair o valor que mesmo sendo repetido é um valor unico para 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 10:10 am    Assunto: Responder com Citação

Bom dia,

Esse filtro abaixo deve ser removido:

Código:
    MC.Data BETWEEN : PDATA1 AND : PDATA2


ficando somente esse:

Código:
    MC.Data <= : PDATA2


Dessa forma a query vai retornar os registros anteriores ao período mas eles só vão ser utilizados para a soma do saldo, não vão ser retornados pela procedure, mas para isso tem que ser adicionado aquele If antes do Suspend.
Não tinha entendido que você queria o saldo em uma linha inicial separada. Você não consegue pegar o primeiro registro e calcular o saldo anterior?
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 10:26 am    Assunto: Responder com Citação

imex escreveu:
Bom dia,

Esse filtro abaixo deve ser removido:

Código:
    MC.Data BETWEEN : PDATA1 AND : PDATA2


ficando somente esse:

Código:
    MC.Data <= : PDATA2


Dessa forma a query vai retornar os registros anteriores ao período mas eles só vão ser utilizados para a soma do saldo, não vão ser retornados pela procedure, mas para isso tem que ser adicionado aquele If antes do Suspend.
Não tinha entendido que você queria o saldo em uma linha inicial separada. Você não consegue pegar o primeiro registro e calcular o saldo anterior?
Bom dia Imex,

Não preciso exatamente ser em uma linha, acho que ja vi isso quando usava PostgresSQL o CTE

Pode ser na lateral cada campo pois vou colocar umum relatorio

Esse relatorio terá os seguintes filtros
Periodo De até tal data
e a conta se é unica ou varias contas, pq agrupo aqui no relatorio por conta

Ai preciso a cada conta
PRIMEIRA LINHA DO RELATORIO
Saldo anterior a data periodo
DETALHE
Valores D/C que ja esta mostrando no meu relatorio
ABAIXO DO DETALHE DE CADA GRUPO DE CONTA
Total de Entrada
Total de Saida
Saldo Final

Minha SP agora esta montada assim
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,
    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
      MC.valor
    end) as valor,
    IIF( MC.TIPO IN (0, 3), 'D', 'C'),
    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)
    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
    MC.Data BETWEEN : PDATA1 AND : PDATA2
    AND POSITION(cast(MC.STATUS as varchar(255)) || ',', :PSTATUS) > 0
    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, : VALOR, : d_c,
    : DEPOSITO, : PAGAMENTO
    DO BEGIN
        IF (: STATUS <> 30) THEN
            SALDO = SALDO + DEPOSITO - PAGAMENTO;
    SUSPEND;
    END
END


Acho que aqui tenho algumas informações que posso usar no relatorio, se conseguir todas informações fica show.

Entendeu agora a necessidade?

Será que tem como ter essas informações em um unico sql?
_________________
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 11:25 am    Assunto: Responder com Citação

Experimente fazer uns testes com essa versão com algumas pequenas alterações para ver se é retornado o resultado esperado:

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
      MC.valor
    end) as valor,
    IIF( MC.TIPO IN (0, 3), 'D', 'C'),
    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)
    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
    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, : VALOR, : d_c,
    : DEPOSITO, : PAGAMENTO
    DO BEGIN
        SALDO_ANT = SALDO;
        IF (: STATUS <> 30) THEN
            SALDO = SALDO + DEPOSITO - PAGAMENTO;
        if (: DATA >= : PDATA1) THEN
            SUSPEND;
    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 2:33 pm    Assunto: Responder com Citação

Boa tarde Imex, fiz aqui, mais achei muito pesado para executar o SP

Ficou assim (Tinha campos com valores errados no case do meu select que arrumei)
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
    SUSPEND;
    END
END

Mais ao executar fica muito pesado
_________________
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 Ter Fev 23, 2021 2:55 pm, num total de 1 vez
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 2:42 pm    Assunto: Responder com Citação

adriano_servitec escreveu:
Boa tarde Imex, fiz aqui, mais achei muito pesado para executar o SP

Ficou assim (Tinha campos com valores errados no case do meu select que arrumei)
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
    SUSPEND;
    END
END

Mais ao executar fica muito pesado


Em um post anterior, vc me ajudou com a lentidão fazendo desta forma o select
Código:
select
    conta.id,
    replace (conta.nome,  '  ', ' ') AS nome,
    (select SUM(movconta.valor * CASE WHEN movconta.tipo in (0, 3) THEN 1 ELSE -1 END)
     from movconta
     where conta.id = movconta.id_conta) AS valor
from conta
where conta.inativo = 0
ORDER BY conta.nome


Mais ai pega o saldo atual
_________________
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 3:30 pm    Assunto: Responder com Citação

Um teste que você pode fazer é remover todos os Joins possíveis de dentro da procedure, e coloca-los na query de fora que chama a procedure.
Pelo que vi rapidamente acho que só o Join com a tabela Cliente teria que ser mantido dentro da procedure porque tem um campo dessa tabela que é utilizado no Where.

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 3:40 pm    Assunto: Responder com Citação

imex escreveu:
Um teste que você pode fazer é remover todos os Joins possíveis de dentro da procedure, e coloca-los na query de fora que chama a procedure.
Pelo que vi rapidamente acho que só o Join com a tabela Cliente teria que ser mantido dentro da procedure porque tem um campo dessa tabela que é utilizado no Where.

Espero que ajude
O que seria query de fora? Não entendi não esta tudo dentro de um FOR?
_________________
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 4:23 pm    Assunto: Responder com Citação

A query de fora a que me referi seria onde você tem algo parecido com o que segue:

Código:
select * from MinhaProcedure


Mas revendo acho que também é possível adicionar umas querys antes do Suspend para acrescentar os campos das outras tabelas que são obtidos originalmente com o Join. Segue um exemplo com a tabela de centro de custos:

Código:
        IF (: DATA >= : PDATA1) THEN
          BEGIN
            SELECT CC.NOME INTO :NOME_CCUSTO
            FROM CENTRODECUSTO CC
            WHERE CC.ID = :ID_CCUSTO;

            SUSPEND;
          END


Acho que retirar esses Joins talvez ajude porque eles não são necessários para os registros anteriores ao período já que esses registros servem apenas para o saldo.

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 4:28 pm    Assunto: Responder com Citação

imex escreveu:
A query de fora a que me referi seria onde você tem algo parecido com o que segue:

Código:
select * from MinhaProcedure


Mas revendo acho que também é possível adicionar umas querys antes do Suspend para acrescentar os campos das outras tabelas que são obtidos originalmente com o Join. Segue um exemplo com a tabela de centro de custos:

Código:
        IF (: DATA >= : PDATA1) THEN
          BEGIN
            SELECT CC.NOME INTO :NOME_CCUSTO
            FROM CENTRODECUSTO CC
            WHERE CC.ID = :ID_CCUSTO;

            SUSPEND;
          END


Acho que retirar esses Joins talvez ajude porque eles não são necessários para os registros anteriores ao período já que esses registros servem apenas para o saldo.

Espero que ajude


Mais ai tenho que retirar algo ?
Pq se coloca ro select ai ta dando erro no INTO
Código:
        IF (: DATA >= : PDATA1) THEN
          BEGIN
            SELECT CC.NOME INTO :NOME_CCUSTO
            FROM CENTRODECUSTO CC
            WHERE CC.ID = :ID_CCUSTO;

            SUSPEND;
          END


Devo colocar todos select aqui dentro?

Vai ser 2 SUSPEND?
_________________
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 4:39 pm    Assunto: Responder com Citação

Experimente deixar o Into depois do Where:

Código:
        IF (: DATA >= : PDATA1) THEN
          BEGIN
            SELECT CC.NOME
            FROM CENTRODECUSTO CC
            WHERE CC.ID = :ID_CCUSTO
            INTO :NOME_CCUSTO;

            SUSPEND;
          END


Se funcionar acho que vai ser necessário um Select para cada Join removido.
O Suspend é um só, o If e o Suspend que estão no exemplo acima já existem na versão anterior.

Espero que ajude
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 3 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