Bir tabloyu Referans alarak Başka bir tabloyu güncellemek

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Bir tabloyu Referans alarak Başka bir tabloyu güncellemek

Mesaj gönderen vkamadan »

Merhaba,
Belli bir tablodaki bilgilere göre başka bir tabloyu güncellemenin tek satırlık SQL ile yapabilecek bir yolu olduğunu
keşfedince bir çok uzun süren işlemi saniylere indirerek kod karmaşasından kurtuldum, bilmeyen arkadaşlar için paylaşmak istedim.

Senaryomuz şu olsun,
Cari hareket kayıtlarına bakarak Cari kartlara borç alacak rakamlarını yazacak bir yapı kuralım,(çok gereksiz bir şey ama anlaşılması kolay olsun dedim aklıma bu geldi)

Kod: Tümünü seç

CariHesapKartiTablosu
---------------------
id
toplamborc
toplamalacak



CariHareketTablosu
--------------------
id
cariid
borc
alacak
olsun, örnek kayıtlar

Kod: Tümünü seç

CariHesapKartiTablosu

id    toplamborc   toplamalacak
---   ---------     -----------
1         0               0
2         0               0   



CariHareketTablosu

id   cariid   borc    alacak
--   ------   ----    ------
1      1       10       0
2      1       0        5
3      1       20       0
4      1       0       20
5      2      100       0
6      2       0       100
..
.
.
.
Şeklinde olsun ,



şimdi biz CariHareketTablosu isimli tabloda ki tüm kayıtları ele alarak ilgili cariHesapKarti na tuturları yazdıralım

Cümlemiz şu,

Kod: Tümünü seç

UPDATE CariHesapKartiTablosu CHT , CariHareketTAblosu CHRT SET CHT.toplamborc = CHT.toplamborc +  CHRT.borc , CHT.toplamalacak = CHT.toplamalacak +  CHRT.alacak where CHT.id=CHRT.cariid

sql kodunu çalıştırınca CAriHesapKarti tablomuz aşağıdaki şekli alır.Cümleyi geliştirebilirsiniz ihtiyaca göre, bu en temel kullanım şekliydi, inşallah açıklayıcı olmuştur ve yararlı olur.

Kod: Tümünü seç

CariHesapKartiTAblosu

id    toplamborc   toplamalacak
---   ---------     -----------
1         30             25
2         100           100   
En son vkamadan tarafından 03 Tem 2007 05:56 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Volkan KAMADAN
www.polisoft.com.tr
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Bu sorgu tekrar tekrar çalıştırıldığında sürekli üzerine eklediğinden hatalı sonuçlar çıkacaktır. Hata olmaması için ya önce CHT tablosundaki değerler sıfırlanmalıdır yada iç içe sql yazılmalıdır.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

mkysoft yazdı:Bu sorgu tekrar tekrar çalıştırıldığında sürekli üzerine eklediğinden hatalı sonuçlar çıkacaktır. Hata olmaması için ya önce CHT tablosundaki değerler sıfırlanmalıdır yada iç içe sql yazılmalıdır.
Evet tabi basit olsun die sallama bir senaryo üzerinden gittim, detayları düşünmek lazım tabi ihtiyaca göre, sadece böyle bir yöntem var bilmeyen arkadaşlar istifade edebilsin inşallah.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
TRSoft
Kıdemli Üye
Mesajlar: 636
Kayıt: 13 Şub 2004 11:39
Konum: Konya
İletişim:

Mesaj gönderen TRSoft »

@vkamadan çok yararlı bir kod..
Ancak hangi veritabanında çalıştırdığınıda yazarsan sevinirim. Çünkü Firebirdde bu kodu çalıştıramadım muhtemelen mysqlde denediniz.

Hatta örnek olsun diye koduda yazıyorum..

Kod: Tümünü seç

UPDATE STOK ST, STOK_HAREKET SH SET ST.GIREN=ST.GIREN+SH.GIREN,ST.CIKAN=ST.CIKAN+SH.CIKAN WHERE ST.STOK_NO=SH.STOK_NO;
ilk virgülde hata veriyor..
İlimle geçen bir gece,
ibadetle geçen bin geceden hayırlıdır.
HZ. MUHAMMED (S.A.)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Aşağıdaki gibi bir kullanım da pratiklik sağlayabilir :wink:

Kod: Tümünü seç

update stok_kart sk
set top_gelen = (select sum(miktar) from stok_hareket where stok_id = sk.stok_id and hareket_tipi = 'G')
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
TRSoft
Kıdemli Üye
Mesajlar: 636
Kayıt: 13 Şub 2004 11:39
Konum: Konya
İletişim:

Mesaj gönderen TRSoft »

teşekkür ederim @rsimsek abi..
İlimle geçen bir gece,
ibadetle geçen bin geceden hayırlıdır.
HZ. MUHAMMED (S.A.)
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,
evet kodu mysqlde denedim, aslında MSSQL de de çalıştıramadık galiba bu kullanım şekli mysql ye özgü bir olay.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

vkamadan yazdı:...

Kod: Tümünü seç

UPDATE CariHesapKartiTablosu CHT, CariHareketTAblosu CHRT
SET CHT.toplamborc = CHT.toplamborc + CHRT.borc, CHT.toplamalacak = CHT.toplamalacak + CHRT.alacak
where CHT.id = CHRT.cariid 
Burada aslında alışılmış yapının dışında şöyle bir durum var; her iki tabloda matriks çarpımı şeklinde (daha doğrusu CHT.id=CHRT.cariid bu ilişkiye göre) hareket tablosundaki tüm kayıtları mevcut master/esas (CariHesapKartiTablosu CHT) tablodaki ilgili alana üzerine ekleniyor/toplanıyor. Dediğin gibi her veri tabanı desteklemeyebilir :roll:

Benim verdiğim yapı daha genel ve geniş kullanımı olabilecek bir yapı :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

MSSQL buna benzer bişeyle uğraşan oldumu.

Benim denemelerim de(mssql2000) böyle bişeyin olmayacağı sonucuna ulaştım. Daha önce uğraşan oldumu İşlem tablesindeki sonuçları kartlara nasıl yansuıtıyorsunuz.

Saygılarımla
Teşekkürler.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

SQL Server'da bunun karşılığı biraz farklı biçimde var. Yukarıdaki örneğin üzerinden gidersek kart toplamları aşağıdaki sorgu ile bulunabilmektedir.

Kod: Tümünü seç

select cariid, sum(borc), sum(alacak) from CariHareketTablosu group by cariid
. Ayrıca SQL Server'da sorgudan sorgu çekmek mümkündür. Yeterki hesaplama yapan alanlara isim verilmiş olsun. Örnekte top_borc ve top_alacak olarak verildiğine dikkat çekmek isterim.

Kod: Tümünü seç

select * from

  (select cariid, sum(borc) as "top_borc", sum(alacak) as "top_alacak" from CariHareketTablosu group by cariid)

as Toplam where Toplam.top_borc>0 or Toplam.top_alacak>0
Ayrıca bir tablodaki şarta ve değerlere göre update - set sql'i de çalıştığına göre

Kod: Tümünü seç

update tbl set alan=degeralani from tbl2 where sart...
Şimdi örneğe göre helvamızı yaparsak

Kod: Tümünü seç

UPDATE CariHesapKartiTablosu SET
toplamborc=top_borc, toplamalacak=top_alacak
from (select cariid, sum(borc) as "top_borc", sum(alacak) as "top_alacak" from CariHareketTablosu group by cariid) as Toplam
where CariHesapKartiTablosu.id=Toplam.cariid
bize doğru toplamları o alanlara yazdıracaktır. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla