本篇承接上一篇 https://blog.csdn.net/stone0823/article/details/126735845,对代码稍进行修正:
- 能同时导入多张凭证
- Python 接收 SAP 创建凭证之后的状态栏消息
Excel 模板文件格式如下:
框架代码同上篇,导入凭证的完整代码如下:
from SapSession import getSession, returnEasyAccess #代码参见上一篇博文
import pandas as pd
def read_from_excel_file():
df = pd.read_excel("importfile.xlsx")
return df.to_dict("records")
def create_fi_docs():
# 读取数据
data = read_from_excel_file()
fi_doc_number = ""
fi_doc = []
for item in data:
if fi_doc_number == "" or fi_doc_number == item.get("凭证号码"):
fi_doc.append(item)
fi_doc_number = item.get("凭证号码")
else:
do_create_fi_doc(fi_doc)
fi_doc.clear()
# 添加本行
fi_doc.append(item)
fi_doc_number = item.get("凭证号码")
do_create_fi_doc(fi_doc)
def do_create_fi_doc(fi_doc):
session = getSession()
returnEasyAccess(session)
# F-02 事务码
session.findById("wnd[0]").maximize()
session.findById("wnd[0]/tbar[0]/okcd").text = "F-02"
session.findById("wnd[0]").sendVKey(0)
# 会计凭证抬头
session.findById("wnd[0]/usr/ctxtBKPF-BLDAT").text = fi_doc[0].get("凭证日期")
session.findById("wnd[0]/usr/ctxtBKPF-BUKRS").text = fi_doc[0].get("公司代码")
session.findById("wnd[0]/usr/ctxtBKPF-BUDAT").text = fi_doc[0].get("过账日期")
session.findById("wnd[0]/usr/txtBKPF-MONAT").text = fi_doc[0].get("期间")
session.findById("wnd[0]/usr/ctxtBKPF-WAERS").text = fi_doc[0].get("币别")
# 循环录入每一行
for row in fi_doc:
session.findById("wnd[0]/usr/ctxtRF05A-NEWBS").text = row.get("过账码")
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").text = row.get("科目")
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").setFocus()
session.findById("wnd[0]/usr/ctxtRF05A-NEWKO").caretPosition = 8
session.findById("wnd[0]").sendVKey(0) # 回车
session.findById("wnd[0]/usr/txtBSEG-WRBTR").text = row.get("金额")
if str(row.get("科目")) == "10020100": # 银行科目需要起息日
session.findById("wnd[0]/usr/ctxtBSEG-VALUT").text = row.get("过账日期")
# 模拟后过账
session.findById("wnd[0]/mbar/menu[0]/menu[3]").select()
session.findById("wnd[0]/tbar[0]/btn[11]").press()
# SAP返回消息(SAP状态栏)
print( session.FindById("wnd[0]/sbar").Text )
if __name__ == '__main__':
create_fi_docs()