我在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)
的值。
答案 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
项。您可以使用$v
(ref)
$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;