Fórum Não mostra resultado dos recordscounts nos labels? #358603
16/05/2008
0
Olhe
As partes que estão em azul deveria funcionar, ou seja mostrar no labels, mão não estão, debuguei o codigo pra ver e esta aparecendo certo la no debug, pq então não mostra o resultado no labels?
Este comando é para exportar para uma planilha excel.
Adriano_servitec
Curtir tópico
+ 0Posts
16/05/2008
Adriano_servitec
Se eu deixar esta linha aqui sem comentar
[b:38eecb0912]Application.ProcessMessages; // pode deixar a execução mais lenta, porém, não trava a aplicação durante o while[/b:38eecb0912]
Reclama o erro:
[color=red:38eecb0912][Error] unt.pas(202): Undeclared identifier: ´ProcessMessages´[/color:38eecb0912]
O que será que esta faltando, algum LIB no Uses da Unit?
Gostei + 0
19/05/2008
Adriano_servitec
Gostei + 0
19/05/2008
Joaoshi
Gostei + 0
26/05/2008
Adriano_servitec
Gostei + 0
26/05/2008
Emerson Nascimento
var
lin: integer;
book_mark: TBookmark; //ponteiro
Resultado : String;
HoraAnterior: TTime;
TotalDeRegistros: Integer;
begin
//Seleciona a planilha em que trabalharemos que no caso é a primeira plan (Worksheet[1])
ExcelWorkSheet1.ConnectTo(Excel.Worksheets[1] as _Worksheet);
//Ativa esta planilha
ExcelWorkSheet1.Activate;
// Dá a ela um nome
ExcelWorkSheet1.Name := ´Teste.xls´;
lin:=2; //atribui 2 a variável que indicará a linha que será utilizada para escrever os dados
with Excel do
begin
//nomeação das colunas na planilha que estamos criando
Range[´A1´,´A1´].Value2 := ´País´;
Range[´B1´,´B1´].Value2 := ´Nº Nota Fiscal´;
Range[´C1´,´C1´].Value2 := ´Data Emissão´;
Range[´D1´,´D1´].Value2 := ´Código do Cliente´;
Range[´E1´,´E1´].Value2 := ´Valor Total do ICMS´;
Range[´F1´,´F1´].Value2 := ´Valor Total da Mercadoria´;
Range[´G1´,´G1´].Value2 := ´Valor Total da Nota Fiscal´;
{:Armazena a posição atual, criando um marcador}
book_mark := SQLDataSet.GetBookmark;
with SQLDataSet do //QueryComOsDados é uma TQuery contendo os dados que
//advindos do Banco de Dados, os quais serão exportados.
begin
Close;
Open;
First;
TotalDeRegistros := RecordCount;
prog.Position := 0;
prog.Max := TotalDeRegistros; //definindo o valor máximo da barra de progresso, que é
//o total de registros da Query, já que exportaremos
// todas as linhas da mesma
label9.Caption := IntToStr(TotalDeRegistros); //e tambem no label;
HoraAnterior := Now;
while not EOF do //Até o fim da Query...
begin
Resultado := IntToStr(TotalDeRegistros - (lin - 1));
try
Label10.Caption := ´Média de execução: ´+
FormatFloat(´#0.00´, (lin - 2) / SecondsBetween(Now, HoraAnterior))+ ´ p/s´;
except
end;
Label11.Caption := ´Faltando ´+ resultado +´ registros´;
try
Label12.Caption := ´Tempo estimado: ´+
FormatFloat(´0´, Round(((Now - HoraAnterior) / (lin - 2)) *
(TotalDeRegistros - (lin - 2)) * 100000))+ ´ seg.´;
except
end;
Label13.Caption := ´Tempo decorrido: ´+
FormatFloat(´0´, SecondsBetween(Now, HoraAnterior))+ ´ seg.´;
Forms.Application.ProcessMessages;
//Abaixo, fazemos uma atribuição dos campos da tabela à célula em que
//queremos que estes dados sejam escritos
// ´A´+inttostr(lin) retorna A2, A3, A4 de acordo com cada repetição
Range[´A´+inttostr(lin),´A´+inttostr(lin)].Value2 := ´Brasil´;
Range[´B´+inttostr(lin),´B´+inttostr(lin)].Value2 := FieldByName(´num_nff´).Value;
Range[´C´+inttostr(lin),´C´+inttostr(lin)].Value2 := FieldByName(´dat_emissao´).Value;
Range[´D´+inttostr(lin),´D´+inttostr(lin)].Value2 := FieldByName(´cod_cliente´).Value;
Range[´E´+inttostr(lin),´E´+inttostr(lin)].Value2 := FieldByName(´val_tot_icm´).Value;
Range[´F´+inttostr(lin),´F´+inttostr(lin)].Value2 := FieldByName(´val_tot_mercadoria´).Value;
Range[´G´+inttostr(lin),´G´+inttostr(lin)].Value2 := FieldByName(´val_tot_nff´).Value;
Next; // Vai para o segundo registro da Query com os dados
prog.Position := prog.Position + 1; //Incrementa a barra de progresso
lin := lin+1; // incrementa a variável lin para que o os dados do próximo registro
// sejam escritos na próxima linha da planilha
end;
SQLDataSet.GotoBookmark(book_mark);
SQLDataSet.FreeBookmark(book_mark);
//Close; //Fecha a Query
end;
try
Label10.Caption := ´Média de execução: ´+
FormatFloat(´#0.00´, TotalDeRegistros / SecondsBetween(Now, HoraAnterior))+ ´ p/s´;
except
end;
// Utiliza o recurso auto-dimensionar para ajustar o tamanho das colunas
Columns.AutoFit;
// Centraliza o texto contido no intervalo de células entre A1 e última linha utilizada de C
Range[´A1´, ´D´+inttostr(lin)].HorizontalAlignment := xlcenter;
Range[´E1´, ´G´+IntToStr(lin)].HorizontalAlignment := xlRight;
end;
end;o que estava tornando a execução lenta não era o método ProcessMessages, e sim as várias chamadas a RecordCount. aprenda que toda vez que esse método é chamado, os registros são recontados pelo dataset. coloquei o resultado do RecordCount numa variável e passei a usar essa variável para não comprometer a performance.
sem contar que os cálculos para aferição de tempo estimado e média de registros por segundo estava errada.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)