Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Tek Seferde İlişkili Tüm Tablolarda Güncelleme Sorunu [ÇÖZÜLDÜ]
#1
Merhaba Arkadaşlar,

Şöyle bir sorun ile başım dertte.  Confused

Birkaç tablom doğrudan cari hesap tablosu ile ilişkili ve ben cari hesap id 'sini değiştirmek istiyorum, doğal olarak diğer tüm tablolardaki cari hesap id 'leri de değişmeli. Bu işi toptan yapabilecek yani hem cari hesap tablomdaki id numarasını değiştirecek hem de bu tabloyla ilişkili diğer tablolardaki cari hesap id 'lerini değiştirecek bir sql kodu yazılabilir mi yoksa bu işin başka bir yöntemimi var ???  Huh

cari hesap id string türden ve 6 karakterle sınırlı.
Cevapla
#2
Merhaba.

SQL UPDATE ile yapılabilir. UPDATE yapısını incelemenizde fayda var.
Bazen daha ileriye ulaşmak için bir kaç adım geri gitmek mecburidir. Çünkü en ileri sıçrayışlar iki adım geriden başlar.
Cevapla
#3
Neden illede SQL kod ile değiştirme gereği duyuyorsunuz da FOREIGN KEY(FK) ile yapmıyorsunuz. Tablolarınızda FK tanımlarken ON UPDATE CASCADE şeklinde belirtirseniz. Ana Cari Hesap tablosundaki ID güncellendiği zaman diğer tablolardaki ID bilgileri de otomatik olarak RDBMS tarafından güncellenir.

FK kullanarak yapmak sizin için de uygunsa. Foreign Key nedir nasıl kullanılır bunu araştırın.
PostgreSQL - Linux - Delphi, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#4
(20-02-2019, Saat: 12:43)SenayAkgun Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba Arkadaşlar,

Şöyle bir sorun ile başım dertte.  Confused

Birkaç tablom doğrudan cari hesap tablosu ile ilişkili ve ben cari hesap id 'sini değiştirmek istiyorum, doğal olarak diğer tüm tablolardaki cari hesap id 'leri de değişmeli. Bu işi toptan yapabilecek yani hem cari hesap tablomdaki id numarasını değiştirecek hem de bu tabloyla ilişkili diğer tablolardaki cari hesap id 'lerini değiştirecek bir sql kodu yazılabilir mi yoksa bu işin başka bir yöntemimi var ???  Huh

cari hesap id string türden ve 6 karakterle sınırlı.

Bu işin birden çok yolu var
1. Tabloların Relationships özelliğini ve bunun alt yapısı içinde bulunan Update, Insert, Delete Rule kavramlarını incelemnizi öneririm.
2. Trigerlar ile bunu sağlıyabilirsiniz
3. Kendiniz bir StoreProcedure yazıp içerisinde ihtiyacınız olan kodları yazarak yapabilirsiniz.

Bu konuları biraz araştırın takıldığınız yer olursa yine yardımcı olmaya çalışırız.

Pardon Veritabanınız access sanırım bu nedenle yukarıda yazdıklarımdan 3. maddeye yoğunlaşmanızı öneririm
gigerleri için kaynak bulmakta zorlana bilirsiniz. 
Yeni versiyonlarında triger veri makroları diye geçiyordu hatırladığım kadarı ile birde böyle incelersiniz
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#5
Arkadaşların yazdıklarına ilave olarak bir tavsiye size;
Bu gibi durumlarda CARI tablosunda AutoIncrement Integer bir alan tanımlayıp diğer bağlı tabloları bu alan üzerinden verirseniz, CARI tablonuzda istediğiniz değişikliği çok rahat yapıp böyle sorunlarla uğraşmazsınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#6
(20-02-2019, Saat: 12:43)SenayAkgun Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba Arkadaşlar,

Şöyle bir sorun ile başım dertte.  Confused

Birkaç tablom doğrudan cari hesap tablosu ile ilişkili ve ben cari hesap id 'sini değiştirmek istiyorum, doğal olarak diğer tüm tablolardaki cari hesap id 'leri de değişmeli. Bu işi toptan yapabilecek yani hem cari hesap tablomdaki id numarasını değiştirecek hem de bu tabloyla ilişkili diğer tablolardaki cari hesap id 'lerini değiştirecek bir sql kodu yazılabilir mi yoksa bu işin başka bir yöntemimi var ???  Huh

cari hesap id string türden ve 6 karakterle sınırlı.

