1

我在 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

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

4

3 回答 3

3

无意冒犯,这个标记非常可怕。花时间正确格式化和缩进你的代码!

至于您的问题,这是 $s 的 Oracle apex javascript apis 参考

$s(pNd, pValue, pDisplayValue, pSuppressChangeEvent)

给定一个 DOM 节点或字符串 ID (pNd),此函数设置 Application Express 项目值并考虑项目类型。pDisplayValue 是可选的。如果用于属性“Input Field”=“Not Enterable, Show Display Value and Store Return Value”的“Popup LOV”类型的页面项,则用于设置“Input Field”。pValue 的值存储在隐藏的返回字段中。pSuppressChangeEvent 参数是可选的。传递 FALSE 或不传递此参数值会导致正在设置的项目触发更改事件。传递 TRUE 以防止为正在设置的项目触发更改事件。

参数

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

传下去是this不行的。当你想传递一个值时,这将传递对象。由于您正在创建APEX_ITEM.DATE_POPUP将生成项目的 a,因此在事件发生时input您将需要该value项目的。change您可以通过使用$v( ref )

$v(pNd)

给定一个 DOM 节点或字符串 ID (pNd),此函数返回 Application Express 项的值,其格式与发布时的格式相同。

参数

pNd (DOM Node | string ID)

所以,试试这个:

(onchange="javascript:$s(''P721_DOB_RBD'',$v(this));")
于 2012-10-24T16:43:45.760 回答
0

多年后 - 要格式化代码,使用 sqldeveloper 将代码复制到 sqldeveloper 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
于 2014-09-13T20:09:18.820 回答
0

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

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

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

$v('page item')

您可以使用 JS 在 JS 中获取应用程序项值

 &APP_ITEM.

但是你不能在Javascript中设置价值应用项。您必须创建一个流程来设置应用程序项目值并从 Javascript 顶点 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;
于 2015-03-20T06:20:06.707 回答