| 
			
				|  | 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: |   |  
				| 
 |  
				| Bom dia Imex, 	  | 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?
 | 
 
 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.
 
 |  |