triger ile ay - gun ve no verme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
triger ile ay - gun ve no verme
bir alan o gunun ay ile birlikte otomatik artan bir no gomulebilirmi
Yani 31.08.125
Gun.Ay.Artan No
Yani 31.08.125
Gun.Ay.Artan No
Bu alanı string olarak tanımlayıp
Delphi tarafindan before post eventinde
ile makismum kullanılan degeri bulup string parcalama islemleri ile artan numara kısmını ayırıp 1 arttırıp gun ve ay a ekleyip kullanabilirsiniz...
insert triggerinda bu deger verilemez gibime geliyor.... Zira bu hesaplamayı default deger olarak veremeyeceginiz icin bu hesabi yapıp bir update kodu yazdıgınızda artik olay insert triggerinda degil yeni bir update ile yapılmıs oluyor ki bunun anlamı eger bu alan not null olarak tanımlı ise bu islem gerceklesemez...
Kolay gelsin...
Delphi tarafindan before post eventinde
Kod: Tümünü seç
Select Max(ALAN1) from TABLO1 where ALAN1 like '31.08.%'
insert triggerinda bu deger verilemez gibime geliyor.... Zira bu hesaplamayı default deger olarak veremeyeceginiz icin bu hesabi yapıp bir update kodu yazdıgınızda artik olay insert triggerinda degil yeni bir update ile yapılmıs oluyor ki bunun anlamı eger bu alan not null olarak tanımlı ise bu islem gerceklesemez...
Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... 
* http://delphiturkiye.gunduz.info Seminerler...
* http://www.hakmar.com.tr Kalite bir haktır...

* http://delphiturkiye.gunduz.info Seminerler...

* http://www.hakmar.com.tr Kalite bir haktır...

Kulandığınız veritabanını bilmiyorum ama firebird için şöyle bir trigger yazdım ve oldu.
Denediğim tablo adı TESTTABLE'dı ve artması gereken alan id varchar(20) olarak tanımlanmıştı. İşinize yarar umarım.
Kod: Tümünü seç
CREATE TRIGGER TESTTABLE_BI0 FOR TESTTABLE
ACTIVE BEFORE INSERT POSITION 0
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
Yaptıgım su
SET TERM !,,
CREATE TRIGGER ppp FOR FISHEAD12
ACTIVE BEFORE INSERT POSITION 0
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.FIS_NO = TEMP || '.';
temp = EXTRACT(MONTH from Current_date);
if (substring(temp from 2 for 1) = '') then temp = '0' || temp;
NEW.FIS_NO = NEW.FIS_NO|| TEMP || '.';
select coalesce(max(cast(substring(FIS_NO from 7 for 2) as integer)),0)
from FISHEAD12
where FIS_NO starting with new.FIS_NO
into max_id;
max_id = max_id + 1;
NEW.FIS_NO = NEW.FIS_NO || max_id;
end;
SET TERM !,,
CREATE TRIGGER ppp FOR FISHEAD12
ACTIVE BEFORE INSERT POSITION 0
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.FIS_NO = TEMP || '.';
temp = EXTRACT(MONTH from Current_date);
if (substring(temp from 2 for 1) = '') then temp = '0' || temp;
NEW.FIS_NO = NEW.FIS_NO|| TEMP || '.';
select coalesce(max(cast(substring(FIS_NO from 7 for 2) as integer)),0)
from FISHEAD12
where FIS_NO starting with new.FIS_NO
into max_id;
max_id = max_id + 1;
NEW.FIS_NO = NEW.FIS_NO || max_id;
end;
Ben Firebird 1.5.4731 kullanıyorum. IBConsole kullanmıyorum yerine IBExpert kullanıyorum.
Örnek tablo DDL'i bu şekildeydi.
Belki Firebird ile Interbase triggerı farklı yorumluyor olabilir. Sonuç olarak IBExpert ile yazıp Firebird'e kaydettim ve hiç yakınmadı. Interbase kurulu olmadığı için deneme şansım yok.
Örnek tablo DDL'i bu şekildeydi.
Kod: Tümünü seç
CREATE TABLE TESTTABLE (
ID VARCHAR(20) NOT NULL,
DUMMY VARCHAR(20)
);
Hay Allah sizden razı olsun.... Bu gune kadar before insert triggerinda alanlara deger atılabileceği hiç aklıma gelmemişti... Hatta bu durumlarda hep update kodu yazmışımdır.... Bu cevap ile çok işime yarayacak yeni bir şey öğrenmiş oldum.... Eyvallah....t-hex yazdı:Kod: Tümünü seç
..... NEW.ID = NEW.ID || max_id; end
Sayin musti kodu denemedim ama sonucta bu deger atama yapılabildikten sonra istediginiz islerm bu kod ile olacaktır...
Kolay gelsin....
* http://www.fahrettin.org Manzara Fotoğraflarım... 
* http://delphiturkiye.gunduz.info Seminerler...
* http://www.hakmar.com.tr Kalite bir haktır...

* http://delphiturkiye.gunduz.info Seminerler...

* http://www.hakmar.com.tr Kalite bir haktır...


detail dosyamda bu numaraya nasıl uygulamam gerek sizce
yani master dosyamda otomatik olarak BEFORE INSERT POSITION bu fis numarası aldı. ayni numarayi detail dosyasinda fislere vermeli .
Bilgi girisi icinde bunu yapamam cunku daha kaydet dememil ve aynı anda baska pcler fis girisi yapıyor
post yapar yapmaz olusan numaraya alayim dedim ve detail dosyama yazmadan once fis noları degistireyim dedim ama bu sırada baska birisi fis post etmis olabilir.
Sizce gen_id okuma gibi bir sp ile mi yapmali yada zaten select gen_id ile aliniyor.
yada en profesyoneli nasil olur.