Witam, piszę program w deplhi2010 z obsługą bazy PostgreSQL, stanąłem na formatce, na której chcę wyświeilić wyfiltrowane dane i sumy wierszy, problem polega, że suma kolumny paca_jazda (zmienna Date Time) zamiast prawidłowego wyniku 25:25 pokazuje 01:25, jakiej funkcji sumującej mogę użyć, lub jak prawidłowo zsumować wiersze w danej kolumny. Za pomoc z góry dziękuję
jesteś pewien że to pole typu ftdateTime
? wg mnie jest typu ftTime
, wskazuje na to format wyświetlania danych w gridzie, i dlatego 25 h i 25 min jest konwertowane na 1 h 25 min
przyjrzyj się czemuś co się nazywa TTimeSpan to powinno rozwiązać twój problem
Typy Tdate, TTime, TDateTime są tożsame z typem double
gdzie część całkowita odpowiada za zapis dni, a ułamkowa godzin,minut,sekund,milisekund ... Czyli 2.00 to dwa dni, 2.50 - 2 dni 12 h .
Data jest zapisywana jako liczba dni licząc od 30.12.1899.
Stąd do obliczeń nieraz wygodniej jest traktować zmienne tych typów jako double.
np:
procedure TForm1.Button1Click(Sender: TObject);
var
t: TDateTime;
begin
t := 0.5;
ShowMessage(DateTimeToStr(t));
end;
Dziiękję za wszelką pomoc, ale zbyt słaby jestem bym sobie sa poradził.Jak to zapisać w kodzie
@janusz.p27111960:
pokaż jak wyliczasz sumę
procedure TForm5.Dopisz1Click(Sender: TObject);
var
a: TdateTIME;
begin
zquery2.filter:='dd=1 and mm=6 and rr=2019';
zquery2.Filtered:=true;
zquery2.First;
while not ZQuery2.Eof do
begin
a:=a+zquery2.FieldByName('praca_jazda').asDateTime;
zquery2.Next;
end;
maskedit1.text:=Format('%d:%s',[HourOf(a),FormatDateTime('nn',a)]);
maskedit2.text:=timetostr(a);
Funkcje konwertujące zmienną typu TTime do stringa nie wyświetlą ci nigdy godziny "25:25" ponieważ nie ma godziny 25. Godzina 25:25 to inaczej 1:25 następnego dnia.
Uses System.TimeSpam;
procedure Tmain.Button1Click(Sender: TObject);
var
Razem: TTimeSpan;
czas1, czas2: TTime;
begin
czas1 := Now; // 23:00:00
czas2 := Now; // 23:00:00
Razem := TTimeSpan.Parse(TimeToStr(czas1)) + TTimeSpan.Parse(TimeToStr(czas2));
ShowMessage(Format('%d:%.2d:%.2d', [Razem.Days * 24 + Razem.Hours, Razem.Minutes, Razem.Seconds])); // 46:00:00
end;
Wszystko fajnie a jak to zapisać w pętli dla np 10 wieszy
piszę z pamięci:
with DataModule.qrypytanie, SQL do
begin
Clear;
Close;
Add('select kolumna_z _czasem from twoja_tabela');
Open;
First;
end;
while not DataModule.qrypytanie.Eof do
begin
Razem := Razem + TTimeSpan.Parse(TimeToStr(DataModule.qrypytanie.FieldByName('twoja_kolumna_z_czasem').AsTime));
DataModule.qrypytanie.Next;
end;
Niestety nie działa pokazuje mi wynik 0014
proszę o pomoc, co jest nie tak w tych obliczeniach (kodzie)
nit Unit5;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, DBCtrls, DB, ZAbstractRODataset, ZAbstractDataset,
ZDataset, ZAbstractConnection, ZConnection, Menus, Grids, DBGrids, DateUtils, TimeSpan,
ADODB;
type
TForm5 = class(TForm)
DBGrid1: TDBGrid;
MainMenu1: TMainMenu;
Dopisz1: TMenuItem;
Popraw1: TMenuItem;
skasuj1: TMenuItem;
Zakocz1: TMenuItem;
ZConnection1: TZConnection;
ZQuery2: TZQuery;
DataSource2: TDataSource;
MaskEdit1: TMaskEdit;
MaskEdit2: TMaskEdit;
MaskEdit3: TMaskEdit;
Label1: TLabel;
ADOConnection1: TADOConnection;
procedure Dopisz1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form5: TForm5;
implementation
{$R *.dfm}
procedure TForm5.Dopisz1Click(Sender: TObject);
var
a: TTime;
Razem: TTimeSpan;
begin
zquery2.filter:='dd=1 and mm=6 and rr=2019';
zquery2.Filtered:=true;
zquery2.First;
while not ZQuery2.Eof do
begin
razem:=razem+TTimeSpan.Parse(timetostr(zquery2.fieldbyname('praca_jazda').asdatetime));
zquery2.Next;
end;
maskedit1.Text:=format('%.2d:%.2d:%.2d',[Razem.Days * 24 + Razem.Hours, Razem.Minutes, Razem.Seconds]); ;
end;
end.
ponownie zgłaszam się z problemem, moja aplikacja zbiera informację z kart pracy pracowników (baza postrgres, delphi 2010, komponenty zeos, po przetestowaniu wiem, że zapytanie
select sum(g_jazdy) from kartapracy where ....... działa prawidłowo (jak w załączniku
mam tylko problem jak je umieścić w kodzie i wynik zapisać w labelededit-cie
procedure TForm6.Button1Click(Sender: TObject);
begin
if labelededit4.text<>'' then
begin
zquery1.Filter:='kierowca='+dblookupcombobox1.Text+' and dd1='+QuotedStr(labelededit4.text)+' and mm1='+QuotedStr(labelededit1.text)+' and rr1='+QuotedStr(labelededit2.text);
end;
if labelededit4.text='' then
begin
zquery1.Filter:='kierowca='+dblookupcombobox1.Text+' and mm1='+QuotedStr(labelededit1.text)+' and rr1='+QuotedStr(labelededit2.text);
end;
zquery1.filtered:=true;
button2.Visible:=true
{
zquery1.First;
with zquery1, SQL do
begin
Close;
Clear;
('select sum(godz_jazdy)';
zqiery1.ExecSQL;
end;
labelededit3.text:=timetostr(f1)
}
end;
labeledit.Text:=zquery1.Fields[1].AsString;