1 Son düzenleyen, primeragt (16.03.2012 16:02:59)

Konu: Left

mrb arkadaşlar.

iki adet tablom var. ürünler tablosu (ürün bilgilerini tutuyor yaklaşık 900 ürün var) stok tablosu(alım satım iade bilgilerini tutuyor, yaklaşık 100bin işlem var)
Bunları kullanarak bir rapor oluşturup excele aktarıyorum.
Stok tablosundan, urunler tablosundaki herbir ürüne  aralık ayı için bir sonuç çıkarmam gerekiyor. vb.net ile yaptım bunu ama kayıt sayısı arttıkça işlem çok uzun sürüyor.
Aralık ayı için;
1 aralık 2011 den önce her bir üründen alınan,satılan, iade adetleri
1 aralık - 31 aralık arasında alınan,satılan, iade
31 aralık sonunda stokda olması gereken ürünler
bunu bir döngüye sokarak yaptım ama işlem uzun sürdü.
yardımcı olurmusunuz.
nasıl bir sql cozumu bulabiliriz.
Excel çıktısı : http://www.urlacpl.k12.tr/dosyalar/aralik2011.xls

2

Re: Left

Merhaba ;

İşlem tablosunun bir örneğini de örnek olarak kopyalarmısın?

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ü

3 Son düzenleyen, primeragt (16.03.2012 17:17:57)

Re: Left

http://www.urlacpl.k12.tr/dosyalar/veri2.rar
Ben programda söyle yapıyorum.
Ürünler tablosundan ilk kayıdı alıyorum. Stok tablosunda bu ürünün aralıktan önceki, aralık ayındaki, aralık ayı sonundaki alım satım ve iadelerini buluyorum. Bunu gride atıyorum.
Aynı işlemleri diğer ürünler içinde yapıyorum. Ve bu yavaş bir bilgisayarda çok uzun sürüyor. Hızlı bir bilgisayarda 10 dakika.
İşlem bittikten sonra griddeki ürünleri bir dataset oluşturup rapor ekranına gönderiyorum.

4

Re: Left

Merhaba;

Windows Güvenlik uyarısı nedeniyle MDB dosyasını açamadım. Galiba bir çok makro içeriyor.

XLS tada DBF formatında yollayabilirmisin?

Birde yaptığını söylediğin yöntem kesinlikle tavsiye edilebilir bir yöntem değil.

Tablona uygun bir / yada bir kaç SQL ile işini çözmeni öneririrm. Index optimizasyonu ise bu işte en dikkat etmen gereken konu. Dilerim çalıştırmak istediğin SQL ler tablo yapına uygun şekilde indexlenmiştir!. Yoksa 1/100 sn yelerde alacağın sonuçlar için bir kaç 10 dk beklemen olası.

Sevgiler

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ü

5 Son düzenleyen, ugurlu2001 (16.03.2012 17:25:42)

Re: Left

Bu arada sitedeki arama bölümünde FIFO diye arama yaparsan; sana fikir verebilecek örnekler görebilirsin!

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: Left

bu urunler tablosu

barkod            stok_adi                            alis           satis           kdv
000052000034    OLİPS COOLWAVE ÇİLEK    0,81 TL    1,00 TL    %8
000052000065    OLİPS COOLWAVE NANE    0,81 TL    1,00 TL    %8
1                    ÇAKMAK                            0,35 TL    0,50 TL    %18
11                    TARAFTAR MENDİL            0,65 TL    1,50 TL    %18
12                    KİBRİT    0,04 TL    0,15 TL    %18
13                    SÜNGER    0,20 TL    0,50 TL    %18
14                    PLASTİK BARDAK    0,01 TL    0,10 TL    %18

buda stok tablosu


