DELPHI - SUSPENDER EXECUÇÃO DE QUERY -> THREAD ADO SQL 2008
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
-----------------------------------------------
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
Curtidas 0
Melhor post
Raylan Zibel
16/03/2017
Se é uma thread, poque trava?
Não entendi.
QUE NA VERDADE ESTÁ SENDO EXECUTADA NO SERVIDOR SQL.
Não entendi.
GOSTEI 1
Mais Respostas
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
16/03/2017
O que demora é a abertura da Query? Ou alguma rotina de leitura?
GOSTEI 1
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;
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
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
16/03/2017
Sim trava no dm1.adoquery1.active=true;
Query não terminada.
Query não terminada.
GOSTEI 0
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
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
-----------------------------------------------
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
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