ORACLE Stored Procedure Yardımı
FXERKAN27.07.2005 - 11:34:07
arkadaşlar aşağıdaki gibi stored procedurem var

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


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.
 
rsimsek27.07.2005 - 11:41:15
Programın salaklığından biraz da biz sorumluyuz di mi Wink .Value yerine tipi neyse o şekilde kullanamay çalış. .AsInteger, .AsFloat, .AsString gibi.. Idea
 
FXERKAN27.07.2005 - 11:48:10
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ı.
 
kissoid28.07.2005 - 09:38:02
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
 
rsimsek28.07.2005 - 09:51:57
ORACLE'ın tarih formatı server dan değiştirilebiliyor diye hatırlıyorum Idea
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com