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

code for equal to '=' in oracle forms calculator?

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

有两个显示项,MemoryDisplayMemory 项已隐藏。

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

问题是如何在等于 = 按钮中编写多重计算代码?

你有三个寄存器:点击的按钮,显示值和记忆值。所以计算字符串 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     

创建如下函数。

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