ytl yazı ile gösterme, para okuma,Sayıyı Yazıya çevirme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

ytl yazı ile gösterme, para okuma,Sayıyı Yazıya çevirme

Mesaj gönderen akdatilla »

merhaba arkadaşlar
aşağıdaki kodlar tarafımca yazılıp ihtiyacı olabilecek arkadaşlara sunulmuştur. Kodlarda bazı dış kaynaklardan yararlandım.
Özellikle çevirme komutunun orjinali bir delphi fonksiyonundan alınmış
firebird'e güçlükle çevrilmiştir.
SP_SUBNUMSTR sp'si SP_SUBSTRING isimli dışarıdan aldığım bir sp'nin kısaltılmış şeklidir.

Kodlar üzerinde çalışılarak daha hızlı, daha kısa kodlar üretilebilir.
Yeni üreteceğiniz kodlardan hepimizin yararlanabilmesi için bu foruma eklemenizi rica ediyorum.

Not: Bu kodların SQLServer versiyonu aşağıdaki linkden görülebiir.
viewtopic.php?p=124597#124597

Kolay gelsin.

Kod: Tümünü seç

CREATE TABLE BSMBINLER (
    BIN_HANE    SMALLINT NOT NULL,
    BIN_DEGERI  VARCHAR(16)
);

CREATE TABLE BSMYUZLER (
    YUZ_Y       SMALLINT NOT NULL,
    YUZ_Z       SMALLINT NOT NULL,
    YUZ_DEGERI  VARCHAR(10)
);

--tablolar içinde olması gerekli veriler
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (1,'Seksilyon');
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (2,'Kentrilyon');
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (3,'Katrilyon');
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (4,'Trilyon');
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (5,'Milyar');
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (6,'Milyon');
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (7,'Bin');
INSERT INTO BSMBINLER (BIN_HANE,BIN_DEGERI) VALUES (8,'');

INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,0,'');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,1,'Yüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,2,'İkiyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,3,'Üçyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,4,'Dörtyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,5,'Beşyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,6,'Altıyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,7,'Yediyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,8,'Sekizyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (1,9,'Dokuzyüz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,0,'');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,1,'On');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,2,'Yirmi');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,3,'Otuz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,4,'Kırk');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,5,'Elli');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,6,'Altmış');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,7,'Yetmiş');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,8,'Seksen');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (2,9,'Doksan');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,0,'');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,1,'Bir');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,2,'İki');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,3,'Üç');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,4,'Dört');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,5,'Beş');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,6,'Altı');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,7,'Yedi');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,8,'Sekiz');
INSERT INTO BSMYUZLER (YUZ_Y,YUZ_Z,YUZ_DEGERI) VALUES (3,9,'Dokuz');

--çevirme için gerekli bir sp
CREATE PROCEDURE SP_SUBNUMSTR (
   SRC                              VARCHAR (255),
   START_AT                         INTEGER,
   NLEN                             INTEGER
   )
RETURNS (
   RESULT                         VARCHAR (255)
   )
AS
   declare variable II INTEGER;
   declare variable VGL VARCHAR(255);
   declare variable PFX VARCHAR(255);
   declare variable C CHAR(1);
BEGIN

  IF ( START_AT <= 0 ) THEN START_AT = 1;
  IF ( START_AT > 255 ) THEN START_AT = 255;

  IF ( NLEN > 255 ) THEN NLEN = 255;
  IF ( NLEN < 1 OR NLEN IS NULL ) THEN NLEN = 1;

  VGL = '';
  RESULT = '';
  PFX = '';

   IF ( START_AT > 1 ) THEN
   BEGIN
     II = 1;
     WHILE ( II < START_AT ) DO
     BEGIN
       PFX = PFX || '_';
       II = II + 1;
     END
   END
   II = START_AT;
   WHILE ( II < NLEN + START_AT ) DO
   BEGIN
    C = ' ';

     IF ( SRC LIKE PFX || ' %' ) THEN C = ' ';
     ELSE IF ( SRC LIKE PFX || '0%' ) THEN C = '0';
     ELSE IF ( SRC LIKE PFX || '1%' ) THEN C = '1';
     ELSE IF ( SRC LIKE PFX || '2%' ) THEN C = '2';
     ELSE IF ( SRC LIKE PFX || '3%' ) THEN C = '3';
     ELSE IF ( SRC LIKE PFX || '4%' ) THEN C = '4';
     ELSE IF ( SRC LIKE PFX || '5%' ) THEN C = '5';
     ELSE IF ( SRC LIKE PFX || '6%' ) THEN C = '6';
     ELSE IF ( SRC LIKE PFX || '7%' ) THEN C = '7';
     ELSE IF ( SRC LIKE PFX || '8%' ) THEN C = '8';
     ELSE IF ( SRC LIKE PFX || '9%' ) THEN C = '9';
     ELSE IF ( SRC LIKE PFX || '.%' ) THEN C = '.';
     ELSE IF ( SRC LIKE PFX || ',%' ) THEN C = ',';
     RESULT = RESULT || :C;

     PFX = PFX || '_';
     II = II + 1;
     IF ( II > 255 ) THEN
     BEGIN
       SUSPEND;
       EXIT;
     END
   END
    SUSPEND;
 END



