Firebirdde string otomatik artan alan oluşturmak.

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
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Firebirdde string otomatik artan alan oluşturmak.

Mesaj gönderen aslangeri »

S.A.
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);
Burda firma id benim hazırladığım programda birden fazla firma olması durumunda herbirini ayrı ayrı takip etmek için kullandığım bir alan. Hazırladığınız programa göre bu alana ihtiyacınız olmayabilir.
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
Şimdi bu tabloya kaydımızı girelim.

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);
gelelim dananın kuyruğunun koptuğu yere.
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
Bu procedureyi ben delphi tarafında kullanıyorum.
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.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
burak
Üye
Mesajlar: 9
Kayıt: 02 Oca 2008 12:47

Mesaj gönderen burak »

paylaşım için teşekkürler, ellerinize sağlık
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

emeğine sağlık usta
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Cevapla