oracle apex 中提交和验证页面后的警报消息

jaw*_*jaw 2 oracle-apex

我有一个动态操作执行以下操作,
提交页面,
成功警报消息,
注销并重定向到另一个网站(www.google.com),
并且页面中有两个必需的项目。

当按下按钮并且该项目为空时,会出现成功警报消息,然后系统显示错误(该项目是必需的)。仅当过程和验证完成且没有错误,并且在警报消息中按下“确定”时,如何才能显示成功的警报消息重定向到网站并从会话中注销

Dan*_*han 7

您可以采用不同的方法来解决这个问题。您当前正在使用动态操作和页面级验证以及流程的组合,这些验证和流程不能很好地协同工作。我建议您将所有逻辑移至动态操作。以下是执行我认为您想要执行的操作的分步说明。您可以从中学习,然后将您想要的内容集成回您的解决方案中。

  1. 创建一个新的空白页。我的是第 17 页。如果不同,您需要使用页码更新对“P17”的引用。禁用页面级别属性“警告未保存的更改”以防止在重定向到 Google 之前出现提示。
  2. 向页面添加新的 HTML 区域。
  3. 将新项目添加到该区域。将名称设置为P17_FIRST_NAME并保留默认的文本字段类型。
  4. 将新项目添加到该区域。将名称设置为P17_LAST_NAME并保留默认的文本字段类型。
  5. 将新项目添加到该区域。将名称设置为P17_RESULT,将类型设置为Hidden,并将Value Protected设置为No。此项将用于通过 Ajax 将消息从服​​务器传输到客户端。
  6. 向该区域添加一个按钮。将名称设置为RUN_PROCESS并将操作设置为由动态操作定义。
  7. 创建一个在单击按钮时触发的新动态操作。最简单的方法是右键单击该按钮并选择“创建动态操作”。将名称设置为RUN_PROCESS 单击。
  8. 选择默认为动态操作创建的显示操作。将操作设置为执行 PL/SQL 代码,并将以下代码复制粘贴到PL/SQL 代码属性中。

    declare
    
      l_result_obj json_object_t := json_object_t();
      l_errors_arr json_array_t := json_array_t();
      l_error_obj  json_object_t;
    
    begin
    
      if :P17_FIRST_NAME is null
      then
        l_error_obj := json_object_t();
    
        l_error_obj.put('pageItem', 'P17_FIRST_NAME');
        l_error_obj.put('message', 'First Name is required.');
    
        l_errors_arr.append(l_error_obj);
      end if;
    
      if :P17_LAST_NAME is null
      then
        l_error_obj := json_object_t();
    
        l_error_obj.put('pageItem', 'P17_LAST_NAME');
        l_error_obj.put('message', 'Last Name is required.');
    
        l_errors_arr.append(l_error_obj);
      end if;
    
      if l_errors_arr.get_size() > 0
      then
        l_result_obj.put('status', 'error');
        l_result_obj.put('errors', l_errors_arr);
        :P17_RESULT := l_result_obj.to_string();
        return;
      end if;
    
      null; -- do "success" processing here
    
      l_result_obj.put('status', 'success');
      l_result_obj.put('message', 'Hi ' || :P17_LAST_NAME || ' ' || :P17_LAST_NAME || 
        '! You will now be redirected to Google.');
    
      :P17_RESULT := l_result_obj.to_string();
    
    end;
    
    Run Code Online (Sandbox Code Playgroud)

    正如您所看到的,验证现在正在流程内完成。PL/SQL 代码使用 Oracle 12.2 中引入的 JSON 类型。如果您使用的是旧版本的数据库,则可以调整代码以使用 APEX_JSON。

  9. 仍在“执行 PL/SQL 代码”操作中时,将要提交的项目设置为P17_FIRST_NAME、P17_LAST_NAME并将要返回的项目设置为P17_RESULT。通过这种方式,您可以在进程执行之前将值从页面传输到会话状态,然后在进程执行完成后返回到页面。
  10. 创建一个在 P17_RESULT 的 Change 事件上触发的新动态操作。最简单的方法是右键单击该项目并选择“创建动态操作”。将名称设置为P17_RESULT 已更改。
  11. 选择默认为动态操作创建的显示操作。将“操作”设置为“执行 JavaScript 代码”,并将以下代码复制粘贴到“代码”属性中。

    var result = JSON.parse($v('P17_RESULT'));
    
    apex.message.clearErrors();
    
    if (result.status === 'error') {  
      for (var idx = 0; idx < result.errors.length; idx++) {
        result.errors[idx].type = 'error';
        result.errors[idx].location = ['page', 'inline'];
        result.errors[idx].unsafe = false;
      }
    
      apex.message.showErrors(result.errors);
    } else if (result.status === 'success') {
      apex.message.alert(result.message, function(){
        apex.navigation.redirect('https://google.com');
      });
    }
    
    Run Code Online (Sandbox Code Playgroud)

    JavaScript 代码获取该过程的结果并显示错误消息或警报。我使用apex.message.alert而不是apex.message.showPageSuccess因为前者支持消息被消除时的回调。当消息被忽略时,apex.navigation.redirect将用户带到 Google。

最终应该是这样的:

基于动态动作的处理

我希望这里有足够的信息让您了解正在发生的事情。如果您有任何疑问,请告诉我。apex.navigation您可以在此处找到相关文档apex.message: https: //apex.oracle.com/jsapi

PS 以下是使用 APEX_JSON 的 PL/SQL 代码的示例。

declare

  l_error_count pls_integer := 0;
  l_result_obj  clob;

begin

  apex_json.initialize_clob_output;

  apex_json.open_object();

  apex_json.open_array('errors');

  if :P17_FIRST_NAME is null
  then
    l_error_count := l_error_count + 1;
    apex_json.open_object();

    apex_json.write('pageItem', 'P17_FIRST_NAME');
    apex_json.write('message', 'First Name is required.');

    apex_json.close_object();
  end if;

  if :P17_LAST_NAME is null
  then
    l_error_count := l_error_count + 1;
    apex_json.open_object();

    apex_json.write('pageItem', 'P17_LAST_NAME');
    apex_json.write('message', 'Last Name is required.');

    apex_json.close_object();
  end if;

  apex_json.close_array();

  if l_error_count > 0
  then
    apex_json.write('status', 'error');
    apex_json.close_object();

    :P17_RESULT := apex_json.get_clob_output();
    apex_json.free_output;
    return;
  end if;

  null; -- do "success" processing here

  apex_json.write('status', 'success');
  apex_json.write('message', 'Hi ' || :P17_LAST_NAME || ' ' || :P17_LAST_NAME || 
    '! You will now be redirected to Google.');
  apex_json.close_object();

  :P17_RESULT := apex_json.get_clob_output();
  apex_json.free_output;

end;
Run Code Online (Sandbox Code Playgroud)