Null değerli alanları filtereleme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Null değerli alanları filtereleme

Mesaj gönderen Master43 »

S.A.

LO$CREATED_TABLES tablosunda
FIELD_POSITION,
FIRMA_NO,
DONEM_NO ....
gibi alanlarım var ben yeni kayıt eklediğimde yeni girdiğim kaydın FIRMA_NO ve DONEM_NO ile uyuşan daha önce eklenmiş kayıtlar varsa FIELD_POSITION alanına önceki uyan kaydın bir fazlasını yazacak.

Örneklemek gerekirse benim önceden
Firma_No: 5
Dönem_No: 7
FIELD_POSITION:10
değerlerini içeren bir kaydım var olsun yeni ekleyeceğim kaydında değerleri
Firma_No:5 ve Dönem_No:7
olduğunda otomatik olarak FIELD_POSITION = 11 yazacak bir trigger yazmak istiyorum

bunda ne var diyeceksiniz ancak Dönem_No için Null değer içeren kayıtlarda var ve SQL ifadesi olarak

Kod: Tümünü seç

CREATE TRIGGER "TGBI$CREATED_TABLES"       
FOR LO$CREATED_TABLES                      
ACTIVE BEFORE INSERT POSITION 0            
AS                                         
  DECLARE VARIABLE REC_COUNT INTEGER;      
BEGIN                                      
  NEW.ID = GEN_ID(GEN$CREATED_TABLES, 1);  
                                           
    SELECT COUNT(ID) FROM LO$CREATED_TABLES
    WHERE TABLE_NAME = NEW.TABLE_NAME      
      AND FIRMA_NO = NEW.FIRMA_NO          
      AND DONEM_NO = NEW.DONEM_NO          
                                          
  INTO :REC_COUNT;                         
  NEW.FIELD_POSITION = :REC_COUNT + 1;     
END;                                       
yazdığımda Dönem_No için Null değer içeren kayıtlar hep 1 oluyor diğerleri +1 şeklinde normal olarak artıyor.
Sanırım yeni kayıtta Dönem_No alanına bir değer vermediğim halde New.Dönem_No değeri null olarak algılanmıyor heralde.

Bende tezimi sınamak için bu triggerı IF' li yazdım ama değişen bişi yok yine aynı IS NULL kısmı çalışmıyor yani NEW.DONEM_NO hep IS NOT NULL gibi

Kod: Tümünü seç

  
...
IF (NEW.DONEM_NO IS NULL) THEN            
  BEGIN                                     
    SELECT COUNT(ID) FROM LO$CREATED_TABLES 
    WHERE TABLE_NAME = NEW.TABLE_NAME       
      AND FIRMA_NO = NEW.FIRMA_NO           
      AND DONEM_NO IS NULL INTO :REC_COUNT;                         
  END                                       
  ELSE                                      
  BEGIN                                     
    SELECT COUNT(ID) FROM LO$CREATED_TABLES 
    WHERE TABLE_NAME = NEW.TABLE_NAME       
      AND FIRMA_NO = NEW.FIRMA_NO           
      AND DONEM_NO = NEW.DONEM_NO  INTO :REC_COUNT;                         
  END
...
Bi hayli uzun oldu ama umarım sıkmamışımdır. Yorumlarınız için şimdiden teşekkürler.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

select lerin sonuna select edilen değeri /değerleri atayacağın into ları eklememişsin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Mesaj gönderen Master43 »

...
IF (NEW.DONEM_NO IS NULL) THEN
BEGIN
SELECT COUNT(ID) FROM LO$CREATED_TABLES
WHERE TABLE_NAME = NEW.TABLE_NAME
AND FIRMA_NO = NEW.FIRMA_NO
AND DONEM_NO IS NULL INTO :REC_COUNT;
END
ELSE
BEGIN
SELECT COUNT(ID) FROM LO$CREATED_TABLES
WHERE TABLE_NAME = NEW.TABLE_NAME
AND FIRMA_NO = NEW.FIRMA_NO
AND DONEM_NO = NEW.DONEM_NO INTO :REC_COUNT;
END
...

Kalın ve kırmızı işaretlediğim INTO :REC_COUNT lardan başka bir into daha mı kullanmam gerek? acaba
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

AND DONEM_NO = NEW.DONEM_NO

