 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
tiago_ws Membro Junior

Registrado: Quarta-Feira, 14 de Setembro de 2005 Mensagens: 318
|
Enviada: Qui Jul 12, 2012 9:17 am Assunto: Consulta travando para visualizar no dbgrid |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Jul 12, 2012 10:51 am Assunto: |
|
|
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 |
|
 |
tiago_ws Membro Junior

Registrado: Quarta-Feira, 14 de Setembro de 2005 Mensagens: 318
|
Enviada: Qui Jul 12, 2012 12:17 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Jul 12, 2012 3:18 pm Assunto: |
|
|
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 |
|
 |
tiago_ws Membro Junior

Registrado: Quarta-Feira, 14 de Setembro de 2005 Mensagens: 318
|
Enviada: Sex Jul 13, 2012 2:18 pm Assunto: |
|
|
nao tem como eu mostrar esta consulta so depois de ela montar toda |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jul 13, 2012 3:31 pm Assunto: |
|
|
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 |
|
 |
tiago_ws Membro Junior

Registrado: Quarta-Feira, 14 de Setembro de 2005 Mensagens: 318
|
Enviada: Sex Jul 13, 2012 4:03 pm Assunto: |
|
|
Qual o componente que vc usa imex so pra mim fazer um teste |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|