ORACLE Stored Procedure Yardımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

ORACLE Stored Procedure Yardımı

Mesaj gönderen FXERKAN »

arkadaşlar aşağıdaki gibi stored procedurem var

Kod: Tümünü seç

CREATE OR REPLACE FUNCTION "F_LOKAL_ZAM_HESAPLA" (
as_tur in varchar2,
al_sbs_muhatap_no in NUMERIC,
al_bgp_servis_no in NUMERIC ,
al_bgp_gelirkod_no in NUMERIC,
al_bgs_beyan_no in NUMERIC ,
ai_yil in NUMERIC,
ai_donem in NUMERIC,
ad_islem_tarihi in date ,
ad_vade_tarihi_arg in date ,
adec_tutar in number
)
return numeric
is
ldec_ZamTutar decimal;
ldec_FaizTutar decimal		;
ll_bgp_gelirkod_faiz NUMERIC			;
ll_hata_deger long	 		;
ls_hata varchar2(200) 		;
i Integer		;
li_yil Integer		;
li_ay Integer		;
li_gun Integer		;
ld_bas_tar  date			;
ld_bit_tar date			;
ld_vade_tarihi date			;
ls_turu varchar2(200)		;
ldec_aylik_oran decimal		;
li_ay_sayisi integer		;
ld_ilk_tarih date			;
ld_son_tarih date			;
li_temp_gun integer		;
ldec_eski_oran decimal;
ldec_minimum_tutar decimal;
ls_gecikme_zammi varchar2(200)  		;
ls_gecikme_tutari varchar2(200)		;
ls_gecikme_turu varchar2(200)  		;
ls_gelir_faiz varchar2(200)		;
li_gun_sayisi integer		;
ldec_gunluk_oran decimal		 ;
ll_vbarisi_no NUMBER;
ll_tecil_no NUMBER        ;
ld_uygulama_tarihi date        ;

ad_vade_tarihi date;
ldec_gecikme_faizi 		Decimal ;
li_islem_ay_sayisi integer ;
ld_baslangic_tarih Date    ;
ldec_ZamTutar_ara	Decimal;

rec_bgp_zam ALL_TABLES.TABLE_NAME%TYPE ;

begin

ad_vade_tarihi := ad_vade_tarihi_arg;

If adec_tutar = 0 Then
	 RETURN 0;
End If;


SELECT MAX(bgs_vbarisi_no)
  INTO ll_vbarisi_no
  FROM BGS_TAHAK
WHERE SBS_MUHATAP_NO = al_sbs_muhatap_no
	 AND BGP_SERVIS_NO = al_bgp_servis_no
   AND BGP_GELIRKOD_NO = al_bgp_gelirkod_no
   AND YIL = ai_yil
   AND DONEM = ai_donem
	 AND BGS_BEYAN_NO = al_bgs_beyan_no;

IF ll_vbarisi_no is null THEN
   ll_vbarisi_no := 0;
END IF;

SELECT MAX(bgs_tecil_no)
  INTO ll_tecil_no
  FROM BGS_TAHAK
WHERE SBS_MUHATAP_NO = al_sbs_muhatap_no
	 AND BGP_SERVIS_NO = al_bgp_servis_no
   AND BGP_GELIRKOD_NO = al_bgp_gelirkod_no
   AND YIL = ai_yil
   AND DONEM = ai_donem
	 AND BGS_BEYAN_NO = al_bgs_beyan_no;

IF ll_tecil_no is null THEN
   ll_tecil_no := 0;
END IF;

IF ll_vbarisi_no> 0 OR ll_tecil_no>0  THEN

   IF ad_vade_tarihi Is Null OR (ad_islem_tarihi <= ad_vade_tarihi) THEN
      RETURN 0;
   END IF;

   IF ad_islem_tarihi = '01/09/2003' AND ad_vade_tarihi = '31/08/2003' THEN
      Return 0;
   END IF;

   IF ad_islem_tarihi = '01/03/2004' AND ad_vade_tarihi = '29.02.2004' THEN
      Return 0;
   END IF;

