如何在新SAP会话中执行自动化报表,解决创建后仍在旧会话操作的问题
SAP多会话并行处理问题:新会话创建后操作仍在旧会话执行的解决方法
问题场景
我用Python下载并合并SAP报表,由于数据量限制需要通过多SAP会话实现并行处理。但录制拼接的代码中,第2行创建新会话后,后续操作仍在旧会话中执行,代码无法正常运行:
session.findById("wnd[0]").resizeWorkingPane 145, 41, false session.createSession() session.findById("wnd[0]/tbar[0]/okcd").text = f"{SAP_transaction}" session.findById("wnd[0]").sendVKey(0) session.findById("wnd[0]/usr/ctxtS_VKORG-LOW").text = "" session.findById("wnd[0]/usr/ctxtS_VKBUR-LOW").text = "" session.findById("wnd[0]/usr/ctxtS_AUDAT-LOW").text = "16.11.2020" session.findById("wnd[0]/usr/ctxtS_AUDAT-LOW").setFocus() session.findById("wnd[0]/usr/ctxtS_AUDAT-LOW").caretPosition = 10 session.findById("wnd[0]/usr/btn%_S_VBELN_%_APP_%-VALU_PUSH").press() session.findById("wnd[1]/tbar[0]/btn[24]").press() session.findById("wnd[1]/tbar[0]/btn[8]").press() session.findById("wnd[0]/tbar[1]/btn[8]").press() session.findById("wnd[0]/tbar[1]/btn[43]").press() session.findById("wnd[1]/tbar[0]/btn[0]").press()
问题原因
session.createSession()方法会返回新创建的会话对象,但你没有将这个对象赋值给变量,后续所有操作依然调用原来的session(旧会话),导致动作全部在旧会话中执行。
解决方法
1. 捕获新会话对象
将创建会话的语句修改为赋值形式,把新会话对象存到变量中,后续操作全部使用这个新变量:
# 原语句 # session.createSession() # 修改为 new_session = session.createSession()
2. 修正后的完整代码示例
将后续所有session调用替换为new_session,同时调整为Python兼容的语法(比如方法调用加括号):
# 旧会话的初始化操作(如果需要保留) session.findById("wnd[0]").resizeWorkingPane(145, 41, False) # 创建并获取新会话 new_session = session.createSession() # 所有后续操作使用新会话对象 new_session.findById("wnd[0]/tbar[0]/okcd").text = f"{SAP_transaction}" new_session.findById("wnd[0]").sendVKey(0) new_session.findById("wnd[0]/usr/ctxtS_VKORG-LOW").text = "" new_session.findById("wnd[0]/usr/ctxtS_VKBUR-LOW").text = "" new_session.findById("wnd[0]/usr/ctxtS_AUDAT-LOW").text = "16.11.2020" new_session.findById("wnd[0]/usr/ctxtS_AUDAT-LOW").setFocus() new_session.findById("wnd[0]/usr/ctxtS_AUDAT-LOW").caretPosition = 10 new_session.findById("wnd[0]/usr/btn%_S_VBELN_%_APP_%-VALU_PUSH").press() new_session.findById("wnd[1]/tbar[0]/btn[24]").press() new_session.findById("wnd[1]/tbar[0]/btn[8]").press() new_session.findById("wnd[0]/tbar[1]/btn[8]").press() new_session.findById("wnd[0]/tbar[1]/btn[43]").press() new_session.findById("wnd[1]/tbar[0]/btn[0]").press()
3. 多会话并行的额外注意事项
- 使用Python的
threading模块管理多个会话(推荐,因为SAP会话是IO密集型任务),避免串行执行浪费时间 - 给每个会话分配独立的数据分片(比如不同的日期区间、销售组织代码),避免数据重复或冲突
- 提前确认SAP服务器允许的最大并发会话数,不要创建过多会话导致被系统限制
内容的提问来源于stack exchange,提问作者Maks W
相关产品推荐
相关产品推荐

