Код для равных '=' в калькуляторе форм оракула?

У меня есть несколько кнопок от 0 до 9 и другие методы расчета, такие как плюс, минус и т. Д.

Есть два элемента отображения, Memory а также Display; Memory предмет скрыт

Когда нажимаете на 1 Кнопка затем отобразить значение 1 в Display вещь. Когда нажимаете на + затем сохранить значение 1 в Memory вещь. Когда нажимаете на = кнопку затем добавить Memory + Display значения и показать ответ на Display вещь.

Вопрос в том, как закодировать множественные вычисления в равные = кнопка?

2 ответа

Решение

У вас есть три регистра: нажатие кнопки, отображаемое значение и значение памяти. Итак, строка расчета 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));
Другие вопросы по тегам