ELSE

	SELECT MAX(UYGULAMA_TARIHI)
	  INTO ld_uygulama_tarihi
	  FROM BGP_TAKSIT_VADE
	 WHERE BGP_SERVIS_NO = al_bgp_servis_no
   	 AND YIL = ai_yil
		 AND DONEM = ai_donem;

	IF (ld_uygulama_tarihi) IS NOT NULL THEN
		 IF (ad_islem_tarihi <= ld_uygulama_tarihi) THEN
			   RETURN 0;
		 END IF;

		 IF  ad_islem_tarihi <= ad_vade_tarihi THEN
		    RETURN 0;
	   END IF;

	ELSE

		IF ad_vade_tarihi Is Null OR (ad_islem_tarihi <= ad_vade_tarihi) THEN
	   	RETURN 0;
		END IF;

  END IF   ;

END IF;

ls_gecikme_zammi  := 'H';
ls_gecikme_tutari := 'H';

SELECT GECIKME_ZAMMI,GECIKME_FAIZI,GECIKME_TURU
  INTO ls_gecikme_zammi,ls_gecikme_tutari, ls_gecikme_turu
  FROM bgp_gelirkod
WHERE bgp_gelirkod.no = al_bgp_gelirkod_no;
IF SQLCODE <> 0 THEN
	RETURN 0;
END IF;

IF as_tur = 'Z' And ls_gecikme_zammi  = 'H' Then
   RETURN 0;
END IF;

IF as_tur = 'F' And ls_gecikme_tutari = 'H' Then
   RETURN 0;
END IF;

If f_bgp_gelirkod('FAIZ',ll_bgp_gelirkod_faiz,ls_gelir_faiz) = -1 Then
	 Return 0;
End If;

ld_vade_tarihi := NULL;

If ls_gecikme_tutari = 'E'  AND as_tur = 'F' Then
	SELECT MIN(bgs_tahak.tahak_tar)
	INTO ld_vade_tarihi FROM bgs_tahak
	 WHERE bgs_tahak.sbs_muhatap_no	   = al_sbs_muhatap_no
	 	 AND bgs_tahak.bgp_servis_no	   = al_bgp_servis_no
		 AND bgs_tahak.bgp_gelirkod_no   = ll_bgp_gelirkod_faiz
		 AND bgs_tahak.bgs_beyan_no      = al_bgs_beyan_no
		 AND bgs_tahak.yil               = ai_yil
		 AND bgs_tahak.donem             = ai_donem;
	IF SQLCODE <> 0 THEN
		RETURN 0;
	END IF;
	If ld_vade_tarihi Is Not Null Then
		ad_vade_tarihi := ld_vade_tarihi;
	End If;
End If;

ldec_FaizTutar := 0;
ldec_ZamTutar := 0;
ld_ilk_tarih := ad_vade_tarihi;
ldec_eski_oran	  := 0;

FOR rec_bgp_zam IN (SELECT 
NO,BASLANGIC_TARIHI,BITIS_TARIHI,MINIMUM_TUTAR,ORAN,ACIKLAMA,
                            SIS_KULLANICI_NO,ISLEMTAR  FROM BGP_ZAM )