id    fatura    barkod    tarih    saat    stok_adi    alinan_adet    satilan_adet    fiyat    toplam    durum    kdv
1    STOK SAYIM    40329161    31.12.2010    7:44:50 PM    UZUN WİNSTON BAX    16    0    5,19 TL    83,04 TL    DOĞRU    %0
2    STOK SAYIM    40329345    31.12.2010    7:44:50 PM    WİNSTON SOFT KISA    10    0    5,19 TL    51,90 TL    DOĞRU    %0
269    STOK SAYIM    5449000021588    31.12.2010    7:44:50 PM    KUTU CAPPY ŞEFTALİ    12    0    1,26 TL    15,12 TL    DOĞRU    %8
270    STOK SAYIM    5449000108982    31.12.2010    7:44:50 PM    KUTU CAPPY KAYISI    8    0    1,26 TL    10,08 TL    DOĞRU    %8
271    STOK SAYIM    5449000000439    31.12.2010    7:44:50 PM    COCACOLA 1.5 LT    4    0    1,72 TL    6,88 TL    DOĞRU    %8
272    STOK SAYIM    5449000054227    31.12.2010    7:44:50 PM    COCACOLA 1 LT    16    0    1,52 TL    24,32 TL    DOĞRU    %8
273    STOK SAYIM    5449000003034    31.12.2010    7:44:50 PM    FANTA 1 LT    8    0    1,52 TL    12,16 TL    DOĞRU    %8
274    STOK SAYIM    5449000000286    31.12.2010    7:44:50 PM    COCACOLA 2 LT    4    0    2,16 TL    8,64 TL    DOĞRU    %8
275    STOK SAYIM    8690793010052    31.12.2010    7:44:50 PM    ERİKLİ SU 0.5 LT    166    0    0,21 TL    34,86 TL    DOĞRU    %8
276    STOK SAYIM    90495489    31.12.2010    7:44:50 PM    CAPPY ŞEFTALİ    31    0    0,50 TL    15,50 TL    DOĞRU    %8
277    STOK SAYIM    90495441    31.12.2010    7:44:50 PM    CAPPY VİŞNE    16    0    0,50 TL    8,00 TL    DOĞRU    %8

İleti eklentileri

aralik2011.rar 192.86 kb, 3 kez indirildi, 2012-03-16 tarihinden itibaren 

Bu iletideki eklenti/leri indirmeye yetkiniz yok.

7 Son düzenleyen, cetinbasoz (16.03.2012 20:24:00)

Re: Left

Visual Fox Pro
start = date(2011,12,1)

end = date(2012,1,1) && yanlislik yok 2012 ocak
 
select u.barkod, u.urunadi, st.alinan, st.satilan ;
   from urunler u ;
   left join ;
   (select barkod, ;
       sum(alinan_adet) as alinan, ;
      sum(satilan_adet) as satilan ;
     from stok where tarih >= ?m.start and tarih < ?m.end ;
     group by barkod ) st ;
    on u.barkod = st.barkod ;
   into cursor crsSonuc



Iade goremedim yapilarda. Bir de VB'de yaptim diyorsun. Hangi dilde gerekiyor? VB'mi? VB ise VB6'mi .Net mi? Data nerede? mdb?

rar'da mdb varmis. Access query soruyorsan:

Visual Fox Pro
select u.barkod, u.stok_adi, st.alinan, st.satilan 

   from urunler u
   left join
   (select barkod,
       sum(alinan_adet) as alinan,
      sum(satilan_adet) as satilan
     from stok
     group by barkod ) st
    on u.barkod = st.barkod

Tarihle ilgili kismi koyamadim (cunku access bilmiyorum, fonksiyonlari bir facia). Bu VFP'de mi gerekli baska yerde mi.

8

Re: Left

access query ile aşağıdaki gibi vbscript veya vb.net içinden de aynı şekilde kullanırsın

Visual Fox Pro
SELECT barkod, stok_adi, alinan_eski, satilan_eski, alinan_eski-satilan_eski AS stok_eski, alinan_donem, satilan_donem, alinan_donem-satilan_donem AS stok_donem

