GARANTIR DESCONTO

Fórum DELPHI - SUSPENDER EXECUÇÃO DE QUERY -> THREAD ADO SQL 2008 #578029

16/03/2017

0

THREAD ADO SQL 2008 - DELPHI
-----------------------------------------------

ATRAVÉS DE UMA THREAD EXECUTO UMA QUERY LISTANDO AS INFORMAÇÕES DE VENDAS EM UM PERIODO.

ISSO FUNCIONA PERFEITAMENTE.

O PROBLEMA É QUANDO O USUÁRIO PEGA UM PERÍODO MUITO
GRANDE E SEM PACIENCIA TENTA ENCERRAR A CONSULTA,
E O SISTEMA TRAVA, POIS A THREAD AINDA NÃO TERMINOU.

Pergunta:

COMO SUSPENDER A EXECUÇÃO DESSA QUERY,
QUE NA VERDADE ESTÁ SENDO EXECUTADA NO SERVIDOR SQL.


TENHO PROCURADO SEM EXITO UMA FORMA DE INTERROMPER
ESSE PROCESSO.

Alguém tem alguma luz.

Obrigado.

CMKAS
Clarice Cmkas

Clarice Cmkas

Responder

Post mais votado

16/03/2017

Se é uma thread, poque trava?
QUE NA VERDADE ESTÁ SENDO EXECUTADA NO SERVIDOR SQL.

Não entendi.

Raylan Zibel

Raylan Zibel
Responder

Gostei + 1

Mais Posts

16/03/2017

Clarice Cmkas

PORQUE O USUARIO TENTA ENCERRAR A APLICAÇÃO COM A THREAD RODANDO, AINDA NÃO TERMINADA.
Responder

Gostei + 1

16/03/2017

Raylan Zibel

O que demora é a abertura da Query? Ou alguma rotina de leitura?
Responder

Gostei + 1

16/03/2017

Clarice Cmkas

Sim demora porque o usuário colocou um período muito grande, e a query demora a terminar, então desiste e tenta encerrar a aplicação.

Resumo da Thread

procedure TdatabaseThread.Execute;
var
wpdt1,wpdt2:Tdatetime;
wnat:string;
begin



if not dm1.ADOConnection1.Connected then
begin
CoInitialize(nil);
try
dm1.ADOConnection1.Connected:=true ;
Except
raise Exception.Create('Erro ao Conectar');
end;
end;

if not dm1.ADOConnection1.Connected then
Begin
MessageDlg('Erro de Conexão com o SQL, Informe ao Admistrador. ', mtInformation, [mbOK], 0);
exit;
end;



dm1.adoquery1.close;

dm1.adoquery1.SQL.clear;
dm1.adoquery1.sql.add(' SELECT A.EMP AS EMP,F2_DOC,F2_SERIE,F2_CLIENTE,F2_LOJA,F2_COND,F2_EMISSAO,F2_VALBRUT ');
dm1.adoquery1.sql.add(' ,F2_DESCONT,F2_TIPO,F2_FILIAL,E4_DESCRI,A1_GRPVEN,A1_CGC ');
dm1.adoquery1.sql.add(' ,C5_NUM,C5_XNOME,C5_YQUANT,C5_XQUANT,C5_DESCFI,C5_DESC1,C5_MENNOTA,C5_NAT ,C5_XVRTOT,C5_XCOMPL');
dm1.adoquery1.sql.add(' FROM Nfiscal NF ');
dm1.adoquery1.sql.add(' INNER JOIN Pedidonf A ON A.EMP=NF.EMP AND ');
dm1.adoquery1.sql.add(' F2_DOC=C5_YNOTA AND F2_SERIE=C5_XSERIE AND F2_FILIAL=C5_FILIAL ');
dm1.adoquery1.sql.add(' INNER JOIN Cond_pagto B ON A.EMP=B.EMP AND ');
dm1.adoquery1.sql.add(' E4_FILIAL = A.C5_FILIAL AND E4_CODIGO = F2_COND ');
dm1.adoquery1.sql.add(' LEFT JOIN Clientes D ON ');
dm1.adoquery1.sql.add(' A.EMP=D.EMP AND D.A1_COD=NF.F2_CLIENTE AND D.A1_FILIAL<> '+'''01'''+ ' AND '); //AND D.A1_FILIAL<>:w5 ') ;
dm1.adoquery1.sql.add(' (C5_TIPO <> '+'''B'''+ ' and C5_TIPO <> '+'''D'''+ ') ');
dm1.adoquery1.sql.add(' where ');
dm1.adoquery1.sql.add(' ( C5_NAT=:w1 OR C5_NAT=:w2 ) AND ');
dm1.adoquery1.sql.add(' F2_EMISSAO > = :w3 AND F2_EMISSAO < = :w4 ');
dm1.adoquery1.SQL.add(' AND F2_FILIAL<>:w5 ');

