triger ile ay - gun ve no verme

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

triger ile ay - gun ve no verme

Mesaj gönderen musti »

bir alan o gunun ay ile birlikte otomatik artan bir no gomulebilirmi

Yani 31.08.125
Gun.Ay.Artan No
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Bu alanı string olarak tanımlayıp
Delphi tarafindan before post eventinde

Kod: Tümünü seç

Select Max(ALAN1)  from TABLO1 where ALAN1 like '31.08.%'
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...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

fahrettin hocam
tesekkur ederim o sekilde yapmak pek işime gelmiyor direk vt olması nı arzulamıştım.

aynı anda 3 .4 pc lerde de işlem girilince karışıyor vt yapsa bunu kendini sıra sokar diye dusunuyorum

"bir pcnin tarihi yanlıs olabilir "
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Kulandığınız veritabanını bilmiyorum ama firebird için şöyle bir trigger yazdım ve oldu.

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
Denediğim tablo adı TESTTABLE'dı ve artması gereken alan id varchar(20) olarak tanımlanmıştı. İşinize yarar umarım.
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

TSK EDERIM ILGIIN ICIN

EVET FIREBIRD/ INTERBASE
DATA TYPE ILE ILGILI HATA VERYIOR
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Söylediğim gibi ben varchar(20) şeklinde tanımladığım ID alanı için hazırladım ve çalıştırdım. Siz kendi ihtiyacınız doğrultusunda değiştiriniz
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

bi anlayabilsem abi neler yapacamda anlayamdım ki
varchar 20 derken ne demek istiyon
ben bunu alıyorum ibconsole yapıstırıyorum table adına kendi tablemi yazıyorum ve
calistiramiyorum
rica etsem biraz daha bilgi verirmisiniz?
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

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;
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Ben Firebird 1.5.4731 kullanıyorum. IBConsole kullanmıyorum yerine IBExpert kullanıyorum.
Örnek tablo DDL'i bu şekildeydi.

Kod: Tümünü seç

CREATE TABLE TESTTABLE (
    ID    VARCHAR(20) NOT NULL,
    DUMMY VARCHAR(20)
);
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.
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

tsk ederim ilgin icin
ama bende calismadi

biraz daha ugrasayim olmaz ise
baska sey deniyecez artık
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a
@musti alan isimlerini ve tiplerini kontrol ediyorsun değilmi. verilen örneklerdeki isim ve tiplerle senin kullandığın tablodaki isim ve tipler uymayabilir.
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 abi
kontrol ettim abi
ondan degilmis abi dialect meseli imis benim database 1 di 3 yaptım sorun yok allaha sukur

tskler t-hex
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

t-hex yazdı:

Kod: Tümünü seç

   .....
  NEW.ID =  NEW.ID || max_id;
end
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....

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... 8)
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Fahrettin hocam, asıl Allah sizden razı olsun böyle bir yardımlaşma ortamının oluşmasında emeğiniz geçtiği için. Yardımcı olabildiysem ne mutlu bana.

Herkese iyi çalışmalar
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

:(
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.
Cevapla