如何使用Javascript从APEX_ITEM设置页面元素的值

时间:2012-10-24 15:54:47

标签: javascript oracle-apex

我在Oracle Apex中编写了一些代码而且我不是来自开发背景,所以请原谅我的错误代码。我正在动态生成表单,我想在用户更改特定表单元素的值时设置隐藏页面项。这是我正在使用的代码:

    select APEX_ITEM.HIDDEN(2,base_data_seq_nbr)||APEX_ITEM.HIDDEN(6,case when substr(description,0,1)= chr(49838) then substr(description,-(length(description)-1)) else description end)||APEX_ITEM.HIDDEN(7,case when substr(description,0,1)= chr(49838) then 1 else 0 end)||APEX_ITEM.HIDDEN(9,
                 data_select(replace(replace(trim(substr(field_name,-(length(field_name)-instr(field_name,',',1)))),'BSBR',''),'C','L'), substr(field_name,0,instr(field_name,',',1)-1), :P721_XCASE,:P721_XRETSTAT,:P721_XID,:P721_XCUSNUM,:P721_DB_ID))||case when substr(description,0,1)= chr(49838)
         then '<img src="/i/themes/theme_2/images/required.gif" alt="Value Required" alt="Value Required" />'
         else null
       end as req_ind,
   case when substr(description,0,1)= chr(49838)
         then substr(description,-(length(description)-1))
         else description
       end as description,
   APEX_ITEM.DATE_POPUP(1,rownum,
                 to_date(data_select(replace(replace(trim(substr(field_name,-(length(field_name)-instr(field_name,',',1)))),'BSBR',''),'C','L'), substr(field_name,0,instr(field_name,',',1)-1), :P721_XCASE,:P721_XRETSTAT,:P721_XID,:P721_XCUSNUM,:P721_DB_ID),'MM/DD/YYYY'),'MM/DD/YYYY',10,10,'onkeyup="javascript:FormatDate(this);"' ||case when instr(substr(field_name,1,4),'DOB,',1)>0 then ' onchange="javascript:$s(''P721_DOB_RBD'',this);"' end,'datepicker_'||rownum)
        end
   end as field_format
from bcvsown.bcvs_base_data
    inner join v_lookup v
    on v.value_seq = stmt_type 
left join (select * from apex_collections where collection_name = 'ERR_COLLECTION') ac
    on base_data_seq_nbr=ac.n001
where caseno = :P721_XCASE
and v.value_cd = case when :P721_XDE_SEQ > 1 then decode(:P721_XIS_BSRS,'true','BSRS','BET') else v.value_cd end
and db_id = :P721_DB_ID
and v.type_cd = 'STMT_TYPE' 
order by base_data_seq_nbr

页面按预期呈现,没有错误,页面源显示javascript设置(onchange="javascript:$s(''P721_DOB_RBD'',this);")仅应用于我的目标。但是当我更改元素时,它似乎没有设置隐藏页面项(P721_DOB_RBD)的值。

3 个答案:

答案 0 :(得分:3)

没有冒犯,标记是非常可怕的。花点时间正确格式化和缩进代码!

至于你的问题,this is the Oracle apex javascript apis reference for $s

$s(pNd, pValue, pDisplayValue, pSuppressChangeEvent)
     

给定DOM节点或字符串ID(pNd),此函数设置   Application Express项目值考虑了项目类型。该   pDisplayValue是可选的。如果用于“Popup LOV”类型的页面项   其中属性“输入字段”=“不可输入,显示显示值   和“存储返回值”,用于设置“输入字段”   pValue的值存储在隐藏的返回字段中。该   pSuppressChangeEvent参数是可选的。通过FALSE或   不传递此参数值会导致触发更改事件   正在设置的项目。传递TRUE以防止更改事件被触发   对于正在设置的项目。

     

参数

pNd (DOM Node | string ID)
pValue  (String | Array)
pDisplayValue(String)
pSuppressChangeEvent(Boolean)

传递this将无效。当你想传递一个值时,它将传递该对象。由于您创建的APEX_ITEM.DATE_POPUP会生成input项,因此在value事件发生时您需要change项。您可以使用$vref

来实现
$v(pNd)
     

给定DOM节点或字符串ID(pNd),此函数返回该值   应用程序Express项目的格式与它的格式相同   帐。

     

参数

pNd (DOM Node | string ID)

所以,试试这个:

(onchange="javascript:$s(''P721_DOB_RBD'',$v(this));")

答案 1 :(得分:0)

多年以后 - 要格式化代码,请使用sql developer将代码复制到sql developer sql工作表,右键单击并选择格式。

 SELECT APEX_ITEM.HIDDEN(2,base_data_seq_nbr)
  ||APEX_ITEM.HIDDEN(6,
  CASE
    WHEN SUBSTR(description,0,1)= chr(49838)
    THEN SUBSTR(description,-(LENGTH(description)-1))
    ELSE description
  END)
  ||APEX_ITEM.HIDDEN(7,
  CASE
    WHEN SUBSTR(description,0,1)= chr(49838)
    THEN 1
    ELSE 0
  END)
  ||APEX_ITEM.HIDDEN(9, data_select(REPLACE(REPLACE(trim(SUBSTR(field_name,-(LENGTH(field_name)-instr(field_name,',',1)))),'BSBR',''),'C','L'), SUBSTR(field_name,0,instr(field_name,',',1)-1), :P721_XCASE,:P721_XRETSTAT,:P721_XID,:P721_XCUSNUM,:P721_DB_ID))
  ||
  CASE
    WHEN SUBSTR(description,0,1)= chr(49838)
    THEN '<img src="/i/themes/theme_2/images/required.gif" alt="Value Required" alt="Value Required" />'
    ELSE NULL
  END AS req_ind,
  CASE
    WHEN SUBSTR(description,0,1)= chr(49838)
    THEN SUBSTR(description,-(LENGTH(description)-1))
    ELSE description
  END AS description,
  APEX_ITEM.DATE_POPUP(1,rownum, to_date(data_select(REPLACE(REPLACE(trim(SUBSTR(field_name,-(LENGTH(field_name)-instr(field_name,',',1)))),'BSBR',''),'C','L'), SUBSTR(field_name,0,instr(field_name,',',1)-1), :P721_XCASE,:P721_XRETSTAT,:P721_XID,:P721_XCUSNUM,:P721_DB_ID),'MM/DD/YYYY'),'MM/DD/YYYY',10,10,'onkeyup="javascript:FormatDate(this);"'
  ||
  CASE
    WHEN instr(SUBSTR(field_name,1,4),'DOB,',1)>0
    THEN ' onchange="javascript:$s(''P721_DOB_RBD'',this);"'
  END,'datepicker_'
  ||rownum)
END
END AS field_format
FROM bcvsown.bcvs_base_data
INNER JOIN v_lookup v
ON v.value_seq = stmt_type
LEFT JOIN
  (SELECT * FROM apex_collections WHERE collection_name = 'ERR_COLLECTION'
  ) ac
ON base_data_seq_nbr=ac.n001
WHERE caseno        = :P721_XCASE
AND v.value_cd      =
  CASE
    WHEN :P721_XDE_SEQ > 1
    THEN DECODE(:P721_XIS_BSRS,'true','BSRS','BET')
    ELSE v.value_cd
  END
AND db_id     = :P721_DB_ID
AND v.type_cd = 'STMT_TYPE'
ORDER BY base_data_seq_nbr

答案 2 :(得分:0)

如果要在Javascript中设置值应用程序项,除了一个之外没有办法。您可以在Javascript使用中设置页面级别项目:

 $s(':P12_Item','value');

您可以使用以下方式获取页面级别项目值:

$v('page item')

您可以使用

在JS中获取Application项值
 &APP_ITEM.

但是您无法在Javascript中设置值应用程序项。您必须创建一个进程,该进程将设置应用程序项值并从Javascript apex Ajax调用此进程。

<script>
var get = new htmldb_Get(null,&APP_ID.,'APPLICATION_PROCESS=SET_APS_CASEIDS',0);

get.addParam('x01',$caseIds);

gReturn = get.get();
if (gReturn) {
window.location='f?p=&APP_ID.:66:&SESSION.::NO:66';
}
</script>

在我的情况下,我使用Ajax在应用程序项目中设置值并处理并重定向到其他页面。该页面将使用应用程序项值。

申请流程代码。

首先从共享组件创建应用程序项。

Name: APS_CASEIDS
Session State protection:unrestricted

从共享组件创建应用程序进程。

Name:SET_APS_CASEIDS (Name should be match in ajax call).
Process point:On Demand:run this application process when requested by process.
Process Text:


BEGIN

owa_util.mime_header('text/html', FALSE );
htp.p('Cache-Control: no-cache');
htp.p('Pragma: no-cache');
owa_util.http_header_close;

    APEX_UTIL.SET_SESSION_STATE('APS_CASEIDS',APEX_APPLICATION.G_X01);
END;