Sorgulama yaklasimi

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Sorgulama yaklasimi

Mesaj gönderen mrtblt »

Merhaba arkadaslar

Cari hesaplar listesi olusturmak istiyorum. Bu listede bazi cari hesap bilgilerinin yani sira alacak, borc ve bakiye sutunlari da olacak

Liste icin toplam 4 tablo kullanilacak

Cari, ceksenet, fatura, cari_fis. Bu tablolardan son 3'u borc alacak durumlarini tesbit etmek uzere kullanilacak ve hepsinde cl_id (cari hesap id) isminde bir alan mevcut. Ayrica hepsinde tip alani var, temel olarak kaydin giris mi cikis mi oldugunu tesbit etmeye yariyor. Mesela alis ve satis iade faturalari giris iken, satis ve alis iade faturalari cikis gibi. Simdi bu verilere gore tek bir sorguda kompleks join statement kullanarak borc alacak degerlerini tesbit edebilirmiyim. Yani diyelimki ceksenet tablosunda tip=1 ve tip=2 alacak, tip=3 ve tip=4 borc olarak kabul edilecek ve buna gore degerler donecek. Bastanda sordugum gibi bunu join kullanarak tek sorguda bitirebilirmiyiz yoksa cari hesap tablosunda bir dongu olusturup sonra dongu icerisinde herbir cari hesap icin ayri ayri diger tablolari sorgulayarak mi sonuca olasmak mumkun olur ancak. Son secenek uygulama acisindan kolay olmakla beraber bana ilkel bir yontem gibi geliyor ve sanki daha fazla sorgulama zamani tuketir gibi bir durum var.

Yoksa ayrica bir tablo mu olusturayim hareketler diye. Bu tabloda 5 alan olsun : id, cari_id, ref_id, tip, miktar. Ve mesela ben bir musteriden cek girdigimde bu tabloyada otomatik kayit yapilsin. Mesela soyle :

Kod: Tümünü seç

id : 1
cari_id : 125
ref_id : cs1
tip : 1 (giris)
miktar : 3250
Ve bu tablodan her musteri icin borc bakiye durumlarini tek sorguda bitirebilirim. Ama buda extra hamallik demek eger yukarida anlattigim sekilde bu isi tek sorguda bitirebilmek mumkunse.
Kullanıcı avatarı
IZLEN
Üye
Mesajlar: 58
Kayıt: 07 Mar 2008 02:40
İletişim:

Re: Sorgulama yaklasimi

Mesaj gönderen IZLEN »

Bence Eğer Cari Hesap listesi oluşturacaksan bu bilgilerin zaten bir tabloda olması gerekir
Ayrıca bakiyeleri de olsun istiyorsan ilgili table da borc ve alacak tutarının tutulduğu alan omlası daha iyi bir vt tasarımı olur ve her cari harekette bu alanları artırarak lazım olduğunda kullamabilirsiniz. her cari kartlar tablosu var ve hareketleri de farklı dosyada ilse bunun gropu by ile hareketlerin tomlamını almanız ve aradaki fark ile bakiyeye ulaşmanız mümkündür.
tablo yapınızıda beilrtirseniz sdaha net cevap alabilirsiniz bence
İzlen
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Re: Sorgulama yaklasimi

Mesaj gönderen mrtblt »

Ben hareket toplamlarini tabloda simdilik tutmamaya karar verdim.

Bunun disinda soyle bir sorgum var

Kod: Tümünü seç

$sql = mysql_query("SELECT c.id,c.cl_name,c.city,c.contact_person,c.mobil1,sum(ihb.grand_sum) as b_inv_sum, sum(iha.grand_sum) as a_inv_sum from clients as c left join inv_header as ihb on (c.id=ihb.client_id and ihb.inv_type in('2','3','5')) left join inv_header as iha on (c.id=iha.client_id and iha.inv_type in ('1','4')) group by c.id");
Burada bi selff join yapmaya calisiyorum yani inv_header dosyasini iki kez yorumluyorum. inv_type ('2','3','5') degerlerinden birine sahip olan kayitlar borc olarak toplaniyor, inv_type ('1','4') degerlerinden birine sahip olan kayitlar da alacak olarak toplaniyor


tabloda ki alan degerleride asagidaki gibi

Kod: Tümünü seç

id;inv_no;client_id;inv_date;inv_type;adet;net_sum;vat_sum;disc_prcnt;disc_val;grand_sum;inv_exp;exch_rate;carpan 39;3096469;15;2008-04-10;1;10;195.00;37.05;0;0.00;232.05;1;3.67;1 
38;3096468;15;2008-04-10;1;2;10.70;2.03;0;0.00;12.73;1;3.67;1 
40;3096470;15;2008-04-10;2;10;195.00;37.05;0;0.00;232.05;1;3.67;-1 41;3096471;15;2008-04-10;5;5;100.00;19.00;0;0.00;119.00;1;3.67;-1
id 39 ev 38 su toplami veriyor (232.05+12.73=244.78), ve id 40 ile 41 de (232.05+119=351.05) toplamini veriyor fakat sorgudan donen deger ise

Kod: Tümünü seç

b_inv_sum=489.56 a_inv_sum=702.10
Burada goruldugu gibi double sum yapiyor. Muhtemelen ilgili sartlari saglayan 2 ser kayit oldugundandir. Eger daha fazla olsa bu toplama islemi daha fazla tekrar edecekti.

Burada bu sorguyu dogru toplama sonucunu almak icin nasil degistirebilirim?

Tablo yapilarida su sekildedir

Kod: Tümünü seç

CREATE TABLE IF NOT EXISTS `clients` (
  `id` int(11) NOT NULL auto_increment,
  `user_name` varchar(20) NOT NULL,
  `pass` varchar(20) NOT NULL,
  `cl_code` varchar(10) NOT NULL,
  `cl_name` varchar(40) NOT NULL,
  `shop_name` varchar(30) NOT NULL,
  `contact_person` varchar(40) NOT NULL,
  `address_inv` varchar(80) NOT NULL,
  `address_dlv` varchar(80) NOT NULL,
  `city` varchar(40) NOT NULL,
  `judet` varchar(40) NOT NULL,
  `tel_fix` varchar(15) NOT NULL,
  `mobil1` varchar(15) NOT NULL,
  `mobil2` varchar(15) NOT NULL,
  `email` varchar(30) NOT NULL,
  `cui` varchar(20) NOT NULL,
  `cif` varchar(15) NOT NULL,
  `bank` varchar(30) NOT NULL,
  `iban` varchar(30) NOT NULL,
  `approved` char(1) NOT NULL,
  `suspended` char(1) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `cl_code` (`cl_code`,`cl_name`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=79 ;

Kod: Tümünü seç

CREATE TABLE IF NOT EXISTS `inv_header` (
  `id` int(11) NOT NULL auto_increment,
  `inv_no` varchar(10) collate utf8_romanian_ci NOT NULL,
  `client_id` varchar(11) collate utf8_romanian_ci NOT NULL,
  `inv_date` date NOT NULL,
  `inv_type` varchar(15) collate utf8_romanian_ci NOT NULL,
  `adet` int(11) NOT NULL,
  `net_sum` decimal(7,2) NOT NULL,
  `vat_sum` decimal(7,2) NOT NULL,
  `disc_prcnt` int(2) NOT NULL,
  `disc_val` decimal(7,2) NOT NULL,
  `grand_sum` decimal(7,2) NOT NULL,
  `inv_exp` varchar(2) collate utf8_romanian_ci NOT NULL,
  `exch_rate` decimal(5,2) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_romanian_ci AUTO_INCREMENT=33 ;

Cevapla