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
相关产品推荐
相关产品推荐

