none
Mantık yürütemedim, döngüler bir birine girdi :( RRS feed

  • Soru

  • Arkadaşlar,

    Vetabanının bir sütununda personel IBM numaralarını tutmak istiyorum. Numaralar şöyle verilecek;

    İdari birim 0 ile 99 arası, Kesimhane 100 ile 199 arası, Preshane de 200 ile 299 arası..

    Her yeni personel kayıt edildiğinde şunu yapacak.. Bir comboboxta bulunan İdari Birim, Kesimhane ve Preshane seçeneklerinden mesela İdari Birim seçilirse sütunu baştan sona tarayacak ve 0 ile 99 arasındaki en küçük sayısı (yani sıradaki personel IBM) bulup onu bir artırarak yeni kaydın ibmno alanına yazacak. Combobox'ın Kesimhane seçeneği seçilirse yine sütunu baştan sona tarayacak ve bu sefer 100 ile 199 arasındaki en küçük sayısı bulup 1 artırarak yeni kaydın ibmno alanına yapacak. Yazdığım mantıkta bir hata olabilir çünkü zaten mantığını kafamda toparlayamadım. Yardımcı olursanız sevinirim.

    12 Ekim 2015 Pazartesi 14:07

Yanıtlar

  • Foreign Key

    Bu da gayriresmi sekilde benim aciklamam:

    Simdi senin personelin var. Bir Personel tablosunda onlarin bilgilerini tutuyorsun (nufus cuzdani gibi nadiren degisen ve degistiginde yine sadece o kisiye ait olan bilgileri):

    Personel: TCKimlik, Ad, Soyad, DogumYeri, DogumTarihi ... 

    Nufus cuzdanlarinda seri nosu vardir. Bu bizi ilgilendirmez, nufus idaresi tarafindan veriliyor ve tek, benimki sadece bana ait (ya da TCKimlikNo). Bu anlamli da sayilmaz, onemli olan o degerin, bir cuzdani digerinden ayirabilmesi ve cuzdan sahibini ilgilendirmiyor (yani otomatik uretilmeli ve insan eli degmesine izin vermemeli). Buna PRIMARY KEY diyoruz. PRIMARY KEY, bir tablo icerisinde essiz olarak bir satiri digerlerinden ayirmak icin kullanilir (mahkemede X ve Y'den olma Z dogumlu ... diye kisiyi belirlemenin kisa ve kesin sekli). Sonucta senin Personel tablon:

    Personel: PersonelID, TCKimlik, Ad, Soyad, DogumYeri, DogumTarihi ... 

    seklinde. Kullandigin database'e ozel komutlarla bu PersonelId'yi database tarafindan otomatik olarak verilen bir deger yapiyorsun. Unutma bu deger kullaniciyi ilgilendirmiyor, kayitlari bulabilmek icin sadece yazilimcilari ve database'i ilgilendiriyor. Kullanici hic gormese de olur.

    Senin ayni zamanda calisma bolgelerin var, onun icin de benzer sekilde bir tablo:

    Bolumler: BolumID, Adi

    1, Idari bolum
    2, Kesimhane
    3, Preshane

    gibi. 

    Personel, bolumler arasinda yer degistirmiyordur, ya da degistirse bile sen sadece su anki yerleriyle ilgileniyorsundur, o zaman dogrudan Personel tablosuna bolumunu belirten BolumID kolonunu eklersin:

    Personel: PersonelID, TCKimlik, Ad, Soyad, DogumYeri, DogumTarihi ... , BolumID

    iste bu BolumID FOREIGN KEY. Yani bir baska tablonun PRIMARY KEY'sini isaret ediyor. Orada 1 varsa Personel "Idari bolum"dendir gibi.

    Kisilerin yer degistirmeleri mumkun ve sen bunu tarihsel olarak tutmak istiyorsan araya 3. bir "kopru" tablo girer (Personelden BolumID'yi kaldiriyoruz):

    PersonelYer: PersonelID, BolumID, Baslangic, Bitis

    gibi. Burada iki tane FOREIGN KEY, Personel ve Bolumler tablolarinin PRIMARY KEY'lerini isaret ediyor. 

    Hangi database'i kullandigini bilmedigimden ve aslinda FOREIGN KEY anlatmaya calistigimdan, yukaridaki gibi 30-40 yil oncesinin databaseleri ile de gecerli olan yontem bu. Elinde daha modern ve destekleyen bir database var ise (ornegin PostgreSQL) o zaman bu bolumler icin oyle ayri bir tablo tutmak yerine, bir ENUM yaratip kullanabilirsin.

    Not: TCKimlik essiz (ya da en azindan oyle olmali), o yuzden "dogal" bir PRIMARY KEY olarak kullanilabilir.
    13 Ekim 2015 Salı 12:04
    Yanıtlayıcı
  • Foreign key, teorik olarak iki tablo arasındaki ilişkiyi tanımlayan alan olarak kullanıyoruz. Bunun yanında birde fiziksel görevi de var ki bu çok önemlidir.

    1. Foreign Key Constraint:

    Bu kısıtlama alt tabloya kayıt eklenirken FK alanına üst tabloda var olmayan bir PK değerinin yazılmasını engeller.

    2. Foreign Key Replication

    Bu özellik ise üst tabloda bir kayıt silinirken, alt tabloda ilişkili kayıtlar varsa silme engellenebilir ya da istenirse alt tablodaki ilişkili kayıtların da silinmesi sağlanabilir.

    Bunlar veri bütünlüğünü sağlamak, örneğin kategorisiz ürün olmasını , birimsiz personel olmasını yazılımsal olarak engeller.


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    • Yanıt Olarak İşaretleyen Sedat Kaynar 14 Ekim 2015 Çarşamba 05:01
    13 Ekim 2015 Salı 12:28
    Moderatör
  • Mantık yürütemiyorsun çünkü yapmak istediğin şey pek mantıklı değil. Neden Birimler ve Personel için birer tablo oluşturup foreign key ile bağlamıyorsun?

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    • Yanıt Olarak Öneren Soner KOYLU 12 Ekim 2015 Pazartesi 17:06
    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:59
    12 Ekim 2015 Pazartesi 16:58
    Moderatör
    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:59
    13 Ekim 2015 Salı 07:53
  • Yok ben illa kara düzen gideceğim diyorsan da neden sorgunda ona göre seçim yapmıyorsun

    sqlcommand cmd=new SqlCommand("select id from tabloAdi where birimAdi='idari birimler' grup by columAdi desc",conn);

    burda sana en son numarayı verir id  olarak direk SqlReader ile alabilirsin ama uğraşırsın.

    Önay Hoca ve Soner Beyin dedikleri en kolay yolu ve daha hızlı performansdır.


    pancarahmet

    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:45
    13 Ekim 2015 Salı 09:24
  • var denemeler = db.TabloAdi
                      .Select( t => t.Deneme )
                      .ToArray();

    Bu ne isine yarayacak bilemem. 

    MS SQL Server kullaniyorsan, Sequence var. postgreSQL kullaniyorsan Serial var. Bunlara neden ihtiyacin oldugunu sen daha iyi bilirsin ama var. 

    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:44
    13 Ekim 2015 Salı 10:22
    Yanıtlayıcı

Tüm Yanıtlar

  • Kodları yazarsan Yardımcı olmaya çalışalım

    Bilgisayar,Hayallerini, Mantığını Kullanarak Gerçekleştirir...

    12 Ekim 2015 Pazartesi 14:20
  • if (cbCalistigiBolum.Text == "İdari Bölüm")
                    {
                        tksnbaglan.Open();
                        tksncmd.Connection = tksnbaglan;
                        tksncmd.CommandText = "select * from Personel";
                        SqlDataReader drpersonel = tksncmd.ExecuteReader();
                        while (drpersonel.Read())
                        {
                            if (int.Parse(drpersonel[46].ToString()) < 100)
                            {
                                for (int i = 99; i <= 0; i--)
                                {
                                    if (int.Parse(drpersonel[46].ToString()) != i)
                                    {
                                        ibmNumarasi = i;
                                    }
                                }
                            }
                        }
                        drpersonel.Close();
                        tksncmd.Dispose();
                        tksnbaglan.Close();
                    }
                    if (cbCalistigiBolum.Text == "Kesimhane")
                    {
                        tksnbaglan.Open();
                        tksncmd.Connection = tksnbaglan;
                        tksncmd.CommandText = "select * from Personel";
                        SqlDataReader drpersonel = tksncmd.ExecuteReader();
                        while (drpersonel.Read())
                        {
                            if (int.Parse(drpersonel[46].ToString()) < 100)
                            {
                                for (int i = 199; i <= 100; i--)
                                {
                                    if (int.Parse(drpersonel[46].ToString()) != i)
                                    {
                                        ibmNumarasi = i;
                                    }
                                }
                            }
                        }
                        drpersonel.Close();
                        tksncmd.Dispose();
                        tksnbaglan.Close();
                    }

    Dediğim gibi yazdığım kodlar size korkunç gelebilir kafamda nasıl yapacağımı bir türlü toparlayamadığım için saçmalamış olabilirim. Kusura bakmayın.

    En son "ibmNumarasi" değişkeni içerisindeki veriyi veritabanına yazdıracağım.




    12 Ekim 2015 Pazartesi 14:38
  • Mantık yürütemiyorsun çünkü yapmak istediğin şey pek mantıklı değil. Neden Birimler ve Personel için birer tablo oluşturup foreign key ile bağlamıyorsun?

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    • Yanıt Olarak Öneren Soner KOYLU 12 Ekim 2015 Pazartesi 17:06
    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:59
    12 Ekim 2015 Pazartesi 16:58
    Moderatör
  • Mantık yürütemiyorsun çünkü yapmak istediğin şey pek mantıklı değil. Neden Birimler ve Personel için birer tablo oluşturup foreign key ile bağlamıyorsun?

    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Aklın yolu bir. Soruyu okur okumaz bunu yazayım diye içimden geçti. Sen yazmışsın hemen abi.

    Mail Blog Web Site

    12 Ekim 2015 Pazartesi 17:07
  • Peki veritabanının herhangi bir sütunundaki kayıtları (mesela sütun ismi deneme olsun) bir dizi değişkenin içerisine nasıl atabilirim.
    13 Ekim 2015 Salı 05:37
    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:59
    13 Ekim 2015 Salı 07:53
  • Yok ben illa kara düzen gideceğim diyorsan da neden sorgunda ona göre seçim yapmıyorsun

    sqlcommand cmd=new SqlCommand("select id from tabloAdi where birimAdi='idari birimler' grup by columAdi desc",conn);

    burda sana en son numarayı verir id  olarak direk SqlReader ile alabilirsin ama uğraşırsın.

    Önay Hoca ve Soner Beyin dedikleri en kolay yolu ve daha hızlı performansdır.


    pancarahmet

    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:45
    13 Ekim 2015 Salı 09:24
  • var denemeler = db.TabloAdi
                      .Select( t => t.Deneme )
                      .ToArray();

    Bu ne isine yarayacak bilemem. 

    MS SQL Server kullaniyorsan, Sequence var. postgreSQL kullaniyorsan Serial var. Bunlara neden ihtiyacin oldugunu sen daha iyi bilirsin ama var. 

    • Yanıt Olarak İşaretleyen Sedat Kaynar 13 Ekim 2015 Salı 10:44
    13 Ekim 2015 Salı 10:22
    Yanıtlayıcı
  • Haklısınız foreign key'i biraz araştırmam gerekiyor. Nasıl kullanıldığı yada yöntemi konusunda bir bilgim yok. Kafamda şöyle kurgulamıştım;

    Önce ibmNo sütunundaki mesela 0 ile 99 arasında olan sayıları bir dizi içerisine atıp daha sonra bu dizi içindeki en büyük sayıyı bulup bir artırmayı düşünmüştüm bu yüzden dizi değişkenin içerisine nasıl atacağımı sormuştum. Ama daha fazla zorlamayacağım ve tavsiyenizi dinleyeceğim. Foreign key yöntemini basir bir örnek ile ve açıklama satırlarıyla anlayabileceğim şekilde bir kaynak verirseniz sevinirim.
    13 Ekim 2015 Salı 10:52
  • Foreign Key

    Bu da gayriresmi sekilde benim aciklamam:

    Simdi senin personelin var. Bir Personel tablosunda onlarin bilgilerini tutuyorsun (nufus cuzdani gibi nadiren degisen ve degistiginde yine sadece o kisiye ait olan bilgileri):

    Personel: TCKimlik, Ad, Soyad, DogumYeri, DogumTarihi ... 

    Nufus cuzdanlarinda seri nosu vardir. Bu bizi ilgilendirmez, nufus idaresi tarafindan veriliyor ve tek, benimki sadece bana ait (ya da TCKimlikNo). Bu anlamli da sayilmaz, onemli olan o degerin, bir cuzdani digerinden ayirabilmesi ve cuzdan sahibini ilgilendirmiyor (yani otomatik uretilmeli ve insan eli degmesine izin vermemeli). Buna PRIMARY KEY diyoruz. PRIMARY KEY, bir tablo icerisinde essiz olarak bir satiri digerlerinden ayirmak icin kullanilir (mahkemede X ve Y'den olma Z dogumlu ... diye kisiyi belirlemenin kisa ve kesin sekli). Sonucta senin Personel tablon:

    Personel: PersonelID, TCKimlik, Ad, Soyad, DogumYeri, DogumTarihi ... 

    seklinde. Kullandigin database'e ozel komutlarla bu PersonelId'yi database tarafindan otomatik olarak verilen bir deger yapiyorsun. Unutma bu deger kullaniciyi ilgilendirmiyor, kayitlari bulabilmek icin sadece yazilimcilari ve database'i ilgilendiriyor. Kullanici hic gormese de olur.

    Senin ayni zamanda calisma bolgelerin var, onun icin de benzer sekilde bir tablo:

    Bolumler: BolumID, Adi

    1, Idari bolum
    2, Kesimhane
    3, Preshane

    gibi. 

    Personel, bolumler arasinda yer degistirmiyordur, ya da degistirse bile sen sadece su anki yerleriyle ilgileniyorsundur, o zaman dogrudan Personel tablosuna bolumunu belirten BolumID kolonunu eklersin:

    Personel: PersonelID, TCKimlik, Ad, Soyad, DogumYeri, DogumTarihi ... , BolumID

    iste bu BolumID FOREIGN KEY. Yani bir baska tablonun PRIMARY KEY'sini isaret ediyor. Orada 1 varsa Personel "Idari bolum"dendir gibi.

    Kisilerin yer degistirmeleri mumkun ve sen bunu tarihsel olarak tutmak istiyorsan araya 3. bir "kopru" tablo girer (Personelden BolumID'yi kaldiriyoruz):

    PersonelYer: PersonelID, BolumID, Baslangic, Bitis

    gibi. Burada iki tane FOREIGN KEY, Personel ve Bolumler tablolarinin PRIMARY KEY'lerini isaret ediyor. 

    Hangi database'i kullandigini bilmedigimden ve aslinda FOREIGN KEY anlatmaya calistigimdan, yukaridaki gibi 30-40 yil oncesinin databaseleri ile de gecerli olan yontem bu. Elinde daha modern ve destekleyen bir database var ise (ornegin PostgreSQL) o zaman bu bolumler icin oyle ayri bir tablo tutmak yerine, bir ENUM yaratip kullanabilirsin.

    Not: TCKimlik essiz (ya da en azindan oyle olmali), o yuzden "dogal" bir PRIMARY KEY olarak kullanilabilir.
    13 Ekim 2015 Salı 12:04
    Yanıtlayıcı
  • Foreign key, teorik olarak iki tablo arasındaki ilişkiyi tanımlayan alan olarak kullanıyoruz. Bunun yanında birde fiziksel görevi de var ki bu çok önemlidir.

    1. Foreign Key Constraint:

    Bu kısıtlama alt tabloya kayıt eklenirken FK alanına üst tabloda var olmayan bir PK değerinin yazılmasını engeller.

    2. Foreign Key Replication

    Bu özellik ise üst tabloda bir kayıt silinirken, alt tabloda ilişkili kayıtlar varsa silme engellenebilir ya da istenirse alt tablodaki ilişkili kayıtların da silinmesi sağlanabilir.

    Bunlar veri bütünlüğünü sağlamak, örneğin kategorisiz ürün olmasını , birimsiz personel olmasını yazılımsal olarak engeller.


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    • Yanıt Olarak İşaretleyen Sedat Kaynar 14 Ekim 2015 Çarşamba 05:01
    13 Ekim 2015 Salı 12:28
    Moderatör
  • Bu soruyu tekrar sormak zorundayım.

    Diyelimki ben dediğiniz gibi yaptım ve 2 tablo hazırladım. Bir tanesine tblPersonel diğerine de tblBirim dedim. tblBirim de sadece id ve ibmNo var. Kayıt yaparken combobox'tan idari birim seçilmişse tblBirim tablosunun ibmNo alanına 0 ile 100 arasında ibmNo'ları, Kesimhane seçilmişse 100 ile 200 arasında ibmNo'ları vereceğim. Buraya kadar sorun yok. Yapmak istediğim şu;

    Diyelimki ibmNo alanında idari birime ait 001, 002, 003, 004, 005 kayıtları var. Ben daha önce 003 olan kayıtı sildim. 001, 002 ,004, 005 kaldı. Daha sonra tekrar personel eklemek isteyip idari birimi seçtiğimde sıradan baksın ve olmayan ilk numarayı bulsun (003) ve yeni personele bu ibm numarasını versin istiyorum. Tam olarak öğrenmek istediğim bu daha önce anlatamamış olabilirim kusura bakmayın.

    19 Ekim 2015 Pazartesi 12:32
  • Sen dinlemiyorsun ve israrla ve de gereksiz sekilde birimlere X-Y araliginda ibmNo diye bir zimbirti atamak istiyorsun. Oyle olsun:

    WITH  tally ( siraNo )
            AS (
                 SELECT TOP 10000
                        ROW_NUMBER() OVER ( ORDER BY t1.[object_id] )
                 FROM   sys.all_columns t1
                 CROSS JOIN sys.all_columns t2
               )
      SELECT MIN(siraNo)
      FROM    tally
      WHERE   NOT EXISTS ( SELECT *
                       FROM   tblPersonel p
                       WHERE  p.BirimID = @birimId and
                              tally.siraNo >= @IdBaslangic and
                              p.PersonelId = tally.[siraNo] );

    Buna birimID ve baslangic ID parametre olarak verip istedigin olur, ama unutma bunu insert sirasinda kullanmalisin yoksa cakisma yasarsin. Sanirim bunu bir SP haline getirip trigger olarak kullanmak isteyeceksin.


    19 Ekim 2015 Pazartesi 14:30
    Yanıtlayıcı
  • Sen dinlemiyorsun ve israrla ve de gereksiz sekilde birimlere X-Y araliginda ibmNo diye bir zimbirti atamak istiyorsun. Oyle olsun:

    WITH  tally ( siraNo )
            AS (
                 SELECT TOP 10000
                        ROW_NUMBER() OVER ( ORDER BY t1.[object_id] )
                 FROM   sys.all_columns t1
                 CROSS JOIN sys.all_columns t2
               )
      SELECT MIN(siraNo)
      FROM    tally
      WHERE   NOT EXISTS ( SELECT *
                       FROM   tblPersonel p
                       WHERE  p.BirimID = @birimId and
                              tally.siraNo >= @IdBaslangic and
                              p.PersonelId = tally.[siraNo] );

    Buna birimID ve baslangic ID parametre olarak verip istedigin olur, ama unutma bunu insert sirasinda kullanmalisin yoksa cakisma yasarsin. Sanirim bunu bir SP haline getirip trigger olarak kullanmak isteyeceksin.



    BEN ERROR :(

    19 Ekim 2015 Pazartesi 14:47