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

时间:2020-01-26 16:43:09

标签: oracle-apex

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

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

1 个答案:

答案 0 :(得分:3)

您可以采用不同的方法来解决这个问题。您目前正在混合使用动态操作和页面级验证以及流程,这些流程无法很好地发挥作用。我建议您将所有逻辑移至动态动作。以下是逐步说明,以做我认为您要尝试做的事情。您可以从中学到东西,然后将想要的东西集成到解决方案中。

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

    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;
    

    如您所见,验证现在在流程内完成。 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代码,然后将以下代码复制粘贴到 Code 属性中。

    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');
      });
    }
    

    JavaScript代码从过程中获取结果,并显示错误消息或警报。我使用的是apex.message.alert而不是apex.message.showPageSuccess,因为前者在关闭邮件时支持回调。取消该消息后,apex.navigation.redirect会将用户带到Google。

这是最后的样子:

Dynamic Action based processing

我希望这里有足够的信息供您了解正在发生的事情。如果您有任何问题,请告诉我。您可以在https://apex.oracle.com/jsapi

中找到apex.navigationapex.message的文档。

P.S。这是一个使用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;