파이썬으로 SAP Script 실행하기 (with argument)

개요

파이썬으로 SAP Script 실행하기 (날짜, 파일명 등 입력과 함께)

 

SAP GUI에는 엑셀의 매크로와 거의 동일한 Script Recording 기능이 있습니다. 

 -> 레코딩 버튼을 누르고 작업을 하면 일련의 액션들이 VBS 파일에 저장이 되고, 저장된 VBS 파일을 실행하면 이전에 했던 작업들이 다시 반복됩니다. 

 

VBS 파일 실행하면 자동으로 작업이 진행됨

 다만 이렇게 파일을 직접 실행하게 되면, 해당 작업에 날짜, 경로등을 입력해야 하는 경우 파일을 직접 수정해야 하는 번거로움이 있습니다. 예를 들어서, 특정 창고의 현재 재고를 파악하는 트랜잭션을 실행하는 경우에는 날짜를 입력할 필요가 없어 필요할 때 해당 VBS 파일을 실행하면 되지만, 특정 날짜 기준으로 매출을 파악하는 트랜잭션을 실행해야 하는 경우에는 매번 확인하고자 하는 날짜가 다르므로 필요에 따라 날짜를 바꾸어야 합니다.

 

위에서 실행한 VBS 파일의 코드 일부분

 

 엑셀엔 VBA가 있으므로 처음에는 엑셀로 사용하였으나, 어차피 SAP Script를 실행하여 데이터를 다운받은 이후에는 파이썬으로 이것저것 작업을 해야 하므로 굳이 번거롭게 VBA를 사용할 필요가 없어 파이썬으로 실행하기로 했습니다. 파이썬이 훨씬 편하고 좋습니다.

 

 따라서 여기서는 SAP Script를 파이썬으로 실행하되, 필요한 전달인자를 넘겨주어 자동으로 오늘 날짜로 다운받기 등을 해보겠습니다.

 

방법

1) SAP에서 하고자 하는 작업을 레코딩 

 

Script Recording은 여기서.. 

녹화 창이 뜨면, 저장할 파일 경로 입력해주고 녹화하고, 작업하고, 저장하시면 됩니다.

 

 

 

2) 저장된 VBS 파일을 열어봅니다.  

 제 코드는 7월 1일부터 7월 4일까지 매출 실적을 조회하고 다운로드 하는 코드입니다. 

 

파일명 : run.vbs

If Not IsObject(application) Then
   Set SapGuiAuto  = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session    = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session,     "on"
   WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "ZKR_SD010"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtS_VKBUR-LOW").text = "KR46"
session.findById("wnd[0]/usr/ctxtS_FKDAT-LOW").text = "01.07.2020" 
session.findById("wnd[0]/usr/ctxtS_FKDAT-HIGH").text = "04.07.2020" 
session.findById("wnd[0]/usr/txtP_DWNLD").text = "Y"
session.findById("wnd[0]/usr/txtP_FILE").text = "C:\workspace\SAP\test.csv" 
session.findById("wnd[0]/usr/txtP_FILE").setFocus
session.findById("wnd[0]/usr/txtP_FILE").caretPosition = 35
session.findById("wnd[0]").sendVKey 8
session.findById("wnd[0]/tbar[0]/btn[15]").press
session.findById("wnd[0]/tbar[0]/btn[15]").press

If 부분은 SAP가 정상적으로 실행이 되어 있는지, 확인하고 있는 부분이고 session.findByID가 실제 작업을 수행하는 부분입니다. 날짜가 있는 부분이 실적 조회하는 기간이고, 밑에 파일 경로가 데이터를 다운 받아서 저장할 곳입니다.

 

 

3) 파이썬에서 실행해보기

 

파일명: main.py

import os

os.system("run.vbs")

운영체제를 다루는 os 모듈을 임포트하고, 같은 경로에 있을 경우 파일명만 입력하여 실행하면 됩니다. 스크립트 녹화 전과 같은 환경에서 실행한다면, 문제 없이 저장된 작업이 진행될 것입니다.

 

 

4) VBS 파일의 날짜 및 실적 다운 경로 변경

 

 여기서 해야할 것은 VBS의 날짜 및 파일 경로 부분에 변수를 집어 넣는 것입니다. 

따라서, 해당 부분에 넣을 변수를 선언하되, 그 변수는 VBS 파일 실행시 전달될 수 있도록 해야합니다.

 

VBS 파일(run.vbs)의 맨 윗부분에 아래와 같은 코드를 추가합니다.

Arg라는 변수를 선언하고, 변수 Arg는 스크립트를 실행할 때 받는 전달인자가 되도록 합니다.

Dim Arg
Set Arg = WScript.Arguments

 

그리고 날짜 및 파일 경로 부분에 변수 Arg가 들어가도록 아래와 같이 바꿉니다.