dm1.adoquery1.Parameters[0].Value:='1';
dm1.adoquery1.Parameters[1].value:='7';
dm1.adoquery1.Parameters[2].value:=dtos(wpdt1);
dm1.adoquery1.Parameters[3].value:=dtos(wpdt2);
dm1.adoquery1.Parameters[4].value:='01';



dm1.adoquery1.Prepared := true;

try
dm1.adoquery1.active:=true;
Except
begin
p_menu.StatusBar1.caption:='Erro de Conexão, ou limite de registros de retorno excedido, Reduza o período ';
exit;
end;
end;

while not dm1.adoquery1.Eof do
begin
..........inclui em um arquivo temporário

dm1.adoquery1.Next;
end;


dm1.adoquery1.close;
dm1.ADOConnection1.Connected:=false;

CoUninitialize;

end;


Constructor TdatabaseThread.create(dt1: TdateTime;dt2:Tdatetime);
begin
Fdt1:=dt1;
Fdt2:=dt2;
FreeOnTerminate:=true;
inherited create(false);
end;
Responder

Gostei + 0

17/03/2017

Raylan Zibel

try
dm1.adoquery1.active:=true;
Except
begin
p_menu.StatusBar1.caption:='Erro de Conexão, ou limite de registros de retorno excedido, Reduza o período ';
exit;
end;


É aqui que trava? Ou é em um while?
Responder

Gostei + 0

17/03/2017

Clarice Cmkas

Sim trava no dm1.adoquery1.active=true;


Query não terminada.
Responder

Gostei + 0

17/03/2017

Raylan Zibel

Tente usar um ClientDataset (com o datasetprovider apontando pro ADOQuery). O clientdataset tem uma propriedade PacketRecords, que permite trazer os registros em pacotes durante a leitura. Talvez evite o travamento.
Responder

Gostei + 0

17/03/2017

Gutemberg Silva

THREAD ADO SQL 2008 - DELPHI
-----------------------------------------------

ATRAVÉS DE UMA THREAD EXECUTO UMA QUERY LISTANDO AS INFORMAÇÕES DE VENDAS EM UM PERIODO.

ISSO FUNCIONA PERFEITAMENTE.

O PROBLEMA É QUANDO O USUÁRIO PEGA UM PERÍODO MUITO
GRANDE E SEM PACIENCIA TENTA ENCERRAR A CONSULTA,
E O SISTEMA TRAVA, POIS A THREAD AINDA NÃO TERMINOU.

Pergunta:

COMO SUSPENDER A EXECUÇÃO DESSA QUERY,
QUE NA VERDADE ESTÁ SENDO EXECUTADA NO SERVIDOR SQL.


TENHO PROCURADO SEM EXITO UMA FORMA DE INTERROMPER
ESSE PROCESSO.

Alguém tem alguma luz.

Obrigado.

CMKAS



TALVEZ ISSO POSSA AJUDÁ-LO: https://msdn.microsoft.com/pt-br/library/aa833250(v=vs.90).aspx
Responder

Gostei + 0

17/03/2017

Raylan Zibel

TALVEZ ISSO POSSA AJUDÁ-LO: https://msdn.microsoft.com/pt-br/library/aa833250(v=vs.90).aspx


É Delphi, não modo design do Visual Studio.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar