据了解最近市场上很多电子元器件短缺,生产物料面对不确定性因素。很多项目组都在整理物料清单以及物料供应商信息。
手头有一张包含33
个SKU名称的表格,具体需求如下:
(1)汇总出这33个SKU使用的全部物料,其中不同SKU存在物料共用的情况;
(2)汇整每个SKU使用的单颗物料数量;
(3)根据物料ID,从库中查询每颗电子料的供应商信息,包括MAN
和MAN_NUM
。
所有物料纵向排列,列名称为Object ID
,供应商信息和每个SKU使用的物料数量横向排列,作为表格的列。
BOM里包含整机物料信息,需要从SAP 上下载,鉴于有33个机种,如果手动下载并对33个BOM文件进行整理,有大量枯燥无味的重复性工作。因此决定使用Python脚本完成上述需求。
使用SAP自动化,需要借用Scripting Tracker
工具,相关介绍可参考。
我们需要先在SAP的Options
里进行简单设置,如下图:
再打开Scripting Tracker应用,点击页面上的刷新
按钮,即可把Scripting Tracker工具和SAP进行连接。
整个SAP有多个Workspace,登录SAP之前,需要先选择有登录权限的Server 。
此处我选择的server名称是
BRP - ERP Production
:
connection = application.OpenConnection("BRP - ERP Production", True)
如何选择服务器,这让我头疼了很久,想不出方法,因为未登录前,Scripting Tracker无法识别控件也不能进行脚本的录制。
整个自动登录,根据SKU清单自动下载保存BOM文件的代码如下:
import subprocess
import sys
import time
import win32com.client
def login(self):
try:
subprocess.Popen(self.pathname)
time.sleep(2)
SapGuiAuto = win32com.client.GetObject("SAPGUI")
if not isinstance(SapGuiAuto, win32com.client.CDispatch):
return
application = SapGuiAuto.GetScriptingEngine
if not isinstance(application, win32com.client.CDispatch):
SapGuiAuto = None
return
connection = application.OpenConnection("BRP - ERP Production", True) # BRP - ERP Production 服务器名称
if not isinstance(connection, win32com.client.CDispatch):
application = None
SapGuiAuto = None
return
session = connection.Children(0)
if not isinstance(session, win32com.client.CDispatch):
connection = None
application = None
SapGuiAuto = None
return
### login
session.findById("wnd[0]/usr/txtRSYST-BNAME").text = self.user
session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = self.pwd
session.findById("wnd[0]").sendVKey(0)
session.findById("wnd[0]").sendVKey(0) # Additional enter key to get past compliance msg
# check out the materical
# self.checkout_material_description(session)
self.download_product_BOM(session)
except:
print(sys.exc_info())
在SAP上的下载操作:
def download_product_BOM(self, session):
session.findById("wnd[0]/tbar[0]/btn[3]").press()
session.findById("wnd[0]/tbar[0]/okcd").text = "CS12"
session.findById("wnd[0]/tbar[0]/btn[0]").press()
for sku in self.SKUs:
session.findById("wnd[0]/usr/ctxtRC29L-MATNR").text = sku #输入SKU
session.findById("wnd[0]/usr/ctxtRC29L-WERKS").text = self.plant #输入5811
session.findById("wnd[0]/usr/ctxtRC29L-CAPID").text = "PP01" # 输入PP01
session.findById("wnd[0]/tbar[1]/btn[8]").press() #点击执行按钮
session.findById("wnd[0]/tbar[1]/btn[45]").press() #点击load file
session.findById(
"wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[3,0]").select()
session.findById(
"wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[3,0]").setFocus()
session.findById("wnd[1]/tbar[0]/btn[0]").press()
session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = sku + '.html' #保存文件名称
session.findById("wnd[1]/tbar[0]/btn[0]").press()
session.findById("wnd[0]/tbar[0]/btn[3]").press() #回退
主要实现方法就是使用Pandas
读取包含SKU名称的Excel, 将所有SKU 名称保存成一个list
, 登录SAP 成功后,遍历所有SKU去下载BOM并将每个文件保存为html
格式 (也有其他文件格式可选)。其中各个SAP控件的识别、操作需要借助Scripting Tracker工具里的录制功能。
本文仅仅是下载BOM进行了自动化处理,其他包含查物料库存数量、物料描述等都可以采用自动化方式,当然前提是有大量的数据。