Расчетный запрос с параметрами в HANA / CrystalReports - PullRequest
1 голос
/ 28 мая 2020

Мне сложно объяснить свою необходимость, поэтому я опишу сценарий.


Сценарий:

  • Продукт A имеет максимальное производство 125 кг за один раз.
  • Оператор получил производственный заказ на 1027,5 кг продукта A.
  • Оператор должен рассчитать, сколько раундов ему нужно будет изготовить, и скорректировать количество компонентов для каждый раунд.

Мы хотим создать отчет, в котором эти вычисления уже выполнены, и что, по нашему мнению, будет первым шагом, основанным на значениях этого сценария, - это вернуть что-то вроде этого:

КРУГЛЫЙ КОЛИЧЕСТВО (кг)
1 125
2 125
3 125
4 125
5 125
6 125
7 125
8 125
9 27,5

После этого перерасчет компонентов можно было бы производить простыми операциями.


Проблема в том, что мы не могли придумать способ получить желаемую прибыль, и мы также не могли придумать другой способ ачи Составление указанного отчета.

Все, что мы могли сделать, это получить целую часть деления

SELECT FLOOR(1027.5/125) AS "TEST" FROM DUMMY

и остаток

SELECT MOD(1027.5,125) AS "TEST" FROM DUMMY

Мы используем:

  • SAP HANA SQL
  • Crystal Reports
  • SAP B1

Любая помощь приветствуется

Спасибо за заранее!

1 Ответ

1 голос
/ 29 мая 2020

Есть несколько способов достичь желаемого, которое вы описали.

Один из способов - преобразовать требование в функцию, которая принимает два значения входных параметров и возвращает таблицу производственных циклов. Это может выглядеть так:

create or replace  function production_rounds(
            IN max_production_volume_per_round decimal (10, 2)
          , IN production_order_volume         decimal (10, 2)
          )
returns table   (
          production_round integer
        , production_volume decimal (10, 2))
as
begin
declare rounds_to_produce integer;
declare remainder_production_volume decimal (10, 2);

    rounds_to_produce := floor( :production_order_volume / :max_production_volume_per_round);
    remainder_production_volume := mod(:production_order_volume, :max_production_volume_per_round);

    return 
        select /* generate rows for all "max" rounds */
                 s.element_number                   as production_round
               , :max_production_volume_per_round   as production_volume
        from
            series_generate_integer
                (1, 1, :rounds_to_produce + 1) s
    UNION ALL
        select /* generate a row for the final row with the remainder */
                :rounds_to_produce + 1              as production_round
              , :remainder_production_volume        as production_volume
        from
            dummy
        where 
            :remainder_production_volume > 0.0;

end;

Вы можете использовать эту функцию, как любую таблицу, но с параметрами:

select * from production_rounds (125 , 1027.5) ;

PRODUCTION_ROUND    PRODUCTION_VOLUME
1                   125              
2                   125              
3                   125              
4                   125              
5                   125              
6                   125              
7                   125              
8                   125              
9                   27.5             

Бит, который, вероятно, требует объяснения, - это SERIES_GENERATE_INTEGER. Это встроенная функция c, специфичная для HANA, которая возвращает количество записей из «серии». Здесь серия представляет собой последовательность периодов в пределах минимального и максимального пределов и с определенным размером шага между двумя смежными периодами. Подробнее о том, как это работает, можно найти в справочной документации HANA, но пока просто скажу, что это самый быстрый способ сгенерировать набор результатов с X строками.

Этот генератор серий используется для создания всего " полные «производственные туры». Для второй части UNION ALL затем создается только одна строка, выбирая из встроенной таблицы DUMMY (DUAL в Oracle), которая гарантированно будет иметь только одну запись. Наконец, эту вторую часть необходимо «отключить», если на самом деле нет остатка, что делается с помощью предложения WHERE.

...