döngüler ve sorgularla ilgili

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
huseyinert
Üye
Mesajlar: 233
Kayıt: 19 Nis 2005 06:49
Konum: Bartın

döngüler ve sorgularla ilgili

Mesaj gönderen huseyinert »

merhaba arkadaşlar programımda cariharaket query sinin after post olayında girilen haraket doktor hesabı ve kasa ya gidiyori, gittiği anda da yine cariharaketin afterpost olayında bunların toplamlarını repeat until döngüsüyle alıyorum acaba kasa da ve doktor hesabında kayıtlar çoğalınca ,cariharakete kayıt yaparken bir problem oluşurmu ve çok yavaşlarmı, şuanda problemsiz ama kayıtlar çoğalınca yavaşlama veya prob. çıkma ihtimali varmı, bunun başka çözüm yolu varsa onumu denemeliyim
"Kula bela gelmez Hak yazmayınca,Hak bela yazmaz kul azmayınca..." MEVLANA
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba ,
Döngü ile toplam aldırmanız tahmin ettiğiniz gibi ileride kayıt sayısı arttığında yavaşlamalara neden olacak bir sistem, madem TQuery kullanıyorsunuz ikinci bir TQuery yardımı ile toplam sonucunu direk DAtabaseden SQL ile alabilirsiniz örneğin Toplam:Double bir değişkenimiz olsun, tablonun adı Doktor olsun toplam alınacak alanın adı da tutar olsun toplamı alacağımız örnek aşağıdaki gibi olamalıdır,

Kod: Tümünü seç

 with Query2 do
   begin
    sql.add('select SUM(tutar) from doktor');
    Active:=true;
    Toplam:=Fields[0].Ascurrency;
   end;
iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
huseyinert
Üye
Mesajlar: 233
Kayıt: 19 Nis 2005 06:49
Konum: Bartın

Mesaj gönderen huseyinert »

çok teşekkür ederim peki birden fazla alanı toplamak istersem nasıl yapacağım şu şekilde bir kodu öreneğin

Kod: Tümünü seç

g_Nakit:=0;g_Kredi:=0;g_Cek:=0;g_Senet:=0;g_top:=0;c_top:=0;dun_devreden:=0;devredecek_tutar:=0;bakiye:=0;c_nakit:=0;c_cek:=0;c_kredi:=0;c_senet:=0;
     data.Kasa.Last;
     repeat
if data.Kasa.FieldByName('odemetipi').AsString='Nakit' then g_Nakit:=g_Nakit+data.Kasa.FieldByName('giris').AsFloat;
if data.Kasa.FieldByName('odemetipi').AsString='Kredi Kartı' then g_Kredi:=g_Kredi+data.Kasa.FieldByName('giris').AsFloat;
if data.Kasa.FieldByName('odemetipi').AsString='Çek' then g_Cek:=g_Cek+data.Kasa.FieldByName('giris').AsFloat;
if data.Kasa.FieldByName('odemetipi').AsString='Senet' then g_Senet:=g_Senet+data.Kasa.FieldByName('giris').AsFloat;

if data.Kasa.FieldByName('odemetipi').AsString='Nakit' then c_Nakit:=c_Nakit+data.Kasa.FieldByName('cikis').AsFloat;
if data.Kasa.FieldByName('odemetipi').AsString='Kredi Kartı' then c_Kredi:=c_Kredi+data.Kasa.FieldByName('cikis').AsFloat;
if data.Kasa.FieldByName('odemetipi').AsString='Çek' then c_Cek:=c_Cek+data.Kasa.FieldByName('cikis').AsFloat;
if data.Kasa.FieldByName('odemetipi').AsString='Senet' then c_Senet:=c_Senet+data.Kasa.FieldByName('cikis').AsFloat;

     data.Kasa.Prior;
     until(data.Kasa.Bof);

     data.Kasamaster.Edit;
     data.Kasamaster.FieldByName('g_Nakit').AsFloat:=g_Nakit;
     data.Kasamaster.FieldByName('g_Cek').AsFloat:=g_Cek;
     data.Kasamaster.FieldByName('g_Kredi').AsFloat:=g_kredi;
     data.Kasamaster.FieldByName('g_Senet').AsFloat:=g_Senet;

     data.kasamaster.FieldByName('giris_top').AsFloat:=g_nakit+g_cek+g_senet+g_kredi;


     data.Kasamaster.FieldByName('c_Nakit').AsFloat:=c_Nakit;
     data.Kasamaster.FieldByName('c_Cek').AsFloat:=c_Cek;
     data.Kasamaster.FieldByName('c_Kredi').AsFloat:=c_kredi;
     data.Kasamaster.FieldByName('c_Senet').AsFloat:=c_Senet;

     data.kasamaster.FieldByName('cikis_top').AsFloat:=c_nakit+c_cek+c_senet+c_kredi;



data.kasamaster.FieldByName('bakiye').AsFloat:=(data.kasamaster.fieldbyname('g_nakit').AsFloat+data.kasamaster.fieldbyname('dunku_kasa_mev').AsFloat)-data.kasamaster.fieldbyname('c_nakit').AsFloat;

data.kasamaster.FieldByName('devreden_kasa_mev').AsFloat:=data.kasamaster.FieldByName('bakiye').AsFloat;



     data.Kasamaster.Edit;
     data.Kasamaster.Post;
teşekkür ederim bu kodu sql ile nasıl yapacağız bu çok daha karışıyor
"Kula bela gelmez Hak yazmayınca,Hak bela yazmaz kul azmayınca..." MEVLANA
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba
bence şu şekilde bir fonksiyon declare edin ve kullanın;

Kod: Tümünü seç

function Toplam(OdemeTipi:String):Double;
var
qToplam:TQuery;
begin
  try
   qToplam:=TQuery.Create;
   with qToplam do
     begin
       DatabaseName:='db adı yada yolu';
       sql.add('select SUM(tutar) from tablo_adi where odemetipi='+''''+OdemeTipi+'''');
       Active:=true;
       Result:=Fields[0].AsCurrency;
     end;
  finally
    qToplam.Free;
  end;
end;
kullanmak içinde;

Kod: Tümünü seç

NakitToplam:=Toplam('Nakit');
CekToplam:=Toplam('Çek');
.
.

gibi iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
huseyinert
Üye
Mesajlar: 233
Kayıt: 19 Nis 2005 06:49
Konum: Bartın

Mesaj gönderen huseyinert »

cevaplarınız için teşekkür ederim

Kod: Tümünü seç

sql.add('select SUM(tutar) from tablo_adi where odemetipi='+''''+OdemeTipi+''''); 
       Active:=true; 
       Result:=Fields[0].AsCurrency; 
koduna örneğin ben tutar,borc alacak, alanlarımın da toplamını almak istiyorum bu kodu

Kod: Tümünü seç

sql.add('select SUM(tutar,borc,alacak) from tablo_adi where odemetipi='+''''+OdemeTipi+''''); 
       Active:=true; 
       Result:=Fields[0].AsCurrency;


şeklinde mi değiştireceğiz ve son olarak ta döngü bitince başka bi tabloya kayıtların toplamını post ediyorum burda tam olarak bu nasıl olacak,yani ben kasaya giriş yaptıysam kasadaki tüm hesaplama işlemlerini yapmalı çek, senet,kredikartı,nakit toplamları almalı nakit giriş ten nakit çıkışı çıkartıp bakiyeyi bulmalı bunu tam olarak ben sql ile yapamıyorum ve sağolun gönderdiğinizi kodları biraz daha açabilirimisiniz
yapmak istiedeğimi anladınız yukarıda şuan da kasada döngü ile yaptıüğım kod var incelerseniz tam olarak vakıf olabilirsiniz...çok teşekkür ederim ilginiz için...
"Kula bela gelmez Hak yazmayınca,Hak bela yazmaz kul azmayınca..." MEVLANA
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba
bu fonksiyonun amacı belirtilen alanların toplamını döndürmerk ozaman fonksiyonu şu şekilde düzenlersiniz,

Kod: Tümünü seç

function Toplam(ToplanacakAlanAdi , OdemeTipi:String):Double;
var
qToplam:TQuery;
begin
  try
   qToplam:=TQuery.Create;
   with qToplam do
     begin
       DatabaseName:='db adı yada yolu';
       sql.add('select SUM('+ToplanacakAlanAdi+') from tablo_adi where odemetipi='+''''+OdemeTipi+'''');
       Active:=true;
       Result:=Fields[0].AsCurrency;
     end;
  finally
    qToplam.Free;
  end;
end; 
Kullanirkende Bu sefer,

Kod: Tümünü seç

 BorcToplam:=Toplam('Borç' , 'Çek');
 AlacakToplam:=Toplam('Alacak' ,'Çek');
iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
huseyinert
Üye
Mesajlar: 233
Kayıt: 19 Nis 2005 06:49
Konum: Bartın

Mesaj gönderen huseyinert »

abi teşekkür ederim ama birden fazla alanda nasıl kullancaz ve ikinci kod bölümüde verdiğiniz toplam fonksiyonuun çağırdığınız kodları ve benim işlemmime göre kasaharaketinin toplamlarını nereye nasıl yazdırcaz...
"Kula bela gelmez Hak yazmayınca,Hak bela yazmaz kul azmayınca..." MEVLANA
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba,
ikinci verdiğim fonksiyondada toplanacak alanı ve odeme tipini parametre olarak geçiyorsunuz dolayısıyla tablonuzda Borc ve alacak adında alanlar olduğu farz edersek ve Nakit Borç ve Nakit Alacaklarını şu şekilde elde edeblilriz

Kod: Tümünü seç

AlacakToplam := Toplam('Alacak' , 'Nakit');
BorcToplam    := Toplam('Borç' , 'Nakit');
burada fonksiyonun birinci parametresine gönderdiğiniz alan adı toplanır ve sonuç olarak döndürür ben örnek olsun die borç ve alacak dedim siz istediğiniz sayıda çağırabilirsiniz.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
huseyinert
Üye
Mesajlar: 233
Kayıt: 19 Nis 2005 06:49
Konum: Bartın

a

Mesaj gönderen huseyinert »

merhaba abi şu şekilde yapıyorum ama bi problem var

Kod: Tümünü seç

ibquery1.Close;
ibquery1.SQL.Clear;
ibquery1.SQL.Add('select SUM(giris),SUM(cikis) from hesap_detay where kno=:kno');

ibquery1.Open;


data.fatura_kurumu.Edit;
data.fatura_kurumu.FieldByName('giris_top').AsFloat:=strtofloat(ibquery1.fields[0].asstring);
data.fatura_kurumu.FieldByName('cikis_top').AsFloat:=strtofloat(ibquery1.fields[1].asstring);
data.fatura_kurumu.FieldByName('bakiye').AsFloat:=strtofloat(ibquery1.fields[0].asstring)-strtofloat(ibquery1.fields[1].asstring);
data.fatura_kurumu.Post;
bu kod çalışıyor ama buna bi kriter eklediğimde not floaatin point gibi hata veriyor o kod da şu;

data.sum_kasa.Close;
data.sum_kasa.SQL.Clear;
data.sum_kasa.SQL.Add('select SUM(giris),SUM(cikis) from kasa where id=:id and odemetipi='+#39+'Nakit'+#39+'');

data.sum_kasa.Open;
data.Kasamaster.Edit;
data.Kasamaster.FieldByName('g_Nakit').AsFloat:=strtofloat(sum_kasa.fields[0].asstring);
data.Kasamaster.FieldByName('c_Nakit').AsFloat:=strtofloat(sum_kasa.fields[1].asstring);

data.Kasamaster.Edit;
data.Kasamaster.Post;

bu kod da not flaotin point hatası veriyor
ikinci bişey daha var
burda nakit toplam yaptım cek,kredi kartı ve senette var
bunları şöyle mi yapcaz

data.sum_kasa.SQL.Add('select SUM(giris),SUM(cikis) from kasa where id=:id and odemetipi='+#39+'Kredi Kartı'+#39+'');

şeklinde ekleyip demi olacak eğer 4 tane kullanırsak şöle olacak

Kod: Tümünü seç

data.sum_kasa.Close;
data.sum_kasa.SQL.Clear;
data.sum_kasa.SQL.Add('select SUM(giris),SUM(cikis) from kasa where id=:id and odemetipi='+#39+'Nakit'+#39+'');

data.sum_kasa.SQL.Add('select SUM(giris),SUM(cikis) from kasa where id=:id and odemetipi='+#39+'Kredi Kartı'+#39+'');
data.sum_kasa.SQL.Add('select SUM(giris),SUM(cikis) from kasa where id=:id and odemetipi='+#39+'Senet'+#39+'');

data.sum_kasa.SQL.Add('select SUM(giris),SUM(cikis) from kasa where id=:id and odemetipi='+#39+'Çek'+#39+'');


data.sum_kasa.Open;
ozaman çağrırken

Kod: Tümünü seç

data.Kasamaster.Edit;
     data.Kasamaster.FieldByName('g_Nakit').AsFloat:=strtofloat(sum_kasa.fields[0].asstring);
 data.Kasamaster.FieldByName('c_Nakit').AsFloat:=strtofloat(sum_kasa.fields[1].asstring);

data.Kasamaster.Edit;
data.Kasamaster.Post;

bölümne
strtofloat(sum_kasa.fields[1].asstring);
fields[1] yazamayız burya ne yazacağız

İnşaallah anlatabilmişimdir.. sağolun Allah Razı olsun
"Kula bela gelmez Hak yazmayınca,Hak bela yazmaz kul azmayınca..." MEVLANA
Kullanıcı avatarı
huseyinert
Üye
Mesajlar: 233
Kayıt: 19 Nis 2005 06:49
Konum: Bartın

Mesaj gönderen huseyinert »

arkadaşlar cevaplarınızı bekliyorum odemetipi kriterini ve fields[0] dan sonra nasıl nasıl olacağını çözemedim
"Kula bela gelmez Hak yazmayınca,Hak bela yazmaz kul azmayınca..." MEVLANA
Cevapla