Bir zamanlar yazmış olduğum, firebird veritabanı üzerinde sayıları yazıya çeviren procedure.
Kullanım: SELECT p.TUTARYAZI FROM YAZIYLA(111023.03) p TUTARYAZI --------- YÜZONBİRBİNYİRMİÜÇ YTL ÜÇ YKR
Kaynak kodları…
SET TERM ^ ; CREATE PROCEDURE BASAMAKYAZI( BASAMAK Integer, RAKAM Integer ) RETURNS ( YAZI Varchar(20) ) AS BEGIN YAZI= case basamak when 1 then case rakam when 1 then 'BİR' when 2 then 'İKİ' when 3 then 'ÜÇ' when 4 then 'DÖRT' when 5 then 'BEŞ' when 6 then 'ALTI' when 7 then 'YEDİ' when 8 then 'SEKİZ' when 9 then 'DOKUZ' end when 2 then case rakam when 1 then 'ON' when 2 then 'YİRMİ' when 3 then 'OTUZ' when 4 then 'KIRK' when 5 then 'ELLİ' when 6 then 'ALTMIŞ' when 7 then 'YETMİŞ' when 8 then 'SEKSEN' when 9 then 'DOKSAN' end when 3 then case rakam when 1 then 'YÜZ' when 2 then 'İKİYÜZ' when 3 then 'ÜÇYÜZ' when 4 then 'DÖRTYÜZ' when 5 then 'BEŞYÜZ' when 6 then 'ALTIYÜZ' when 7 then 'YEDİYÜZ' when 8 then 'SEKİZYÜZ' when 9 then 'DOKUZYÜZ' end end; SUSPEND; END^ SET TERM ; ^ SET TERM ^ ; CREATE PROCEDURE YAZIYLA ( TUTAR Numeric(18,2) ) RETURNS ( TUTARYAZI Varchar(300) ) AS DECLARE VARIABLE tutarstr VARCHAR(50); DECLARE VARIABLE yazi VARCHAR(50); DECLARE VARIABLE len integer; DECLARE VARIABLE tamsayistr VARCHAR(50); DECLARE VARIABLE tamsayiuz integer; DECLARE VARIABLE kesirstr VARCHAR(2); DECLARE VARIABLE i integer; DECLARE VARIABLE rakam integer; DECLARE VARIABLE basamak integer; DECLARE VARIABLE uclubasamak integer; BEGIN tutarstr=tutar; len = 0; TUTARYAZI = ''; len= CHAR_LENGTH(tutarstr); IF (len = 0) THEN BEGIN TUTARYAZI = 'SIFIR'; END tamsayiuz = len-3; tamsayistr = SUBSTRING(tutarstr FROM 1 FOR tamsayiuz); kesirstr = SUBSTRING(tutarstr FROM len-1 FOR 2); i = 1; uclubasamak = tamsayiuz; WHILE (uclubasamak>3) DO BEGIN uclubasamak = uclubasamak-3; END -- Tam kısmı WHILE (i<=tamsayiuz) DO BEGIN rakam = SUBSTRING(tamsayistr FROM i FOR 1); basamak = tamsayiuz-i+1; IF ((tamsayiuz=1) AND rakam=0) THEN TUTARYAZI = 'SIFIR'; IF (( rakam>0 ) and (not ( tamsayiuz = 4 and basamak = 4 and rakam = 1 ))) THEN BEGIN -- 1111 EXECUTE PROCEDURE BASAMAKYAZI(:uclubasamak,:rakam) RETURNING_VALUES :YAZI; TUTARYAZI = TUTARYAZI || TRIM(YAZI); END IF ((BASAMAK=4) AND (TUTARYAZI not like '%MİLYON' and TUTARYAZI not like '%MİLYAR')) THEN TUTARYAZI = TUTARYAZI||'BİN' ; IF ((BASAMAK=7) AND ( TUTARYAZI not like '%MİLYAR' )) THEN TUTARYAZI = TUTARYAZI || 'MİLYON'; IF (BASAMAK=10) THEN TUTARYAZI = TUTARYAZI || 'MİLYAR'; i = i + 1; uclubasamak = uclubasamak - 1; IF (uclubasamak = 0) THEN uclubasamak = 3; END TUTARYAZI = TUTARYAZI||' TL '; -- Kuruş Kısmı IF (CAST (kesirstr AS INTEGER)>0) THEN BEGIN rakam = SUBSTRING(kesirstr FROM 1 FOR 1); IF ( rakam > 0 ) THEN BEGIN EXECUTE PROCEDURE BASAMAKYAZI(2,:rakam) RETURNING_VALUES :YAZI; TUTARYAZI= TUTARYAZI||TRIM(YAZI); END rakam = SUBSTRING(kesirstr FROM 2 FOR 1); IF ( rakam > 0 ) THEN BEGIN EXECUTE PROCEDURE BASAMAKYAZI(1,:rakam) RETURNING_VALUES :YAZI; TUTARYAZI= TUTARYAZI||TRIM(YAZI); END TUTARYAZI= TUTARYAZI||' KR'; END SUSPEND; END^ SET TERM ; ^
Bu güzel çalışma için teşekkür ederim. Kendi projemde kullanıyorum. Bir sorunla karşılaşıyorum. 3000 TL için sonuç BİNTL şeklinde geriye dönüyor. Nasıl düzeltebilirim.
Kod üzerinde değişiklik yaptım.
Kodu tekrar alıp çalıştırınız.
İyi çalışmalar.
teşekkür ederim. elinize sağlık