Importação de Horas Planilha

29/03/2023

0

Amigos,

Estou precisando de importar uma planilha que contém horas trabalhadas.
O meu problema é que na planilha tenho horas maior que 24horas e Horas negativas, no formato hh:mm
Ex:
26:25
02:25
-30:30
10:08
09:26


Quando faço a importação, as horas maiores que 24h vem com o desconto de 24h.
Ex.
26:25 ->   2:25   -> ERRADO
02:25 ->  2:25   ->  certo
-30:30 -> -6,30  ->  ERRADO
10:08 ->  10:08 -> certo


Para importação fiz da seguinte forma:
Var sh : Variant;
Saldo : String;
Begin 
      Col2 := 3;
     Wlinha := 1;
      Repeat
            SH     := Busca_na_planilha(WLinha,Col2); 
            //Resultado do SH antes de formatar:   1,100694 -> 1,100694 -> -1,2708333 -> 0,4222
            Saldo  := FormatDateTime('hh:mm',SH);
            //Resultado do Saldo após formatar:   2:25 -> 2:25 -> 6:30  -> 10:08
            //Se SH negativa, coloco o sinal de negativo.
            if Copy(Sh,1,1) = '-' then
                Saldo := '-' + Saldo; 
           //Resultado final do Saldo após formatar:   2:25 -> 2:25 -> -6:30 -> 10:08
            
            Inc(Wlinha);    
   until Wlinha > 10
End;

A saida correta deveria ser:
26:25 -> 2:25 -> -30:30 -> 10:08
Dirceu Morais

Dirceu Morais

Responder

Posts

30/03/2023

Dirceu Morais

Amigos, eu não encontrei uma solução para o problema mencionado. Procurei na internet e não encontrei.

Para resolver o problema - não sei se é a melhor solução - eu fiz da seguinte forma.


Para importação fiz da seguinte forma:
Var sh : Variant;
Saldo : String;
i : Integer;
Begin 
      Wlinha := 1;
      Repeat
            SH     := Busca_na_planilha(WLinha,3); 
            //Resultado do SH antes de formatar:   1,100694 ->  0,100694 -> -1,2708333 -> 0,4222
            Saldo  := FormatDateTime('hh:mm',SH);
           //Resultado do Saldo após formatar:   2:25 -> 2:25 -> 6:30  -> 10:08
            //AQUI EU VERIFICO SE A PARTE INTEIRO SO VALOR QUE EU BUSQUEI É MAIOR QUE ZERO.
            //SE FOR MAIOR QUE ZERO, É PQ A HORA É MAIOR QUE 24H (24 = 1, 48 = 2, 72= 3....)
            y := Abs(Trunc(Sh)); //Pego a parte inteira 
            if (y > 0) then      //Ver se é maior que zero
            Begin
               y := 2400 * y;   //Multiplico por 24horas   
               //1º Registro passa por aqui, 1*2400 = 2400 'mais' 2:25 = 26:25
               //3º Registro passa por aqui, 1*2400 = 2400 'mais' 6:30 = 30:30 
               Saldo := Somar_Horas(Saldo,ConfiguraHora(IntToStr(y)));  //Soma o SALDO + HORAS
            End;         

           //Se SH negativa, coloco o sinal de negativo. No 3º Registro, passa aqui
            if Copy(Sh,1,1) = '-' then
                Saldo := '-' + Saldo; 
           //Resultado final do Saldo após formatar:   26:25 -> 2:25 -> -30:30 -> 10:08
            
            Inc(Wlinha);    
   until Wlinha > 10
End;

Responder

30/03/2023

Arthur Heinrich

var
  d Double;
  m : String;
...
  d:=SH;
  m:=IntToStr(trunc(Frac(d*24)*60));
  if (Length(m)=1) then m:='0'+m;
  Saldo:=IntToStr(trunc(d*24))+':'+m;
...

Responder

30/03/2023

Stella Oliveira

Para importar uma planilha que contém horas trabalhadas em formato hh:mm, incluindo horas maiores que 24 e horas negativas, em Delphi, você pode seguir os seguintes passos:

uses XlsFile;

var
  xls: TXlsFile;
  row, col: integer;
begin
  xls := TXlsFile.Create;
  try
    xls.Open('caminho_para_o_arquivo.xls');
    for row := 1 to xls.RowCount do
    begin
      for col := 1 to xls.ColCount do
      begin
        // Processa as células da planilha
      end;
    end;
  finally
    xls.Free;
  end;
end;


Para converter as horas do formato hh:mm para um formato que pode ser armazenado em um banco de dados, você pode usar a função StrToTime. Por exemplo:

var
  horaStr: string;
  hora: TDateTime;
begin
  horaStr := '27:30';
  hora := StrToTime(horaStr);
end;


Para lidar com horas maiores que 24 horas, você pode armazenar as horas em um TDateTime e, em seguida, subtrair a data de referência, que é 30 de dezembro de 1899. Por exemplo:

var
  hora: TDateTime;
  dataReferencia: TDateTime;
  dataHora: TDateTime;
begin
  hora := EncodeTime(27, 30, 0, 0);
  dataReferencia := EncodeDate(1899, 12, 30);
  dataHora := hora - dataReferencia;
end;


Para lidar com horas negativas, você pode armazenar as horas em um TDateTime e, em seguida, inverter o sinal do TDateTime. Por exemplo:

var
  horaNegativa: TDateTime;
  horaPositiva: TDateTime;
begin
  horaNegativa := EncodeTime(-2, 30, 0, 0);
  horaPositiva := -horaNegativa;
end;


Para inserir as horas no banco de dados, você pode usar um parâmetro de TDateTime em uma instrução SQL. Por exemplo:

var
  command: TADOCommand;
begin
  command := TADOCommand.Create(nil);
  try
    command.Connection := connection;
    command.CommandText := 'INSERT INTO Tabela (HorasTrabalhadas) VALUES (:horasTrabalhadas)';
    command.Parameters.ParamByName('horasTrabalhadas').Value := hora;
    command.Execute;
  finally
    command.Free;
  end;
end;


Lembre-se de adaptar o código de acordo com suas necessidades, como configurar as opções de tratamento de erros, ajustar as configurações de conexão e mapeamento de colunas, etc.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar