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:
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:
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