[ bobans72 @ 01.08.2014. 02:07 ] @
Pozdrav svima na forumu !

Da li neko zna kako da izračunam ukupno radno vreme sa cenom po satu ?
Pošto sam probao na ovaj način :

[code]
procedure TForm1.Button1Click(Sender: TObject);
var
Time:TTime;
Ukupno,Cena : Currency;
begin
Time:=StrToTime('100:00:00')*24;
Cena:=StrToFloat('1000');
Ukupno:= Time * Cena;
Edit1.Text := FormatFloat('###,##0.00',Ukupno);
end;
[code]

I dobijem grešku: ''100:00:00'' is not a valid time.

Menjao sam (TTime) i (StrToTime) u druge formate ali i dalje je problem '100:00:00'.
A kad postavim da bude vreme '10:00:00' onda dobijem traženi ukupan iznos (10.000,00) ali sa trocifrenim satima nastaje problem.
Da li neko može ispraviti ovu grešku ili postoji neki drugi način za izračunavanje ? Unapred hvala.

[ captPicard @ 01.08.2014. 08:15 ] @
Odakle vučeš podatak o vremenu? Tj. o satima?
Normalno je da ti daje grešku jer TTime ne može imati vrijednost 100 sati, može max 24.
[ ravni @ 01.08.2014. 09:00 ] @
Koliko se moze napabirciti iz ostataka dokumentacije za Delphi TTime podrzava do 24 sata.
Mozes da probas
• da nadjes neku biblioteku za rad za datumima/vremenskim intervalima ili
• da rucno parsiras taj string (100:00:00) ili
• da promenis GUI pa da u jednom polju dobijes sate a u drugom minute i onda normalizujes minute:
ukupnoSati = brojSati + broj minuta / 60
[ bobans72 @ 01.08.2014. 10:54 ] @
Pozz

Mislite kako sam došao do trocifrene sate (100:00:00).
Evo ovako:

Code:
// Ukupno radnih sati
 function Sati_Sec( Sati:string ):LongInt;
Var Sat,Min,Sec:LongInt;
begin
 Sati[Pos(':',Sati)]:= '[';
 Sati[Pos(':',Sati)]:= ']';
 Sat := StrToInt(Copy(Sati,1,Pos('[',Sati)-1));
 Min := StrToInt(Copy(Sati,Pos('[',Sati)+1,(Pos(']',Sati)-Pos('[',Sati)-1)));
 if Pos(':',Sati) > 0 then
    Sec := StrToInt(Copy(Sati,Pos(']',Sati)+1,(Pos(':',Sati)-Pos(']',Sati)-1)))
 else
    Sec := StrToInt(Copy(Sati,Pos(']',Sati)+1,2));
 Result := Sec + (Sat*3600) + (Min*60);
end;
 function Sec_Sati( Sec:LongInt ):string;
Var Sati,Min:LongInt;
  Tmp : Double;
begin
 Tmp := Sec / 3600;
 Sati := Round(Int(Tmp));
 Sec :=  Round(Sec - (Sati*3600));
 Tmp := Sec / 60;
 Min := Round(Int(Tmp));
 Sec :=  Round(Sec - (Min*60));
 Result := FormatFloat( '00', Sati )+ ':' + FormatFloat( '00', Min ) + ':' + FormatFloat( '00', Sec );
end;
procedure TForm1.Button3Click(Sender: TObject);
var
Total:Integer;
begin
Total:=0;
TablePrijavaOdjava.DisableControls;
TablePrijavaOdjava.First;
while not TablePrijavaOdjava.EOF do
begin
   Total := Total + Sati_Sec( TimeToStr(TablePrijavaOdjava.FieldByName('Ukupno_sati').AsDateTime));
  TablePrijavaOdjava.Next;
end;
TablePrijavaOdjava.EnableControls;
 UkupnoEdit1.Text :=(sec_Sati(Total));

end;
// Kraj ukupno sati


Što znači sabiranjem kolone (ukupno_sati) dobijene kalkulacijom prijave i odjave dobijem trocifrene sate
koje posle ovim kodom
Code:
//Ukupno radno vreme puta cena
Procedure TForm1.Button1Click(Sender: TObject);
var
Time:TTime;
Ukupno,Cena : Currency;
begin
Time:=StrToTime('100:00:00')*24;
Cena:=StrToFloat('1000');
Ukupno:= Time * Cena;
Edit1.Text := FormatFloat('###,##0.00',Ukupno);
end;
//Kraj ukupno isplata

