1 Son düzenleyen, Aligocmen (20.10.2009 13:47:58)

Konu: Günün Soranı !

Selam Arkadaşlar,

2 adet tablom var .. AlisSatis ve TahsilOdeme.. Ben bu iki tabloyu aynı anda SQL ile sorgulayarak örneğin C1 carisi için bir cari hesap listesi oluşturmak istiyorum. O listede en alttaki tablo oluyor. Bunu yapmak mümkün mü ? Tabi gerçek soru bu değil ? Asıl soru;  nasıl ? hmm

  • AlisSatis Tablosu
    Id   Tarih      Hareket        Cari          Tutar
    --------------------------------------------------
    1      T1               Alis           C1             50
    2      T2               Alis           C1             40
    3      T3               Satis          C2             10
    4      T4               Satis          C2              7


  • TahsilOdeme Tablosu
    Id    Tarih      Hareket             Cari      Tutar
    --------------------------------------------------
    1       T1             Tahsil              C2         5     
    2       T2             Odeme            C1       10
    3       T3             Odeme            C1       40
    4       T4              Tahsil              C2        8

  • CariHesapListesi
    C1 için :

    Tarih          Hareket    Borc   Alacak    Bakiye
    ---------------------------------------------------
        T1             Alis                         50       50
        T2             Alis                         40       90
        T2             Odeme     10                      80
        T3             Odeme     40                      40

2

Re: Günün Soranı !

SQL den kasıt MS SQL ise sql view ile yapabilirsin. http://www.sistemhocasi.com/konya-mcpd- … irmek.html

Dbf ise Database altında local view yapabilirsin.

Bilmediğin Neyse Yanıldığındır.

3 Son düzenleyen, ugurlu2001 (20.10.2009 15:33:27)

Re: Günün Soranı !

Günün Cevapcısı :

Selam Ali;

Biraz uğraştırdı ama istediğin bunun gibi birşey olsa gerek;

Data hazırlamak bir hayli uğraştırdı. Çetin Üstadın hazır data oluşturmak için yazdığı bir kod vardı. Onunla örnek data olsaydı çok daha rahat olucaktı.

Visual Fox Pro
CLEAR ALL

CLOSE DATABASES
 
LOCAL lcCari, lnPrevBakiye
 
STORE "" TO m.lcCari
STORE 0 TO lnPrevBakiye
 
DO TabloYap
 
SELECT ;
        CariTemp.Tarih, ;
        CariTemp.Cari, ;
        Cast(Nvl(IslemTemp.Tutar,0) As B) As Alis, ;
        Cast(Nvl(OdemeTemp.Tutar,0) As B) As Odeme, ;
        (Cast(Nvl(OdemeTemp.Tutar,0) As B) - Cast(Nvl(IslemTemp.Tutar,0) As B)) As Tutar, ;
        Cast(0 As B) As Bakiye ;
    From ( Select Distinct ;
                    Tarih, Cari ;
                 From AlisSatis ;
            Union ;
            Select Distinct ;
                    Tarih, Cari ;
                 From TahsilOdeme) As CariTemp ;
    LEFT JOIN ;
        ( Select ;
                Tarih, ;
                Cari, ;
                Sum(Tutar) As Tutar ;
            FROM AlisSatis ;
            GROUP BY Tarih, Cari ) As IslemTemp ;
        ON CariTemp.Tarih == IslemTemp.Tarih AND CariTemp.Cari == IslemTemp.Cari ;
    LEFT JOIN ;
        ( Select ;
                Tarih, ;
                Cari, ;
                Sum(Tutar) As Tutar ;
            FROM TahsilOdeme ;
            GROUP BY Tarih, Cari ) As OdemeTemp ;
        ON CariTemp.Tarih == OdemeTemp.Tarih AND CariTemp.Cari == OdemeTemp.Cari ;
ORDER BY CariTemp.Cari, CariTemp.Tarih ;
INTO CURSOR CrsResult READWRITE
 
GO TOP IN CrsResult
 
m.lcCari = CrsResult.Cari
m.lnPrevBakiye = 0
 
SCAN
    IF m.lcCari == CrsResult.Cari AND NOT Eof("CrsResult")
        Replace CrsResult.Bakiye WITH m.lnPrevBakiye  + CrsResult.Tutar
        m.lnPrevBakiye = CrsResult.Bakiye
    ELSE
 
        m.lcCari = CrsResult.Cari
        m.lnPrevBakiye = 0
 
        Replace CrsResult.Bakiye WITH m.lnPrevBakiye  + CrsResult.Tutar
        m.lnPrevBakiye = CrsResult.Bakiye
    ENDIF