session.findById("wnd[0]/usr/ctxtS_FKDAT-LOW").text = Arg(0)
session.findById("wnd[0]/usr/ctxtS_FKDAT-HIGH").text = Arg(1)
session.findById("wnd[0]/usr/txtP_DWNLD").text = "Y"
session.findById("wnd[0]/usr/txtP_FILE").text = "C:\workspace\SAP\"&Arg(1)&".csv"

Arg(0)는 첫 번째 전달인자, Arg(1)는 두 번째 전달인자 입니다. 

 

설명

 

파일 변경 전 : 정해진 날짜 경로가 스크립트에 포함되어 있어, 그냥 파일을 실행하면 정해진 날짜의 실적을 다운

  - 날짜 1 : "01.07.2020"  / 날짜 2 : "04.07.2020"

  - 파일 저장 경로 : "C:\workspace\SAP\test.csv"

 

파일 변경 후 :  변경 후에는 날짜칸에 Arg(0), Arg(1)가 들어가고, 저장할 파일 이름에도 Arg(1)이 들어감.

  - 날짜 1: Arg(0) /  날짜 2: Arg(1)

  - 파일 저장 경로 : "C:\workspace\SAP\&Arg(1)"&".csv"

 

 

따라서 변경 후에는 아래와 같이 전달인자를 포함하여 실행해주어야 합니다.

-> 01.07.2020 부터 01.07.2020까지 실적을 조회하고, 같은 폴더에 "04.07.2020.csv"파일이 생성되며 실적이 다운로드됩니다.

 

 

5) 파이썬으로 전달인자 넣으며 실행해보기

위에서 만든 main.py를 수정합니다.

import os
os.system('run.vbs "01.07.2020" "01.07.2020"')

main.py를 실행하면 위에서 명령 프롬프트에서 실행한 것과 똑같은 결과를 볼 수 있습니다.

 

 

저는 파이썬의 datetime 모듈을 이용하여, 시작 날짜를 이번 달 1일, 끝나는 날짜를 오늘 날짜로 지정하였습니다.

import os
from datetime import datetime

# 시작날짜 : 오늘 날짜에서 1일로 변경 -> 이 달의 1일
start = datetime.today().replace(day=1).strftime("%d.%m.%y")
# 끝나는 날짜 : 오늘 날짜
end = datetime.today().strftime("%d.%m.%y")

os.system("run.vbs {} {}".format(start, end))

 

 => 이제 이 main.py 를 실행하면, 자동으로 시작 날짜에 이번 달 1일, 끝나는 날짜를 오늘 날짜로 지정하여 SAP Script가 작동됩니다.

 

6) 전체 코드

 

run.vbs

Dim Arg
Set Arg = WScript.Arguments

If Not IsObject(application) Then
   Set SapGuiAuto  = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session    = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session,     "on"
   WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "ZKR_SD010"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtS_VKBUR-LOW").text = "KR46"
session.findById("wnd[0]/usr/ctxtS_FKDAT-LOW").text = Arg(0)
session.findById("wnd[0]/usr/ctxtS_FKDAT-HIGH").text = Arg(1)
session.findById("wnd[0]/usr/txtP_DWNLD").text = "Y"
session.findById("wnd[0]/usr/txtP_FILE").text = "C:\workspace\SAP\data\"&Arg(1)&".csv"
session.findById("wnd[0]/usr/txtP_FILE").setFocus
session.findById("wnd[0]/usr/txtP_FILE").caretPosition = 35
session.findById("wnd[0]").sendVKey 8
session.findById("wnd[0]/tbar[0]/btn[15]").press
session.findById("wnd[0]/tbar[0]/btn[15]").press

 

main.py

import os
from datetime import datetime

start = datetime.today().replace(day=1).strftime("%d.%m.%y")
end = datetime.today().strftime("%d.%m.%y")

os.system("run.vbs {} {}".format(start, end))

 

마무리

 SAP로 데이터 조회/다운 후에 필요한 데이터 작업은 알아서 하시면 됩니다. 저 같은 경우에는 로컬에 있는 엑셀 파일에서 Forecast 데이터를 불러오고, SAP에서는 현재 실적 및 재고 상황을 가져와서 비교하여 간단하게 보여주는 것을 자동화하여 사용하고 있습니다. 

 

 

느낀 점

 코딩하는 분들 중에서 SAP 사용하는 사람들이 별로 없다. 마찬가지로 SAP 사용하는 사람들 중에서도 코딩하는 분들이 별로 없는 듯. 나 혼자 꿀빠는 것 같아 좋기도 한데 아쉽기도 하다. 앞으로 파이썬의 더욱 널리 알려야겠다.

댓글

Designed by JB FACTORY