2012-10-24 59 views
1

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

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

没有冒犯,那标记是相当可怕的。花时间正确地格式化和缩进你的代码!

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

$s(pNd, pValue, pDisplayValue, pSuppressChangeEvent) 

给出一个DOM节点或字符串ID(PND),这个函数设置 快捷应用项目价值考虑的项目类型。 pDisplayValue是可选的。如果用于属性“输入字段”=“不可输入,显示显示值 和存储返回值”的“弹出式LOV” 类型的页面项目,则用于设置“输入栏”。 pValue的值 存储在隐藏的返回字段中。 pSuppressChangeEvent参数是可选的。如果传递FALSE或 未传递此参数值,则会导致 正在设置的项目发生更改事件触发。通过TRUE以防止更改事件发生 正在设置的项目。

参数

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

薪火this将无法​​正常工作。当你想传递一个值时,它会传递这个对象。由于您创建的APEX_ITEM.DATE_POPUP会生成input物品,因此您需要在change事件发生时物品的value。您可以通过使用$vref

$v(pNd) 

给出一个DOM节点或字符串ID(PND)做到这一点,该函数将返回相同的格式的快捷应用项目的价值 因为这将是 发布。

参数

pNd (DOM Node | string ID) 

那么,试着用这样的:

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

你是我的英雄! – user1769597

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 
0

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

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

可以使用获得的页面级项目值:

$v('page item') 

您可以开始使用

&APP_ITEM. 

在JS应用项目值但是您不能在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; 
相关问题