Select 使用 SSIS 来自 MARA 的最近 30 天行

Select last 30 days rows from MARA using SSIS

我正在尝试 select 行的最后日期更改 = 30 天。

我在 where 子句中尝试了 LAEDA = ( sy-datum -30 ),但它总是生成 error.I 连接到 sap Abap database

消息错误:

[EIS-Material 1] Error: ERPConnect.ERPException: Error while receiving function return values: SYSTEM_FAILURE An error has occurred while parsing a dynamic entry. at ERPConnect.RFCAPI.ReceiveFunctionResults(UInt32 connectionHandle, RFC_PARAMETER[] importing, RFC_PARAMETER[] changing, RFC_TABLE[] tables, Encoding apiEncoding) at ERPConnect.RFCFunction.ReceiveFunctionArguments(RFC_TABLE[]& apiTables) at ERPConnect.RFCFunction.CallClassicAPI() at ERPConnect.RFCFunction.ExecuteRFC(Byte[] tid) at XtractKernel.Extractors.TableExtractor.GetPackage(RFCFunction& func)
at XtractKernel.Extractors.TableExtractor.Extract() at XtractKernel.Extractors.ExtractorBase`1.Extract(ProcessResultCallback processResult) at XtractIS.XtractSourceTable.PrimeOutput(Int32 outputs, Int32[] outputIDs, PipelineBuffer[] buffers) at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPrimeOutput(IDTSManagedComponentWrapper100 wrapper, Int32 outputs, Int32[] outputIDs, IDTSBuffer100[] buffers, IntPtr ppBufferWirePacket)

在 mySQL / MariaDB 中,这个有效:

select ...
from ...
where date >= DATE_ADD(CURDATE(), INTERVAL -30 DAY)

但我们需要知道您使用的是什么数据库。

你可以试试,如果你使用SQL数据库:

Select DATEADD(Month, -1, getdate()) 

所以您正在使用第三方工具从 SAP 系统中提取数据。根据错误消息,该工具进行远程函数调用 (RFC) 并将 SQL 交给 ABAP 后端。那么你的 where 条件必须是有效的 ABAP/Open SQL 语法,不管后面的数据库是什么。

您的调用(简化)在 ABAP 中看起来像这样(使用新的@-syntax):

DATA(lf_dat) = sy-datum - 30.

SELECT matnr
FROM mara
WHERE laeda >= @lf_dat
INTO TABLE @DATA(lt_matnr)
.

问题是,据我所知,您不能在语句中进行此计算,因此您必须使用变量。但是由于您的第三方工具只允许您编写一个 where 条件,我看不出有什么办法可以处理这个问题,除非条件中有一个静态日期:

laeda >= '20190106' "YYYYMMDD

您可以将 ABAP 标签添加到您的问题中,以吸引更多关于此 ABAP 特定主题的专家。

我在Xtract IS在线帮助中看到ABAP端安装了一个名为Z_THEO_READ_TABLE的自定义函数模块,它执行Xtract IS发送的SQL。该模块提供 2 种版本,一种用于 ABAP >= 740 SP 5,所以我猜它是用于 ABAP SQL 严格模式的版本。

所以,我想也许你可以使用 "host expression" 来编写这个类似 ABAP 的 Where 子句,它在 ABAP SQL 严格模式下有效:

 LAEDA = @( sy-datum - 30 )

根据您的错误消息,"An error has occurred while parsing a dynamic entry",我猜想这个功能模块做了类似 SELECT (dyn-columns) FROM (dyn-table) WHERE (dyn-condition) 的事情,即所有元素都是在 运行 时间动态定义的。

不幸的是,“ABAP documentation sql_cond - (cond_syntax) 说“主机表达式不允许出现在动态逻辑表达式中。”

这么长,不可能像你想的那样做一个where子句。

可能有很多方法可以绕过这个限制(比如在 SAP 中创建 SAPquery 或 BAPI 并从 Xtract IS 调用它,等等)但这是另一个问题。

您不能通过 SAP Open 那样指定 ABAP 公式 SQL。

不是直接解决你的挑战(因为你有产品限制),这里是通过 AecorSoft 工具实现动态过滤器的方法:

(DT_WSTR, 4)(DATEPART("yy" , GETDATE())) + RIGHT("0" + (DT_WSTR, 4)DATEPART("mm" , GETDATE()),2) + RIGHT("0" + (DT_WSTR, 4)DATEPART("dd" , GETDATE()),2)

完整的用例,可以查看博客SAP Table Delta Extract Made Easy through Dynamic Filters