Bir çok yöntem ile sorununuzu çözebilirsiniz ama şunu söyleyeyim; belki dikkate alırsınız. Maalesef, veri tabanı tasarımınız hatalı.

  1. İsminde ID ibaresi bulunan bir alanın türünün string olması beklenmez, sayısal bir saha olması beklenir.
  2. Yine isminde ID ibaresi bulunan bir sahanın primary key/autoinc olması beklenir.
  3. Bu tarz bir alanın (yani sayısal ve autoinc olarak ayarlanmış) diğer tablolar ile ilişkilendirilmesi gerekir.
  4. İlişki hangi alan üzerinden kurulur ise kurulsun,hiç bir neden ile ilişkili alanların güncellenmemesi gerekir. Böyle bir gereksinim de hatalı tasarım anlamına gelir.
Sorununuza çözüm değil biliyorum, lâkin önünüzde başka programlar da olacak; en azından onlar için fikir edinmeniz için yazdım.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
Arkadaşlar, hepinizin eline sağlık beni bilgilendirmişsiniz. Notlarımı aldım başarırsam, buradan sizinle paylaşırım.
Cevapla
#8
Merhaba,

Veritabanı içerisinde ilişkisel verilerin bir arada ve düzenli tutulması için kullanılan alanları işaretlemek, belirlemek için Id (identification) isminde belirleyici bir numerik alan kullanılır. Bunu sizin kodlama tarafında gerçek verilerle eşleştirmeniz biraz yanlış bir yaklaşım olur. Bunun yerine bahsettiğiniz "cari hesap id string türden ve 6 karakterle sınırlı." gibi; string (varchar) alanlar üzerinden özel bir kod ile bilgileri tutmak için Id yerine Kod ibaresi tutabilirsiniz.

Örn:
CariHesapId yerine CariHesapKodu,
CariId yerine CariKodu gibi.

Tek seferde ilgili veri ile alakalı tüm tablolardan update çalıştırmak için birkaç farklı yöntem vardır. Bunlar sizin veritabanı yetkinliğinize göre kapsamlandırılabilir. Birkaç örnek sayacağım, siz kendinize en uygun yöntemi seçin.

1-) Tüm ilgili tablolar için birer update query script'i oluşturun. Güncelleme yaptığınız event/action/function içerisinde hepsini tetikleyin.
2-) Çok katmanlı programlama yaptığınız zaman her tablonuz için update metodunuz hazır olur, her tablonuzun servisindeki bu metodları ilgili işlemde çağırın.
3-) Veritabanı içerisinde fonksiyon veya tetikleyici ile verilerin değişeceği esas tabloda bir şeyler değişirse gidip tüm tablolarda bunu gerçekleştirin.


Şahsi tavsiyeme gelirsek; bir cari hesap alanında kişiyi işaretlemek ve işaretlediğimiz kavramı değiştirmek yerine şöyle bir ilişkisel yapı kurarsanız tüm bu yüklerden kurtulursunuz;

1-) Her tabloda ID alanını tutun.
2-) Her tabloda Kodu alanını tutun.
3-) Arayüzlerinizde Kodu alanını tüm işlemlerde gösterme kullanın, ancak işlemleri ID'ler ile yapın.
4-) Kodu alanı istediğiniz zaman değişse de, verileriniz ID alanı ile sistemde sabit kalacaktır.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#9
(21-02-2019, Saat: 09:36)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba,

Veritabanı içerisinde ilişkisel verilerin bir arada ve düzenli tutulması için kullanılan alanları işaretlemek, belirlemek için Id (identification) isminde belirleyici bir numerik alan kullanılır. Bunu sizin kodlama tarafında gerçek verilerle eşleştirmeniz biraz yanlış bir yaklaşım olur. Bunun yerine bahsettiğiniz "cari hesap id string türden ve 6 karakterle sınırlı." gibi; string (varchar) alanlar üzerinden özel bir kod ile bilgileri tutmak için Id yerine Kod ibaresi tutabilirsiniz.

Örn:
CariHesapId yerine CariHesapKodu,
CariId yerine CariKodu gibi.

Tek seferde ilgili veri ile alakalı tüm tablolardan update çalıştırmak için birkaç farklı yöntem vardır. Bunlar sizin veritabanı yetkinliğinize göre kapsamlandırılabilir. Birkaç örnek sayacağım, siz kendinize en uygun yöntemi seçin.

