Sumownie czasu z wierszy

0

Witam mam pytanie w jaki najprostszy i najszybszy sposób z sumowac dane z kolumny w DBGridzie.
Jest kolumna o nazwie [czas wykonania]

|czas wykonania| SUMA |
0001 0102
0002
0059

Dane te wyświetlane są w DBGrid poprzez zapytanie:

(' SELECT [czas wykonania], Suma='''+wynik+''' FROM Time 'ADOQuerry1)

i tak chciałbym aby w kolumnie wynik zsumowało mi czasy wykonania z Tabeli TIME

Proszę o pomoc.

0

Nie mam DBGrida, bo używam Delphi 7 Personal, a poza tym mam niemal zerowe doświadczenie gdy
chodzi o bazy danych, ale sumowanie czasów zrobił bym tak jak pokazałem poniżej. Oto dwie funkcje:

function Time2Secs(Time: TDateTime): integer;
var
  T : LongInt;
begin
  T := (StrToInt(FormatDateTime('hh', Time)) * 3600)
     + (StrToInt(FormatDateTime('nn', Time)) * 60)
     + (StrToInt(FormatDateTime('ss', Time)));
  Result := T;
end;

function Secs2Time(Sec: Integer): string;
var
  ZH, ZM, ZS: Integer;
begin
  if (Sec > 0) then
    begin
    ZH := Sec div 3600;
    ZM := Sec div 60 - ZH * 60;
    ZS := Sec - (ZH * 3600 + ZM * 60);
    Result := Format('%0.2d:%0.2d:%0.2d', [ZH, ZM, ZS]);
    end
    else
    begin
    Result := Format('%0.2d:%0.2d:%0.2d', [0, 0, 0]);
    end;
end;

Następnie sumowanie zrobiłem ze StringGrida. W DBGrid, pewnie używa się identycznych własnośći.
W kolumnie o indeksie zero od zerowego wiersza do tego o indeksie dwa są takie czasy jak podałeś,
a następnie po kliknięciu w Button wykonywany jest poniższy kod i jako wynik podawany jest czas w
kolumnie o indeksie jeden, a w wierszu o indeksie zero. Kod sobie możesz dopasować do użytego
przez Ciebie DBGrida. Funkcja Secs2Time była w orginale ograniczona do ilości sekund w jednej
dobie, ale ponieważ tutaj sumy mogą wyjść większe to zrobiłem sptawdzanie czy sekundy > zera.

var
  I, Sekundy : integer;
begin
  Sekundy := 0;
  for I := 0 to StringGrid1.RowCount - 1 do
    begin
    Sekundy := Sekundy + Time2Secs(StrToTime(StringGrid1.Cells[0, I]));
    end;
  StringGrid1.Cells[1, 0] := Secs2Time(Sekundy);
end;
0

Po pierwsze: zamiana czasu na sekundy, a potem sekund na czas - zgadza się.
Po drugie - z poziomu DBGrida to będzie wolne. I jeśli chcesz tak robić, to musisz najpierw dać disableControls, a po pętli enableControls(w datasecie oczywiście).

A najlepiej jak to zrobisz na poziomie SQL:

SELECT sum(dbo.timeToSec(pole_z_czasem))
FROM tabela

To jest jedno rozwiązanie i dostaniesz wtedy ilość sekund, które będziesz musiał zamienić na czas w aplikacji, lub:

SELECT dbo.SecToTime(sum(dbo.timeToSec(pole_z_czasem)))
FROM tabela

i dostaniesz wtedy to, co zwróci funkcja SecToTime.
Oczywiście timeToSec i SecToTime musisz sam sobie napisać.

Niemniej jednak wykonanie operacji z poziomu SQL będzie duuuuuuużo szybsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1