我有一个交互式报告,其中一些列包括
APEX.ITEM
。 APEX.ITEM
s 的数据应该存储在一个单独的表中,该表不是我查询的主表。例如:
SELECT
A.id ID
,APEX_ITEM.SELECT_LIST_FROM_QUERY(P_IDX => 1,
P_VALUE => B.id,
P_QUERY => ' SELECT C.name,C.id from
C
where C.DETAIL_id='||B.id
) LOV_COLUMN
,APEX_ITEM.text(p_idx => 3 , P_VALUE => B.DESCRIPTION,p_maxlength =>150,p_attributes => 'style="width:350px";') DESCRIPTION
from A
left join B ON B.DETAIL_ID =A.DETAIL_ID
WHERE A.D = :P5_VALUE_ID
我想将LOV_COLUMN和DESCRIPTION的数据存储在B表中。 为了实现这个目标,首先我编写了一个函数,用于在提交之前为每一行生成 IR 的 JSON,并填充
APEX.ITEM
。然后我在这个 IR 上编写了一个用于更新和插入的合并。这是我的 JSON :
function create_json()
{
var TBL =document.getElementsByClassName("classname")
var allDataArr=[];
$(TBL[1]).find('tr').each(function(index, element) {
var row_data={};
$(element).find('td').each(function(index2, element2) {
if(index2 == 0){
row_data.LOV_COLUMN=$(element2).find(":selected").val()
}
///and other columns...
});
allDataArr.push(row_data)
});
}
我的合并:
merge into C
using (
SELECT ID,LOV_COLUMN,DESCRIPTION
FROM json_table
( :P5_GRID_JSON,'$[*]' ---this is a page item that contains the json of IR
columns(
ID NUMBER PATH '$.ID',
LOV_COLUMN NUMBER PATH '$.LOV_COLUMN',
DESCRIPTION VARCHAR2 PATH '$.DESCRIPTION'
)
)
) jsn
on (jsn.ID = C.DETAIL_A_ID )
WHEN MATCHED THEN
UPDATE SET
C.LOV_COLUMN = jsn.LOV_COLUMN
,C.DESCRIPTION =jsn.DESCRIPTION
WHEN NOT MATCHED then
INSERT (DETAIL_A_ID,LOV_COLUMN,DESCRIPTION)
VALUES (jsn.ID,jsn.LOV_COLUMN,jsn.DESCRIPTION) ;
为了获取 JSON,我使用 td 的索引来获取所选值或输入值。但有些东西可能会给创建的 JSON 带来问题。如果用户更改列的顺序,IR 列的索引将会更改,从而导致 JSON 损坏。有没有什么方法可以创建 JSON 而不会出现这样的问题,并在 IG 中使用 data-id 之类的东西而不是 IR 中的列索引?
此外,如果它看起来很复杂,我在工作区上制作了一个名为 IR JSON 的应用程序。
工作区名称:ASKTOM_FRIENDLY_URL
用户:[电子邮件受保护]
密码:123@456_HELP
这是使用服务器端处理的解决方案:
在查询中,将
APEX_ITEM.HIDDEN
项连接到另一列,以便行集的主键包含在报告中。
SELECT qd.id
,apex_item.hidden(
p_idx => 1
,p_value => qd.m5questionnaire_id
)||
apex_item.select_list_from_query(
p_idx => 2
,p_query => 'select QUESTION_TEXT , ID from M5QUESTIONNAIRE_DETAILS where M5QUESTIONNAIRE_ID ='
|| :P10_M5QUESTIONNAIRE_ID
) m5questionnaire_details_id
,apex_item.text(
p_idx => 3
,p_value => a.answer
) descriptive_answer
FROM m5questionnaire_details qd
LEFT JOIN m5answersheet a ON a.m5questionnaire_details_id = qd.id
WHERE qd.m5questionnaire_id = :P10_M5QUESTIONNAIRE_ID
FETCH FIRST ROW ONLY
然后在页面处理中,使用提交的
APEX_APPLICATION.G_F0x
数组处理发布的答案。在这种情况下,由于您要求合并,因此这些行被放入一个集合中,然后可以在合并事务的查询中加入该集合。
DECLARE
l_collection_name VARCHAR2(100) := 'ANSWERS';
BEGIN
-- create collection
APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
p_collection_name => l_collection_name);
-- some code instrumentation for easier debugging
apex_debug.info(
p_message => q'#kl debug index count : %0, %1, %2#',
p0 => APEX_APPLICATION.G_F01.COUNT,
p1 => APEX_APPLICATION.G_F02.COUNT,
p2 => APEX_APPLICATION.G_F03.COUNT);
-- loop over the index column
FOR i IN 1..APEX_APPLICATION.G_F01.COUNT LOOP
-- add elements to collection
APEX_COLLECTION.ADD_MEMBER (
p_collection_name => l_collection_name,
p_c001 => APEX_APPLICATION.G_F01(i),
p_c002 => APEX_APPLICATION.G_F02(i),
p_c003 => APEX_APPLICATION.G_F03(i)
);
END LOOP;
-- merge in to destination table
MERGE INTO m5answersheet a
USING (
SELECT c002 AS m5questionnaire_details_id
,c003 AS descriptive_answer
,n001
FROM apex_collections
WHERE collection_name = l_collection_name
) coll ON ( coll.m5questionnaire_details_id = a.m5questionnaire_details_id )
WHEN MATCHED THEN UPDATE
SET a.answer = coll.descriptive_answer
WHEN NOT MATCHED THEN
INSERT (
m5questionnaire_details_id
,answer )
VALUES
( coll.m5questionnaire_details_id
,coll.descriptive_answer );
END;