yerine:

AND (DONEM_NO = NEW.DONEM_NO OR (DONEM_NO IS NULL AND NEW.DONEM_NO IS NULL))

yazarak dener misiniz?
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Mesaj gönderen Master43 »

Hakan Can kadeşim eline sağlık gayet güzel çalışıyor ancak neden böyle bir koda ihtiyaç duyuluyor anladım desem yalan olur.

Allah sizin gibileri başımızdan eksik etmesin.
Kullanıcı avatarı
miskin
Üye
Mesajlar: 103
Kayıt: 26 Tem 2005 02:02
Konum: Gavuristan

Re: Null değerli alanları filtereleme

Mesaj gönderen miskin »

Kesin konuyu tam kavramamakla beraber, Triggerini befor insert yapmissin, After insertten sonra normelde degerlerin girmesi lazim degil mi?

Birde select ifadesinin dogrulugunu görmek icin, Soruyu triggerin disinda vermeni tavsiye ederim, istedigin sonuc cikip cikmadigini görmek icin.

miskin
Master43 yazdı:S.A.

LO$CREATED_TABLES tablosunda
FIELD_POSITION,
FIRMA_NO,
DONEM_NO ....
gibi alanlarım var ben yeni kayıt eklediğimde yeni girdiğim kaydın FIRMA_NO ve DONEM_NO ile uyuşan daha önce eklenmiş kayıtlar varsa FIELD_POSITION alanına önceki uyan kaydın bir fazlasını yazacak.

Örneklemek gerekirse benim önceden
Firma_No: 5
Dönem_No: 7
FIELD_POSITION:10
değerlerini içeren bir kaydım var olsun yeni ekleyeceğim kaydında değerleri
Firma_No:5 ve Dönem_No:7
olduğunda otomatik olarak FIELD_POSITION = 11 yazacak bir trigger yazmak istiyorum

bunda ne var diyeceksiniz ancak Dönem_No için Null değer içeren kayıtlarda var ve SQL ifadesi olarak

Kod: Tümünü seç

CREATE TRIGGER "TGBI$CREATED_TABLES"       
FOR LO$CREATED_TABLES                      
ACTIVE BEFORE INSERT POSITION 0            
AS                                         
  DECLARE VARIABLE REC_COUNT INTEGER;      
BEGIN                                      
  NEW.ID = GEN_ID(GEN$CREATED_TABLES, 1);  
                                           
    SELECT COUNT(ID) FROM LO$CREATED_TABLES
    WHERE TABLE_NAME = NEW.TABLE_NAME      
      AND FIRMA_NO = NEW.FIRMA_NO          
      AND DONEM_NO = NEW.DONEM_NO          
                                          
  INTO :REC_COUNT;                         
  NEW.FIELD_POSITION = :REC_COUNT + 1;     
END;                                       
yazdığımda Dönem_No için Null değer içeren kayıtlar hep 1 oluyor diğerleri +1 şeklinde normal olarak artıyor.
Sanırım yeni kayıtta Dönem_No alanına bir değer vermediğim halde New.Dönem_No değeri null olarak algılanmıyor heralde.

Bende tezimi sınamak için bu triggerı IF' li yazdım ama değişen bişi yok yine aynı IS NULL kısmı çalışmıyor yani NEW.DONEM_NO hep IS NOT NULL gibi

Kod: Tümünü seç

  
...
IF (NEW.DONEM_NO IS NULL) THEN            
  BEGIN                                     
    SELECT COUNT(ID) FROM LO$CREATED_TABLES 
    WHERE TABLE_NAME = NEW.TABLE_NAME       
      AND FIRMA_NO = NEW.FIRMA_NO           
      AND DONEM_NO IS NULL INTO :REC_COUNT;                         
  END                                       
  ELSE                                      
  BEGIN                                     
    SELECT COUNT(ID) FROM LO$CREATED_TABLES 
    WHERE TABLE_NAME = NEW.TABLE_NAME       
      AND FIRMA_NO = NEW.FIRMA_NO           
      AND DONEM_NO = NEW.DONEM_NO  INTO :REC_COUNT;                         
  END
...
Bi hayli uzun oldu ama umarım sıkmamışımdır. Yorumlarınız için şimdiden teşekkürler.
Cevapla