我正在尝试select最后一次日期更改= 30天的行。
我在where子句中尝试了LAEDA = ( sy-datum -30 ),但总是产生错误。我连接到sap Abap database。

消息error:
[EIS-Material 1]错误: ERPConnect.ERPException:接收函数返回值时出错: SYSTEM_FAILURE解析动态条目时出错。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输出,Int32[] outputID,PipelineBuffer[]缓冲区) at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPrimeOutput(IDTSManagedComponentWrapper100 wrapper,Int32输出,Int32[] outputID,IDTSBuffer100[] buffers,IntPtr ppBufferWirePacket)
发布于 2019-02-07 19:13:27
因此,您正在使用第三方工具从SAP系统中提取数据。根据错误消息,toole进行远程函数调用(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特定主题的专家。
发布于 2019-02-08 03:57:38
我在Xtract IS联机帮助中看到,ABAP端安装了一个名为Z_THEO_READ_TABLE的自定义函数模块,它执行Xtract IS发送的SQL语句。该模块提供了两种风格,一种是用于ABAPSQL740SP5的,所以我猜它是用于>=的版本。
因此,我想也许您可以通过使用“主机表达式”来编写类似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调用它,等等)。但这是另一个问题。
发布于 2019-02-07 17:32:24
在mySQL / MariaDB中,这是可行的:
select ...
from ...
where date >= DATE_ADD(CURDATE(), INTERVAL -30 DAY)但我们需要知道您使用的是哪个数据库。
https://stackoverflow.com/questions/54570034
复制相似问题