选择30天后退

时间:2019-02-07 09:24:47

标签: sql ssis sap abap

我正在尝试select行以进行最后一次日期更改= 30天。

我在LAEDA = ( sy-datum -30 )子句中尝试了where,但是它始终会产生错误。我连接到sap Abap database

enter image description here

消息错误:

  

[EIS材质1]错误:ERPConnect.ERPException:错误   接收函数返回值:SYSTEM_FAILURE发生错误   同时解析动态条目。在   ERPConnect.RFCAPI.ReceiveFunctionResults(UInt32 connectionHandle,   导入RFC_PARAMETER [],更改RFC_PARAMETER [],RFC_TABLE []   表格,编码apiEncoding)在   ERPConnect.RFCFunction.ReceiveFunctionArguments(RFC_TABLE []&   apiTables)位于ERPConnect.RFCFunction.CallClassicAPI()处   ERPConnect.RFCFunction.ExecuteRFC(Byte [] tid)在   XtractKernel.Extractors.TableExtractor.GetPackage(RFCFunction&func)
  在XtractKernel.Extractors.TableExtractor.Extract()在   XtractKernel.Extractors.ExtractorBase`1.Extract(ProcessResultCallback   XtractIS.XtractSourceTable.PrimeOutput(Int32上的processResult)   输出,Int32 [] outputID,PipelineBuffer []缓冲区)位于   Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPrimeOutput(IDTSManagedComponentWrapper100   包装器,Int32输出,Int32 []输出ID,IDTSBuffer100 []缓冲区,   IntPtr ppBufferWirePacket)

5 个答案:

答案 0 :(得分:3)

因此,您正在使用第三方工具从SAP系统提取数据。根据该错误消息,该环将进行远程功能调用(RFC),并将SQL移交给ABAP后端。然后,无论后面的数据库是什么,您的where条件都必须是有效的ABAP / Open SQL语法。

您的呼叫(简化)在ABAP中看起来像这样(带有新的@语法):

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特定主题的专家。

答案 1 :(得分:1)

我在Xtract IS联机帮助中看到,ABAP端安装了一个名为Z_THEO_READ_TABLE的自定义功能模块,该模块执行Xtract IS发送的SQL。该模块有2种版本,一种是ABAP> = 740 SP 5,所以我想它是ABAP SQL严格模式的版本。

所以,我想也许您可以使用“主机表达式”编写类似于ABAP的Where子句,该表达式在ABAP SQL严格模式下有效:

 LAEDA = @( sy-datum - 30 )

根据您收到的错误消息“解析动态条目时发生错误”,我猜想此功能模块的作用类似于SELECT (dyn-columns) FROM (dyn-table) WHERE (dyn-condition),即所有元素在运行时都是动态定义的。

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

很长时间以来,无法根据需要创建where子句。

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

答案 2 :(得分:0)

在mySQL / MariaDB中,这有效:

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

但是我们需要知道您正在使用哪个数据库。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

不是直接解决您的难题(因为您有产品限制),这是通过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