1. 단가 표현을 위한 Collection 생성
Pre-Rendering - Before Regions - Processes
Identification - Name : CreateCollection
Type : Execute Code
Source - Location : Local Database
Language : PL/SQL
PL/SQL Code :
declare
--l_session apex_application.g_instance%type := apex_application.g_instance;
l_query varchar2(20000) :=
'select cd
, to_number(grp2) hh24
, to_number(grp3) amt
, 0 page_cnt
, 0 page_amt
, null, null, null, null, null, null
from jkmst_cd_mst
where grp_id = 1 and cd != ''00''
order by cd';
begin
APEX_COLLECTION.DELETE_ALL_COLLECTIONS;
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY2 (
p_collection_name => 'ESTIMATION',
p_query => l_query,
p_generate_md5 => 'YES');
end;
2. 예상금액확인 리전 생성
Identification - Name : 예상금액확인
Type : Classic Report
** 앞서 만들어 놓은 collection 에서 데이터를 읽어 오면서 컬럼별 스타일 적용
select '<span class="t-Icon fa fa-number-'||trim(to_char(n001))||'-o fa-2x" aria-hidden="true"></span>' cd
, n002 hh24, n003 amt
, n004 page_cnt
, (n003 * n004) page_amt
, '<button class="ButtonXU t-Button t-Button--default t-Button--hot" id=U-'||trim(to_char(n001))||' type="button"><span aria-hidden="true" class="fa fa-arrow-circle-o-up"></span></button>' btn_up
, '<button class="ButtonXD t-Button t-Button--default" id=D-'||trim(to_char(n001))||' type="button"><span aria-hidden="true" class="fa fa-arrow-circle-o-down"></span></button>' btn_down
from apex_collections
where collection_name = 'ESTIMATION'
order by seq_id
Appearance - Template Options : Use Template Defaults, Show Region Icon, Accent 2, Scroll - Default
Icon : fa-dollar fa-2x
그리고 디자인이 들어간 CD, BTN_UP, BTN_DOWN 은 컬럼 Type을 Markdown 으로하여 HTML 표현
Dynamic Action - Name : UbtnClickedWhen - Event : Click
Selection Type : jQuery Selector
jQuery Selector : .ButtonXU (button class name in sql design)
-- True Action1 : Set Value (PL/SQL에서 클릭 버튼 종류를 인식하기 위해 U, D 값 셋팅)
Set Type : JavaScript Expression : this.triggeringElement.id
Affected Elements : P3_ID
-- True Action2 : Execute Server-side Code (클릭된 Row의 값 계산, 누적)
declare
lv_value varchar2(100) := :P3_ID;
lv_calc varchar2(1) := substr(lv_value,1,1);
ln_level number := to_number(substr(lv_value,3));
ln_cnt number := 0;
begin
--raise_application_error(-20001, substr(lv_value,1,1));
if :P3_ID is null then return; end if;
select n004 into ln_cnt
from apex_collections
where collection_name = 'ESTIMATION'
and seq_id = ln_level;
if lv_calc = 'U' then
ln_cnt := ln_cnt + 1;
else
ln_cnt := ln_cnt - 1;
end if;
if ln_cnt < 0 then return; end if;
--raise_application_error(-20001, ln_cnt);
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'ESTIMATION',
p_seq => to_char(ln_level),
p_attr_number => 4,
p_number_value => ln_cnt);
select sum(n003 * n004) into ln_cnt
from apex_collections
where collection_name = 'ESTIMATION';
:P3_SUM := TO_CHAR(ln_cnt,'999,999,999,999');
end;
-- True Action3 : Refresh (계산된 Collection에서 값 읽어오기)
Selection Type : Region
Region : 예상금액확인
-- True Action4 : Execute JavaScript Code (리전 상단의 합계 버튼에 값 셋팅)
$('#myStaticBTN span.t-Button-label').text(apex.item('P3_SUM').getValue())
참고
https://docs.oracle.com/en/database/oracle/application-express/21.1/aeapi/CREATE_COLLECTION_FROM_QUERY2-Procedure.html#GUID-7800CD9E-FD29-4E49-B637-A426D78A644C
CREATE_COLLECTION_FROM_QUERY2 Procedure
Use this procedure to create a collection from a supplied query. This method is identical to CREATE_COLLECTION_FROM_QUERY
, however, the first 5 columns of the SELECT
clause must be numeric and the next 5 must be date. After the numeric
and date columns, there can be up to 50 character columns in the SELECT
clause. The query is parsed as the application owner. If a collection
exists with the same name for the current user in the same session for
the current Application ID, an application error is raised.
이 프로시저를 사용할 경우 반드시 첫 5개는 숫자, 다음 5개는 일자 그리고 1개는 문자가 필요함. Null이라도 표시해야 함.
declare
l_query varchar2(20000) :=
'select prod_id, prod_qty, 0, 0, 0, null, null, null, null, null, null
from po_mst where rownum <= 3';
begin
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY2 (
p_collection_name => 'PRODLIST',
p_query => l_query,
p_generate_md5 => 'YES',
p_truncate_if_exists => 'YES');
end;
댓글 없음:
댓글 쓰기