Hazırladığımız programlarda bazı tablolarda otomatik kod oluştumamız gerekmektedir.
Mesela fatura keserken 'A001' gibi bir seri takip etmemiz gerekir.
Bu gibi işlemleri yapmak için ben bu seri numaraları tutan bir tablo ve bu tablodan parametreleri okuyup sıradaki numarayı geri döndüren bir procedure var. önce tablomuzu oluşturalım.
Kod: Tümünü seç
CREATE TABLE NUMARALAR (
FIRMAID DINTEGER NOT NULL /* DINTEGER = INTEGER */,
CARI DINTEGER DEFAULT 0 /* DINTEGER = INTEGER */,
FATURA DINTEGER DEFAULT 0 /* DINTEGER = INTEGER */,
IRSALIYE DINTEGER DEFAULT 0 /* DINTEGER = INTEGER */,
SIPARIS DINTEGER DEFAULT 0 /* DINTEGER = INTEGER */,
TAHSILAT DINTEGER DEFAULT 0 /* DINTEGER = INTEGER */,
ODEME DINTEGER DEFAULT 0 /* DINTEGER = INTEGER */,
STOK DINTEGER DEFAULT 0 /* DINTEGER = INTEGER */,
CARI_ONEK KARAKTER10 DEFAULT 'C' /* KARAKTER10 = VARCHAR(10) */,
FATURA_ONEK KARAKTER10 DEFAULT 'F' /* KARAKTER10 = VARCHAR(10) */,
IRSALIYE_ONEK KARAKTER10 DEFAULT 'I' /* KARAKTER10 = VARCHAR(10) */,
SIPARIS_ONEK KARAKTER10 DEFAULT 'S' /* KARAKTER10 = VARCHAR(10) */,
TAHSILAT_ONEK KARAKTER10 DEFAULT 'T' /* KARAKTER10 = VARCHAR(10) */,
ODEME_ONEK KARAKTER10 DEFAULT 'O' /* KARAKTER10 = VARCHAR(10) */,
STOK_ONEK KARAKTER10 DEFAULT 'STK' /* KARAKTER10 = VARCHAR(10) */,
CARI_UZUNLUK DSMALLINT DEFAULT 10 /* DSMALLINT = SMALLINT */,
FATURA_UZUNLUK DSMALLINT DEFAULT 10 /* DSMALLINT = SMALLINT */,
IRSALIYE_UZUNLUK DSMALLINT DEFAULT 10 /* DSMALLINT = SMALLINT */,
SIPARIS_UZUNLUK DSMALLINT DEFAULT 10 /* DSMALLINT = SMALLINT */,
TAHSILAT_UZUNLUK DSMALLINT DEFAULT 10 /* DSMALLINT = SMALLINT */,
ODEME_UZUNLUK DSMALLINT DEFAULT 10 /* DSMALLINT = SMALLINT */,
STOK_UZUNLUK DSMALLINT DEFAULT 10 /* DSMALLINT = SMALLINT */
);
ALTER TABLE NUMARALAR ADD CONSTRAINT PK_NUMARALAR PRIMARY KEY (FIRMAID);
Onun haricinde tabloda (her firma için)tek bir kayıt olacağı için ekstra bir ID alanı tanımlamadım.
Tabloda
CARI, FATURA, IRSALIYE, SIPARIS, TAHSILAT, ODEME, STOK
tabloları için otomatik kod oluşturuyorum bu yüzden her bir tablo için kendi adıyla başlayan 3 alan var.
- CARI = Enson verilen değeri tutuyor..
CARI_ONEK = Artan Alanımızın önüne ekleyeceğimiz kod
CARI_UZUNLUK = Artan alanımızın uzunluğu
Kod: Tümünü seç
INSERT INTO NUMARALAR (FIRMAID, CARI, FATURA, IRSALIYE, SIPARIS, TAHSILAT, ODEME, STOK, CARI_ONEK, FATURA_ONEK, IRSALIYE_ONEK, SIPARIS_ONEK, TAHSILAT_ONEK, ODEME_ONEK, STOK_ONEK, CARI_UZUNLUK, FATURA_UZUNLUK, IRSALIYE_UZUNLUK, SIPARIS_UZUNLUK, TAHSILAT_UZUNLUK, ODEME_UZUNLUK, STOK_UZUNLUK) VALUES (2, 5, 0, 0, 0, 0, 0, 0, 'C', 'F', 'I', 'S', 'T', 'O', 'STK', 6, 10, 10, 10, 10, 10, 10);
Procedure ile sıradaki numarayı oluşturup istediğimiz yerde tablomuza ekleyebiliriz.
Kod: Tümünü seç
CREATE PROCEDURE SP_SIRADAKINUMARAYIVER (
IN_FIRMAID INTEGER,
IN_TUR INTEGER)
RETURNS (
OUT_NUMARA VARCHAR(15))
AS
DECLARE VARIABLE V_DEGER INTEGER;
DECLARE VARIABLE V_ONEK VARCHAR(10) CHARACTER SET WIN1254;
DECLARE VARIABLE V_UZUNLUK SMALLINT;
DECLARE VARIABLE V_BOSLUK VARCHAR(15);
begin
select case :in_tur
when 1 then n.cari+1
when 2 then n.fatura+1
when 3 then n.irsaliye+1
when 4 then n.siparis+1
when 5 then n.tahsilat+1
when 6 then n.odeme+1
when 7 then n.stok+1
else '1'
end,
case :in_tur
when 1 then n.cari_onek
when 2 then n.fatura_onek
when 3 then n.irsaliye_onek
when 4 then n.siparis_onek
when 5 then n.tahsilat_onek
when 6 then n.odeme_onek
when 7 then n.stok_onek
else 'X'
end,
case :in_tur
when 1 then n.cari_uzunluk
when 2 then n.fatura_uzunluk
when 3 then n.irsaliye_uzunluk
when 4 then n.siparis_uzunluk
when 5 then n.tahsilat_uzunluk
when 6 then n.odeme_uzunluk
when 7 then n.stok_uzunluk
else 5
end
from numaralar n
where n.firmaid=:in_firmaid
into :v_deger, :v_onek, :v_uzunluk;
v_bosluk='';
while ((strlen(out_numara))<(v_uzunluk)) do
begin
out_numara=v_onek||v_bosluk||v_deger;
v_bosluk=v_bosluk||'0';
end
suspend;
end
isteyen after insert veya beforeinsert trigerlarında kullanabilir.
procedureyi kullanmak için firmaid ve hangi tablo için alan oluşturacaksak o alanın sıranumarasını parametre olarak vermemiz yeterli. procedure bize istediğimiz tablo için sıradaki numarayı oluşturacaktır.
Not: Procedure strlen UDF sini kullanmaktadır. Bu udf yi yüklemek için firebird in udf klasöründeki scripti çalıştırabilirsiniz.
Kolay Gelsin.