使用 HANA/CrystalReports 中参数的计算查询
Calculated query with parameters in HANA/CrystalReports
我无法解释我的必要性,所以我将描述场景。
场景:
- A产品一次最大产量为125KG。
- 操作员收到了 1027,5KG 的产品 A 的生产订单。
- 操作员必须计算他需要多少轮
制造和调整每一轮的组件数量。
我们想创建一个报告,其中已经完成了这些计算,我们认为第一步是根据这个场景的值,return 像这样:
圆形数量(KG)
1 125
2 125
3 125
4 125
5 125
6 125
7 125
8 125
9 27,5
之后,通过简单的操作就可以重新计算组件了。
问题是我们想不出一种方法来获得所需的 return,我们也想不出一种不同的方法来实现上述报告。
我们所能做的就是得到除法的整数部分
SELECT FLOOR(1027.5/125) AS "TEST" FROM DUMMY
和余数
SELECT MOD(1027.5,125) AS "TEST" FROM DUMMY
我们正在使用:
- SAP HANA SQL
- Crystal 报告
- SAP B1
如有任何帮助,我们将不胜感激
提前致谢!
有几种方法可以实现你所描述的。
一种方法是将需求转化为一个函数,该函数接受两个输入参数值和 returns 生产轮次的 table。
这看起来像这样:
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;
您可以像使用任何函数一样使用此函数 table - 但参数为:
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
。这是一个特定于 HANA 的内置函数,它 returns 来自 "series" 的一些记录。这里的系列是在最小和最大限制内的一系列周期,并且在两个相邻周期之间具有一定的步长。
有关其工作原理的更多信息,请参阅 HANA 参考文档,但现在只是说,这是生成具有 X 行的结果集的最快方法。
此系列生成器用于创建所有 "full" 生产回合。
对于 UNION ALL
的第二部分,然后通过从内置的 table DUMMY
(Oracle 中的 DUAL
)中进行选择来创建一行,保证只有一个单条记录。
最后,如果实际上没有余数,则第二部分需要是 "disabled",这是由 WHERE
子句完成的。
我无法解释我的必要性,所以我将描述场景。
场景:
- A产品一次最大产量为125KG。
- 操作员收到了 1027,5KG 的产品 A 的生产订单。
- 操作员必须计算他需要多少轮 制造和调整每一轮的组件数量。
我们想创建一个报告,其中已经完成了这些计算,我们认为第一步是根据这个场景的值,return 像这样:
圆形数量(KG)
1 125
2 125
3 125
4 125
5 125
6 125
7 125
8 125
9 27,5
之后,通过简单的操作就可以重新计算组件了。
问题是我们想不出一种方法来获得所需的 return,我们也想不出一种不同的方法来实现上述报告。
我们所能做的就是得到除法的整数部分
SELECT FLOOR(1027.5/125) AS "TEST" FROM DUMMY
和余数
SELECT MOD(1027.5,125) AS "TEST" FROM DUMMY
我们正在使用:
- SAP HANA SQL
- Crystal 报告
- SAP B1
如有任何帮助,我们将不胜感激
提前致谢!
有几种方法可以实现你所描述的。
一种方法是将需求转化为一个函数,该函数接受两个输入参数值和 returns 生产轮次的 table。
这看起来像这样:
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;
您可以像使用任何函数一样使用此函数 table - 但参数为:
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
。这是一个特定于 HANA 的内置函数,它 returns 来自 "series" 的一些记录。这里的系列是在最小和最大限制内的一系列周期,并且在两个相邻周期之间具有一定的步长。
有关其工作原理的更多信息,请参阅 HANA 参考文档,但现在只是说,这是生成具有 X 行的结果集的最快方法。
此系列生成器用于创建所有 "full" 生产回合。
对于 UNION ALL
的第二部分,然后通过从内置的 table DUMMY
(Oracle 中的 DUAL
)中进行选择来创建一行,保证只有一个单条记录。
最后,如果实际上没有余数,则第二部分需要是 "disabled",这是由 WHERE
子句完成的。