dbgrid de borc-alacak bakiyede hesaplama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

dbgrid de borc-alacak bakiyede hesaplama

Mesaj gönderen Bil_Bakalım »

takıldığım bir nokta var.Yardımcı olursanız sevinirim.
Delphi 7.0 ile mysql kullanıyorum. dbgrid içerisinde listelediğim carihareket tablosunun
tarih---İşlem türü ----Borç------Alacak--- Kalan şeklinde bir dizaynı var. Kalan hesaplanan calculated alan. Yapmayı başaramadığım şey Kalanı bulmak :oops: olmasını istediğim şekli şöyle

Tarih -------------işlem türü----Borç-----Alacak-----Kalan Tutar
01.01.2005-------Devir---------100 ----- 0 ----- 100
03.01.2005-------Nakit Hrk.---- 0 ----- 50 ----- 50
03.03.2005-------Nakit Hrk.----100 ----- 0 ----- 150
En son Bil_Bakalım tarafından 07 Şub 2005 01:57 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba

arama yaparsanız muhakkak doğru ve kesin çözümler bulacaksınız.

calculatedalan:=ibdataset1.fieldbyname('borc').asinteger-ibdataset1.fieldbyname('alacak').asinteger;

şeklinde olacağını düşünüyom. fikir vermesi acısından

ustalara saygısızlık yaptım ise özür
kolay gelsin
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

merhaba

Mesaj gönderen Bil_Bakalım »

Bu soruyu sormamak için çook çalıştım ve aradım.İstediğimi veren bir mantık bulamadım. Oncalcfields alanında carihareketsanaltutar.asfloat:=carihareketborc.asfloat-carihareketalacak.asfloat
diyerek hesaplamayı yapıyor ama bir önceki satırdan gelen kalanı bu hesaplamaya nasıl dahil edeceğim.
Programda bu iş kolay diye en sona attım. :oops: Teslim edeceğim ama bu yapılmadan teslim edemem
Verdiğim örnekte ikinci kayıtta kalan kısmındaki tutar ilk kayıttan gelen 100 liradan 50 lira çıkarınca kalan tutar
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Her kayıttan sonra (after/before insert) calculated alanın değerini bir değişkende tutsan ve bu tutuğun değişkeni de bir sonra ki kayıtta ki calculated alana eklesen olur mu ?
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

merhaba

Mesaj gönderen Bil_Bakalım »

Carihareketler tablosu bilgi girişinin yapıldığı tek yer değil.Çekgirişleri yapıldığında yada fatura giriş yapıldığında carihareket tablosuna da kayıt atıyor. Bu nedenle after yada before özelliğini kullanamıyorum.

İlginiz için teşekkür ederim.
Misafir

Mesaj gönderen Misafir »

ben qreport için şöyle yapmıştım.

rapora bir bir formül alanı ekledim. ve detail bandın beforeprint olayına şu kodu yazdım.

sum(borc)-sum(alacak).

kolaygelsin
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

Mesaj gönderen Bil_Bakalım »

mikrocu yazdı:ben qreport için şöyle yapmıştım.

rapora bir bir formül alanı ekledim. ve detail bandın beforeprint olayına şu kodu yazdım.

sum(borc)-sum(alacak).

kolaygelsin
Ama bu bir rapor değilki.Bir tablonun içeriğini dbgrid içerisinde gösteriyor ve borc /alacak bölümlerinin içerisindeki değere göre kalan tutar kısmını hesaplıyor.
Muhasebe programı yazmış olan arkadaşlar beni anlayacaklardır.Programda istenen şey hareket esnasında müşterinin ne kadar borcu yada alacağı olduğunu bulmak ve bu kalan sutununda
olacak.Dbedit yada başka bir yerde değil.


:( Arkadaşlar çıldırmak üzereyim.Kafayı yedim desem yeridir yani
Misafir

Mesaj gönderen Misafir »

Kod: Tümünü seç

select a.id, a.tarih, a.gtutar, a.ctutar, (select (sum(b.gtutar) - sum(b.ctutar)) as bakiye from tbhar b where b.id <= a.id) as bakiye from tbhar a order by id

ms sql de denedim çalıştı. ama büyük ihtimalle paradox ta çalışmaz. ha bu arada field leri null bırakma 0 değeri ver.

gtutar = borç
ctutar = alacak

sanırım sölemeye gerek yok.

kolay gelsin
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

Mesaj gönderen Bil_Bakalım »

Mikrocu hocam zaman ayırıp cevap yazdığın için sana ve diğer arkadaşalra teşekkür ederim.Ayrıca senin daha önce söylediğin gibi
mikrocu yazdı:Öncelikle bir delphi kitabı almalısın ve bazı geceler ağlayana kadar bu kitaba çalışmalısın. gerçekten az çok bi şeyler yazmak istiyorsan delphide. yanlış anlama forum sana asla delphi öğretmez. forumu ancak nokta atışı için kullanırsın. soru sorarsın ve cevap alırsın. o kadar. öncesini senin doldurman gerekiyor.
inan bana gözlük takmamın tek nedeni programlama ve okuma. Yazdığın cevap benim yapmak istediğim şey için uygun değil gibi geldi.Ayrıca Mysql ile çalıştıramadım.Durumumu mu daha detaylı anlatırsam sanırım daha çok yardımcı olabilirsiniz.
Öncelikle şunu söyleyeyim forumda bu tür söylenen şeyler sql sorgusu ile yazılmış ve sonuç bir dbgridde gösterilmiş benim istediğiim bu değil

Benim carikartı ve carihareket isimli iki tablom var.Bu tablolar birbirlerine carikod üzerinden bağlı.Ve carihareket tablosunun verileri bir dbgrid içerisinde görüntüleniyor.
Bu tabloya fatura ekranından,çekgiriş ve çekçıkış ekranlarından kayıt giriliyor ayrıca master-detail ekranından da direkt bilgi girişi yapılabiliyor.

Şimdi yapmak istediklerimi söyle açıklayayım.Dinamik bir tablo olduğu için Hesaplamayı calculated olarak yapmam gerekiyor. Başka türlüsü benim için olmaz

:) Son bir iki günde Bir carikodu ilk seçildiğinde cariharekettablosundaki hesaplamayı doğru olarak yaptırabiliyorum.En son kayıda kadar Kalan tutar doğru olarak hesaplıyor.Ama Master-Detail olarak bağlı oldukları alandan yeni bir kayıt (dbgrid içerisinde) eklemek istediğim anda kalan tutar sapıtıyor ve konuyla ilgisiz sonuçlar yapıyor.
benim yazdığım kod şöyle:

Kod: Tümünü seç

procedure TCARIFORM.carihareketCalcFields(DataSet: TDataSet);
begin
  if kalantutarmiktari=0 then//Bu değişkenle bir önceki satırın kalanını     
    begin                                 //buluyorum
      carihareketsanaltutar.asfloat:=carihareketborc.asfloat-
                                                   carihareketalacak.asfloat;
      kalantutarmiktari:=carihareketsanaltutar.asfloat;
  end else
  begin
     carihareketsanaltutar.asfloat:=(carihareketborc.asfloat-
                                    carihareketalacak.asfloat)+kalantutarmiktari;//önceki satırdan gelelen kalanı dahil ediyor
     kalantutarmiktari:=carihareketsanaltutar.asfloat;
   end;
end;
Ah birde insert yada edit ederken kalan tutar sapıtmasa :( Daha bu işi başaramadım Bu arada değerler önceden sıfırlanıyor
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Query nin AutoCalculate özelliğine bakarmısın .. Çünkü bu özellik true olduğunda onCalculate olayında devamlı olarak post işlemi yapılır .
Belki sorun burada olabilir .
Misafir

Mesaj gönderen Misafir »

Kod: Tümünü seç

procedure TCARIFORM.carihareketCalcFields(DataSet: TDataSet);
begin
  if kalantutarmiktari=0 then//Bu değişkenle bir önceki satırın kalanını     
    begin                                 //buluyorum
      carihareketsanaltutar.asfloat:=carihareketborc.asfloat-
                                                   carihareketalacak.asfloat;
      kalantutarmiktari:=carihareketsanaltutar.asfloat;
  end else
  begin
     carihareketsanaltutar.asfloat:=(carihareketborc.asfloat-
                                    carihareketalacak.asfloat)+kalantutarmiktari;//önceki satırdan gelelen kalanı dahil ediyor
     kalantutarmiktari:=carihareketsanaltutar.asfloat;
   end;
end

koda biraz baktım. sanırım gereksiz bir if kullanmışsın. yani kalantutarmiktari 0 ise toplama değil ise topla. yanlış okumadım değil mi ? diyelimki kalantutarmiktari 0 olsun ve toplasın ne zararı var biliyorsun 0 toplamada etkisiz eleman.

bir de kalantutarmiktari nasıl hesaplattığını yazarsan bir şey söylemek mümkün olacak.

kolay gelsin.
Misafir

Mesaj gönderen Misafir »

yazdığım sql de id dediğimiz bi alan var onu sıralama için kullandım. sen bunu kendi tablona göre değiştirmen lazım. order by dan sonraki sıralama alanı da o şekilde.

ya hocam şimdi nereden buldun çıkardın o mesajı. ben o kadar kötü bi adam değilim halbu ki. :D
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

Mesaj gönderen Bil_Bakalım »

koda biraz baktım. sanırım gereksiz bir if kullanmışsın. yani kalantutarmiktari 0 ise toplama değil ise topla. yanlış okumadım değil mi ? diyelimki kalantutarmiktari 0 olsun ve toplasın ne zararı var biliyorsun 0 toplamada etkisiz eleman.
Hocam kalantutarmiktari benim bir önceki satırın kalantutar bakiyesini içinde sakladığım değişken.Cari ilk seçildiğinde onu sıfırlıyorum.(İlk satırda önceden gelen bir bakiye olmayacağı için)

Daha sonra ilk begin end bloğunda ilk satırdaki hesaplama sonucunu bu değişkene atıyorum ve bir sonraki satıra geçtiğinde kalantutarmiktari sıfır değerine eşit olmadığı için hesaplama sonucuna da onu dahil ediyor. Aksi bir yol izlediğimde hesaplamayı doğru yapmıyor.

sorunum şimdi tüm hesaplamalar düzgün iken edit yada insert durumuna geçince carihareketsanaltutar değerinin sapıtması.

Bence bunun nedeni insert yada edit durumuna geçmeden tekrar alanların hesaplanması ve bu esnada en son kayıttaki borc ve alacağı sanki ilk kayıda ait borc alacakmış gibi algılaması

Beforeinsert de alanları sıfırla dedim tınlamadı bile :(

benim tablomda da id alanı var.Verdiği hata ikinci select cümleciği ile ilgili.Onu kabul etmiyor. :lol: Dedikya soru sormadan önce iyi okuyup araştırıyoruz ki yapabilecekken kimsenin zamanını almayalım
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

Mesaj gönderen Bil_Bakalım »

Daha önce buna benzer uygulama yapmış olan bir arkadaşım kodu gönderebilir mi acaba?
Misafir

Mesaj gönderen Misafir »

ben den paydos. yani kafam da kuramıyorum tasarladığın yapıyı.
Cevapla