LOOP

	 ld_bas_tar 			:= rec_bgp_zam.BASLANGIC_TARIHI;
	 ld_bit_tar				:= rec_bgp_zam.BITIS_TARIHI;
	 ldec_aylik_oran	:= rec_bgp_zam.ORAN;

	 IF ll_vbarisi_no > 0 THEN
	    ldec_aylik_oran := 10;
	 END IF;

	 ldec_minimum_tutar	:= rec_bgp_zam.MINIMUM_TUTAR;

	 ldec_aylik_oran		:= ldec_aylik_oran / 100;
	 ldec_gunluk_oran		:= ldec_aylik_oran / 30;

  /*-*/
	 If not (ld_bit_tar Is Not Null And ad_vade_tarihi >  ld_bit_tar)  Then


	 If ld_bas_tar Is Not Null And ad_islem_tarihi < ld_bas_tar Then
	    Exit;
	 END IF;

	 If ls_gecikme_turu = 'A' Then

		  If ad_islem_tarihi > ld_bit_tar And ld_bit_tar Is NOT Null Then

			 li_yil := YEAR( ld_bit_tar );
			 li_ay  := MONTH( ld_bit_tar )	;
			 li_gun := F_DAY( ld_ilk_tarih );
			 If F_DAY ( ld_ilk_tarih ) < F_DAY ( ld_bit_tar ) Then
				 li_ay  := li_ay + 1;
				 IF li_ay > 12 THEN
					 li_yil := li_yil + 1;
				    li_ay := 1;
				 END IF;
			 End If		 ;

			 li_temp_gun := F_AYIN_GUN_SAYISI (to_date('01/'|| 
to_char(li_ay)||'/'||to_char(li_yil),'dd/mm/yyyy'));

			 If li_gun > li_temp_gun Then
				 li_gun := li_temp_gun;
			 End If;

		   ld_son_tarih := To_Date(li_gun || '/'|| 
to_char(li_ay)||'/'||to_char(li_yil),'dd/mm/yyyy')		;

		 Else

			 ld_son_tarih := ad_islem_tarihi;

		 End If	 ;

		 li_ay_sayisi := f_ay_sayisi(ld_ilk_tarih,ld_son_tarih);

		 If f_Day(ld_ilk_tarih) = f_Ayin_Gun_Sayisi(To_Date('01/'|| 
to_char(Month(ld_ilk_tarih))||'/'||to_char(Year(ld_ilk_tarih)),'dd/mm/yyyy')) 
And
    			 f_Day(ld_son_tarih) = f_Ayin_Gun_Sayisi(To_Date('01/'|| 
to_char(Month(ld_son_tarih))||'/'||to_char(Year(ld_son_tarih)),'dd/mm/yyyy')) 
Then

			 If F_Day(ld_ilk_tarih) < F_Day(ld_son_tarih) Then
				 li_ay_sayisi := li_ay_sayisi - 1;
			 End If;

		 End If;

		 If ld_ilk_tarih < ld_bas_tar Then
			 li_ay_sayisi := li_ay_sayisi - 1;
			 ldec_ZamTutar := ldec_ZamTutar + (adec_tutar * ldec_eski_oran );
		 End If;

		 ldec_ZamTutar := ldec_ZamTutar + (adec_tutar * li_ay_sayisi * 
ldec_aylik_oran );

		 IF ad_islem_tarihi > '31.07.2004' AND
		          ad_islem_tarihi < '01.10.2004' AND ll_vbarisi_no > 0 THEN


			ld_son_tarih := '28.07.2004';
			ld_baslangic_tarih := '01.08.2004';

			li_ay_sayisi := f_ay_sayisi(ad_vade_tarihi,ld_son_tarih);

			ldec_ZamTutar := (adec_tutar * li_ay_sayisi * ldec_aylik_oran );

			ldec_gecikme_faizi := 5;

			li_islem_ay_sayisi := f_ay_sayisi( ld_baslangic_tarih , ad_islem_tarihi 
);

			ldec_gecikme_faizi := ldec_gecikme_faizi / 100;

			ldec_ZamTutar := ldec_ZamTutar + ( adec_tutar * ldec_gecikme_faizi * 
li_islem_ay_sayisi );

			ldec_ZamTutar_ara := ( adec_tutar * ldec_gecikme_faizi * 
li_islem_ay_sayisi );

   	 END IF ;

		 If ldec_ZamTutar < ldec_minimum_tutar Then
			 ldec_ZamTutar := ldec_minimum_tutar;
		 End If;

		 ld_ilk_tarih := ld_son_tarih;

		 ldec_eski_oran := ldec_aylik_oran;

	 Else

		If ad_vade_tarihi > ld_bas_tar Then
			ld_ilk_tarih := ad_vade_tarihi;
		Else
			ld_ilk_tarih := ld_bas_tar;
		End If;

		If ad_islem_tarihi < ld_bit_tar Then
			ld_son_tarih := ad_islem_tarihi;
		Else
			ld_son_tarih := ld_bit_tar;
		End If;

		li_gun_sayisi := ld_ilk_tarih - ld_son_tarih;

		if (adec_tutar * li_gun_sayisi * ldec_gunluk_oran ) >= ldec_minimum_tutar 
then
			  ldec_ZamTutar := ldec_ZamTutar + (adec_tutar * li_gun_sayisi * 
ldec_gunluk_oran )	;
		Elsif (adec_tutar * li_gun_sayisi * ldec_gunluk_oran ) < 
ldec_minimum_tutar Then
			ldec_ZamTutar :=  ldec_ZamTutar + ldec_minimum_tutar;
		End If;
	 End If;

	 END IF;/*-*/
END LOOP ;

ldec_ZamTutar  := ldec_ZamTutar - ldec_FaizTutar   ;

IF ldec_ZamTutar < 0 THEN
   ldec_ZamTutar := 0 ;
END IF;

If ldec_ZamTutar > 0 Then
	IF al_bgp_servis_no = 2342 THEN
		ldec_ZamTutar := f_yuvarla('S',ai_yil,ldec_ZamTutar);
	ELSE
		ldec_ZamTutar := f_yuvarla('Z',ai_yil,ldec_ZamTutar);
	END IF;
End If;


Return ldec_ZamTutar;

end;
bu stored procedure ü aşağıdaki gibi çağırmaya çalışıyorum, bağlantı için ADO Connection ve ADOStoredProc kullanıyorum, deneme amaçlı olduğu için ADO kullandım

Kod: Tümünü seç

var
  sonuc: variant;
begin

  with sp_ado2.Parameters do
    begin
      ParamByName('AS_TUR').Value := 'Z';
      ParamByName('AL_SBS_MUHATAP_NO').Value := 2;
      ParamByName('AL_BGP_SERVIS_NO').Value := 1230;
      ParamByName('AL_BGP_GELIRKOD_NO').Value := 1231;
      ParamByName('AL_BGS_BEYAN_NO').Value := 2291114;
      ParamByName('AI_YIL').Value := 2002;
      ParamByName('AI_DONEM').Value := 2;
      ParamByName('AD_ISLEM_TARIHI').Value := strtodate('25.07.2005');
      ParamByName('AD_VADE_TARIHI_ARG').Value := strtodate('30.11.2002');
      ParamByName('ADEC_TUTAR').Value := 19.96;
    end;

  sp_ado2.ExecProc;
  sonuc := sp_ado2.Parameters.ParamValues['return_value'];


  ShowMessage(sonuc);
bana döndermesi gereken değer 11,50 gibi değerken bu salak bana 1000 gibi bir değer dönderiyor yada ORA-6550, PLS-360 (tip dönüşüm yada tip uyuşmazlığı gibi) bir hata verip beni sinir ediyor. acaba burdaki sorun ne olabilir. googledaki gruplarda aradım ama hiçbir sonuç çıkmadı. lütfen yardım edin. PL/SQL Developer de bu fonksiyonu çalıştırmayı denedim onuda beceremedim. ona bile yardımcı olsanız çok sevinirim. LÜTFEN YARDIMMMM.
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Programın salaklığından biraz da biz sorumluyuz di mi :wink: .Value yerine tipi neyse o şekilde kullanamay çalış. .AsInteger, .AsFloat, .AsString gibi.. :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

Mesaj gönderen FXERKAN »

abi o dediğinizi bende düşündüm ve o şekilde yaptım o zaman dahada saçma salak sonuçlar getirdi. o nedenle özellikle variant yaptımki ne geliyorsa uygun hale dönüştürerek bana göstersin diye ama olmadı.
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
kissoid
Üye
Mesajlar: 28
Kayıt: 12 Tem 2005 02:06
İletişim:

veri tipi

Mesaj gönderen kissoid »

hocam delphi ile oracle 'ın tarih ve saat değişkeni arasında fark var. iki tip birbirini tutmuyor. Benim de başıma geldi. Tarihi delphide string değerine çevir sonra oracle'a gönder orada tarihe çevir. O zaman sorun kalmıyo. kolay gelsin
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

ORACLE'ın tarih formatı server dan değiştirilebiliyor diye hatırlıyorum :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla