Makbuz-Fiş Seri ve Sıra numaraları hakkında bir diğer yöntem

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ı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Makbuz-Fiş Seri ve Sıra numaraları hakkında bir diğer yöntem

Mesaj gönderen freeman35 »

Aşağıda Table ın DDL i var. Kullandığım kodları yapıştırıyorum, gereksiz alanları ayıkladım gözümden kaçan ufak yazım hataları olabilir

Kod: Tümünü seç

DECLARE EXTERNAL FUNCTION LPAD
    CSTRING(255),
    INTEGER,
    CSTRING(1)
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'IB_UDF_lpad' MODULE_NAME 'ib_udf';


CREATE TABLE MASTER_ (
    MAK_SERI     DM_STR2 /* DM_STR2 = VARCHAR(2) */,
    MAK_SIRA     DM_BIGINT NOT NULL /* DM_BIGINT = BIGINT */,
    MAK_TRH      DM_DATE NOT NULL /* DM_DATE = DATE */,
    MAK_NO       COMPUTED BY (CAST( COALESCE(MAK_SERI, '')
      || '-' ||
      LPAD(CAST(MAK_SIRA AS VARCHAR(15)) ,15,' ')
AS VARCHAR(18)))
);
MAK_NO yu oluştururken kullandığım LPAD standart UDF içinde mevcut. Yaptığı iş gönderilen stringin soluna belirtilen adete tamamlamak şartıyla belirtilen karakter ekler.
Computed alanı AS VARCHAR(18 ) ile sabitleme sebebim LPAD function ı 255 karakter return değeri olduğu için, "MASTER_" table ın select inde okadar uzun oluyor, buda gereksiz bir network trafinde yük oluşturur.bunu engellemek için benim en fazla olabilecek uzunluk 18 olduğu için 18 le sabitledim.

Aşağıdaki Procedure ilede en büyük kaydı bulup 1 arttırıp dışarı çıkartıyor. burda püf nokta şu delphi yada FB içinde kullanılırken Seri NO ='' yani null olması boşluk ile null farklı olarak algılanabilir(başıma gelmişti)Bende o yüzden boşluksa bu null dur diye kurguladım tüm db ve delphi tarafında.

Ayrıca, MAK_TYPE_ID ile aynı table da birden fazla farklı fiş tipi bilgisini saklıyorum, bana sum alırken kolaylık sağlıyor. Yani tahsilat ve tediye için aynı table ı kullanıyorum Alacak ve Borç field larını sum ile alabilmek gibi. Siz kendi yapınızda bunu kullanmaya bilirsiniz.

Kod: Tümünü seç

CREATE OR ALTER PROCEDURE SP_LAST_MST_SIRA(
    MAK_TIPI__ INTEGER,
    SERI__ VARCHAR(2))
RETURNS (
    RESULT INTEGER)
AS
BEGIN
RESULT=-1;
 IF (SERI__ IS NULL) THEN BEGIN
    SELECT COALESCE( MAX(MASTER_.MAK_SIRA), 0)
    FROM MASTER_
    WHERE (MASTER_.MAK_TYPE_ID =:MAK_TIPI__)AND
          (MASTER_.MAK_SERI IS NULL)
    INTO:RESULT;
  RESULT = RESULT + 1;
 END ELSE BEGIN
    SELECT COALESCE( MAX(MASTER_.MAK_SIRA), 0)
    FROM MASTER_
    WHERE (MASTER_.MAK_TYPE_ID =:MAK_TIPI__)AND
          (MASTER_.MAK_SERI = :SERI__)
    INTO:RESULT;
  IF ( RESULT IS NULL ) THEN RESULT = 0;
  RESULT = RESULT + 1;
 END
 SUSPEND;
END
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla