Veritabanında ID alan oluşturmadan güncelleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Veritabanında ID alan oluşturmadan güncelleme

Mesaj gönderen Gold_Lady »

Merhaba,
Veritabanında ID alan ( otomatik artan sayı varya o tam adını bilmiyorum) olmadan IBdataset ile güncelleştirme yapabilir miyiz?
Deniyorum ancak bir sonuç çıkaramadım. Sanırım yanlış yapıyorum. Kullandığım kod:

Kod: Tümünü seç


IBDataSet1.Close;
ibdataset1.ModifySQL.Clear;
IBDataSet1.modifysql.Add('UPDATE NEW_TABLE SET BIRIM='''+edit4.Text+''''+ 'WHERE BIRIM='''+edit3.Text+'''');
ibdataset1.open;
ibtransaction1.CommitRetaining;

Yardımcı olursanız sevinirim..
Şimdiden teşekkür ederim...
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
dün de dediğim gibi bunu ibdataset1.selectsql koduna yazıp
open yerine execsql i çalıştırın.
Update de delete gibi sonuç döndürmeyen bir deyimdir. o yüzden ibsql ile de kullanabilirsiniz.
Son bir not parametreleri ekleme yerine parametre olarak verseniz daha iyi olur.
Mesela aşağıdaki gibi veya quotedstr kullanılabilir. Kaç tane tırnak bırakacağınızı şaşırımamanız için

Kod: Tümünü seç

IBDataSet1.Close;
ibdataset1.selectsql.Clear;
IBDataSet1.selectsql.Add('UPDATE NEW_TABLE SET BIRIM=:birimpar  WHERE BIRIM=:birimdeg');
ibdataset1.parambyname('birimpar').asstring:=edit4.text;
ibdataset1.parambyname('birimdeg').asstring:=edit3.text;
ibdataset1.execsql;
ibtransaction1.CommitRetaining;


http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
o işlemi ibdataset ile yapmayın.
ibdataseti i bir nevi table bileşeni olarak düşünün.
Sizin yaptığınız işlem için ibupdatesql vey ibsql veya ibquery bileşenlerinden biri kullanılabilir.
query yazıldıktan sonra execquery (veya ilgili bileşenin exec metodu) ile query nizi çalıştırabilirsiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
İşim çıktığı için önceki mesajı tam yazmadan post ettim.
Size biraz daha açıklama yapma gereği duydum.

İbdatasetlerde bulunan ibdataset1.modifySQL gibi eventlara yazdığınız deyimler, İbdatasete bağladığınız bir dbedit,bir dbgrid olabilir bu bileşenleri kullanıp verileri değiştirdiğinizde otomatik olarak modifySQL deki komutlar çalıştırılır. Ordaki deyimler db bileşenlerinin hareketlerine cevap vermek içindir. O yüzden onları genelde değiştirmemeniz gerekir.

Diğer topiğinizde dediğim gibi Ayrıca bu işleri yapmak istiyorsanız ibsql türü bileşenleri ekleyip çalıştırsanız daha iyi olur. Ayrıca ibdatasetin amacı da kayıt düzenlemektir. yani edit bileşenleri değil dbedit bileşenleri kullanarak kayıtları kolay bir şekilde düzenlemektir. Mesela ibdatasetten önce
kayıt düzenlemek için ibquery+ibupdatesql ikilisi kullanılıyordu. ibdataset bu ikilinin yerine geçti.

Yani bileşenleri işinizin ihtiyacınıza göre kullanırsanız daha rahat edersiniz.


Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Birbirlerine o kadar benziyorlar ki o mu bu mu derken insan çıldırıyor. Hele birde yeni başladıysanız.

Çok teşekkür ederim. Daha gidecek çok uzun bir yolum var anlaşılan. :oops:
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Yok olmayacak sanırım, beceremiyorum ben bu SQL olayını:
@ofenX' in önerisiyle aşağıdaki kodu denedim, önce tamam işte bu dedim ancak, bir kayıt değiştirmek istediğimde BIRIM alanında değiştirmek istediğim değerle beraber aynı değere sahip ne kadar kayıt varsa hepsini değiştiriyor.
Mesela birim alanında o an seçili kayıtın değeri Litre, ben bunu metre ile değiştirmek istiyorum, o alanda ne kadar litre varsa hepsini metre ile değiştiriyor.

Kod: Tümünü seç

IBDataSet1.Close;
ibdataset1.selectsql.Clear;
IBDataSet1.selectsql.Add('UPDATE NEW_TABLE SET BIRIM=:birimpar  WHERE BIRIM=:birimdeg');
ibdataset1.parambyname('birimpar').asstring:=edit4.text;
ibdataset1.parambyname('birimdeg').asstring:=edit3.text;
ibdataset1.execsql;
ibtransaction1.CommitRetaining; 
Ne yapmak istediğimide anlatamıyorum sanırım, kod çalışıyor ancak benim istedğimi gibi değil. Bunaldım sıkıldım ama yok kod bana ben koda baktım durdum gece yarısına kadar.Ben mi yanlış denizlerde yüzüyorum, bu Delphi mi çok karışık anlayamadım.
Sanırım Delphi yine raftaki tozlu yerini alacak benim için...
Ama tekrar Visual Basic ile de uğraşmak istemiyorum...
:roll:
En son Gold_Lady tarafından 27 Nis 2006 08:36 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Gold_Lady yazdı:@ofenX' in önerisiyle aşağıdaki kodu denedim, önce tamam işte bu dedim ancak, bir kayıt değiştirmek istediğimde BIRIM alanında değiştirmek istediğim değerle beraber aynı değere sahip ne kadar kayıt varsa hepsini değiştiriyor.
Anahtar sözcük bu. Yazdığınız kodda diyorsunuz ki Birim alanı edit3'ün textine eşit olanları güncelle. O da sizin dediğinizi aynen yapıyor. ID kullanmanın maksadı da zaten bu. Her bir kaydı birbirinden ayırabilmek. ID neden kullanmıyorsunuz bilmiyorum ama kullanırsanız işiniz daha kolay olur aksi takdirde where'den sonra öyle bir şart yazmalısınız ki sadece sizin istediğiniz kayıt uysun o şarta.

Kolay Gelsin...

Not: Delphi'yi atmayın tozlu raflara, bu Delphi'den değil SQL'den kaynaklanıyor. Hangi dili kullanırsanız kullanın bu problemi zaten yaşayacaktınız.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Delphi' yi öğrenmeye çalışıyorum, ID ne işe yarar onu bile bilmiyorum. Forumu okudum ancak kimisi çok gerekli kimisi kullanılsada olur kullanılmasada olur yazmış. ID ile deneyim dedim trigger girdi olaya. Kavrayamıyorum, anlayamıyorum, yapamıyorum.
aksi takdirde where'den sonra öyle bir şart yazmalısınız ki sadece sizin istediğiniz kayıt uysun o şarta.
Derken nasıl bir şart? , forumda ne yazayımda aratayım yardımcı olur musunuz?

NOT: Şimdiye kadar veritabanı ile pek işim olmamıştı, kendimce amatör şeyler ile uğraşırdım. Visual Basic yetiyordu. Haklısınız galiba Visul Basic ile de olsa SQL sorun olacaktı.
En son Gold_Lady tarafından 27 Nis 2006 08:48 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

id şart bence kim değil dedi bilmiyorum. veri tabanı olarak ne kullanıyorsunuz? fire bird ise trigger kullanmak gerekiyor tabii ki. Ama acces, ms sql vb gibi bir veri tabanı ise onlar otomatik olarak yapıyor bu işi zaten.

Şart derken: birim = litre and tarih=şu tarih and saat=bu saat gibi bişeyer demek lazım.
ama id kullanırsanız where id=5 diyince sadece id'si 5 olan kaydı günceller.

Kolay Gelsin...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Veritabanı Firebird kullanıyorum.
ID konusunda where ID=5 derken, mesela bir sorgu yaptım ismine göre sorguladım veritabanını.
Karşıma ismi atıyorum Ahmet olan kayıt geldi tabi anladıgım kadarıyla alan PK olacagından bir tane Ahmet yazılı kayıt gelcek. Peki şimdi ben bunun ID numarasının kaç oldugunu nasıl bileceğim ve SQL' de Where Id= den sonra her arama için nasıl bir şey yazdıracağımda bu ID ye bildireceğim programa.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

ilk sql de seçtiğiniz alanların içine id alanınıda eklemeniz gerekiyor.
firebird'de trigger ile id tanımlama sanırım anlatılmıştır. Generator de tanımlamak gerekiyor triggerda kullanmak için.

Eğer bulamazsanız ben de bi döküman olacaktı bunu anlatan.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

bu konuyu diyorsunuz sanırım.

http://www.delphiturkiye.com/index.php? ... ataset.htm

Bunun dışında başka kaynak varsa rica etsem sizden yollar mısınız?
Değişik kaynak olması daha iyi olur.. :oops:
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Dökümanı bulduğumda bi özet çıkardığımı gördüm.
Önce bi generator tanımlamak gerekiyor, generator her seferinde 1 artan bir sayı üretiyor ve her bir tablo için ayrı bir generator tanımlamak lazım.

Kod: Tümünü seç

create generator isim
gen_tabloadi gibi bi standart kullanılırsa iyi olur.

sonra da insert olayından önce bu generatorden sayıyı alıp tabloda ilgili alana (id alanına) yazacak olan bi trigger lazım.

Kod: Tümünü seç

create trigger triger_icin_bir_isim for tablo_adi
active before insert
as
begin
   if (new.id_icin_kullanilan_alan_adiis null) then
      new.id_icin_kullanilan_alan_adi=GEN_ID(generator_adi,1);
   end
bu sql kodlarını kullanarak bir id alanına otomatik olarak her yeni kayıt eklediğinizde bir değer atayabilirsiniz.

Kolay Gelsin...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Bu arada eğer ingilizceniz varsa "Teach Yourself Interbase" adında bi pdf döküman var, FireBird'ün sitesinde bulmuştum ben. Temel bilgileri gayet basit bir şekilde anlatıyor, ben oldukça faydalanmıştım.

Kolay Gelsin...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Gold_Lady
Üye
Mesajlar: 142
Kayıt: 03 Nis 2006 08:39
Konum: İş Yerinden :)
İletişim:

Mesaj gönderen Gold_Lady »

Çok teşekkür ederim.
Cevapla