代码在oracle表单计算器中等于'='?

时间:2018-03-20 07:27:27

标签: oracle oracleforms oracle-fusion-middleware

我有多个按钮0到9以及其他计算方法,如加号,减号等

有两个显示项MemoryDisplay; <{1}}项目已隐藏。

单击Memory按钮,然后在1项目中显示值1。单击Display按钮,然后将值1存储在+项目中。点击Memory按钮,然后添加= + Memory值并在Display项目上显示答案。

问题是如何将多个计算编码为等于Display按钮?

2 个答案:

答案 0 :(得分:3)

您有三个寄存器:单击按钮,显示值和内存值。所以计算字符串2+3=5看起来像这样:

button Display Memory 
     2       2
     +       2      2
     3       3      2
     =       5      5

据我了解您的问题,当用户键入多个步骤而不按=时,您希望处理更长的计算,例如2+3+7/4*5=。有几种方法可以做到这一点,但对用户来说最直观的方法是将算术运算符视为具有隐式=运算,计算运行总和并显示该值。

button Display Memory 
     2       2
     +       2      2
     3       3      2
     +       5      5
     7       7      5
     /      12     12
     4       4     12
     *       3      3
     5       5      3
     =      15     15

要完成这项工作,您需要另一个注册项来跟踪当前的操作员。

button Display Memory Operator
     2       2       
     +       2      2        +
     3       3      2        +
     +       5      5        +
     7       7      5        +
     /      12     12        /
     4       4     12        /
     *       3      3        *
     5       5      3        * 
     =      15     15        =

因此,当用户点击触发按钮时,您执行以下操作:

if :operator = '+' then
    :memory := :memory + :display;
elsif :operator = '-' then
    :memory := :memory - :display;
elsif :operator = '/' then
    :memory := :memory / :display;
elsif :operator = '*' then
    :memory := :memory * :display;
end if;
:display := :memory;
:operator := :button_value;

当用户在一行中键入两个操作时,您需要决定如何处理这种情况,例如: +/。但是,您可能也需要跟踪上一次按下按钮。

那么=的目的是什么?那么,这取决于用户下次输入的内容。如果他们跟随=跟另一个操作员,那么它只是一个小计,总和继续....

button Display Memory 
     2       2
     +       2      2
     3       3      2
     =       5      5
     +       2      5  <-- continue with existing sum
     =       7      7  

...但是如果他们跟着一个号码,那么我们就开始新的总和了,我们重置了记忆:

button Display Memory 
     2       2
     +       2      2
     3       3      2
     =       5      5
     2       2         <-- start a new sum
     +       2      2
     2       2      2
     =       4      4     

答案 1 :(得分:0)

创建如下的函数。

create or replace function calculate(p_input VARCHAR2) RETURN VARCHAR2
IS
   v_output VARCHAR2(20);
   missing_expression EXCEPTION;
   invalid_identifier EXCEPTION;
   PRAGMA EXCEPTION_INIT(missing_expression, -936);
   PRAGMA EXCEPTION_INIT(invalid_identifier, -904);
BEGIN
   EXECUTE IMMEDIATE 'SELECT '||p_input||' FROM dual' INTO v_output;
   RETURN v_output;
EXCEPTION
   WHEN VALUE_ERROR OR MISSING_EXPRESSION OR INVALID_IDENTIFIER THEN
       RETURN 'ERROR';
END;
/

在SQL中使用示例,

SELECT CAST(CALCULATE('1+2-3+4+5') AS VARCHAR2(20)) output 
  FROM dual;

在Oracle表单中,

:block.io_display_item := CAST(CALCULATE(:block.io_display_item) AS VARCHAR2(20));