Arsip: [ask] hitung total

 
user image
more 17 years ago

cyber_hecker

spesifikasi : Delphi 7.0 mySQL Data Access Component 4.0.0.2 by CoreLab mySQL ver. 5.0.24a-community-nt dari dulu saya paling bingung adalah pada bagian menghitung total harga dari barang. contoh kita membuat faktur. satu faktur terdiri dari banyak item. nah kesemua item bila di tambah dan dihapus kan ada keterangan total harga yang selalu berubah-ubah. kalo kita tidak menggunakan cache.. biasanya saya langsung mengaksesnya lewat query. contoh :
SELECT SUM(HARGA) FROM TB_ITEM_JUAL
ini bisa dilakukan karena harga sudah disimpan kedalam database secara langsung. tapi bila kita menggunakan cache.. data tidak tersimpan kedalam database. jadi cara diatas tidak bisa saya lakukan. untuk mengakali hal tersebut, saya menggunakan function bego sebagai berikut :
function TFTrPOTemp.myHitungTotalAll: Single;
var
  bm: TBookmark;
  lTotal : Single;
begin
  Result := 0;
  if myQuPOTempDet.Active then
    with myQuPOTempDet do begin
      bm := GetBookmark;
      DisableControls;
      try
        lTotal := 0;
        First;
        while not Eof do begin
          lTotal := lTotal + FieldByName('harga').AsFloat;
          Next;
        end;
        Result := lTotal;
      finally
        if BookmarkValid(bm) then
          GotoBookmark(bm);
        FreeBookmark(bm);
        EnableControls;
      end;
    end;
end;
prosedur ini ku letakan pada event afterpost dan afterdelete. cara ini berhasil tapi masih punya kelemahan yang sangat fatal yaitu : bila datanya banyak.. prosesnya di jamin lama banget. walaupun kemungkinan untuk data banyak masih kecil sekali. emang ada orang belanja sampe 1000 item sekali belanja ?? sebenernya komponen myDAC ini sudah disediakan fasilitas untuk melakukan perhitungan seperti ini. yaitu dengan menggunakan TAggregateField. tapi sudah ku coba dan tidak pernah berhasil menampilkan datanya. saya juga udah mencoba mencarinya di google dan forum milik corelab (www.crlab.com/forum) tapi belum menemukan jawabannya. nah.. adakah rekan-rekan disini mempunyai cara yang lebih ampuh ??
user image
more 17 years ago

Manz

Ada cara lebih ampuh, ... kalo dikau pake DevEx Grid seperti ini dijamin gampang.... meskipun masih menggunakan metode looping, tapi ini lebih cepat daripada langsung akses dari db nya... Tinggal simpan function perhitungan total di event : DataSummaryFooterSummaryItems0GetText(... bla bla bla parameter) dikau sudah dapat menghitung seperti itu dengan cepatnya. Sama halnya dengan daku disini ... tadinya seperti itu, tapi sekarang sudah SOLVED ... :mrgreen:
user image
more 17 years ago

deLogic

Kalo gak pengen looping per record.. ya taruh aja perhitungan di setiap event Post, Delete...misalnya untuk delete, maka kasih perhitungan lTotal := lTotal - NilaiFieldDariRecordYgDiDelete.. demikian pula untuk Post, tinggal bedakan aja apakah itu Insert atau Update. Btw.. kayaknya ada sesuatu yg aneh kalo proses looping dan perhitungan dengan record < 1000 dikau bilang lambat.. biasanya sih cepat, apalagi perhitungan dikau cukup simpel.
user image
more 17 years ago

cyber_hecker

