Arsip: Function gak ngembaliin nilai ??? tanya kenapa

 
user image
more 14 years ago

Manz

Nah, aku nanya lagi : langsung dech daripada lieur :

var
  min: word;
  t_o: real;
begin
... bla bla bla
   if (min <> 0) then t_o := t_o + getminutes(min);
end;
function TDataModule3.GetMinutes(min: Real) : Real;
var
  sql : string;
begin
  sql := 'select min_calc from reff_minute ' +
         'where ' + floattostr(min) + ' between min_from and min_until';
  ibdataset1.SelectSQL.Clear;
  ibdataset1.SelectSQL.Add(sql);
  ibdataset1.Active := true;
  getminutes := ibdataset1.FieldByName('min_calc').AsFloat;
  ibdataset1.Active := false;
end;
nah, disitu nilai t_o = 14 dan nilai min = 30; fungsi getminutes mentranslate dari : 1..15 jadi 0.25 16..30 jadi 0.5 31..45 jadi 0.75 46..59 jadi 1 kalo di trace di getminutes := ibdataset1.fieldbyname('min_calc').asfloat itu hasilnya 0.5 karena nilai min nya 30. tapi kenapa begitu balik ke pemanggil :

t_o := t_o + getminutes(min); 
koq, t_o nya gak 14.5 ya :? untuk min type datanya word, karena hasil dari decodetime kumahaaaa ??? :?
user image
more 14 years ago

kaka-delphi

Coba di trace di pemanggilnya yang :
t_o := t_o + getminutes(min);
di baypass dulu berapa nilainya yang di kembalikan,misal dengan ShowMessage();
ShowMessage(FloatToStr(getminutes(min)));
apa bener hasilnya 0.5 .. :D Coba ganti keywordnya untuk pengembalian nilai dengan keyword "Result",
Result := ibdataset1.FieldByName('min_calc').AsFloat;
kalee aja ... :lol: oia, sekedar saran saja, sebaiknya penamaan variable dan parameter fungsi dibedakan saja, ini menghindari dari bug yang mungkin akan menyulitkan. Contoh dari source diatas :

var 
  min: word;
....
function TDataModule3.GetMinutes(min: Real) : Real;
user image
more 14 years ago

Manz


ShowMessage(FloatToStr(getminutes(min)));
bener hasilnya 0.5 tapi begitu nyampe t_o, tetep hasilnya 14, ngak 14.5 ..... :(
@kaka-delphi: sekedar saran saja, sebaiknya penamaan variable dan parameter fungsi dibedakan saja, ini menghindari dari bug yang mungkin akan menyulitkan
sarannya diterima ... :)
user image
more 14 years ago

_aa_

kalau code nya persis seperti diatas (dan optimization ON) debugger tidak bakal mau repot-repot nge-trak nilai t_o karena tidak digunakan (dead-code) coba tambah misalnya showmesage(floattoStr(t_o)) sebelum end
user image
more 14 years ago

kingstoneboy

Iya, setuju.... coba trace aja pake showmessage dulu. Kalo gak bisa, coba ganti getminutes := ibdataset1.FieldByName('min_calc').AsFloat; jadi result:=ibdataset1.FieldByName('min_calc').AsFloat; Moga manfaat :lol: [/pas]
user image
more 14 years ago

Manz

hihihi, semuanya udah dicobain kalo showmessage pasti keluar 0.5 nya tapi pas tracing di t_o nya, tetep gak mau hasilnya tetep 14 kan lieur
user image
more 14 years ago

deLogic

bisa disajikan listing lengkapnya? jangan2 ada statement yg kelewat.. atau coba dcu unit Anda nya di hapus.
user image
more 14 years ago

Manz

list diawal forum ini sudah lengkap, justru permasalahannya adalah di :

begin
... bla bla bla
   if (min <> 0) then t_o := t_o + getminutes(min);
end;
dan memang untuk ini diletakkan di line terakhir. karena untuk bla bla bla nya kepanjangan :D .dcu dihapus ??? apa gak jadi masalah nantinya pada saat loading ?
user image
more 14 years ago

kifmesoft

kalo gitu .... bagian itu saja ... tulis dengan lengkap... ;) (kepanjangan nggak apa-apa asal rapi....) (semakin panjang code... semakin memungkinkan munculnya bug..)
user image
more 14 years ago

Manz

ini satu block untuk ngitung t_o :

var
  ot_begin, ot_finish, work_start, work_finish: tdatetime;
  td: extended;
  hd: int64;
begin
  ot_begin := strtodatetime(fm_absence.cxGridDBTableView1OT_TIME_START.editvalue);
  ot_finish := strtodatetime(fm_absence.cxGridDBTableView1OT_TIME_FINISH.editvalue);
  work_start := sh_begin;
  work_finish := sh_finish;
  if (ot_begin < sh_begin) then work_start := ot_begin;
  if (ot_finish > sh_finish) then work_finish := ot_finish;
  td := abs(work_finish - work_start);
  decodetime(td, h, min, s, msec);
  hd := (24 * trunc(td)) + h;
  t_o := hd;
  if (min <> 0) then t_o := t_o + getminutes(min);
end;
function TDataModule3.GetMinutes(min: Real) : Real;
var
  sql : string;
 
begin
  sql := 'select min_calc from reff_minute ' +
         'where ' + floattostr(min) + ' between min_from and min_until';
  ibdataset1.SelectSQL.Clear;
  ibdataset1.SelectSQL.Add(sql);
  ibdataset1.Active := true;
  getminutes := ibdataset1.FieldByName('min_calc').AsFloat;
  ibdataset1.Active := false;
end;
apa karena t_o (real) di assign sama hd (int64) jadi kagak bisa ? :? kalo gitu, gimana caranya casting dari int64 biar jadi real :wink:
more ...
  • Pages:
  • 1
  • 2
Share to

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com