Contoh kasus kita terapkan pada tabel EMP.
Kita bisa lakukan dengan memakai konsep AJAX atau Dynamic Action.
Langkah implementasi dalam APEX untuk AJAX sbb:
- Tambahkan kolom ORDER_BY number(3);
- Buatlah report dengan memakai collection contoh nama collection : 'R_SORT'
- Buat process pl/sql before header
- Buat calssic report dengan query
- Buatlah Application Process : REORDER dengan process point : on demand
declare
l_col_name varchar2(100):='R_SORT';
l_query varchar2(4000);
begin
l_query:='select a.EMPNO,a.ENAME,a.JOB,a.MGR,a.HIREDATE,a.SAL,a.COMM,a.DEPTNO,a.ORDER_BY from emp a order by a.ORDER_BY';
if not APEX_COLLECTION.COLLECTION_EXISTS(p_collection_name => l_col_name) then
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B(
p_collection_name => l_col_name
, p_query => l_query
);
end if;
end;
SELECT coll.seq_id No
, coll.c001 empno
, coll.c002 ename
, coll.c003 job
, coll.c004 mgr
, coll.c005 hiredate
, coll.c006 comm
, coll.c007 sal
, coll.c008 deptno
FROM APEX_collections coll
WHERE coll.collection_name = 'R_SORT'
ORDER BY to_number(coll.seq_id)
declare
-- ajax call to move a seq_id collection
l_seq number(5);
l_seq_id number(5);
l_old number(5);
l_new number(5);
l_counter number(5);
l_abscounter number(5);
begin
l_seq_id := to_number(wwv_flow.g_x01);
l_counter := to_number(wwv_flow.g_x02);
l_abscounter :=abs(l_counter);
if l_counter < 0 then
-- Move UP
for i in 1 .. l_abscounter loop
apex_collection.move_member_down(
p_collection_name => 'R_SORT'
, p_seq => l_seq_id
);
l_seq_id := l_seq_id - 1;
end loop;
elsif l_counter > 0 then
-- Move DOWN
for i in 1 .. l_abscounter loop
apex_collection.move_member_up(
p_collection_name => 'R_SORT'
, p_seq => l_seq_id
);
l_seq_id := l_seq_id + 1;
end loop;
end if;
htp.prn('success');
end;
function setSortable() {
var vStart = 0;
var vEnd = 0;
var vCounter = 0;
var vSeqId = 0;
var sortRegion = '#report_RSORT_1 .report-standard tbody:first'; // selector tergantung report yg anda pakai
$(sortRegion).sortable({
cursor : 'wait',
distance : 15,
revert : 500,
start : function (event, ui) {
vStart = Number(ui.item.index()) + 1;
vSeqId = Number($(this).find('td[headers="NO"]')[ui.item.index()].innerHTML);},
stop : function (event, ui) {
vEnd = Number(ui.item.index()) + 1;
vCounter = vEnd - vStart;
apex.server.process("REORDER"
, { x01: vSeqId, x02: vCounter }
, {
dataType: 'text'
, success: function (pData) {
if (pData != 'success') {
alert(pData);
}
else {
// refresh report id tergantung report yg anda pakai
$('#report_28558823308938595811_catch').trigger('apexrefresh');
}
}
}
);
}
});
$(sortRegion).disableSelection();
}
Liat demo hasilnya disini.