Oracle, hr_maintain_proposal_api.delete_salary_proposal

Yakın zamanda (yani bugün), iş yerinde uzunca bir süre (4-5 saat kadar) uğraştıktan sonra bir maaşı silmek istediğimizde nelere dikkat etmemiz gerektiğini az çok gördüm. Bunu sizlerle de paylaşmak istedim.

Sorun: ‘hr_maintain_proposal_api.delete_salary_proposal’ kullanılarak bir maaşın silinmesi ve hemen ardından aynı tarihlerde bir yeni maaşın yaratılmasıydı.

Karşılaşılan sorun kodu: ORA-20001: Element entry overlaps with another entry of the same type

Oracle Metalink cevabı: Bullshit….

Şimdi, kullandığım bir paket aracılığı ile bir maaşı silip, yine aynı tarihte yeni maaş kaydı yaratmam gerekiyordu. Aranızda neden bunu bir component olarak eklemediğimi soracaklar olacaktır. Keza, maaş apisinin, ilk maaş yaratırken multicomponent’a izin vermediğini söyleyebilirim. Manuel olarak değiştirmeyi denemedim çünkü adamlar direk api’nin açıklamasında ilk önce maaşı yarat, sonraki bir tarihte gir ne gireceksen, zam mı girersin, prim mi verirsin…

Fakat, adama ilk maaş tarihinde bir maaş yükseltmesi yapılması gerekiyorsa, bunu eski maaşı silip, yeni bir maaş yaratarak yapmayı uygun buldum. Aslında direk aklıma gelen de buydu ( Tabi müşterimiz eski maaşı da görmek istiyordu, bunu da per_pay_proposals’ta bir attribute’a attık.)

Eski maaşı sildim (per_pay_proposals tablosundan.) Lakin, api bir türlü, bu tablonun bağlı olduğu bir tablodaki (pay_element_entries_f) kaydı silmiyordu.

Oracle ekranlarından bunu yapabiliyorum, başka bir kodumda bunu yapabiliyorum, ama bu dediğim pakette yapamıyordum.

Yukarıdaki hatayı alıyordum.

Keza, api’nin içine girilecek olursa, pay_element_entries_f tablosunu sadece per_pay_proposals tablosundaki ‘Approved’ flag’i ‘Y’ olanlar için yaptığını gördüm.

Ben de bu pakette, bu delete apisinden önce kişinin belli bir tarihten sonra maaşı varsa bunu ‘N’ yap diyordum. Çünkü, kişinin gelecekte onaylanmış bir maaşı varsa, Oracle, geçmişte bir maaş değiştirmenize izin vermiyor. Bunu düzelttiğimde maaşı da sildiğini ve sorunumun gittiğini gördüm.

Şimdi, eğer delete_salary_proposal’ı kullanıyorsanız nelere dikkat etmeniz gerektiğini gözden geçirelim:

1) Api’ye değer yollarken, bunların doğru ve api’nin istediği sayıda olduğuna dikkat edin.

Mesela delete api’ye şöyle yolluyoruz:

hr_maintain_proposal_api.delete_salary_proposal(
p_pay_proposal_id               =>l_pay_proposal_id
,p_business_group_id           =>l_bussiness_group_id
,p_object_version_number  =>l_obj_version_number
,p_validate                                =>false
,p_salary_warning                  =>l_salary_warning);

Buradaki, ilk 3 parametre dolu olmalı. Yani doğru değerleri yollamalısınız. Validate ‘false’ olarak yollanmalı ve diğeri de ‘null’ yollanabilir. Tam olarak ne işe yaradığını bilmiyorum.

Yine burada da dikkat edilmesi gereken, object_version_number, siz maaş apisine her müdehale ettiğinizde değişen bir değer. Yani, eğer bu api’yi çalıştıracaksanız, bu değeri arada bir yerde, maaş tablosunu update etmeden aldığınıza dikkat edin. Hatta işinizi garantiye alın, direk bu api’nin üstünde bir kere daha alın bu değerleri. Ufak bir select yazın, elinize mi yapışır?

2) Eğer bu maaşın, component’ları varsa dert etmeyin, bu componentları da kendisi otomatik siliyor. Fakat, eğer maaş olduğu gibi kalsın ama ben component’larından birini silmek istiyorum diyorsanız, maaştaki proposal_id’yi kullanarak ‘per_pay_proposal_components’ tablosuna gitmelisiniz. Buradan istediğiniz bileşenlerin id’lerini alabilirsiniz. Korkmayın, bunun için de bir apimiz var 🙂

delete_proposal_component(
p_component_id                   => l_component_id ,
p_validation_strength          => l_validation_strength,
p_object_version_number  => l_object_version_number ,
p_validate                                => false);

İstediğiniz component’ın id’sini bulun ve yollayın. Aynı şekilde bu tabonun da bir object_version_number değeri var, bunu da alın ve yollayın. Lakin Validation_strength nedir bilmiyorum. Bu api’yi kullandığımda yazıyı da güncellerim.

3) Mutlaka ama mutlaka açın ve apinin açıklamasını okuyun. Sonra da içine bakın, tam olarak ne yapıyor, hangi tabloları hangi durumda siliyor. Benim sorunum, bu durumlara bakmadan apiyi yanlış yönlendirmekti. Sonuç olarak da, bu kayıt zaten var arkadaşım uyarısı veriyordu.

4) Kodunuza mutlaka exception koyun. Keza ben exception’dan dönen hata raporları olmasaydı sebebi asla bulamayacaktım. Bu hata raporlarına rağmen metalink’te bir şey bulamıyorsam, düşünün ki hata kodu olmadan nasıl kör olurum. Benim de bu exception handling konusunda öğreneceğim dağlar kadar bilgi var ama şimdilik az çok elimin döndüğü kadar yapıyorum, zamanla da gelişirim diye umuyorum.

5) Api’yi çalıştırmadan önce, null olarak yollayacağınız parametrelerin, gerçekten böyle olup olmadıklarını kontrol edin. Hatta bence direk apiyi çalıştırmadan önce bunları bir güzel null yapın ve yolunuza devam edin.

Şimdilik aklıma gelenler bunlar. Ne de olsa ben de henüz Oracle’da 6. ayımı yeni doldurdum, yazıda size ters gelen durumlar varsa, yorum kısmına yazın, eğer güzel bir öneri ya da doğru bir tespitse; dener, çalışıyorsa yazıma koyarım ya da ilgili yeri düzeltirim.

Bir sonraki yazılarda, maaş apisini ve belirlediğiniz maaşı nasıl onaylayacağınızı anlatacağım.

O zamana kadar, sorunsuz müşteriler, anlayışlı patronlar ve bilgi dolu günler diliyorum efendim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.