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 

Consulta travando para visualizar no dbgrid

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
tiago_ws
Membro Junior
Membro Junior


Registrado: Quarta-Feira, 14 de Setembro de 2005
Mensagens: 318

MensagemEnviada: Qui Jul 12, 2012 9:17 am    Assunto: Consulta travando para visualizar no dbgrid Responder com Citação

Bom Dia a Todos.
Estou começando a usar Store procedures para fazer consultas no meu sistema.
Uso delphi 7 e firebird 2.5.

Estou tendo um problema com a primeira consulta que eu fiz.
Chamo ela de dentro de um IBquery e mostro o resulta em um dbgrid,
mas quando vou rolando o dbgrid ela esta travando , da um tempinho libera de novo.

Não sei se estou fazendo alguma coisa errada ou se preciso usar outro componente para vizualizar este resultado.

Obrigado desde Ja.
Tiago W. Schneider.
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 Jul 12, 2012 10:51 am    Assunto: Responder com Citação

Bom dia,

Você testou a stored procedure com uma ferramenta como o IBExpert ou semelhante? Acontece a mesma coisa? Estão sendo retornadas muitas linhas?
A princípio você pode utilizar uma IBQuery para executar uma SP que retorna registros.
Acho que você teria que postar o código da sua SP para que todos possam analisar, caso não descubra o que está acontecendo.


Editado pela última vez por imex em Qua Mar 08, 2023 10:56 am, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tiago_ws
Membro Junior
Membro Junior


Registrado: Quarta-Feira, 14 de Setembro de 2005
Mensagens: 318

MensagemEnviada: Qui Jul 12, 2012 12:17 pm    Assunto: Responder com Citação

No ibexpert acontece a mesma coisa tb, e retorna muitas linhas mesmo, mas depois de chegar ao fim do arquivo não trava mais.

vou pastar ela aqui:

SET TERM ^ ;

create or alter procedure PROC_BMB690_VENDAS (
IN_FILIALINI varchar(3),
IN_FILIALFIM varchar(3),
IN_GRUPOINI varchar(3),
IN_GRUPOFIM varchar(3),
IN_DATAINI date,
IN_DATAFIM date,
IN_OPERADORINI varchar(3),
IN_OPERADORFIM varchar(3),
IN_PRODUTOINI integer,
IN_PRODUTOFIM integer)
returns (
OUT_PRODUTO integer,
OUT_GRUPO varchar(3),
OUT_PRODUTODESCRICAO varchar(50),
OUT_QUANTIDADE numeric(15,3),
OUT_VALORCUSTO numeric(15,2),
OUT_VALORVENDA numeric(15,2),
OUT_VALORTOTAL numeric(15,2),
OUT_PERCENTUAL numeric(15,2),
OUT_ULTIMOCUSTO numeric(15,3),
OUT_ULTIMAVENDA numeric(15,3),
OUT_TOTALCOMPRA numeric(15,2),
OUT_TOTALVENDA numeric(15,2),
OUT_GRUPODESCRICAO varchar(30))
as
declare variable VAR_CUSTO numeric(15,3);
declare variable VAR_COMBUSTIVEL varchar(1);
declare variable VAR_PRODUTO integer;
declare variable VAR_BICO varchar(2);
declare variable VAR_GRUPO varchar(3);
declare variable VAR_TOTALVENDA numeric(15,2);
declare variable VAR_TOTALCOMPRA numeric(15,2);
begin

OUT_QUANTIDADE = 0;
OUT_VALORCUSTO = 0;
OUT_VALORTOTAL = 0;
OUT_VALORVENDA = 0;
OUT_ULTIMAVENDA = 0;
OUT_ULTIMOCUSTO = 0;
VAR_GRUPO = '';

FOR SELECT
CTEPRO.PROCOD, CTEPRO.PROCOMBUS, CTEPRO.PROLIN, CTEPRO.PRODES,
CTELIN.LINDES
FROM
CTEPRO
INNER JOIN
CTEPRF ON (CTEPRF.PRFPRO = CTEPRO.PROCOD) AND
(CTEPRF.PRFFIL BETWEEN :IN_FILIALINI AND :IN_FILIALFIM)
LEFT JOIN
CTELIN ON (CTELIN.LINCOD = CTEPRO.PROLIN)
WHERE
PROCOD BETWEEN :IN_PRODUTOINI AND :IN_PRODUTOFIM AND
CTELIN.LINCOD BETWEEN :IN_GRUPOINI AND :IN_GRUPOFIM AND
CTEPRF.PRFSIT <> 'D'
ORDER BY
CTEPRO.PROLIN, CTEPRO.PROCOD
INTO
OUT_PRODUTO, VAR_COMBUSTIVEL, OUT_GRUPO, OUT_PRODUTODESCRICAO,
OUT_GRUPODESCRICAO
DO
BEGIN

IF (VAR_GRUPO <OUT_GRUPO> 0
INTO
OUT_QUANTIDADE
DO
BEGIN

/* PEGA O VALOR DE VENDA DO PRODUTO NA TABELA DE ALTERAÇÃO DE PREÇOS
CTECBA */
SELECT
OUT_VALORVENDA
FROM
PROC_ULTIMO_PRECO(:IN_FILIALINI,'',:IN_DATAFIM,2,1,:OUT_PRODUTO)
INTO
OUT_ULTIMAVENDA;

OUT_VALORVENDA = (:OUT_QUANTIDADE * :OUT_ULTIMAVENDA);

END

END
ELSE
BEGIN

FOR SELECT
COALESCE(SUM(BMBMBM.MBMTOTQTD),0)
FROM
BMBMBM
WHERE
BMBMBM.MBMFIL BETWEEN :IN_FILIALINI AND :IN_FILIALFIM AND
BMBMBM.MBMDAT BETWEEN :IN_DATAINI AND :IN_DATAFIM AND
BMBMBM.MBMFRE BETWEEN :IN_OPERADORINI AND :IN_OPERADORFIM AND
BMBMBM.MBMPRO = :OUT_PRODUTO AND
BMBMBM.MBMTOTQTD > 0
INTO
OUT_QUANTIDADE
DO
BEGIN

SELECT FIRST 1
BMBCOD
FROM
BMBBMB
WHERE
BMBFIL = :IN_FILIALINI AND
:IN_DATAFIM BETWEEN BMBDATINI AND BMBDATFIM AND
BMBPRO = :OUT_PRODUTO
ORDER BY
BMBCOD
INTO
VAR_BICO;

/* PEGA O VALOR DE VENDA DO PRODUTO NA TABELA DE ALTERAÇÃO DE PREÇOS
CTECBA */
SELECT
OUT_VALORVENDA
FROM
PROC_ULTIMO_PRECO(:IN_FILIALINI,:VAR_BICO,:IN_DATAFIM,1,1,:OUT_PRODUTO)
INTO
OUT_ULTIMAVENDA;

OUT_VALORVENDA = (:OUT_QUANTIDADE * :OUT_ULTIMAVENDA);

END

END

OUT_VALORCUSTO = (:OUT_QUANTIDADE * :OUT_ULTIMOCUSTO);
OUT_VALORTOTAL = (:OUT_VALORVENDA - :OUT_VALORCUSTO);
OUT_TOTALVENDA = (:OUT_TOTALVENDA + :OUT_VALORVENDA);
OUT_TOTALCOMPRA = (:OUT_TOTALCOMPRA + :OUT_VALORCUSTO);

IF ((:OUT_VALORCUSTO > 0) AND (:OUT_VALORVENDA > 0)) THEN
OUT_PERCENTUAL = (((:OUT_VALORVENDA / :OUT_VALORCUSTO) - 1) * 100);

IF (:OUT_QUANTIDADE > 0) THEN
SUSPEND;

END

end^
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 Jul 12, 2012 3:18 pm    Assunto: Responder com Citação

Achei meio difícil de analisar a sua SP, pois ela é bem longa, chama outras SP's e parece que uma parte foi distorcida pelo fórum:

Código:
IF (VAR_GRUPO <OUT_GRUPO> 0
INTO


Se não me engano quando são retornados muitos registros, tanto o IBExpert como os componentes da aba Interbase fazem a carga dos registros por demanda, por isso você está percebendo uma certa lentidão em alguns momentos e depois no final não percebe mais, pois neste momento todos os registros já estão carregados.
Não conheço muito bem os componentes da aba Interbase, por isso não sei se é possível alterar o modo como os registros são carregados, se bem que acho que seria mais o caso de tentar otimizar o máximo possível esta SP ou até mesmo enxuga-la.

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tiago_ws
Membro Junior
Membro Junior


Registrado: Quarta-Feira, 14 de Setembro de 2005
Mensagens: 318

MensagemEnviada: Sex Jul 13, 2012 2:18 pm    Assunto: Responder com Citação

nao tem como eu mostrar esta consulta so depois de ela montar toda
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: Sex Jul 13, 2012 3:31 pm    Assunto: Responder com Citação

Como disse antes, não tenho experiência com os componentes da aba Interbase, mas experimente aumentar o valor da propriedade BufferChunks da sua IBQuery.
Outra tentativa seria ligar um DataSetProvider e um ClientDataSet com a sua IBQuery, passando a ligar o DBGrid com o ClientDataSet.

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tiago_ws
Membro Junior
Membro Junior


Registrado: Quarta-Feira, 14 de Setembro de 2005
Mensagens: 318

MensagemEnviada: Sex Jul 13, 2012 4:03 pm    Assunto: Responder com Citação

Qual o componente que vc usa imex so pra mim fazer um teste
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: Sex Jul 13, 2012 4:22 pm    Assunto: Responder com Citação

DBExpress, mas acho que o resultado vai ser o mesmo se você fizer a ligação da IBQuery com um ClientDataSet .
Você pode conferir um exemplo de ligação no tópico abaixo, substituindo no caso o SQLConnection pelo IBDatabase e a SQLQuery pela IBQuery.
http://www.activedelphi.com.br/forum/viewtopic.php?p=330409&sid=e67b2dc77ccda8a2e4277cee665a79ce

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
Página 1 de 1

 
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