--Tamsayıyı yazı ile çıktı veren sp 
CREATE PROCEDURE YAZIILEGOSTER(VSAYI DOUBLE PRECISION) RETURNS (VSONUC VARCHAR(750))
AS
 declare variable Vi INT;
 declare variable Vy INT;
 declare variable Vz INT;
 declare variable VParca VARCHAR(5);
 declare variable VASt VARCHAR(24);
 declare variable VEkSt VARCHAR(26);
 declare variable VAraSonuc VARCHAR(2000);
 declare variable Vn INT;
 declare variable VRPos Int;
 declare variable Vhane Int;
 declare variable VBSt VARCHAR(24);
 declare variable VRSubstr VARCHAR (255);
BEGIN
    VSONUC='';
    VBSt=CAST(:VSAYI AS VARCHAR(24));
    VASt='';
    execute procedure LEN :VBSt returning_values :Vn;
    Vi=:Vn;
    Vj=0;
    --return cast(Vi as varchar(5))
    while (:Vi>0) DO
    begin
        vj=:vj+1;
        EXECUTE PROCEDURE SP_SUBNUMSTR :VBSt,:Vi,1 returning_values :VRSubstr;
        if (:VRSubstr='.') then
        Begin
            VASt='';
            Vn=:Vn-:vj;
            Vj=0;
        end
        else
        if (:VRSubstr<>' ') then
        VASt=:VASt||:VRSubstr;
        Vi=:Vi-1;
    end
    Vi=1;
    Vhane=1;
    while (:Vi<=:Vn) do
    begin
         EXECUTE PROCEDURE SP_SUBNUMSTR :VASt,:Vi,3 returning_values :VRSubstr;
         VParca=:VRSubstr;
         VAraSonuc='';
         Vy=1;
         while (:Vy<4) do
         begin
              EXECUTE PROCEDURE SP_SUBNUMSTR :VParca,4-:Vy,1 returning_values :VRSubstr;
              if (not((:VRSubstr is null) or (:VRSubstr=' ')))  then
              begin
                Vz=cast(:VRSubstr as int);
                select :VAraSonuc||' '||YUZ_DEGERI from BSMYUZLER where YUZ_Y=:Vy AND YUZ_Z=:Vz
                into :VAraSonuc;
              end
              Vy=:Vy+1;
         end
         if (:VAraSonuc<>'') then
         select :VAraSonuc||' '||BIN_DEGERI FROM BSMBINLER WHERE BIN_HANE=9-:Vhane into :VAraSonuc;
         if (:VAraSonuc='Bir Bin') then VAraSonuc='Bin';
         Vi=:Vi+3;
         Vhane=:Vhane+1;
         VSONUC=:VAraSonuc||:VSONUC;
    end
    suspend;
END

--YTL sayıyı yazı ile çıktı veren sp
CREATE PROCEDURE KURUSLUOKU(VSAYI DOUBLE PRECISION) RETURNS (VSONUC VARCHAR(250))
AS
  declare variable VTAMKISMI DOUBLE PRECISION;
  declare variable VONDAKISMI DOUBLE PRECISION;
  declare variable VGSAYI DOUBLE PRECISION;
  declare variable VSVal VARCHAR(60);

BEGIN
    VGSAYI=FLOOR(:VSAYI);
    VTAMKISMI=:VGSAYI;
    VGSAYI=ROUND(VSAYI*100,0)-VGSAYI*100;
    VONDAKISMI=:VGSAYI;
    VSONUC='';
    IF (:VTAMKISMI>0) THEN
    Begin
        execute procedure YAZIILEGOSTER :VTAMKISMI returning_values :VSVAL;
    end
    if (:VSVAL<>'') then VSONUC=:VSONUC||VSVal||' YTL';
    IF (:VONDAKISMI>0) Then
    Begin
        VSVal='';
        execute procedure YAZIILEGOSTER :VONDAKISMI returning_values :VSVal;
        if (:VSVAL<>'') then VSONUC=:VSONUC||VSVal||' YKR';
    end
    suspend;
END

--Örnek Okuma Komutu:
SELECT * FROM KURUSLUOKU(3215.245)
Nail19
Üye
Mesajlar: 4
Kayıt: 24 Kas 2004 10:51
Konum: İzmir, Gaziemir

Mesaj gönderen Nail19 »

Yazmış olduğun kodlar için teşekkür ederim. Emeğine sağlık.

Fakat ben senin gönderdiğin haliyle çalıştıramadım. Bu nedenle senin kodlarda düzenleme ve ilaveler yaptım. Onları gönderiyorum.

Kod: Tümünü seç

---------------------  Udf Ekledim.
DECLARE EXTERNAL FUNCTION FLOOR
    DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'IB_UDF_floor' MODULE_NAME 'ib_udf';



---------------------
CREATE PROCEDURE KURUSLUOKU (
    vsayi double precision)
returns (
    vsonuc varchar(250))
