| FXERKAN | 27.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. | |
| rsimsek | 27.07.2005 - 11:41:15 |
| Programın salaklığından biraz da biz sorumluyuz di mi | |
| FXERKAN | 27.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ı. | |
| kissoid | 28.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 | |
| rsimsek | 28.07.2005 - 09:51:57 |
| ORACLE'ın tarih formatı server dan değiştirilebiliyor diye hatırlıyorum | |