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)))
);
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