Firebird içinden teklif numarası oluşturma

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
AhmetNuri
Üye
Mesajlar: 260
Kayıt: 02 Tem 2007 07:55
Konum: ist
İletişim:

Firebird içinden teklif numarası oluşturma

Mesaj gönderen AhmetNuri »

Selamlar, uzun süredir forumlar yardımı ile firebird veri tabanı geliştiriyorum. Şimdi elde ettiğim kodlardan ilginç olanları sizlerle paylaşmak istedim. Konu firebird içinnden teklif yada sipariş numarası oluşturma.
trigger ile otomatik olarak sipariş numarası hazırlayalım. Her zamanki gibi ilk önce analiz yaparak işe başlıyoruz. Sipariş numarmız yıl+ay+xxxx olarak 4 basamklı bir sayıdan oluşsun. 2011010001,2011010002.....2011020001...2012010001 gibi üç tane değişim süreci var. 4 basamklı sayı her ay değişiminde sıfırlanması gerekiyor. Bu işlemi herhangi bir programlama dilinden 5 dakikada yapabilirsiniz. Fakat en güvenli yol veri tabanı üzerinden yapmaktır. Karışıklık çıkmaz. Aynı sipariş numarasını başkasına verme riski olmaz. Bu numarayı oluşturmak için

* 2 adet trigger
* 3 adet generator
* 1 adet test tablsou oluşturacağız.

Öncelikle test tablosundan başlıyalım.
order adında bir tablomuz ve iki adet alanımız olsun. Tablo isimlerini ingilizce kullanmanızı tavsiye ederim. bir gün projeniz büyürse ekibin nereli olacağı hiç belli olmuyor.
1. alan order_id Otomatik artan integer
2. alan order_no 20 Karekterli String utf8
Numara alanına string değer atama nedenim bazen numaranın başına harf koymak gerekebiliyor. Mesela sipariş numarası ile teklif numarasını ayırmak için teklifin başına T siparişin başına S harfi koymak gerekebiliyor. 10 karekter yerine 20 karekter kullanma nedeni ise ileri ye dönük taleplerin tam karşılanabilmesi. Karekter sınırını sadece çıktı alırken sayfaya sığması için kullanın artık veri tabanları terebaylara kadar veri depolayabiliyor. vchar bir alanda 10 tane fazla string kesinlikle size bir zarar vermez.
Şimdi generator leri nerede kullanacağımız tesbit edelim.

1. generator ü order_id nin otomatik olarak artması için kullanacağız
2. generator ü teklif sıra numarasının artması için kullanacağız
3. generatoru ise ay değişmişmi değişmemişmi anlamak için kullanacağız

Asıl işlevi trigger yapacak. Trigger ı order tablosunun BEFORE INSERT olayına ekliyoruz.

Şimdiye kadar anlatılan teklif numarası oluşturma ile ilgili kod öneli olan aşğıdaki trigger diğer kodlar standart ems veya ibx otomatik olarak oluşturuyor. Takdir edersinizki 3. parti programlarla otomatik olarak oluşabilen kodları buradan vermenin bir anlamı yok. Bu örnek ile generator ve Trigger ın güçünü anlamış olacaksınız. Tavsiyem bu tip kodlar kullanmadan mobil cihazlar için kod geliştirme işine hiç girmeyin.
Bu arada order isimli bir tablo adı tavsiye edilmez Çünkü Order By deyimi ile sorun yaşayabilirsiniz. Bu örnekte sorun çıkmadı fakat bu hiç çıkmaz demek değil. Bir güncelleme olur bi şey olur order da patlayabilir.

Kod: Tümünü seç

AS
declare variable CYearStr VARCHAR(4);
declare variable CMonthStr VARCHAR(2);
declare variable MonthInt INTEGER;
declare variable EndMonthInt INTEGER;
declare variable OrderNoInt Integer;
declare variable AddZero VARCHAR(10);
declare variable OrderNoStr VARCHAR(20);
/*Trigger kodunun başlangıcı amac otomatik olarak teklif/sipariş numarası hazırlamak
2011010001,2011010002 gibi
Ahmet Nuri DENİZ 01.2011
*/
begin
if (new.ORDER_NO is null) then begin /*EĞER EL İLE NUMARA YAZILMADI İSE*/
/*DEĞİŞKENLERE DEĞERLERİ ATANIYOR*/
EndMonthInt = gen_id(ORDER_ORDER_NO_MONTH,0);
MonthInt = (extract(Month from current_date));
CYearStr = (cast (extract(year from current_date) as varchar(4)));
/*AY KISIMI 1. AY İÇİN 1 ,2. AY İÇİN 2 OLARAK GELİR 01,02 OLARAK YAZMAK İÇİN KONTROL*/
if (MonthInt < 10 ) then CMonthStr = '0' || (cast (extract(Month from current_date) as varchar(2)));
else
CMonthStr = (cast (extract(Month from current_date) as varchar(2))) ;
/*EĞER YENİ BİR AYA GİRİLMİŞ İSE
TEKLİF NUMARASINI TUTUAN TRİGGER SIFIRLANMALI
GÜNCEL AYI TUTAN TRİGGER DAKİ AY DEĞERİ GÜNCELLENMELİ
*/
if (EndMonthInt <> MonthInt) then begin
execute statement'SET GENERATOR ORDER_ORDER_NO_GEN TO 0' ;
execute statement'SET GENERATOR ORDER_ORDER_NO_MONTH TO '|| MonthInt;
end
OrderNoInt = gen_id(ORDER_ORDER_NO_GEN,1);
/*TEKLİF NUMARASININ 0001,0002 GİBİ DÖRT BASAMAKLI OLMASI İÇİN AŞAĞIDAKİ GİBİ KONTROL YAPILIYOR*/
if ((OrderNoInt >=1) and (OrderNoInt < 10)) then AddZero = '000' || cast(OrderNoInt as varchar(4));
if ((OrderNoInt >=10) and (OrderNoInt < 100)) then AddZero = '00' || cast(OrderNoInt as varchar(4));
if ((OrderNoInt >=100) and (OrderNoInt < 1000)) then AddZero = '0' || cast(OrderNoInt as varchar(4));
OrderNoStr = CYearStr || CMonthStr || AddZero;
New.order_no = ordernostr;
end
end
Dosya ekleri
FBTEST0_1.zip
Siparis Numarası örneği
Fb 2.5 ve üzeri ile çalışır
(46.18 KiB) 241 kere indirildi
Ahmet DENİZ
Cevapla