原先例程用ABAP写,用的是ABAP运行环境在ABAP层。
现在用AMDP写,是要在HANA runtime,把代码下推到数据库层处理,理论上来讲会快很多。
那么问题就来了,有没有必要把转换的routine用AMDP写?结论是大多数情况下没必要,没什么用。
因为当我们用ODP的extractor的时候,因为ODP抽取和转换都是在ABAP环境运行,这时候,肯定是直接写ABAP代码更好了,都在一层处理。没必要再去写一个在AMDP类里实现的方法,再把数据拖到数据库层处理。除非有特殊的复杂逻辑,ABAP搞不定的,才用AMDP写。
咱就只来看看AMDP在转换里是怎么写的:
首先会看到AMDP的类,还有方法里的变量:
有三个重要的:
1. inTab: 就是存income数据的内表
2. outTab:就是存output数据的内表
3. errorTab: 包含错误记录的表。
下面来看两个简单的例子:
1. 字段例程
字段例程的方法是系统自己生成的。
METHOD S0001_G01_R3 BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY.
-- target field: 0LOGSYS
-- *** Begin of routine - insert your code only below this line ***
-- Note the _M class are not considered for DTP execution.
-- AMDP Breakpoints must be set in the _A class instead.
outTab = SELECT
case
when LOGSYS = '999' then '100'
else LOGSYS
end as LOGSYS,
RECORD,
SQL__PROCEDURE__SOURCE__RECORD
FROM :inTab
;
-- Allow Error Handling for HANA Routines is enabled
ERRORTAB = SELECT '' AS ERROR_TEXT, '' AS SQL__PROCEDURE__SOURCE__RECORD FROM DUMMY WHERE DUMMY <> 'X';
-- *** End of routine - insert your code only before this line ***
ENDMETHOD.
2. 结束例程
结束例程在方法 procedure里面写。
ABAP代码:
*********** Start Transformation**********************************
SELECT MATERIAL PLANT NET_PRICE GROSS_PRICE /BIC/VALID_DATE
FROM
/BIC/APLB12
INTO CORRESPONDING FIELDS OF TABLE LT_PLB FOR ALL ENTRIES IN
RESULT_PACKAGE
WHERE MATERIAL = RESULT_PACKAGE-/BIC/ZMATERIAL
AND PLANT = RESULT_PACKAGE-PLANT.
LOOP at RESULT_PACKAGE ASSIGNING <result_fields>.
********* Start Polulate Data in Result ADSO************************
READ TABLE LT_PLB INTO WA_PLB
WITH KEY MATERIAL = <result_fields>-/BIC/ZMATERIAL
PLANT = <result_fields>-PLANT.
IF sy-subrc = 0.
<result_fields>-/BIC/TOTAL PRICE = WA_PLB-GROSS_PRICE + WA_PLB-NET_PRICE.
ENDIF.
********* End Polulate Data in Result ADSO***************************
AMDP 代码:
********* Start AMDP Script *****************************************
OUTTAB = SELECT
"/BIC/POORDER",
"/BIC/ORDER_LINE",
"/BIC/SCHEDULE_LINE",
"/BIC/CREATION_DATE",
"/BIC/ZMATERIAL",
"/BIC/0PLANT",
"/BIC/TOTAL_PRICE",
CURRENCY,
SQL_PROCEDURE_SOURCE_RECORD
FROM
(SELECT
P1."/BIC/POORDER",
P1."/BIC/ORDER_LINE",
P1."/BIC/SCHEDULE_LINE",
P1."/BIC/CREATION_DATE",
P1."/BIC/ZMATERIAL",
P1."/BIC/0PLANT",
(P2.GROSS_PRICE + P2.NET_PRICE) AS "/BIC/TOTAL_PRICE",
CURRENCY,
P1.SQL_PROCEDURE_SOURCE_RECORD
FROM : TEMP_TABLE P1 LEFT OUTER JOIN "/BIC/APLB12" P2 ON P1."/BIC/ZMATERIAL" = P2.MATERIAL
AND P1."/BIC/0PLANT" = P2.PLANT);
********** END OF AMDP SCRIPT ***************************************
AMDP的常用语法及错误:下一篇
如何Debug AMDP:下下篇