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
我正在尝试 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