调用 RFC_READ_TABLE 时如何检查 NOT NULL?

Posted

技术标签:

【中文标题】调用 RFC_READ_TABLE 时如何检查 NOT NULL?【英文标题】:How to check NOT NULL when calling RFC_READ_TABLE? 【发布时间】:2021-09-01 23:20:34 【问题描述】:

我正在尝试使用 python connect SAP 系统获取数据。在这里,我有关于如何过滤一个特定字段 IS NOT EMPTY 的问题?

例如下面,如何过滤字段 QNAME 不为空。在 SAP 中,我们可以轻松设置。 非常感谢!

table = 'LTAP'
options = [ 'TEXT': "LGNUM = '586'" and "VLTYP = 'GPA'" and "NLTYP = 'PD2'"]
fields = ['TANUM','VLTYP','VLPLA','NLTYP','NLPLA','QDATU','QNAME']
pp = PrettyPrinter(indent=4)
rowskips = 0

print("----Begin of Batch---")
result = conn.call("RFC_READ_TABLE",
QUERY_TABLE = table, 
DELIMITER='|',
FIELDS = fields,\
OPTIONS = options,
ROWSKIPS = rowskips, 
ROWCOUNT = 50 )
pp.pprint(result['DATA'])

【问题讨论】:

【参考方案1】:

在 ABAP SQL(A.K.A. Open SQL)中,“不等于”对应于运算符 <>。使用 pyrfc,它将是:

options = [ 'TEXT': "QNAME <> '' and LGNUM = '586' and VLTYP = 'GPA' and NLTYP = 'PD2'",
 'TEXT': " and QDATU = '20160422'" ]

注意这里有两行,因为TEXTRFC_READ_TABLE 中只有 72 个字符。如果您有超过 72 个字符,则将条件分成几行,如 here 解释的那样,即 RFC_READ_TABLE 将用空格填充每一行以获得正好 72 个字符,并将整理所有行而不进行任何转换以形成 WHERE子句。

【讨论】:

谢谢!你知道如何获取和过滤当前日期字段 QDATU 吗? (获取昨天的日期。)提前谢谢你!!! 在连接到基于 ABAP 的系统的数据库中,日期字段对应于 YYYYMMDD CHAR 格式,并且始终根据公历表示。所以,昨天,2021年6月17日,对应文字20210617 你的意思是这样的?: options = [ 'TEXT': "QNAME '' and LGNUM = '586' and VLTYP = 'GPA' and NLTYP = 'PD2' and QDATU = ' 20160422'"] 谢谢!我尝试添加选项 QDATU = '20160422',然后我收到错误消息。你的意思是在每个条件之后,应该有一个新的行来分割它们?像这样? options = [ 'TEXT': "QNAME '' and /*new line*/ LGNUM = '586' and /*new line*/ VLTYP = 'GPA' and.... 我已经完成了我的回答,我希望它会澄清。

以上是关于调用 RFC_READ_TABLE 时如何检查 NOT NULL?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试 N 秒后是不是没有调用方法?

当有更改时,如何在调用子构建时检查依赖关系?

如何在编译时检查是不是存在可以使用特定参数集调用的函数?

调用触摸手势事件时如何检查其父视图或子视图?

如何在启动/调用批处理文件时检查是不是定义了参数?

如何检查检查PInvoke签名的调用约定和参数与非托管的目标签名是不是匹配?