trebam dobiti (Ukupno radno vreme) pomnoženo sa cenom po satu i da dobijem iznos za isplatu.
E sad gde mi je greška nemogu pronaći.
[ captPicard @ 01.08.2014. 11:19 ] @
Koliko vidim, varijabla Time ti slobodno može biti tipa Currency i onda nema problema.
[ reiser @ 01.08.2014. 16:33 ] @
Nemoj da konvertujes u string uopste, nego odradi nesto ovako:

Code:

var
  total_time: TDateTime;
begin
  total_time := 0;
  while not TablePrijavaOdjava.EOF do
  begin
    total_time := total_time + TablePrijavaOdjava.FieldByName('Ukupno_sati').AsDateTime;
    TablePrijavaOdjava.Next;
  end;

  ...
[ bobans72 @ 02.08.2014. 00:50 ] @
Ne vredi i dalje isto mogu menjati bilo koju varijablu tipa TDateTime ili pak tipa Currency opet
izbacuje istu grešku da nije validno vreme ('100:00:00') te ga ne može izračunati. Nebitno da li je
100 sati ili 50 sati svako ukupno vreme koje prelazi 24 sata nije validno.
Da li ima još neko rešenje kako to mogu izračunati ?
Jer uz pomoć onih dveju funkcija mi izračunava ukupno vreme kako treba i npr. upiše u EDIT-U onih ('100:00:00'),
ali iz EDIT-A neće da pomnoži ni sa jednim brojem ili kako je kod mene sa cenom po satu.
Evo opet koda:
Code:

//Ukupno radno vreme puta cena
Procedure TForm1.Button1Click(Sender: TObject);
var
Time:TTime;
Ukupno,Cena : Currency;
begin
Time:=StrToTime(Edit1.Text)*24; //Sabira iz kolone i upisuje ukupno sati npr:25:00:00 ili 100:00:00 ne prihvata kada se pomnoži sa cenom
Cena:=StrToFloat(Edit2.Text); //Cena po satu '1000'
Ukupno:= Time * Cena;
Edit1.Text := FormatFloat('###,##0.00',Ukupno);
end;
//Kraj ukupno isplata
Ima li načina ?
[ reiser @ 02.08.2014. 10:47 ] @
Ima, konvertujes vreme u sekunde i tako sabiras, na kraju podelis da dobijes broj sata.
[ Milan Milosevic @ 02.08.2014. 12:11 ] @
Da li nesto ovako odgovara tvoim potrebama
[ captPicard @ 02.08.2014. 17:48 ] @
Nemoj raditi sa time varijablom, uzmi samo ovaj dio "100" i stavi to u currency varijablu i pomnoži, i to je to.
[ reiser @ 02.08.2014. 18:31 ] @
Napraviste od prostog problema komplikovani...

Prvo, postavka ti je losa, jer TDateTime nije namenjen da cuvas vremenski interval. Dakle, u koraku gde racunas radne sate (odjava - prijava), umesto sto to cuvas kao TDateTime, cuvaj u sekundama. Kasnije ti se sve svodi na sabiranje tih kolona i deljenje.

Ako ovo ne mozes da uradis, onda pogledaj DecodeTime() funkciju koja razdvaja TDateTime na h/m/s/msec komponente. Prilikom citanja iz baze, pozovi DecodeTime(), onda sabiraj sate, ili sve u sekundama, pa kasnije izvlaci zaokruzenu vrednost.
[ Rapaic Rajko @ 03.08.2014. 12:11 ] @
Mozda je ovde problem ne-poznavanje internog formata TTime/TDateTime formata.

Tip podatka TTime/TDateTime je prosti double. Sad, neka je Time varijabla tipa TTime.
Po konvenciji,

Code:
  Time := 1.0;

predstavlja interval od 1 dana (day). Pa shodno tome,
Code:
  Time := 1.0 / 24.0;
je interval od 1 sata (hour), itd. i na kraju se dodje do sekunde
Code:
  Time := 1.0 / (24.0 * 60.0 * 60.0);


Zaobidji string konverzije, nepotrebne su.
I da, vazi primedba da tipovi TTime/TDateTime NISU predvidjeni za smestanje intervala, vec tacke u vremenu; zato stavi prosto Time: double; i sve ce raditi kako treba.

Pozz