Trigerdeki bilgiyi master detail dosyasında anlık alma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Trigerdeki bilgiyi master detail dosyasında anlık alma

Mesaj gönderen musti »

Düşündümde bu ayrı bir başlık konusu olabilir.

fahrettin hocamın dediği gibi ben bugun cok sey ogrendim allah razi olsun.

ACTIVE BEFORE INSERT POSITION 0

icine giren bir id adı ile kayıtlı field mızı ki bu master table miz oluyor

form üzerinndeli master detail tablele formuzda nasıl kullanırız.

master dosyamız post olup acilip kapanmadan yeni id yi almiyor, tabi
boyle oluncada detail dosyamız masterdaki id deki degeri almiyor. sizce bu nasil olmalı . Master detail kaldırdım Query ile yapayım dedim yi
ne olmadı. once post edeyim sonra onu okuyayum en sonraki id yi alayim detail tablemdeki yeni id ye eşitleyim dedim buda mantık lı gelmedi cunku ayni anda 3 , 4 pc den fis girisi yapiliyor. Zaten sorun olmasın diye bu id triger la yapalım dedik ki sagolsun hocam yardımcı oldu.

sonuc olarak yapamadim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Delphi içinden yapmak istiyorsan Detail tablonun BeforeInsert inde Master tablonun State inin insert modunda olup olmadığını kontrol edebilir, insert te ise önce master tabloyu post edebilirsin..

Kod: Tümünü seç

if Master.State in [dsInsert] then
  Master.Post;
Bundan sonra da Detail in OnNewRecord veya AfterInsert inde Masterdaki ilişkili alanı Detailin alanına taşırsın.

Kod: Tümünü seç

 Detail.FieldByName('ID').AsInteger := Master.FieldByName('ID').AsInteger; 
Ayrıca arama yaparsan konu ile ilgili bir çok konuşma geçmişti :wink:
viewtopic.php?t=9830&highlight=master+detail+ibdataset
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

hocam id trigerla olustugu icin post oluncada anında
master table gelmiyor.

IBTable ile zaten master detail ilişkisi DataSource MAstesource kullanarak yaptım

ben biraz daha farklı bir yontem denedim oda trigerla yine detail doysaınında id sini yine trigerla olsutrgugum master dosyassından alsın dedim ve form üzerinde ki hic id kontrolu yapmam ve ya master detail uygulama ma gerek kalmadı .

Ama test etmedim. tek kullanıcıda sorun olmaz tabi de benim sıkıntım aynı anda 5- 6 pc den fis giriliyor ve hepsine tiriger id veriyor. Allah kerim

kodum ise soyle
once master taple post oluyor tabiki :




CREATE TRIGGER "detail_id" FOR "detail_TABLE"
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE variable temp CHAR(20);
begin
select max(id) from master_table
into temp;
NEW.ID=temp;
end
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
ibdataset in generator fields özelliği var. onu kullanabilirsin.
direk generatorden okuyup id alanına (pkey alanına) değer veriyor.

kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

a.s selam
hocam generator um yokki triger icinde hallediyorum yani into ile degiskene alıp yazıyorum.
Zaten generator sadece sayi artırma degilmi.
Gun.ay. generatore eklenebiliyormu

soyle bir sey yani 09.02.0001 yade 09.02.1 de olabilir bu sayı her kayıtda ay ve gune gore artacak 09.02.2.... 09.02.3 gibi
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

master tablemdeki trigera yazayım
sogulsun hocalarım yardımcı oldular

AS
DECLARE variable temp CHAR(2);
declare variable max_id integer;
begin
temp = EXTRACT(DAY from Current_date);
if (substring(temp from 2 for 1) = '') then temp = '0' || temp;
NEW.ID = TEMP || '.';
temp = EXTRACT(MONTH from Current_date);
if (substring(temp from 2 for 1) = '') then temp = '0' || temp;
NEW.ID = NEW.ID || TEMP || '.';
select coalesce(max(cast(substring(id from 7 for 2) as integer)),0)
from TESTTABLE
where id starting with new.id
into max_id;
max_id = max_id + 1;
NEW.ID = NEW.ID || max_id;
end
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

@musti kardeş trigger lerle boşuna kastırıyorsun gibime geliyor :wink: ya @aslangeri nin dediği yöntemle generatör kullanmalısın yada benim söylediğim yöntemle yapmalısın.. :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

hocam
en guvenilir yontem olarak trigeri dusuntugum icin numalandırmaya trigera verdimki sadece formdan appllyupdate veya commit diyince triger yapsın bu isi ve fis numaralandırmada bir hata olmasın. cunku programda olusacak en kucuk bir sorun benim bitisim olur cok yuklu bir transaction var ve 3,4 pc den aynı anda giriliyor.

o yuzden endiseliyim hocam .

saygılar
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

trigger in kullanım amacı bu olaya uymuyor :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Evet hocam bu işin böyle triggerlarla ve üstelik IBX bileşenleri program başından sona tek transaction kullanılacak şekilde tasarlanmışken yapılması çook zor. Bu iş için bence IBX vasat.

En güzeli generator kullanın. Tarihi okuturkende sistem tarihine bakmayın, firebirdden

Kod: Tümünü seç

select first 1 current_date from rdb$fields;
böyle bir sorgu ile sunucudaki tarihi alın. Ona göre işlem yapın. Ay, gün ayırın, sonunada generator değerini ekleyin olsun bitsin.
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

eversez sozuzden cıkmam

trigerlari siliyorum gen_id ile yapiyorum

IBdataset aferpost olayına bu fisnoyu ekleyerek yapıyorum
Cevapla