ENDSCAN
 
BROWSE
 
RETURN
 
PROCEDURE TabloYap
CREATE CURSOR AlisSatis (Tarih D, Hareket C(15), Cari C(15), Tutar B)
 
CREATE CURSOR TahsilOdeme ;
        (Tarih D, Hareket C(15), Cari C(15), Tutar B)
 
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari001", 75.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari001", 45.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari001", 110.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari001", 45.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari001", 15.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari001", 88.00)
 
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari001", 750.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari001", 450.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari001", 1100.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari001", 450.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Satis", "Cari001", 105.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Satis", "Cari001", 808.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari002", 175.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari002", 1110.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari002", 115.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari002", 188.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari002", 175.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari002", 1110.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari002", 115.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari002", 188.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari003", 99.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari003", 77.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari003", 666.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari003", 111.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari003", 222.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari003", 753.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari003", 852.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari003", 258.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari003", 965.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari003", 456.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari003", 654.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari003", 18.00)
 
 
INSERT INTO TahsilOdeme VALUES (Date(), "Tahsil", "Cari001", 300 )
INSERT INTO TahsilOdeme VALUES (Date()-1, "Odeme", "Cari001", 650 )
INSERT INTO TahsilOdeme VALUES (Date()-2, "Tahsil", "Cari001", 1500 )
INSERT INTO TahsilOdeme VALUES (Date()-5, "Odeme", "Cari001", 900 )
INSERT INTO TahsilOdeme VALUES (Date(), "Tahsil", "Cari002", 1300 )
INSERT INTO TahsilOdeme VALUES (Date()-1, "Odeme", "Cari002", 1650 )
INSERT INTO TahsilOdeme VALUES (Date()-2, "Tahsil", "Cari002", 500 )
INSERT INTO TahsilOdeme VALUES (Date()-7, "Odeme", "Cari002", 700 )
INSERT INTO TahsilOdeme VALUES (Date()-2, "Tahsil", "Cari002", 950 )
INSERT INTO TahsilOdeme VALUES (Date()-3, "Odeme", "Cari002", 2750 )
INSERT INTO TahsilOdeme VALUES (Date()-6, "Tahsil", "Cari002", 900 )
INSERT INTO TahsilOdeme VALUES (Date()-10, "Odeme", "Cari002", 650 )
RETURN
ENDPROC
 
RETURN
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

4

Re: Günün Soranı !

Sevgili Uğur,

Zahmetin için çok teşekkür ederim .. Bu sorgu benim istediğim sonuç tablosunu vermiyor. Ama yakın bir sonuç getiriyor.
Senin query inde her satırda alacak-borc bakiyeye yazıyor oysa aynı carinin bir önceki bakiyesi sonraki tarihteki bakiyeye eklenecekti.,

Bunun üzerinde çalışıp sonuca ulaşırım herhalde .

5

Re: Günün Soranı !

Oldu olucak tam olsun. Ufak bir değişiklik  smile


Visual Fox Pro
CLEAR ALL

CLOSE DATABASES
 
LOCAL lcCari, lnPrevBakiye
 
STORE "" TO m.lcCari
STORE 0 TO lnPrevBakiye
 
DO TabloYap
 
SELECT ;
        CariTemp.Tarih, ;
        CariTemp.Cari, ;
        "Alis" As Hareket, ;
        Cast(Nvl(IslemTemp.Tutar,0) As B) As Borc, ;
        Cast(0 As B) As Alacak, ;
        Cast(0 As B) As Bakiye ;
    From ( Select Distinct ;
                    Tarih, Cari ;
                 From AlisSatis ) As CariTemp ;
    LEFT JOIN ;
        ( Select ;
                Tarih, ;
                Cari, ;
                Sum(Tutar) As Tutar ;
            FROM AlisSatis ;
            GROUP BY Tarih, Cari ) As IslemTemp ;
        ON CariTemp.Tarih == IslemTemp.Tarih AND CariTemp.Cari == IslemTemp.Cari ;
