Não mostra resultado dos recordscounts nos labels?
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
Posts
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?
26/05/2008
Adriano_servitec
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.
Clique aqui para fazer login e interagir na Comunidade :)