Showing posts with label LOV. Show all posts
Showing posts with label LOV. Show all posts

Sunday, September 18, 2016

PopUp List Of View in AngularJs

Membuat Popup atau pada angularjs menyebutnya Modal, memang menjadi daya tarik sendiri selain untuk mempercantik pada tampilan tapi juga dapat menyesuaikan kebutuhan, sehingga tidak harus selalu membuka page baru untuk data yang sifatnya tidak terlalu banyak. Blog kali ini akan membahas tentang Popup List Of View, dimana Popup tersebut akan menampilkan list data Provinsi dan data Kab / Kota yang berada di Provinsi tersebut.

Seperti membuat modal pada umumnya, di mulai dari file HTML


di mana kita membuat form input yang di sertai button untuk memanggil fungsi pada controller yang akan menampilkan modal dengan list dari provinsi. Pada form input kab / kota, di bagian ng-click kita juga mengirimkan id dari provinsi supaya ketika kita memilih provinsi tersebut, kita dapat melihat kab / kota yang ada dalam provinsi tersebut.


Lihat kembali HTML, ng-click dari provinsi akan memanggil function cariNama3 dan di kab / kota akan memanggil function cariNama4. Ada sedikit perbedaan dari 2 function tersebut, yaitu pada data yang akan di kirim ke controller modal. Di dalam 2 function tersebut ada yang namanya modalParam. ModalParam fungsi nya untuk menampung data yang di kirim dari file HTML tadi dan akan di kirimkan ke controller modal sebagai parameter untuk mengambil data dari backend.
Bingung ya..??? Begini kira - kira flow nya

Nah saatnya ke controller modal,


di sini parameter id prov yang di kirim dari controller view (function kab / kota ) di kenali sebagai seacrh_idProv dalam function lovKab. 2 Function di atas lah yang bertugas mengambil data dari backend. Berikut penampakan dari modal provinsi dan kab / kota



Selesai sudah membuat modal provinsi dan kab / kota, semoga blog ini bermanfaat dan selamat mencoba dan menerapkan pada kasus - kasus berikutnya. :D


Tuesday, December 15, 2015

ADF LOV with Sub-Query parameter

Pada ADF biasanya sebuah LOV (List Of Value) berasal dari sebuah VO (View Object).
Apabila sebuah LOV memiliki dependensi parameter dari field lainnya pada UI, maka biasanya query pada VO nya akan memiliki :param.

Misalnya seperti berikut:
select distinct xx.kolom_1, xx.kolom_2
from table_xx xx, (
    select kolom_a, kolom_b
    from table
    where kolom_c = :param1
) yy
where 
xx.kolom_3 = yy.kolom_a
yy.kolom_b = :param2 

pada umumnya untuk menghandle masalah depedensi ini kita akan menggunakan view criteria atau bindParameter.

Cara kerja dari view criteria adalah membungkus query vo dan menambahkan where clause menjadi seperti berikut:

select * from (
    select distinct xx.kolom_1, xx.kolom_2
    from table_xx xx, (
        select kolom_a, kolom_b
        from table
        where kolom_c = :param1
    ) yy
    where 
    xx.kolom_3 = yy.kolom_a
    yy.kolom_b = :param2
    )
where ....
 
dan sebuah viewcriteria membutuhkan query yang memiliki kolom yang akan menjadi filter.
jadi untuk query yang menggunakan distinct akan bermasalah, karena mungkin saja kolom yang akan menjadi filter tersebut mempengaruhi jumah data hasil query

select * from (
    select distinct xx.kolom_1, xx.kolom_2, yy.kolom_b
    from table_xx xx, (
        select kolom_a, kolom_b
        from table
        where kolom_c = :param1
    ) yy
    where 
    xx.kolom_3 = yy.kolom_a
    yy.kolom_b = :param2
    )
where kolom_b = :parameter

Tidak hanya untuk query DISTINCT saja, karena ada beberapa sql lainnya yang tidak bisa dibungkus oleh where clause contohnya seperti START WITH dan CONNECT BY 

Sedangkan bind parameter untuk parameter pada where clause itu sejauh yang saya coba tidak bisa di implement pada sebuah LOV dengan VO yang memiliki query seperti diatas.

Lalu apa bagaimana caranya?
VO di ADF kan hanya bisa menggunakan viewcriteria dan bind parameter untuk mengisi parameter pada query?

Setelah bertukar pikiran dalam diskusi masalah ini, akhirnya di temukan sebuah trik untuk menyelesaikan masalah ini.
Yaitu dengan mengganti query dari VO tersebut secara programmatic pada saat pop-up dialog LOV muncul, atau dengan kata lain adalah meng-harcode parameter kedalam query tersebut.

berikut gambarannya :

select distinct xx.kolom_1, xx.kolom_2
from table_xx xx, (
    select kolom_a, kolom_b
    from table
    where kolom_c = 'ABCDEF'
) yy
where 
xx.kolom_3 = yy.kolom_a
yy.kolom_b = 'GHIJK' 


Oke diatas adalah overview dari apa yang akan di jelaskan secara detail selanjutnya.

Pertama-tama akan saya berikan contoh untuk mengganti query dari sebuah VO.
Pada contoh berikut query VO diganti didalam sebuah method di dalam ViewObjectImpl

public class VoTableSearchImpl {
  /**
   * This is the default constructor (do not remove).
   */
  public VoTableSearchImpl() {
  }

  public void execSearchQuery(String param1, String param2) {
   
    setFullSqlMode(FULLSQL_MODE_AUGMENTATION); 
    setQuery("select distinct xx.kolom_1, xx.kolom_2
            from table_xx xx, (
                select kolom_a, kolom_b
                from table
                where kolom_c = '"+ param1 +"'
            ) yy
            where 
            xx.kolom_3 = yy.kolom_a
            yy.kolom_b = "+ param2 +"'");
    executeQuery();
  }

}

yang perlu diperhatikan adalah semua nama kolom, jumlah kolom, dan type data nya harus sama antara query awal dengan query yang baru


selanjutnya adalah mengimplementasikannya kedalam sebuah LOV

akan ditaruh dalam sebuah method listener pada LOV yaitu launchPopupListener
dan ada satu method tambahan yang diperlukan untuk bisa mendapatkan VO dari suatu LOV

private ViewObject getLovVo(String attributeBinding) {
        BindingContext bctx = BindingContext.getCurrent();
        BindingContainer bindings = bctx.getCurrentBindingsEntry();
        FacesCtrlLOVBinding lov = (FacesCtrlLOVBinding)bindings.get(attributeBinding);
        return lov.getListIterBinding().getViewObject();
    }

dan berikut adalah isi dari method launchPopupListener

public void onLaunchLovNama(LaunchPopupEvent launchPopupEvent) {
    String param1 = (String)getAttrBinding("param1").getAttributeValue();
    String param2 = (String)getAttrBinding("param2").getAttributeValue();
   
    VoTableSearchImpl vo = (VoTableSearchImpl)getLovVo("lovNama");           
    vo.setFullSqlMode(VoTableSearchImpl.FULLSQL_MODE_AUGMENTATION);
    vo.setQuery("select distinct xx.kolom_1, xx.kolom_2
            from table_xx xx, (
                select kolom_a, kolom_b
                from table
                where kolom_c = '"+ param1 +"'
            ) yy
            where 
            xx.kolom_3 = yy.kolom_a
            yy.kolom_b = "+ param2 +"'");
    vo.executeQuery();
}

Sekian dulu dan selamat mencoba.