as
declare variable vtamkismi numeric(18,2);
declare variable vondakismi numeric(18,2);
declare variable vgsayi numeric(18,2);
declare variable vsval varchar(60);
BEGIN 
    VGSAYI=FLOOR(:VSAYI);
    VTAMKISMI=:VGSAYI; 
--  VGSAYI=ROUND(VSAYI*100,0)-VGSAYI*100;
--  VONDAKISMI=:VGSAYI;
    vondakismi=(:vsayi-:vtamkismi)*100;
    VSONUC=''; 
    IF (:VTAMKISMI>0) THEN 
    Begin 
        execute procedure YAZIILEGOSTER :VTAMKISMI returning_values :VSVAL; 
    end 
    if (:VSVAL<>'') then VSONUC=:VSONUC||VSVal||' YTL'; 
    IF (:VONDAKISMI>0) Then 
    Begin 
        VSVal=''; 
        execute procedure YAZIILEGOSTER :VONDAKISMI returning_values :VSVal; 
        if (:VSVAL<>'') then VSONUC=:VSONUC||VSVal||' YKR'; 
    end 
    suspend; 
END



---------------------Procedure Ekledim.
CREATE PROCEDURE LEN (
    str varchar(100))
returns (
    len integer)
as
declare variable pat varchar(100);
BEGIN 
  len = null; 
  IF (str IS NULL) THEN EXIT; 

  pat = ''; 
  len = 0; 
  WHILE (NOT str LIKE pat) DO BEGIN 
    pat = pat || '_'; 
    len = len + 1; 
  END 
END
--onaydin   ARKADAŞIMIZIN YAPTIĞI PROCEDURE


---------------------
CREATE PROCEDURE YAZIILEGOSTER (
    vsayi double precision)
returns (
    vsonuc varchar(750))
as
declare variable vi integer;
declare variable vy integer;
declare variable vz integer;
declare variable vj integer;
declare variable vparca varchar(5);
declare variable vast varchar(24);
declare variable vekst varchar(26);
declare variable varasonuc varchar(2000);
declare variable vn integer;
declare variable vrpos integer;
declare variable vhane integer;
declare variable vbst varchar(24);
declare variable vrsubstr varchar(255);
BEGIN 
    VSONUC=''; 
    VBSt=CAST(:VSAYI AS VARCHAR(24)); 
    VASt=''; 
--burasıyok    execute procedure LEN :VBSt returning_values :Vn;
  execute procedure LEN(:vbst) returning_values :Vn;
    Vi=:Vn; 
    Vj=0; 
    --return cast(Vi as varchar(5)) 
    while (:Vi>0) DO 
    begin 
        vj=:vj+1; 
        EXECUTE PROCEDURE SP_SUBNUMSTR :VBSt,:Vi,1 returning_values :VRSubstr; 
        if (:VRSubstr='.') then 
        Begin 
            VASt=''; 
            Vn=:Vn-:vj; 
            Vj=0; 
        end 
        else 
        if (:VRSubstr<>' ') then 
        VASt=:VASt||:VRSubstr; 
        Vi=:Vi-1; 
    end 
    Vi=1; 
    Vhane=1; 
    while (:Vi<=:Vn) do 
    begin 
         EXECUTE PROCEDURE SP_SUBNUMSTR :VASt,:Vi,3 returning_values :VRSubstr; 
         VParca=:VRSubstr; 
         VAraSonuc=''; 
         Vy=1; 
         while (:Vy<4) do 
         begin 
              EXECUTE PROCEDURE SP_SUBNUMSTR :VParca,4-:Vy,1 returning_values :VRSubstr; 
              if (not((:VRSubstr is null) or (:VRSubstr=' ')))  then 
              begin 
                Vz=cast(:VRSubstr as int); 
                select :VAraSonuc||' '||YUZ_DEGERI from BSMYUZLER where YUZ_Y=:Vy AND YUZ_Z=:Vz 
                into :VAraSonuc; 
              end 
              Vy=:Vy+1; 
         end 
         if (:VAraSonuc<>'') then 
         select :VAraSonuc||' '||BIN_DEGERI FROM BSMBINLER WHERE BIN_HANE=9-:Vhane into :VAraSonuc; 
         if (:VAraSonuc=' Bir Bin') then VAraSonuc='Bin';
         Vi=:Vi+3; 
         Vhane=:Vhane+1; 
         VSONUC=:VAraSonuc||:VSONUC; 
    end 
    suspend; 
END

akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Mesaj gönderen akdatilla »

merhaba
Kodlarda bir yazım hatam var sanırım. (:) işareti koymamışım bir değişkenin üzerine. Ancak bu halde de çalışıyor doğrusu.
Ben firebird 2.x kullanıyorum. Firebird 1.5.x de bu haliyle çalışmayabilir.
Len() sp'sini,
udf'leri yazmadım. Kusura bakmayın.
Ben'deki len() sp'sini kontrol ettim. Nail beyin gönderdiği kodlarla aynı.
Ben len() sp'sini birsüre önce yabancı bir internet sitesinden almıştım.

udfler
http://rfunc.sourceforge.net/
adresinden indirebileceğiniz.rfunc.dll dosyasından kullanılabilir.
Cevapla