我一直试图解决一个需求,但没有成功,我必须将包含3个字段的表传递给存储过程:对象名称、客户和位置(从AMDP到存储过程)。存储过程应用于返回存储相同客户、位置&min(日期)的表。
min(date)位于从对象名称派生的表中,如下所示:'"/BIC/A' || (object name passed from AMDP) || 2"'的级联。因此,假设AMDP将参数对象作为YCUSTM01传递,那么查找最小日期的表名应该是"/BIC/AYCUSTM012"。因此,我应该能够做一个execute_immediate语句(也许?)若要查找特定位置上的客户的最小日期,请将该表返回AMDP进行进一步计算。
输入表:
| Object_name | Customer | Location |
+-------------+----------+----------+
| YCUSTM01 | Walgreen | Chicago |"/BIC/AYCUSTM012"中的样本数据
| Customer | Location | Date |
+----------+----------+------------+
| Walgreen | Chicago | 24.09.2020 |
| Walgreen | Chicago | 07.02.2019 |
| Walgreen | Chicago | 12.12.2012 |
| Walgreen | Chicago | 01.04.2015 |存储过程的期望输出表:
select
customer,
location,
min(calday)
from "/BIC/AYCUSTM012"
where customer = :customer
and location = :location
group by
customer,
location;
| Customer | Location | Min_date |
+----------+----------+------------+
| Walgreen | Chicago | 12.12.2012 |任何线索都将不胜感激。
发布于 2020-11-15 06:29:19
阿斯腾是非常正确的:直接在代码中访问SAP表并不是最好的方法。相反,建议使用这些ADSO对象的外部视图。
但这不是动态SQL方法的主要问题。同样,astentx已经全面概述了为什么使用动态SQL不是一个好主意,所以我不再重复。
我推荐的解决方案方法需要更多的步骤,并导致数据选择和数据处理/查询计算的代码分离。
包括演示在内的完整方法在这里描述:Lars Breddemann博客:将业务逻辑从表中分离出来,避免动态SQL,因此这里给出了它的大致轮廓:
发布于 2020-11-10 21:38:44
动态对象名有很多缺点。
OBJECT_DEPENDENCIES视图)为您的ADSO获取使用的列表。但也有一些选择。
INFOPROV维度进行限制,而不是动态对象名称。或者不是很好,但工作方式-使用默认情况下在HANA中生成的0BW:BIA:<infoprovname>列视图访问相同的数据。UNION中,并在SELECT列表中对相应的对象进行编码。RSDRI_INFOPROV_READ函数模块从ABAP中所需的信息提供者(动态名称传递)读取数据,然后将该数据传递给AMDP。INTO在EXEC或EXECUTE IMMEDIATE中没有添加。生成动态SQL,在SQLScript中使用SQLScript语句并添加INTO,将其输出的内容获取为三个变量(用于客户、位置和日期),然后用select ... from dummy填充表格结果。execute immediate 'select customer, location, min(date)
from <dyn_tab_name>
where customer = ''' || :p_cust || '''
and location = ''' || :p_loc || '''
group by customer, location'
into lv_cust, lv_loc, lv_date;
outTab =
select :lv_cust as customer
:lv_loc as location,
:lv_date as min_date
from dummy;我没有HANA2.0DBMS来检查如何使用绑定变量与USING一起传递参数到EXEC,而不是普通的连接,而且文档中没有它的示例。希望Lars将添加一些有关该功能的信息。
在这个动态代码上还有一点:如果可以的话,传递多个客户和要检索的位置,因为HANA解析中的单行处理所花费的时间几乎与数据检索过程相同(甚至是多倍)。因此,从联合数据中选择多个客户将表现得更好:

https://stackoverflow.com/questions/64760571
复制相似问题