1-) Tüm ilgili tablolar için birer update query script'i oluşturun. Güncelleme yaptığınız event/action/function içerisinde hepsini tetikleyin.
2-) Çok katmanlı programlama yaptığınız zaman her tablonuz için update metodunuz hazır olur, her tablonuzun servisindeki bu metodları ilgili işlemde çağırın.
3-) Veritabanı içerisinde fonksiyon veya tetikleyici ile verilerin değişeceği esas tabloda bir şeyler değişirse gidip tüm tablolarda bunu gerçekleştirin.


Şahsi tavsiyeme gelirsek; bir cari hesap alanında kişiyi işaretlemek ve işaretlediğimiz kavramı değiştirmek yerine şöyle bir ilişkisel yapı kurarsanız tüm bu yüklerden kurtulursunuz;

1-) Her tabloda ID alanını tutun.
2-) Her tabloda Kodu alanını tutun.
3-) Arayüzlerinizde Kodu alanını tüm işlemlerde gösterme kullanın, ancak işlemleri ID'ler ile yapın.
4-) Kodu alanı istediğiniz zaman değişse de, verileriniz ID alanı ile sistemde sabit kalacaktır.

Merhabalar,

Nacizane olarak,

"Şahsi tavsiyenize" katılıyorum;

ek olarak, ben her tabloda ilişkilendirme için asla "String=VarChar" Kullanmıyorum.
    -> Indexleme
    -> Sorgudaki ilişiklendirmeden doğan yavaşlık
    -> kaplayacağı alan
    -> ve her defasından tabloyu güncellemek zorunda kalacağımdan
bu yöntemi kullanmıyorum.

Yani cariID kaydediyorum. cariKOD olarak kayıt tutmuyorum.

Bir veri gösterecek isem, SQL JOIN ile gerekli sahaları hızlıca birleştirip gösteriyorum. (cariID)

Kullanıcı ana tabloda istediği kadar ünvan kod vs değiştirsin kendi tablosu haricinde hiç bir güncelleme yapmıyorum bu sayede.

Bilgilendirmeniz ve paylaşımınız için tekrar çok teşekkür ederim.



QL84Qr.png
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#10
açılın, ben doktorum.

bir taşta bir kaç kuş vuramayabiliriz ancak birkaç taş fırlatarak bir gergedanı bile mıhlayabiliriz.

veritabanınızda milyonluk satırlara sahip olmadığınız sürece ID alanının ille de autoincrement olması beklenmez ancak bu alanın baştan böyle tasarlanması geleceğe güvenle bakmanızı sağlar.

hemen işe girişelim.

üç adet tablonuz olduğunu düşünelim (cari_hesap, kasa ve stok) kasa ve stok adlı tabloların da cari_hesap adlı tabloyla ilişkisi cari_hesap_id adlı alan ile gerçekleşmiş olsun. (ben yaptım oldu, itiraz istemem)

adım 1:
cari_hesap adlı tablodaki id alanının primary key (birincil anahtar) özelliğini kaldırın.

adım 2:
no adında yeni bir alan ekleyin ve alanın tipini otomatik sayı olarak belirledikten sonra alanı primary key (birincil anahtar) olarak ayarlayın. veritabanınızdaki ilişkiler şekildeki gibi olacaktır.

   

adım 3:
şimdi sıra gergedanımızı mıhlamaya geldi, arkama geçin ve olacakları izleyin.

UPDATE((
cari_hesap

INNER JOIN kasa
ON kasa.cari_hesap_id=cari_hesap.id)

INNER JOIN stok
ON stok.cari_hesap_id=cari_hesap.id)

SET
kasa.cari_hesap_id=cari_hesap.no,
stok.cari_hesap_id=cari_hesap.no

adım 4:
şimdi sıra cesedi kaldırmaya geldi.
cari_hesap adlı tablodaki id alanını kaldırın ve no adındaki alanın adını da id olarak değiştirin. stok ve kasa tablolarındaki cari_hesap_id alanının türünü tamsayı olarak değiştirip, zafer kazanmış bir komutan edası ile olay yerinden uzaklaşın.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi 7 ile ACCDB Dosyalarına Compact İşlemi [Çözüldü] SenayAkgun 11 1.476 22-02-2019, Saat: 20:43
Son Yorum: muratcelik64
Bug Filter property cannot be used for detail tables, Delphi 7 [ÇÖZÜLDÜ] SenayAkgun 9 843 11-02-2019, Saat: 11:56
Son Yorum: SenayAkgun
  Veritabanı Güncelleme Mericx 5 1.924 17-02-2017, Saat: 12:33
Son Yorum: DelphiCanR



Konuyu Okuyanlar: 1 Ziyaretçi