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)