teşekkürler.
sql tipini kullanıp aşağıdaki şekilde hazırladığımız fonksiyonu çağırdım. Bu arada efatura dizayn kısmında koşulları hiç bir şekilde çalıştıramadım. o yüzden koşuluda sql den yaptım. Yanlız bu işlem faturanın dövizli olup olmamasına göre çalışıyor. yani dövizli bir faturayı tl almak isterseniz bile aşağıda döviz tutarı yazacaktır.
Eğer sistemin başta sorduğu sorunun cevabını test edebilirsem çok daha sağlıklı çalışacaktı ama yöntemini bulamadım. şimdilik döviz için ayrı bir tasarım oluşturup aşağıdaki şekilde yazdırdım.
Dövizli mi tl mi almak istiyorsunuz sorunun cevabını nasıl kontrol edebileceğimi bilen varsa paylaşırsa sevinirim.
Tasarımdaki SQL:
case when isnull( VT_Sayisal({1039}),0) > 0 then
XXX2020.DBO.XXX_AY_YAZIYA_CEVIR( VT_Sayisal({1040}), VT_Karekter({1053}) )
else
XXX2020.DBO.XXX_AY_YAZIYA_CEVIR( VT_Sayisal({1035}), 'TL' )
end
tutarı para birimine göre yazı ile yazan fonksiyom:
CREATE FUNCTION [dbo].[XXX_AY_YAZIYA_CEVIR] (@sayi Nvarchar(20), @KUR Nvarchar(20) = 'TL' ) RETURNS VARCHAR(250)
AS
BEGIN
declare @yazi Nvarchar(250) = ''
declare @yazi1 Nvarchar(250) = ''
declare @index tinyint
declare @indexVirgul tinyint
declare @indexNokta tinyint
declare @kurAna Nvarchar(16) = ''
declare @kurKusur Nvarchar(16) = ''
begin
select @indexVirgul = CHARINDEX(',',@sayi)
end
begin
select @indexNokta = CHARINDEX('.',@sayi)
end
if @indexVirgul > 0 and @indexNokta > 0
begin
return ('HATA! Virgül ve noktanın birlikte kullanımı desteklenmiyor!')
end
select @index =
(case
when @indexVirgul > 0 then @indexVirgul
when @indexNokta > 0 then @indexNokta
else 0
end)
if upper(@KUR) = 'TL' OR upper(@KUR) = 'YTL'
begin
SET @kurAna = 'TL'
SET @kurKusur = 'KURUŞ'
end else if upper(@KUR) = 'USD'
begin
SET @kurAna = 'DOLAR'
SET @kurKusur = 'CENT'
end else if upper(@KUR) = 'EUR' OR upper(@KUR) = 'EURO'
begin
SET @kurAna = 'EURO'
SET @kurKusur = 'CENT'
end else if upper(@KUR) = 'GBP'
begin
SET @kurAna = 'STERLIN'
SET @kurKusur = 'POUND'
end
if @index > 0
begin
set @sayi += '0000000'
select @yazi = dbo.XXX_AY_YAZIYA_CEVIR_ISLEM(CONVERT(INT,SUBSTRING(@sayi,0,@index)),1)+' '+@kurAna
--print CONVERT(INT,SUBSTRING(@sayi,0,@index))
--if CONVERT(INT,SUBSTRING(@sayi,0,@index)) > 0
--begin
select @yazi1 = dbo.XXX_AY_YAZIYA_CEVIR_ISLEM(CONVERT(INT,SUBSTRING(@sayi,@index+1,2)),1)+' '+@kurKusur
--end
end else begin
select @yazi = dbo.XXX_AY_YAZIYA_CEVIR_ISLEM(CONVERT(INT,@sayi),1)+' '+@kurAna
end
if (ltrim(rtrim(@yazi)) = @kurAna) set @yazi = 'SIFIR '+ltrim(@yazi)
if (ltrim(rtrim(@yazi1)) = @kurKusur) set @yazi1 = ''/*'SIFIR '+ltrim(@yazi1)*/
set @yazi = ltrim(rtrim(@yazi+' '+@yazi1))
return (@yazi)
END
Sayıyı yazıya çeviren foksiyon.db de tanımlı:
CREATE function [dbo].[XXX_AY_YAZIYA_CEVIR_ISLEM](
@sayi bigint
,@buyukharf INT = 1
)
returns nvarchar(max)
begin
declare @yaziilesayi nvarchar(max)
set @yaziilesayi = N''
declare @sayivarchar varchar(100)
set @sayivarchar = cast(@sayi as varchar(100))
declare @toplambasamak smallint
set @toplambasamak = len(@sayivarchar)
declare @basamak smallint
declare @rakam tinyint
declare @i smallint
set @i = 0
while @i < @toplambasamak
begin
set @basamak = @toplambasamak - @i
set @i = @i + 1
-- sıra ile soldan başlayarak rakamları oku
set @rakam = substring(@sayivarchar, @i, 1)
select
@yaziilesayi = @yaziilesayi +
-- rakamın basamak değeri gözönüne alınarak metin oluşturuluyor
case @rakam
when 0 then N''
when 1 then
case @basamak % 3 when 0 then N'yüz' when 2 then N'on' when 1 then
case when @toplambasamak = 4 and @i = 1 then N'' else
case when @i = @toplambasamak then N'bir' else
case when substring(@sayivarchar, @i-2, 2) = '00'
then N'' else N'bir'
end
end
end
end
when 2 then
case @basamak % 3
when 0 then N'iki yüz' when 2 then N'yirmi' when 1 then N'iki' end
when 3 then
case @basamak % 3
when 0 then N'üç yüz' when 2 then N'otuz' when 1 then N'üç' end
when 4 then
case @basamak % 3
when 0 then N'dört yüz' when 2 then N'kırk' when 1 then N'dört' end
when 5 then
case @basamak % 3
when 0 then N'beş yüz' when 2 then N'elli' when 1 then N'beş' end
when 6 then
case @basamak % 3
when 0 then N'altı yüz' when 2 then N'altmış' when 1 then N'altı' end
when 7 then
case @basamak % 3
when 0 then N'yedi yüz' when 2 then N'yetmiş' when 1 then N'yedi' end
when 8 then
case @basamak % 3
when 0 then N'sekiz yüz' when 2 then N'seksen' when 1 then N'sekiz' end
when 9 then
case @basamak % 3
when 0 then N'dokuz yüz' when 2 then N'doksan' when 1 then N'dokuz' end
end + space(1) +
case @basamak
when 4 then
case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'bin' end
when 7 then
case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'milyon' end
when 10 then
case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'milyar' end
when 13 then
case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'trilyon' end
when 16 then
case when substring(reverse(@sayivarchar), @basamak, 3) = '000' then N'' else N'katrilyon' end
else N''
end + space(1)
end
-- Çevrim sırasında oluşabilecek fazla SPACE karakterleri temizleniyor
set @yaziilesayi = ltrim(rtrim(@yaziilesayi))
WHILE REPLACE(@yaziilesayi, space(2), space(1)) <> @yaziilesayi
BEGIN
SELECT @yaziilesayi = DBO.TRK(REPLACE(@yaziilesayi, space(2), space(1)))
END
-- Metin büyük harflerle isteniyorsa UPPER fonksiyonu kullanılıyor
if @buyukharf = 1 set @yaziilesayi = DBO.TRK(UPPER(@yaziilesayi collate turkish_ci_as))
-- sayının yazı ile ifadesini içeren değişken döndürülüyor
return @yaziilesayi
end