FROM (SELECT a.barkod, a.stok_adi, b.alinan_eski, b.satilan_eski, c.alinan_donem, c.satilan_donem
FROM (urunler AS a LEFT JOIN (select barkod,Iif(Isnull(Sum(alinan_adet)),0,Sum(alinan_adet)) as alinan_eski,Iif(Isnull(Sum(satilan_adet)),0,Sum(satilan_adet)) as satilan_eski from stok where tarih<#01/01/2011# group by barkod)  AS b ON b.barkod=a.barkod) LEFT JOIN (select barkod,Iif(Isnull(Sum(alinan_adet)),0,Sum(alinan_adet)) as alinan_donem,Iif(Isnull(Sum(satilan_adet)),0,Sum(satilan_adet)) as satilan_donem from stok where tarih>=#01/01/2011# and tarih<=#31/01/2011# group by barkod)  AS c ON c.barkod=a.barkod)  AS tbl;

9

Re: Left

SQL
SELECT  u.barkod ,

        u.stok_adi ,
        st1.alinan ,
        st1.satilan ,
        st2.alinan ,
        st2.satilan ,
        st3.alinan ,
        st3.satilan
FROM    ( ( urunler u
            LEFT JOIN ( SELECT  barkod ,
                                SUM(alinan_adet) AS alinan ,
                                SUM(satilan_adet) AS satilan
                        FROM    stok
                        WHERE   tarih < dateserial(2011, 12, 1)
                        GROUP BY barkod
                      ) st1 ON st1.barkod = u.barkod
          )
          LEFT JOIN ( SELECT    barkod ,
                                SUM(alinan_adet) AS alinan ,
                                SUM(satilan_adet) AS satilan
                      FROM      stok
                      WHERE     tarih >= dateserial(2011, 12, 1)
                                AND tarih < dateserial(2012, 1, 1)
                      GROUP BY  barkod
                    ) AS st2 ON u.barkod = st2.barkod
        )
        LEFT JOIN ( SELECT  barkod ,
                            SUM(alinan_adet) AS alinan ,
                            SUM(satilan_adet) AS satilan
                    FROM    stok
                    WHERE   tarih >= dateserial(2012, 1, 1)
                    GROUP BY barkod
                  ) AS st3 ON u.barkod = st3.barkod
ORDER BY 2;

10

Re: Left

Zaman ayırıp cevap yazan herkese teşekkür ederim. Şimdi pansiyonda nobetciyim telefonla yaziyorum yarın deneyecegim.
Soran arkadaşlar için söylüyorum. vb.net (2010) içinde kullanacagim. access içinde alınan satilanlar için view ler kullandım ama dosyayı gönderirken boyut probleminden dolayı sadece bu iki tablo haricindekileri sildim.

11

Re: Left

msayin yazdı:

access query ile aşağıdaki gibi vbscript veya vb.net içinden de aynı şekilde kullanırsın

Visual Fox Pro
SELECT barkod, stok_adi, alinan_eski, satilan_eski, alinan_eski-satilan_eski AS stok_eski, alinan_donem, satilan_donem, alinan_donem-satilan_donem AS stok_donem

FROM (SELECT a.barkod, a.stok_adi, b.alinan_eski, b.satilan_eski, c.alinan_donem, c.satilan_donem
FROM (urunler AS a LEFT JOIN (select barkod,Iif(Isnull(Sum(alinan_adet)),0,Sum(alinan_adet)) as alinan_eski,Iif(Isnull(Sum(satilan_adet)),0,Sum(satilan_adet)) as satilan_eski from stok where tarih<#01/01/2011# group by barkod)  AS b ON b.barkod=a.barkod) LEFT JOIN (select barkod,Iif(Isnull(Sum(alinan_adet)),0,Sum(alinan_adet)) as alinan_donem,Iif(Isnull(Sum(satilan_adet)),0,Sum(satilan_adet)) as satilan_donem from stok where tarih>=#01/01/2011# and tarih<=#31/01/2011# group by barkod)  AS c ON c.barkod=a.barkod)  AS tbl;


Bunu denedim barkod ve ürün adı bilgileri geliyor ama diğer toplamların tamamı 0 olarak dönüyor.

12

Re: Left

cetinbasoz yazdı:
SQL
SELECT  u.barkod ,

        u.stok_adi ,
        st1.alinan ,
        st1.satilan ,
        st2.alinan ,
        st2.satilan ,
        st3.alinan ,
        st3.satilan
FROM    ( ( urunler u
            LEFT JOIN ( SELECT  barkod ,
                                SUM(alinan_adet) AS alinan ,
                                SUM(satilan_adet) AS satilan
                        FROM    stok
                        WHERE   tarih < dateserial(2011, 12, 1)
                        GROUP BY barkod
                      ) st1 ON st1.barkod = u.barkod
          )
          LEFT JOIN ( SELECT    barkod ,
                                SUM(alinan_adet) AS alinan ,
                                SUM(satilan_adet) AS satilan
                      FROM      stok
                      WHERE     tarih >= dateserial(2011, 12, 1)
                                AND tarih < dateserial(2012, 1, 1)
                      GROUP BY  barkod
                    ) AS st2 ON u.barkod = st2.barkod
        )
        LEFT JOIN ( SELECT  barkod ,
                            SUM(alinan_adet) AS alinan ,
                            SUM(satilan_adet) AS satilan
                    FROM    stok
                    WHERE   tarih >= dateserial(2012, 1, 1)
                    GROUP BY barkod
                  ) AS st3 ON u.barkod = st3.barkod
ORDER BY 2;

Bunda da çok fazla sayıda boş değer var

13

Re: Left

Bu hesaplamayı yaptığım form sayfam şu şekilde.

           Dim baglanti As New OleDbConnection
            Dim komut, cmd As New OleDb.OleDbCommand
            Dim okuyucu, rd As OleDbDataReader
            baglanti.ConnectionString = Opet_tasiyici.baglanti_string
            baglanti.Open()
            cmd.Connection = baglanti
            komut.Connection = baglanti
            komut.CommandText = "SELECT * from urunler order by barkod asc"
            okuyucu = komut.ExecuteReader

            Dim sayi = 1
            While okuyucu.Read
                sayi = sayi + 1
            End While
            okuyucu.Close()
            ProgressBar1.Maximum = sayi
            okuyucu = komut.ExecuteReader
            sayi = 1

            Dim barkod As String
            Dim alinan, iade, satilan, fark As Integer
            Dim fiyat As Decimal
            DataGridView1.Rows.Clear()
            While okuyucu.Read
                barkod = okuyucu("barkod")
                fiyat = okuyucu("alis")
                alinan = 0
                iade = 0
                satilan = 0
                fark = 0
                DataGridView1.Rows.Add()
                DataGridView1.Item(0, sayi - 1).Value = barkod
                DataGridView1.Item(11, sayi - 1).Value = fiyat & " TL"
                DataGridView1.Item(1, sayi - 1).Value = okuyucu("stok_adi")
                cmd.CommandText = "SELECT sum(alinan_adet)as alinan from stok where alinan_adet>0 and durum=true and barkod='" & barkod & "' and tarih<#" & ay & "/1/" & yil & "#"
                rd = cmd.ExecuteReader
                While rd.Read
                    If IsNumeric(rd("alinan")) Then alinan = rd("alinan")
                End While
                rd.Close()

                cmd.CommandText = "SELECT sum(alinan_adet)as iade from stok where alinan_adet<0 and durum=true and barkod='" & barkod & "' and tarih<#" & ay & "/1/" & yil & "#"
                rd = cmd.ExecuteReader
                While rd.Read
                    If IsNumeric(rd("iade")) Then
                        iade = rd("iade")
                    End If

                End While
                rd.Close()

                cmd.CommandText = "SELECT sum(satilan_adet)as satilan from stok where durum=false and barkod='" & barkod & "' and tarih<#" & ay & "/1/" & yil & "#"
                rd = cmd.ExecuteReader
                While rd.Read
                    If IsNumeric(rd("satilan")) Then satilan = rd("satilan")
                End While
                rd.Close()
                fark = alinan + iade - satilan

                DataGridView1.Item(2, sayi - 1).Value = alinan
                DataGridView1.Item(3, sayi - 1).Value = -1 * iade
                DataGridView1.Item(4, sayi - 1).Value = satilan
                DataGridView1.Item(5, sayi - 1).Value = fark
                alinan = 0
                iade = 0
                satilan = 0
                fark = 0
                If ay = 12 Then
                    cmd.CommandText = "SELECT sum(alinan_adet)as alinan from stok where alinan_adet>0 and durum=true and barkod='" & barkod & "' and tarih>=#" & ay & "/1/" & yil & "#" & " and tarih<#" & "1/1/" & yil + 1 & "#"

                Else
                    cmd.CommandText = "SELECT sum(alinan_adet)as alinan from stok where alinan_adet>0 and durum=true and barkod='" & barkod & "' and tarih>=#" & ay & "/1/" & yil & "#" & " and tarih<#" & ay + 1 & "/1/" & yil & "#"

                End If
rd = cmd.ExecuteReader
                While rd.Read
                    If IsNumeric(rd("alinan")) Then alinan = rd("alinan")
                End While
                rd.Close()
                If ay = 12 Then
                    cmd.CommandText = "SELECT sum(alinan_adet)as iade from stok where alinan_adet<0 and durum=true and barkod='" & barkod & "' and tarih>=#" & ay & "/1/" & yil & "#" & " and tarih<#" & "1/1/" & yil + 1 & "#"
                Else
                    cmd.CommandText = "SELECT sum(alinan_adet)as iade from stok where alinan_adet<0 and durum=true and barkod='" & barkod & "' and tarih>=#" & ay & "/1/" & yil & "#" & " and tarih<#" & ay + 1 & "/1/" & yil & "#"
                End If

                rd = cmd.ExecuteReader
                While rd.Read
                    If IsNumeric(rd("iade")) Then
                        iade = rd("iade")
                    End If

                End While
                rd.Close()

                If ay = 12 Then
                    cmd.CommandText = "SELECT sum(satilan_adet)as satilan from stok where durum=false and barkod='" & barkod & "' and tarih>=#" & ay & "/1/" & yil & "#" & " and tarih<#" & "1/1/" & yil + 1 & "#"

                Else
                    cmd.CommandText = "SELECT sum(satilan_adet)as satilan from stok where durum=false and barkod='" & barkod & "' and tarih>=#" & ay & "/1/" & yil & "#" & " and tarih<#" & ay + 1 & "/1/" & yil & "#"

                End If
                rd = cmd.ExecuteReader
                While rd.Read
                    If IsNumeric(rd("satilan")) Then satilan = rd("satilan")
                End While
                rd.Close()
                fark = alinan + iade - satilan
                DataGridView1.Item(6, sayi - 1).Value = alinan
                DataGridView1.Item(7, sayi - 1).Value = -1 * iade
                DataGridView1.Item(8, sayi - 1).Value = satilan
                DataGridView1.Item(9, sayi - 1).Value = fark
                DataGridView1.Item(10, sayi - 1).Value = DataGridView1.Item(5, sayi - 1).Value + fark
                DataGridView1.Item(12, sayi - 1).Value = Convert.ToInt16(DataGridView1.Item(10, sayi - 1).Value) * fiyat
                DataGridView1.Item(12, sayi - 1).Value = DataGridView1.Item(12, sayi - 1).Value & " TL"
                sayi = sayi + 1
                ProgressBar1.Value += 1

            End While
            okuyucu.Close()
            baglanti.Close()
            ProgressBar1.Value = 0
            ProgressBar1.Visible = False

        Else
            MsgBox("Lütfen Ay ve Tarih Bilgilerini Seçiniz")
        End If
    End Sub

14 Son düzenleyen, primeragt (17.03.2012 11:52:44)

Re: Left

Sql de temel işlemleri bildiğim için geri kalan kısımları vb.net ile yapmaya çalıştım bugüne kadar. Ama bu programda ekstra bir özellik istedikleri için en kısa yol bildiğin yol mantığı ile bu şekilde bir algoritma oluşturdum ama veri sayısının bu kadar etkileyeceğini hiç hesaba katmadım.

Programdaki progressbar kullanıcı bilgisayarın kilitlendiğini sanmasın diye koydum.

Mantığı şu.
Ürünler tablosundaki her bir kayıt için kullanıcının seçtiği aya kadar olan alım satım iade ve fark bilgileri, kullanıcının seçtiği aydaki alım satım iade ve bunların ay sonundaki devirlerini hesapladım.

bu forumdaki arkadaşların çoğu gördüğüm kadarıyla profesyonel olarak bu işi yapıyorlar. Dolayısıyla bu kodlar onlara acemice gelebilir. Ama benimde piyasa deneyimim olmadığı için ve ne üniversitede nede başka bir yerde bu tür bir eğitim almadığımdan dolayı bu tür acemiliklerim devam edecek diye düşünüyorum.

15

Re: Left

benim sorgumda tarihi gün/ay/yıl vermişim onu ay/gün/yıl olarak değiştir dene çetin beyin sorgusunda fark null değerlerin dönmesi