Não mostra resultado dos recordscounts nos labels?

16/05/2008

1

Pessoal, eu quero mostrar em alguns labels o resultado contando o tempo de espera até que termine o comando, mais não esta funcionando.

Olhe

var lin: integer; book_mark: TBookmark; //ponteiro i, r, vpednenv, vpedenv : integer; Trans_Dat_Str, Resultado : String; HoraAnterior: TTime; PorSegundo: Integer; begin [color=blue:af0b41fd3d] HoraAnterior := Now; PorSegundo := 0;[/color:af0b41fd3d] //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; prog.Max := RecordCount; //definindo o valor máximo da barra de progresso, que é //o total de registros da Query, já que exportaremos // todas as linhas da mesma [color=blue:af0b41fd3d] label9.Caption := IntToStr(RecordCount); //e tambem no label;[/color:af0b41fd3d] while not EOF do //Até o fim da Query... begin [color=blue:af0b41fd3d] HoraAnterior := Now; Label10.Caption := ´Média de execução: ´+ IntToStr(PorSegundo); Resultado := IntToStr(SQLDataSet.RecordCount - SQLDataSet.RecNo); Label11.Caption := ´Faltando ´+ resultado +´ registros´; if PorSegundo <= 0 then //previne ´EdivByZero´ Label12.Caption := ´´ else Label12.Caption := ´Tempo estimado: ´+ CurrToStr((SQLDataSet.RecordCount - SQLDataSet.RecNo) / PorSegundo) +´ segundos´; // Application.ProcessMessages; // pode deixar a execução mais lenta, porém, não trava a aplicação durante o while[/color:af0b41fd3d] //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; [color=blue:af0b41fd3d] Inc(PorSegundo);[/color:af0b41fd3d] 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; // 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;


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.


Responder

Posts

Esqueci de dizer tambem

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?


Responder
sobe


Responder

19/05/2008

Joaoshi

[b:e70be5e570]Uses Forms[/b:e70be5e570];


Responder
[b:3c3663b19e]Uses Forms[/b:3c3663b19e];
Ja esta com esta lib na uses, algo mais? Obrigado


Responder
tente com este código:
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.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira