SP "Precompiler Hatası"

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
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

SP "Precompiler Hatası"

Mesaj gönderen anemos »

Merhaba,

Kullandığım sayıyı yazıya çevirme program kodunu SP'e çevirmeye çalışıyorum.
Derlemeye çalıştığımda "Precompiler Error: Syntax error - ,." hatası alıyorum.
Şu satırda takılıyor:

Kod: Tümünü seç

select substring(:v_say, :s - 2, 1) from rdb$database into :c1;
Prosedur aşağıdaki gibidir:

Kod: Tümünü seç

create procedure ceviri(
  say numeric(15, 0))
returns(
  sonuc varchar(255))
as
declare birler varchar(20);
declare onlar  varchar(20);
declare yuzler varchar(20);
declare diger  varchar(20);

declare v_say  varchar(15);
declare tmp    varchar(255);
declare s      smallint;

declare c1     varchar(20);
declare c2     varchar(20);
declare c3     varchar(20);

begin 

 select Lpad(say, 15, '0') from rdb$database into :v_say;
 
 s = 0;
 while (:s <= 15) do
  begin  
   s = :s + 1;   
   if (mod(:s, 3) = 0) then
    begin          
     select substring(:v_say, :s - 2, 1) from rdb$database into :c1;
     select substring(:v_say, :s - 1, 1) from rdb$database into :c2;
     select substring(:v_say, :s, 1) from rdb$database into :c3;

     select birler[:c1], onlar[:c2], yuzler[:c3], diger[:s] 
     from metinler into :birler, :onlar, :yuzler, :diger;

     tmp = :c1 || :c2 || :c3;

     if (tmp <> '') then
      begin
       if (s = 12) And (Trim(tmp) = 'BİR') then
        tmp = 'BİN';
       else 
         tmp = tmp || :diger;   
      end
      
     sonuc = :sonuc || :tmp;
     
    end
  end
end;
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Re: SP "Precompiler Hatası"

Mesaj gönderen anemos »

Biraz uğraştırdı ama çözdüm. :D Array tipinde sıkıntı varmış.

Yazıya çevirme proseduru aşağıdadır.

Çeviri fonksiyonu:

Kod: Tümünü seç

create or alter procedure ceviri(
  say numeric(15, 0))
returns(
  sonuc varchar(255))
as
  declare variable birler varchar(10)  = '';
  declare variable onlar  varchar(10)  = '';
  declare variable yuzler varchar(10)  = '';
  declare variable diger  varchar(10)  = '';
  declare variable v_say  varchar(15)  = '';
  declare variable tmp    varchar(255) = '';
  declare variable s      smallint     = 0;
  declare variable c1     smallint     = 0;
  declare variable c2     smallint     = 0;
  declare variable c3     smallint     = 0;
begin 
  sonuc = ''; 
  v_say = lpad(say, 15, '0'); 
  while (:s < 5) do
    begin
      s = :s + 1;   
              
      c1 = substring(:v_say from (:s * 3)     for 1);
      c2 = substring(:v_say from (:s * 3) - 1 for 1);
      c3 = substring(:v_say from (:s * 3) - 2 for 1);

      select birler from metinler where id = :c1 into :birler;
      select onlar  from metinler where id = :c2 into :onlar;
      select yuzler from metinler where id = :c3 into :yuzler;
      select diger  from metinler where id = :s  into :diger;
           
      tmp = :yuzler || :onlar || :birler;	 
           
      if (tmp <> '') then
        begin
          if ((s = 4) and (tmp = 'BİR')) then
            tmp = 'BİN';
          else 
            tmp = :tmp || :diger;
            sonuc = :sonuc || :tmp; 
        end        
    end    
  /* Select için */
  -- suspend;  
end;
TL için fonksiyon:

Kod: Tümünü seç

create or alter procedure TL(
  say double precision)
returns(
  sonuc varchar(255))
as
  declare tum       double precision = 0;
  declare tam       bigint           = 0;
  declare kurus     smallint         = 0;  
  -- declare sayi_yonu varchar(6)       = '';
  declare tl_birim  char(2)          = '';
  declare krs_birim char(2)          = '';  
  declare tmp       varchar(255)     = '';
begin 
  -- sayi_yonu = iif(sign(say) = 1, '', 'Eksi /');
  tum = round(abs(say), 2);
  tam = trunc(tum, 0);
  kurus = (tum - tam) * 100;
  
  tl_birim = iif(tam = 0, '', 'TL');
  krs_birim = iif(kurus = 0, '', 'KR'); 
 
  execute procedure ceviri(:tam) returning_values(:tmp); 
  sonuc = tmp || tl_birim;

  execute procedure ceviri(:kurus) returning_values(:tmp);
  tmp = sonuc ||:tmp || krs_birim;

  -- sonuc = :sayi_yonu || trim(:tmp);
  sonuc = trim(:tmp);
 /* select için */
 -- suspend;
end;
Yazı için gerekli tablo yapısı:

Resim
Cevapla