|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jan 15, 2021 2:33 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Fev 22, 2021 2:32 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Fev 22, 2021 4:24 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Fev 22, 2021 4:42 pm Assunto: |
|
|
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 |
|
|
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: Ter Fev 23, 2021 10:10 am Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 23, 2021 10:26 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Fev 23, 2021 11:25 am Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 23, 2021 2:33 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 23, 2021 2:42 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Fev 23, 2021 3:30 pm Assunto: |
|
|
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 |
|
|
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: Ter Fev 23, 2021 4:23 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Fev 23, 2021 4:28 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Fev 23, 2021 4:39 pm Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|