ANASAYFA | BLOG | SORU CEVAP | REFERANSLARIM | DOWNLOAD | HAKKIMDA | İLETİŞİM | ARAMA
~~~SORU~CEVAP~~~
Gönderen: ~~FARUK UNAL~~
11.12.2014

Farklı farklı yöntemleri var, aşağıdaki 2 sorgu ile de sorununuzu çözebilirsiniz, Genel olarak kolona göre case when yada farklı tabloymuş gibi kullanarak çözebilirsiniz

1.yol

select MalzemeAdi,OlcuBirimi, sum (Miktar * (case when Durum='MalzemeGiris' then 1 else  -1  end) ) as Miktar from Stok  where ??????  group by MalzemeAdi, OlcuBirimi

2.yol

select s1.MalzemeAdi,s1.OlcuBirimi, sum (s1.Miktar) -  sum (s2.Miktar) as Miktar from Stok s1,Stok s2 where s1.Durum='MalzemeGiris' AND  s2.Durum='MalzemeCikis'  group by s1.MalzemeAdi, s2.OlcuBirimi

 

Kolay gelsin, İyi çalışmalar

 

Gönderen: Hasan Aykal
11.12.2014

Stok Id              MalzemeAdi          OlcuBirimi          Miktari      Durum

1                        Ekmek                      Adet                      20               Giriş

2                        Ekmek                      Adet                      10               Giriş

3                        Patates                     Kg                          5                Giriş

4                        Ekmek                     Adet                      5                Çıkış

5                        Patates                    Kg                         5                Çıkış

6                        Elma                         Kg                         15              Giriş

 

Faruk hocam; 

1. yolda when anahtar sözcüğü hatası verdi. Benden kaynaklı yapamadım.

2. yolda ise başka malzemelerde çıkış olmamasına veya malzeme bitmesine rağmen farklı sonuç çıkardı.

 

Yukarıdaki veritabanı kayıtlarına göre, datagridviewde aşagıdaki sonucu gösteremedim.

MalzemeAdi            OlcuBirimi           Miktar

Ekmek                       Adet                       25

Elma                          Adet                       15

Gönderen: ~~FARUK UNAL~~
11.12.2014

Kardeşim 1.yol için istersen uzak bağlantı ile destek verebilirim

2.yol için ise PrimaryKey ile de eşleştirmen gerekiyordu, PK kolon adını bilmediğimden yazmamıştım, aşağıdaki gibi kullanmayı denemelisin

select s1.MalzemeAdi,s1.OlcuBirimi, sum (s1.Miktar) -  sum (s2.Miktar) as Miktar from Stok s1,Stok s2 where s1.[Stok Id]=s2.[Stok Id]  AND s1.Durum='MalzemeGiris' AND  s2.Durum='MalzemeCikis'  group by s1.MalzemeAdi, s2.OlcuBirimi

 

Gönderen: Hasan Aykal
12.12.2014

Hocam sabah denedim  ama yine yapamadım. Veritabanı olarak ACCESS kullanıyorum. Bununla alakası olabilir mi? Uygulamada aşağıdaki kodları kullandım. Bir örnek uygulama yapabilirmisiniz?

Stok Id      MalzemeAdi          OlcuBirimi          Miktari      Durum

1                 Ekmek                   Adet                      20            MalzemeGiris

2                 Ekmek                   Adet                      10            MalzemeGiris

3                 Patates                  Kg                         5              MalzemeGiris

4                 Ekmek                   Adet                       5             MalzemeCikis

5                 Patates                  Kg                          5             MalzemeCikis

6                 Elma                      Kg                         15            MalzemeGiris

 

OleDbConnection baglanti = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + Application.StartupPath + "\\data.accdb");

private void Form1_Load(object sender, EventArgs e)

{

}

private void btnTumStok_Click(object sender, EventArgs e)

{

OleDbDataAdapter da = new OleDbDataAdapter("select * from Stok", baglanti);

DataTable dt = new DataTable();

da.Fill(dt);

dataGridView1.DataSource = dt;

baglanti.Close();

}

private void btnCaseWhen_Click(object sender, EventArgs e)

{

OleDbDataAdapter da = new OleDbDataAdapter("select MalzemeAdi,OlcuBirimi, sum (Miktar * (case when Durum='MalzemeGiris' then 1 else -1 end) ) as Miktar from Stok group by MalzemeAdi, OlcuBirimi", baglanti);

DataTable dt = new DataTable();

da.Fill(dt);

dataGridView1.DataSource = dt;

baglanti.Close();

}

private void btnKolonaGore_Click(object sender, EventArgs e)

{

OleDbDataAdapter da = new OleDbDataAdapter("select s1.MalzemeAdi,s1.OlcuBirimi, sum (s1.Miktar) - sum (s2.Miktar) as Miktar from Stok s1,Stok s2 where s1.[StokId]=s2.[StokId] AND s1.Durum='MalzemeGiris' AND s2.Durum='MalzemeCikis' group by s1.MalzemeAdi, s1.OlcuBirimi", baglanti);

DataTable dt = new DataTable();

da.Fill(dt);

dataGridView1.DataSource = dt;

baglanti.Close();

}

 

Gönderen: ~~FARUK UNAL~~
13.12.2014

Ben SQL olarak MSSQL kullanıyorum, dolayısıyla verdiğim kodlar da MSSQL e göre, Access i sadece bu şekilde yardım isteyen arkadaşlar projelerini incelemem için gönderdiklerinde inceleyerek kullanıyorum, o yuzden verdiğim kodlar access de çalışmıyor olabilir, SQL yapısı temelde bütününde benzer olsa da kısmen bazı bölümlerde farklılıklar olabiliyor, dilerseniz faukunal@gmail.com adresine projenizi gönderin, onun üzerinde çalışma yaparsam daha net bir sonuca ulaşırız

 

Kolay gelsin, iyi çalışmalar

Gönderen: Hasan Aykal
14.12.2014

Proje denecek bir şey değil aslında, işyerindeki yemekhane için, giriş çıkışların girildiği, ne kadar Malzeme kaldı bunu yapmaya çalışıyorum.

Daha önce uygulamayı mail olarak atmaya çalıştım fakat güvenlik açığı hatası verip, göndermedi.

Hocam veritabandaki tablo, yukarıdaki gibi. Tek bir form sayfası üzerinde sayfa yüklendiğinde datagridviewe çekip göstermeniz yeterli.

Kaç saattir kodu değiştirip değiştirip deniyorum olmuyor..

Gönderen: ~~FARUK UNAL~~
14.12.2014

Kardeşim faukunal@gmail.com adresine ammyy yada teamviewer bağlantı bilgilerini gönder, bağlanarak yardımcı olmaya çalışıyım, sanırım daha makbule geçecek

Gönderen: Hasan Aykal
14.12.2014

Gonderdim faruk hocam

Gönderen: ~~FARUK UNAL~~
14.12.2014

uzak bağlantı kurularak aşağıdaki sorgu yazıldı ve sorun çözüldü

Select MalzemeAdi, OlcuBirimi,SUM( IIF(Durum='Giriş',Miktar,-1*Miktar) ) as Adet from Stok group by MalzemeAdi, OlcuBirimi


Ad Soyad :
E-mail :
Cevap :
DoÄŸrulama Kodu