@manz_delphi: Ada cara lebih ampuh, ... kalo dikau pake DevEx Grid seperti ini dijamin gampang.... meskipun masih menggunakan metode looping, tapi ini lebih cepat daripada langsung akses dari db nya...
waduh.. kalo pake cara dengan menggunakan komponen, SMDBGrid ku juga punya fungsi bawaan untuk menghitung total seperti itu. tapi kurang keren.. karena pernah ku coba ternyata caranya juga hampir sama dengan fungsi looping ku diatas, yaitu melakukan perhitungan dengan cara bego :D.
@deLogic: Kalo gak pengen looping per record.. ya taruh aja perhitungan di setiap event Post, Delete...misalnya untuk delete, maka kasih perhitungan lTotal := lTotal - NilaiFieldDariRecordYgDiDelete.. demikian pula untuk Post, tinggal bedakan aja apakah itu Insert atau Update.
nah.. kalo mo diletakkan kayak di atas. karena kadang-kadang sulit mbeda in antara insert dan edit. sebagi contoh : harga barang yang kita edit awalnya 5000. dan kita ubah menjadi 1000. nah lTotal harus kita kurangi 4000 kan ?? dari mana kita tahu bahwa harga awal adalah 5000 dan di ubah menjadi 1000. kecuali kita beri prosedur untuk menyimpan nilai awal pada event before edit. saya kira dengan model kayak gini cukup merepotkan.. karena harus mikir kira-kira event apa aja yang harus kita preventif agar tidak terjadi kesalahan hitung. kita tidak tahu sebeapa kreatifnya user kita wekeke.... emang kelebihannya tidak terjadi looping sia-sia. yang dikerjakan adalah proses pada record active aja. untuk proses looping, emang gak ada hitung macem-macem. tapi bayangin aja.. kita entry data. anggap aja setelah menyimpan melakukan perhitungan untuk mencari total sebanyak 1000 record. pasti kelihatan ada jeda.. alias freeze :D. saya kemaren nyoba pengen menggunakan thread. tapi hasilnya 0 besar.. karena diriku gak bisa gimana cara make thread... contoh yang di berikan oleh oom google minta ampun diriku. gak bisa ngerti logikannya.. huekekekek..... :D jadi kayaknya rekan-rekan belum mempunyai cara ampuh ya ? :( ku pikir ada cara yang lebih simple.. gak pake prosedur macem-macem. but, thanks atas sedikit pencerahannya ...
user image
more 17 years ago

deLogic

@CH: merepotkan? itu sih tergantung.. :) kalupun banyak prosedurnya, kan singkat2 kodenya.. btw mengenai jeda proses looping perhitunganpasti adalah, lama waktunya tergantung kode perhitungan dikau dan kemampuan komputer, tinggal dikau aja pake trik biar gak keliatan freeze.. :)
user image
more 17 years ago

Manz

@CH: waduh.. kalo pake cara dengan menggunakan komponen, SMDBGrid ku juga punya fungsi bawaan untuk menghitung total seperti itu. tapi kurang keren.. karena pernah ku coba ternyata caranya juga hampir sama dengan fungsi looping ku diatas, yaitu melakukan perhitungan dengan cara bego :D.
Ya jelas kalo hanya pake fungsi bawaan dari grid tersebut... dikau kan bisa customized code untuk totalnya... sama seperti hal yang aku lakukan dengan menggunakan customized code, gak langsung dari bawaan grid tersebut... jadi coding nya gak bego bego benerrr ... meskipun memang iya bego :mrgreen: Total yang aku pake malah : qty price - disc (kalo ada disc) .... kalo engga berarti qty price ajah, dan ini juga bisa dipergunakan untuk mengetahui value asalnya, alias underlying value (ambil istilah VB sorry).
@CH: nah.. kalo mo diletakkan kayak di atas. karena kadang-kadang sulit mbeda in antara insert dan edit. sebagi contoh : harga barang yang kita edit awalnya 5000. dan kita ubah menjadi 1000. nah lTotal harus kita kurangi 4000 kan ?? dari mana kita tahu bahwa harga awal adalah 5000 dan di ubah menjadi 1000.
ini kasusnya sama dengan daku pada saat tidak diketemukannya underlying value, nah aku pake DevEx ini udah ketauan bisa diambil underlying valuenya itu. Nah, kalo daku menggunakan even Before dan After post ... kalo beforepost untuk checking apakah insert atawa edit, nah untuk after postnya aku pake statusnya untuk mengetahui apakah tadi itu insert atawa edit... tidak terjadi freezing pada saat terjadi peng-update-an data baik edit atawa insert ... :mrgreen:
more ...
  • Pages:
  • 1
Share to

Random Topic

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