Oracle Application Framework (OAF) View Object Extension
Merhaba,
OAF geliştirmeleri yaparken bazı durumlarda standart View Object nesnelerinin SQL sorgularındaki alanlar yetmeyebiliyor. Bu tarz durumlarda standard View Object nesnesini EXTEND ederek onun özelliklerini kapsayan ve ek alanlar koyabildiğimiz yeni bir CUSTOM View Object nesnesi oluşturuyoruz. Yeni oluşan bu nesneyi sayfalarda kişiselleştirmeler ile kullanıp geliştirmeler yapabiliyoruz. Bu yaptığımız geliştirmeler Oracle standartlarına uygun ve PATCH’ler ile ezilmemektedir.
Bu geliştirmede yer alan adımları olduğu gibi uygulamazsanız JDeveloper BUG’larından dolayı birçok hata mesajı ile karşılaşırsınız.
Geliştirmeye başlamadan önce self-servis kişiselleştirme profilinin ve bu sayfa hakkında profilinin açılması gerekmektedir. Bunun için aşağıdaki iki profili kullanıcı bazında açınız;
- Personalize Self-Service Defn (FND_CUSTOM_OA_DEFINTION)
- FND: Diagnostics (FND_DIAGNOSTICS)
Daha sonra VO Extension yapılacak sayfa açılır. Ben bu örnek içerisinde Borçlar Muhasebesinde Tedarikçilerin listelendiği ana sayfayı kullandım. Tedarikçilerin listelendiği tabloya standart view object içerisinde yer almayan ve bir site bilgisi olan address_line1 alanını rownum = 1 ile çekerek getirdim.
Sayfa MDS Dizini:/oracle/apps/pos/supplier/webui/SuppSummPG
İlgili sayfa açıldıktan sonra sol altta yer alan “Bu Sayfa Hakkında” bağlantısına tıklanarak sayfanın XML hiyerarşisi açılır ve pageLayout region’ı genişletilir.
XML hiyerarşisinde alanı eklemek istediğimiz tablo aşağıya doğru taranarak bulunur. Tablonun yanında yer alan View Object (SuppSummVO) bağlantısına tıklanır.
Not: Eğer bağlantı tıklanamaz durumda ise sayfanın en altında yer alan “İş Bileşen Referans Detayları” bölümü genişletilerek de View Object Bağlantısına ulaşılabilinir.
Bağlantıya tıklanınca açılan sayfa View Object SQL sorgusunu ve karşılığında oluşan JAVA Mapping Attribute listesini göstermektedir. Görüldüğü üzere bizim eklemek istediğimiz alan bu listede yer almamaktadır.
Geliştirmeyi daha önceden 12.1.3 için konfigürasyonunu yaptığımız JDeveloper ile yapacağız. Bkz: OAF VE JDEVELOPER LOKAL KURULUM
Extend etmek istediğimiz View Object POS modülü altında yer almaktadır. JDeveloper içerisinde bağımlılıklara takılmadan derleme yapabilmek için EBS sunucusu içerisinde JAVA_TOP/oracle/apps ortam değişkeni altında yer alan pos klasörü <JDEV_USER_HOME>/myprojects/oracle/apps/ altında bir FTP programı ile indirilir.
1 2 3 4 5 6 |
[appldemo@demo ~]$ cd $JAVA_TOP/oracle/apps [appldemo@demo apps]$ pwd /u01/data_appl/apps/apps_st/comn/java/classes/oracle/apps [appldemo@demo apps]$ |
Bu noktada JDeveloper açıldığında indirilen objeleri paket dizinleriyle beraber Applications Navigator altında Demo projesi içerisinde görebiliriz.
Custom View Object’i oluşturmak için projeye sağ tıklanıp New seçilir. Açılan pencerede Business Tier -> ADF Business Components altında yer alan View Object seçilir.
Yeni VO oluşturma sihirbazı açılır. Başlangıç adımı Next ile devam edilir.
Birinci adımda View Object için paket ve isim belirliyoruz. Genel prensip olarak isimlendirme yaparken EXTENSION’lar için standard objelerin başına xx koyarak geliştirme yapmaktayım. Burada da aynı mantığı kullanıyorum.
Paket: xxntc.oracle.apps.pos.supplier.server
İsim: xxSuppSummVO
1. adımda önemli bir nokta olan bu oluşturduğumuz VO’nun Extend ettiği standart VO’yu seçtiğimiz bölümdür.
Bunun için Extends kutucuğunun yanında yer alan Browse butonuna tıklanır.
Açılan listede oracle.apps.pos.supplier.server paketinde yer alan SuppSummVO seçilir.
Not: Eğer liste boş açılıyorsa sihirbazı Cancel butonu ile kapatın. JDeveloper proje yer altında alan standart VO’nun bulunduğu paketi genişletin. Custom VO oluşturma sihirbazını yeniden açın.
Sihirbazda diğer adımları değiştirmeden 7.adıma kadar ilerliyoruz.
Eğer java dosyaları içerisindeki getter ve setter’lara müdahale amacı taşımıyor ve runtime esnasında SQL sorgusunu değiştirmeyi planlamıyorsanız 7.adımda yer alan java dosyalarını oluştur checklerini kaldırın.
Next ile devam edip Finish ile bitirin.
View Object ilgili paket altında oluşacaktır. View Object üzerine çift tıkalyıp tekrar açınız.
Bu bölüme geçmeden önce sorguya ekleyeceğimiz alanı getirecek ek geliştirmeyi yapmamız gerekiyor. Ben pl/sql fonksiyonu oluşturmayı tercih ettim ama buna gerek kalmadan da yapılabilirdi. Fakat fonksiyon içerisinden müdahale daha kolay olduğu ve OAF tarafında değişiklik gerektirmeden alanı değiştirme esnekliği sunduğu için bu yöntemi tercih ettim.
PL/SQL Fonksiyon scripti aşağıdadır;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
create or replace function apps.xx_vo_extension (p_vendor_id in number) return varchar2 is l_sonuc varchar2(200); begin select address_line1 into l_sonuc from ap_supplier_sites_all where vendor_id = p_vendor_id and rownum = 1; return l_sonuc; exception when others then return null; end; |
Edit sihirbazını açtığımız view object içerisinde yer alan sol bölümden Attributes bölümüne geçiş yapınız ve New butonuna tıklayınız.
Bu pencere View Object içerisine yeni bir Attribute oluşturmak için kullanılır.
Name: XxAddressLine1 (Bu ismi daha sonra kişiselleştirme bölümünde kullanacağız)
Type: String
Updatable: Never
Eğer veriyi SQL’den getirecekseniz “Mapped to Column or SQL” check box alanını işaretleyiniz. Diğer türlü alan Transient Attribute olarak oluşur ve az önce check box işaretini kaldırdığımız java dosyası içerisinde manuel olarak set edilmesi gerekliliği orataya çıkar.
Aşağıda yer alan Query Column bölümünde
Alias: xx_address_line1 (SQL’de kullandığınız ALIAS olmasına dikkat ediniz.)
Type: VARCHAR2(240) (bkz: ap_supplier_sites_all tablosu, address_line1 alanı)
Expression: apps.xx_vo_extension(pv.vendor_id)
Attribute oluştuktan sonra SQL sorgusuna alanı aynı ALIAS ile ekliyoruz. Aşağıdaki sorgunun 32. ve 87. satırlarına dikkat ediniz. Standart sorguyu hiç bozmadan ekleme yapılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
SELECT hp.party_name, hp.party_id AS party_id, hp.duns_number_c AS duns, pv.vendor_id, pv.vendor_name, pv.individual_1099 AS taxpayer_id, pv.vat_registration_num AS tax_reg_num, pv.segment1, pv.VENDOR_NAME_ALT AS alternate_name, pv.end_date_active AS end_date_active, pv.start_date_active AS start_date_active, pv.ONE_TIME_FLAG, pv.VENDOR_TYPE_LOOKUP_CODE, pv.PARENT_VENDOR_ID, parent.vendor_name AS parent_vendor_name, pv.PAYMENT_PRIORITY, parent.segment1 AS parent_Segment1, pv.TAX_REPORTING_NAME, pv.terms_id, terms.name AS terms_desc, pv.FEDERAL_REPORTABLE_FLAG, pv.STATE_REPORTABLE_FLAG, pv.PAY_GROUP_LOOKUP_CODE, pay_group.description AS pay_group_desc, aptt.description AS income_tax_type, hp.organization_name_phonetic, plc.DISPLAYED_FIELD AS VENDOR_TYPE_DISPLAY, pv.type_1099 AS income_tax_type_code, pv.employee_id AS employee_id, pecx.employee_num AS employee_number, apps.xx_vo_extension (pv.vendor_id) xx_address_line1 FROM hz_parties hp, ap_suppliers pv, ap_suppliers parent, ap_terms_tl terms, fnd_lookup_values pay_group, AP_INCOME_TAX_TYPES aptt, po_lookup_codes plc, per_employees_current_x pecx WHERE pv.party_id = hp.party_id AND pv.party_id = pecx.party_id(+) AND parent.vendor_id(+) = pv.parent_vendor_id AND pv.terms_id = terms.term_id(+) AND terms.language(+) = USERENV ('LANG') AND terms.enabled_flag(+) = 'Y' AND pv.pay_group_lookup_code = pay_group.lookup_code(+) AND pay_group.lookup_type(+) = 'PAY GROUP' AND pay_group.view_application_id(+) = 200 AND pay_group.language(+) = USERENV ('lang') AND pv.type_1099 = aptt.income_tax_type(+) AND pv.VENDOR_TYPE_LOOKUP_CODE = plc.LOOKUP_CODE(+) AND plc.lookup_type(+) = 'VENDOR TYPE' AND pv.organization_type_lookup_code IN ('INDIVIDUAL', 'FOREIGN INDIVIDUAL') UNION ALL SELECT hp.party_name, hp.party_id AS party_id, hp.duns_number_c AS duns, pv.vendor_id, pv.vendor_name, pv.num_1099 AS taxpayer_id, pv.vat_registration_num AS tax_reg_num, pv.segment1, pv.VENDOR_NAME_ALT AS alternate_name, pv.end_date_active AS end_date_active, pv.start_date_active AS start_date_active, pv.ONE_TIME_FLAG, pv.VENDOR_TYPE_LOOKUP_CODE, pv.PARENT_VENDOR_ID, parent.vendor_name AS parent_vendor_name, pv.PAYMENT_PRIORITY, parent.segment1 AS parent_Segment1, pv.TAX_REPORTING_NAME, pv.terms_id, terms.name AS terms_desc, pv.FEDERAL_REPORTABLE_FLAG, pv.STATE_REPORTABLE_FLAG, pv.PAY_GROUP_LOOKUP_CODE, pay_group.description AS pay_group_desc, aptt.description AS income_tax_type, hp.organization_name_phonetic, plc.DISPLAYED_FIELD AS VENDOR_TYPE_DISPLAY, pv.type_1099 AS income_tax_type_code, pv.employee_id AS employee_id, pecx.employee_num AS employee_number, apps.xx_vo_extension (pv.vendor_id) xx_address_line1 FROM hz_parties hp, ap_suppliers pv, ap_suppliers parent, ap_terms_tl terms, fnd_lookup_values pay_group, AP_INCOME_TAX_TYPES aptt, po_lookup_codes plc, per_employees_current_x pecx WHERE pv.party_id = hp.party_id AND pv.party_id = pecx.party_id(+) AND parent.vendor_id(+) = pv.parent_vendor_id AND pv.terms_id = terms.term_id(+) AND terms.language(+) = USERENV ('LANG') AND terms.enabled_flag(+) = 'Y' AND pv.pay_group_lookup_code = pay_group.lookup_code(+) AND pay_group.lookup_type(+) = 'PAY GROUP' AND pay_group.view_application_id(+) = 200 AND pay_group.language(+) = USERENV ('lang') AND pv.type_1099 = aptt.income_tax_type(+) AND pv.VENDOR_TYPE_LOOKUP_CODE = plc.LOOKUP_CODE(+) AND plc.lookup_type(+) = 'VENDOR TYPE' AND (pv.organization_type_lookup_code NOT IN ('INDIVIDUAL', 'FOREIGN INDIVIDUAL') OR pv.organization_type_lookup_code IS NULL) |
Apply ve ardından OK butonları ile kapatıp JDeveloper’ı Save ediyoruz. Daha önce FTP ile EBS sunucusundan indirdiğimiz POS klasörünü myprojects altında yerleştirmiştik. Aynı klasörü myclasses altına da kopyalıyoruz.
Bu işlemi yaptıktan sonra projeye sağ tıklayıp Make ile derliyoruz. Bütün POS modülü olduğu için derleme normalden fazla zaman alabilir ve derleme esnasında birkaç tane DEPENDENCY hatası alabilirsiniz. Bu hataların bir önemi yoktur, önemli olan projenin Compiler Error alınmadan derlenmesidir.
Eğer proje hatasız derlenmişse, projeye sağ tıklayıp proje özellikleri penceresini açıyoruz. Sol menüden Business Components ağacını genişletip Substitutions bölümüne geçiş yapıyoruz.
Açılan sağ bölümün;
Available bölümünde standart view object nesnesini seçiyoruz. (SuppSummVO)
Substitute bölümünde ise custom view object nesnesini seçiyoruz. (xxSuppSummVO)
Add butonu ile ekleme yapıyoruz. Bir proje için birden çok Substitution eklenebilir.
Ok ile pencereyi kapatıp tekrar projeyi derliyoruz.
Eğer hiçbir sorun olmadan bu aşamaya kadar gelinmişse proje jpx dosyası içerisinde Substitution bölümünü görmeniz gerekiyor. BC4J (VO, EO, AM) extension yapılırken her zaman substitution yapılır ve Proejniz.jpx dosyası içeri IMPORT edilir.
Projenix.jpx dosyasını Notepad ile açıp en alt bölümlerde Substitution bölümünü görebilirsiniz.
1 2 3 4 5 |
<Substitutes> <Substitute OldName ="oracle.apps.pos.supplier.server.SuppSummVO" NewName ="xxntc.oracle.apps.pos.supplier.server.xxSuppSummVO" /> </Substitutes> |
Bu aşamada jpx dosyasının EBS Metadata Services bölümüne IMPORT edilmesi ve custom view object dosyanızın FTP ile JAVA_TOP/xx/.. dizin yoluna atılması gerekmektedir.
.jpx dosyasını IMPORT etmek için aşağıdaki bat scriptini CMD açarak kullanabilirsiniz;
1 2 3 |
C:\\DemoOAF\jdevbin\oaext\bin\jpximport C:\\DemoOAF\jdevhome\jdev\myclasses\Demo.jpx -username apps -password <apps_parola> -dbconnection "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SID=<sid>)))" |
FTP ile myclasses altındaki geliştirmeler de aktarıldıktan sonra apache ve oc4j sunucular bounce edilir.
Tekrar EBS’e giriş yapılır ve ilgili sayfa açılıp “Bu Sayfa Hakkında” bağlantısına tıklanır. Alt bölümnde bulunan “İş Bileşen Referans Detayları” bölümü genişletilir. Eğer herşey düzgünse burada IMPORT ettiğiniz custom View Object’i görebilirsiniz.
View Object içerisine tıklanıldığında ise standart view object içerisinde yer almayan xx_address_line1 alanının yer aldığını görebilirsiniz. Bu artık kişiselleştirme ile kullanıma hazır duruma geldiğinin göstergesidir.
Substituition’ın düzgün IMPORT edildiğini anlamak için JDR_UTILS paketini de kullanabilirsiniz;
1 2 3 4 5 |
begin jdr_utils.listCustomizations('/oracle/apps/pos/supplier/server/SuppSummVO'); end; |
Sonuç: /oracle/apps/pos/supplier/server/customizations/site/0/SuppSummVO
İçeriği görüntülemek için;
1 2 3 4 5 |
begin jdr_utils.printDocument('/oracle/apps/pos/supplier/server/customizations/site/0/SuppSummVO'); end; |
Sonuç:
1 2 3 4 5 6 7 |
<?xml version='1.0' encoding='UTF-8'?> <customization xmlns="http://xmlns.oracle.com/jrad" xmlns:ui="http://xmlns.oracle.com/uix/ui" xmlns:oa="http://xmlns.oracle.com/oa" xmlns:user="http://xmlns.oracle.com/user" version="10.1.3_1312" xml:lang="en-US" customizes="/oracle/apps/pos/supplier/server/SuppSummVO"> <replace with="/xxntc/oracle/apps/pos/supplier/server/xxSuppSummVO"/> </customization> |
Alanı tabloya eklemek içinse tablo bölümü kişiselleştirme ile açılır;
Tablonun bulunduğu bölüm hizasında yer alan “Create Item” butonu ile yeni bir Item oluşturma penceresi açılır;
Yeni Item Site bazında Message Styled Text olarak seçilir ve aşağıdaki bilgilerle oluşturulur.
ID: xx_address_line1
Prompt: xx_address_line1
View Attribute: XxAddressLine1
View Instance: xxSuppSummVO
Sonuç olarak tabloya istediğimiz alanın geldiğini görüyoruz;
Eline sağlık, çok faydalı bir yazı.
teşekkürler