从 IR 创建 JSON,而不使用 td 标签索引

问题描述 投票:0回答:1

我有一个交互式报告,其中一些列包括

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

json oracle-apex
1个回答
0
投票

这是使用服务器端处理的解决方案:

在查询中,将

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;
© www.soinside.com 2019 - 2024. All rights reserved.