You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python通过SAP RFC_READ_TABLE提取BSIS表时多过滤条件失效问题

解决RFC_READ_TABLE过滤条件部分生效的问题

问题分析

你的代码存在两个核心问题导致过滤条件未全部生效:

  • OPTIONS参数传递错误:处理过滤条件时,你将拼接后的内容存入了options变量,但调用RFC_READ_TABLE时仍传入原始的Options列表,导致处理后的规则并未实际生效。
  • 过滤条件格式不符合SAP要求:RFC_READ_TABLE的OPTIONS参数是内表结构,单条条件文本过长可能被SAP截断,且需严格遵循ABAP的WHERE子句语法规范。

解决方案

1. 修复OPTIONS参数传递逻辑

确保处理后的过滤条件被正确传入RFC调用,同时修正原代码的缩进错误。

2. 拆分过滤条件为单独条目

将每个AND连接的条件拆分为OPTIONS表的单独行,避免长文本截断,让SAP更准确解析过滤规则。

3. 严格遵循ABAP语法规范

确保字段值格式匹配SAP字段类型(如GJAHR为4位年份、BUKRS为4位公司代码),条件中的空格、引号使用正确。

修改后的完整代码

class Main:
    def __init__(self):
        self.conn = Connection(ashost=ASHOST, sysnr=SYSNR, client=CLIENT, user=USER, passwd=PASSWD)

    def qry(self, Fields, SQLTable, Options, MaxRows, FromRow):
        # 处理字段参数
        if Fields[0] == '*':
            Fields = []  # 传入空列表表示查询所有字段
        else:
            Fields = [{'FIELDNAME': str(x)} for x in Fields]
        
        # 处理过滤条件参数
        options = []
        if Options:
            # 将每个条件拆分为单独的OPTIONS条目
            for cond in Options:
                options.append({'TEXT': cond.strip()})
        
        # 调用RFC_READ_TABLE
        tables = self.conn.call(
            "RFC_READ_TABLE", 
            QUERY_TABLE=SQLTable, 
            DELIMITER='|', 
            FIELDS=Fields, 
            OPTIONS=options,  # 使用处理后的options变量
            ROWCOUNT=MaxRows, 
            ROWSKIPS=FromRow
        )
    
        # 解析返回数据
        fields = []
        data_fields = tables["DATA"]
        data_names = tables["FIELDS"]
        headers = [x['FIELDNAME'] for x in data_names]
        
        for line in data_fields:
            fields.append(line["WA"].strip().split('|'))

        return fields, headers

s = Main()
table = 'BSIS'
fields = ['BUKRS','BELNR', 'GJAHR', 'BLDAT', 'BUDAT', 'MONAT']
lastmonth = '06'
actmonth = '07'
actualyear = '2023'
soc1 = 'BP01'
soc2 = 'BP02'
minlist = '0100000228'
maxlist = '1300018757'

# 将过滤条件拆分为多个条目,每个条件单独一行
where = [
    f"BELNR BETWEEN '{minlist}' AND '{maxlist}'",
    f"BUKRS IN ('{soc1}', '{soc2}')",
    f"MONAT IN ('{lastmonth}', '{actmonth}')",
    f"GJAHR = '{actualyear}'"
]

# 假设maxrows和fromrow已定义
results, headers = s.qry(fields, table, where, maxrows, fromrow)

关键修改说明

  • OPTIONS参数处理:将原始条件列表拆分为多个{'TEXT': 条件}的字典,避免单条文本过长被截断。
  • 参数传递修复:调用conn.call时使用处理后的options变量,而非原始的Options。
  • 代码缩进修正:完善else分支的缩进逻辑,避免语法错误。
  • 数据解析优化:简化循环逻辑,直接遍历data_fields而非通过索引。

内容的提问来源于stack exchange,提问作者Camila Lopez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:37:03