DELPHI - SUSPENDER EXECUÇÃO DE QUERY -> THREAD ADO SQL 2008

Delphi

16/03/2017

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

Curtidas 0

Melhor post

Raylan Zibel

Raylan Zibel

16/03/2017

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

Não entendi.
GOSTEI 1

Mais Respostas

Clarice Cmkas

Clarice Cmkas

16/03/2017

PORQUE O USUARIO TENTA ENCERRAR A APLICAÇÃO COM A THREAD RODANDO, AINDA NÃO TERMINADA.
GOSTEI 1
Raylan Zibel

Raylan Zibel

16/03/2017

O que demora é a abertura da Query? Ou alguma rotina de leitura?
GOSTEI 1
Clarice Cmkas

Clarice Cmkas

16/03/2017

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;
GOSTEI 0
Raylan Zibel

Raylan Zibel

16/03/2017

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?
GOSTEI 0
Clarice Cmkas

Clarice Cmkas

16/03/2017

Sim trava no dm1.adoquery1.active=true;


Query não terminada.
GOSTEI 0
Raylan Zibel

Raylan Zibel

16/03/2017

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.
GOSTEI 0
Gutemberg Silva

Gutemberg Silva

16/03/2017

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
GOSTEI 0
Raylan Zibel

Raylan Zibel

16/03/2017

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.
GOSTEI 0
POSTAR