UNION ;
SELECT ;
        CariTemp.Tarih, ;
        CariTemp.Cari, ;
        "Tahsilat" As Hareket, ;
        Cast(0 As B) As Borc, ;
        Cast(Nvl(OdemeTemp.Tutar,0) As B) As Alacak, ;
        Cast(0 As B) As Bakiye ;
    From (Select Distinct ;
                    Tarih, Cari ;
                 From TahsilOdeme) As CariTemp ;
    LEFT JOIN ;
        ( Select ;
                Tarih, ;
                Cari, ;
                Sum(Tutar) As Tutar ;
            FROM TahsilOdeme ;
            GROUP BY Tarih, Cari ) As OdemeTemp  ;
        ON CariTemp.Tarih == OdemeTemp.Tarih AND CariTemp.Cari == OdemeTemp.Cari ;
ORDER BY 2,1,3 ;
INTO CURSOR CrsResult READWRITE
 
GO TOP IN CrsResult
 
m.lcCari = CrsResult.Cari
m.lnPrevBakiye = 0
 
SCAN
    IF m.lcCari == CrsResult.Cari AND NOT Eof("CrsResult")
        Replace CrsResult.Bakiye WITH m.lnPrevBakiye  + ( CrsResult.Borc - CrsResult.Alacak )
        m.lnPrevBakiye = CrsResult.Bakiye
    ELSE
 
        m.lcCari = CrsResult.Cari
        m.lnPrevBakiye = 0
 
        Replace CrsResult.Bakiye WITH m.lnPrevBakiye  + ( CrsResult.Borc - CrsResult.Alacak )
        m.lnPrevBakiye = CrsResult.Bakiye
    ENDIF
ENDSCAN
 
Browse
 
RETURN
 
PROCEDURE TabloYap
CREATE CURSOR AlisSatis (Tarih D, Hareket C(15), Cari C(15), Tutar B)
 
CREATE CURSOR TahsilOdeme ;
        (Tarih D, Hareket C(15), Cari C(15), Tutar B)
 
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari001", 75.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari001", 45.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari001", 110.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari001", 45.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari001", 15.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari001", 88.00)
 
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari001", 750.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari001", 450.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari001", 1100.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari001", 450.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Satis", "Cari001", 105.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Satis", "Cari001", 808.00)
 
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari002", 175.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari002", 1110.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari002", 115.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari002", 188.00)
 
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari002", 175.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari002", 1110.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari002", 145.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari002", 115.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari002", 188.00)
 
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari003", 99.00)
INSERT INTO AlisSatis VALUES (Date(), "Alis", "Cari003", 77.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari003", 666.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Alis", "Cari003", 111.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari003", 222.00)
INSERT INTO AlisSatis VALUES (Date()-2, "Alis", "Cari003", 753.00)
 
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari003", 852.00)
INSERT INTO AlisSatis VALUES (Date(), "Satis", "Cari003", 258.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari003", 965.00)
INSERT INTO AlisSatis VALUES (Date()-1, "Satis", "Cari003", 456.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari003", 654.00)
INSERT INTO AlisSatis VALUES (Date()-4, "Satis", "Cari003", 18.00)
 
 
INSERT INTO TahsilOdeme VALUES (Date(), "Tahsil", "Cari001", 300 )
INSERT INTO TahsilOdeme VALUES (Date()-1, "Odeme", "Cari001", 650 )
INSERT INTO TahsilOdeme VALUES (Date()-2, "Tahsil", "Cari001", 1500 )
INSERT INTO TahsilOdeme VALUES (Date()-5, "Odeme", "Cari001", 900 )
INSERT INTO TahsilOdeme VALUES (Date(), "Tahsil", "Cari002", 1300 )
INSERT INTO TahsilOdeme VALUES (Date()-1, "Odeme", "Cari002", 1650 )
INSERT INTO TahsilOdeme VALUES (Date()-2, "Tahsil", "Cari002", 500 )
INSERT INTO TahsilOdeme VALUES (Date()-7, "Odeme", "Cari002", 700 )
INSERT INTO TahsilOdeme VALUES (Date()-2, "Tahsil", "Cari002", 950 )
INSERT INTO TahsilOdeme VALUES (Date()-3, "Odeme", "Cari002", 2750 )
INSERT INTO TahsilOdeme VALUES (Date()-6, "Tahsil", "Cari002", 900 )
INSERT INTO TahsilOdeme VALUES (Date()-10, "Odeme", "Cari002", 650 )
RETURN
ENDPROC
 
RETURN
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

6

Re: Günün Soranı !

Eğer seni yanlış anlamadıysam

Visual Fox Pro
Select Tarih, 0 As Tip, Hareket, Cast(0 As B(2)) As Borc, Tutar As Alacak, Cast(0 As B(2)) As Bakiye ;

    From AlisSatis ;
    Where Cari = "C1" ;
Union All ;
Select Tarih, 1 As Tip, Hareket, Tutar As Borc, Cast(0 As B(2)) As Alacak, Cast(0 As B(2)) As Bakiye ;
    From TahsilOdeme ;
    Where Cari = "C1" ;
Into Cursor HesapListesi ReadWrite ;
Order By 1, 2
 
Local lnBakiye As Double
m.lnBakiye = 0
Scan
    m.lnBakiye = m.lnBakiye + Borc - Alacak
    Replace Bakiye With m.lnBakiye
EndScan
/o---------------------o\
     www.haser.com
\o---------------------o/

7

Re: Günün Soranı !

Evet arkadaşlar bunlar harika çözümler. Ama maalesef ben bu işi nokta NET ortamında yapmaya çalışıyorum. Burada datasetler , tableadapterler var,linq var yavaşlık var , özgürlük yok , bavuluyla Haydarpaşa merdivenlerinden inen taşralıyız burada  hmm

Not: Hallettim ama çok zamanımı aldı.

8

Re: Günün Soranı !

Ali; şu ana kadar .NET ortamında uygulama geliştirmedim ama edindiğim tecrübelerimden bir not:

Kullanıcı tarafında işi minimumda tut. Bırak işin angaryasını SQL server çeksin: "Stored Procedures", Triggers", "User Defined Functions". Yani kullanıcı kısmına işin Dataset ile değilde "RecorSet" ile olsun .

Bu konuda diğer ustaların ve arkadaşların ne düşündüğünü bilemiyorum. Bu benim kişisel deneyimlerimin sonucu.

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

9 Son düzenleyen, taRKan (21.10.2009 11:50:57)

Re: Günün Soranı !

Ali,
Yukarıda yazdığımı .Net ile de yapman kolay
Kodu ezbere yazıyorum hata varsa kusura bakma

C#
using (ProjeAdiDataContext dc = new ProjeAdiDataContext ())

        {
            List<HesapListesi> sorgu = dc.ExecuteQuery<HesapListesi>(
    "Select Tarih, 0 As Tip, Hareket, Cast(0 As Numeric(9, 2)) As Borc, Tutar As Alacak, Cast(0 As Numeric(9, 2)) As Bakiye " +
        "From AlisSatis " +
        "Where Cari = {0} " +
    "Union All " +
    "Select Tarih, 1 As Tip, Hareket, Tutar As Borc, Cast(0 As Numeric(9, 2)) As Alacak, Cast(0 As Numeric(9, 2)) As Bakiye " +
        "From TahsilOdeme " +
        "Where Cari = {0} " +
    "Into Cursor HesapListesi ReadWrite " +
    "Order By 1, 2" , tcKodHesap).ToList<KrediKartiOranlariCari>();
 
            decimal bakiye = 0;
            for (int i = 0; i < sorgu.Count; i++)
            {
                bakiye = bakiye +  sorgu[i].Borc -  sorgu[i].Alacak;
                sorgu[i].Bakiye = bakiye ;
            }
        }

Not:
.Net acayip acemiyim kod kötü olabilir smile

/o---------------------o\
     www.haser.com
\o---------------------o/

10 Son düzenleyen, cetinbasoz (21.10.2009 15:39:14)

Re: Günün Soranı !

Ali,
Madem .Net de yapiyorsun o zaman Linq var, kolaylik var, hiz var, ozgurluk var:)

Su ara avktim yok yazamiyorum oyle birkac dakikaligina ugradim. Linq ile:

let ve new isin cevabi. Tek geciste yaparsin SQL yazmakla tirmalama.

11

Re: Günün Soranı !

Tarkan zahmetin için çok sağol ona benzer bir yöntemle hallettim. Gerçekten tableadapterin içinde sorgu yazarak çözmeye çalışıyordum.
Hata etmişim..

Çetin Haydarpaşa cıvarında dolaştığım için bana özgürlük yok henüz big_smile .

Ha! birde burada noktaNET le uğraşan herkes C# kullanıyor galiba ben VB.NET kullanmaya çalışıyorum. Yanlış yapıyorum galiba.. hmm