【问题标题】:PL/SQL - Aggregate values & Write to tablePL/SQL - 聚合值并写入表
【发布时间】:2015-10-11 19:54:42
【问题描述】:

我刚刚开始涉足 PL/SQL,所以这个问题可能非常简单。这是场景:

我有几个带有加权数值的复选框。例如:

复选框 I --> 值 '5'
复选框 II --> 值 '10'
复选框 III --> 值 '15'
等等

表单总共有 15 个复选框,最终用户可以选择从 0 到全部 15 个之间的任何位置。当他们选择复选框时,将计算总重量并显示最终数值。例如。勾选 3 Checkbox I 和 2 Checkbox III = 45 分。

现在 45 的总值将等于一个单独的值。示例:

在 0 分时,值 = '好的'
1-15 分,值 = '错误'
16-30 点,值 = '警告'
31+ 点,值 = '关键'

表单本身是在 Oracle APEX 中构建的,我可以使用动态操作来完成,但使用 PL/SQL 可能是更好的解决方案。

总之,我希望隐藏字段首先从选中的复选框中计算总数,然后使用该总数来计算好的、错误、警告或严重的值。

非常感谢任何帮助!

【问题讨论】:

    标签: sql plsql oracle-apex


    【解决方案1】:

    根据我的经验,如果我们要在您的情况下使用 javascript 会更好,因为我们必须操作 DOM 和复选框的事件。如果您想在运行时显示/更改项目值并获取值,那么 javascript 在这方面比 PLSQL 更好,除非您每次选中/取消选中页面中不建议的框时都想提交页面。 这是我对您的问题的解决方案。

    首先,在您的页面上创建一个Display Only 项目。这是值“Okay”、“Error”、“Warning”或“Critical”出现的地方。将其默认值设置为 0 非常重要。然后在页面的“函数和全局声明”部分中,放置以下函数:

            function getcheck(checkbox_id,displayOnly_id){
            var chkboxName = document.getElementById(checkbox_id + "_0").getAttribute("name");
            var chks = document.getElementsByName(chkboxName);
            var howmanychecks = chks.length;
            var currentSum=0;
            var v_remarks = "";
            for(x=0;x<howmanychecks;x++){
                chks[x].setAttribute("onchange","checkIfchecked(this,\'" + displayOnly_id + "\')");
                if(chks[x].checked){
                    currentSum = currentSum + Number(chks[x].value);
                }
            }
            if(currentSum==0){
                v_remarks = "Okay";
            }
            else if(currentSum>0 && currentSum<=15){
                v_remarks = "Error";
            }
            else if(currentSum>15 && currentSum<=30){
                v_remarks = "Warning";
            }
            else{
                v_remarks = "Critical";
            }
            document.getElementById(displayOnly_id).value = currentSum;
            document.getElementById(displayOnly_id + "_DISPLAY").innerHTML = currentSum + ": " + v_remarks; 
        }
    
    function checkIfchecked(p_element, displayOnly_id){
        var v_difference;
        var v_sum = Number($v(displayOnly_id));
        var displayOnly_display = displayOnly_id + "_DISPLAY";
        var v_remarks = "";
        if(p_element.checked){
            v_sum = v_sum + Number(p_element.value);
            $("#" + displayOnly_id).val(v_sum);
    
        }
        else{
           v_difference=Number($("#" + displayOnly_id).val())-Number(p_element.value);
           if(v_difference<0){
              v_difference=0;
           }
           $("#" + displayOnly_id).val(v_difference);
        } 
        if($("#" + displayOnly_id).val()==0){
            v_remarks = "Okay";
        }
        else if($("#" + displayOnly_id).val()>0 && $("#" + displayOnly_id).val()<=15){
            v_remarks = "Error";
        }
        else if($("#" + displayOnly_id).val()>15 && $("#" + displayOnly_id).val()<=30){
            v_remarks = "Warning";
        }
        else{
            v_remarks = "Critical";
        }
        document.getElementById(displayOnly_display).innerHTML=$("#" + displayOnly_id).val() + ": " + v_remarks;
    
    }
    

    上述函数将获得被选中的那些框的值的总和。如果未选中,则将从当前总和中取出一个框的值。它还会显示当前检查点的备注,无论是“Okay”、“Error”、“Warning”还是“Critical”。

    在页面的“页面加载时执行”部分,添加以下行:

      getcheck(nameofyourcheckboxitem,nameofyourdisplayonlyitem);
    

    其中nameofyourcheckboxitem 是您的复选框的名称,nameofyourdisplayonlyitem 是您刚刚创建的仅显示项目的名称。

    下面是我给你的函数的使用示例:

        getcheck("P1_MYCHECKBOX","P1_MYDISPLAYONLY");
    

    【讨论】:

    • 谢谢!我会试一试,让你知道结果! :)
    • 嗨@vance - 这很好用!但是有一个问题 - 当我点击保存并重新加载页面时,它不会保持现有值。例如,如果我将它设置为关键并关闭表单并返回,它会返回 0 并且选择一个复选框会添加 +5 而不是“现有值 + 5”。
    • 谢谢先生!这非常完美。 :)
    • 只是想知道,为什么不在代码中使用 jQuery?这将使它更具可读性(并且跨浏览器安全,但操作没有提到要支持的浏览器,所以我猜是这样)。至少,为了便于代码维护,apex javascript api 也会有很大帮助。
    • 我刚刚开始看到 jquery 的奇妙之处,这就是为什么我的代码是 javascript 和 jquery 的混合体。只要我知道如何,我总是将 jQuery 合并到我的代码中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2017-11-16
    相关资源
    最近更新 更多