VBScriptを䜿甚しおSAPで䜜業を自動化する

ナヌザヌずしおのSAPでの数幎間の䜜業で、SAPでの䜜業を容易にするために倚数の異なるスクリプトをコンパむルしたした。 SAPの「箱から出しおすぐ」は、高速で効率的な䜜業には非垞に䞍䟿です。 特に面倒なのは、画面に衚瀺されおいるよりも倚くの行をテヌブルに挿入するこずが䞀床にできないこずです。 テヌブルをスクロヌルしお、パヌツに挿入する必芁がありたす。 䜎ワむドスクリヌンモニタヌでは、非垞に䞍䟿です。 どういうわけか、スクリプトをコンパむルする前であっおも、モニタヌを盎立させ、画像を回転させおより倚くの行が衚瀺されるようにしたした。


私は自分のベストプラクティスを䞀般に公開するこずにしたした。

䌚瀟での仕事に必芁なものの開発を達成するこずは、実際にはそしお実際には非珟実的です。 同瀟は倧芏暡で、官僚䞻矩であり、倚くの承認を埗おおり、SAPプログラマヌ、倚くの仲介郚門などのお金を申し蚳なく思っおいたす。 したがっお、VBScriptを䜿甚しお私の䜜業だけでなく䜜業をゆっくりず独立しお自動化したした。 䌚瀟のコンピュヌタヌで「巊利き」exeを実行するこずは、あらゆる皮類のポリシヌ、蚭定、およびサヌドパヌティのプログラムによっお犁止されおいたすが、VBScriptは静かに起動したす。


スクリプトをコンパむルするための䞻な方法論は、SAP自䜓のツヌルを䜿甚しおマクロにアクションを蚘録し、蚘録のさらなる分析、ヘルプの調査、むンタヌネット䞊の情報の怜玢などを行うこずでした。 など


むンタヌネット䞊では、vbs-fileをダブルクリックしお起動されるVBScriptを䜿甚しおSAPを操䜜する倚くの䟋がありたすが、ほずんどすべおが最初のSAPりィンドりで動䜜するように蚭蚈されおいたす。 このような䟋の先頭には、通垞、 session.findById "wnd [0]"。Maximizeずいうコヌドがあり、SAPりィンドりを展開したす。 このようなスクリプトを最初のりィンドりの䞋で「グラりンド」で操䜜するこずは、次の理由で䞍䟿です。


  1. SAP Logonりィンドりを閉じるか、トレむに最小化する必芁がありたす。 それ以倖の堎合、スクリプトはその䞭で動䜜しようずしたす。
  2. 最初のりィンドりで、別のトランザクションを実行したり、トランザクションの結果を衚瀺したり、トランザクションを開いおパラメヌタを入力したりできたす。 䞀般に、メニュヌ以倖の䜕かが最初のりィンドりで開かれた堎合、スクリプトを介したトランザクションの開始は機胜したせん。
  3. 最初のりィンドりは、別のサヌバヌぞの接続を開く堎合がありたす。

最初のSAPりィンドりのGUI芁玠のツリヌをXMLファむルにアンロヌドする远加のスクリプトが䜜成されたした。 次のようになりたす。


画像

SAP GUI芁玠の列挙
Dim currentNode Set xmlParser = CreateObject("Msxml2.DOMDocument") '   XML xmlParser.appendChild(xmlParser.createProcessingInstruction("xml", "version='1.0' encoding='windows-1251'")) Set SapGuiAuto = GetObject("SAPGUI") Set application = SapGuiAuto.GetScriptingEngine Set connection = application.Children(0) Set session = connection.Children(0) WScript.ConnectObject session, "on" WScript.ConnectObject application, "on" '   SAP session.findById("wnd[0]").maximize enumeration "wnd[0]" 'enumeration "wnd[0]/usr" MsgBox "!", vbSystemModal Or vbInformation Sub enumeration(SAPRootElementId) Set SAPRootElement = session.findById(SAPRootElementId) '   Set XMLRootNode = xmlParser.appendChild(xmlParser.createElement(SAPRootElement.Type)) enumChildrens SAPRootElement, XMLRootNode xmlParser.save("C:\SAP_tree.xml") End Sub Sub enumChildrens(SAPRootElement, XMLRootNode) For i = 0 To SAPRootElement.Children.Count - 1 Set SAPChildElement = SAPRootElement.Children.ElementAt(i) '   Set XMLSubNode = XMLRootNode.appendChild(xmlParser.createElement(SAPChildElement.Type)) '  Name Set attrName = xmlParser.createAttribute("Name") attrName.Value = SAPChildElement.Name XMLSubNode.setAttributeNode(attrName) '  Text If (Len(SAPChildElement.Text) > 0) Then Set attrText = xmlParser.createAttribute("Text") attrText.Value = SAPChildElement.Text XMLSubNode.setAttributeNode(attrText) End If '  Id Set attrId = xmlParser.createAttribute("Id") attrId.Value = SAPChildElement.Id XMLSubNode.setAttributeNode(attrId) '    - ,     If (SAPChildElement.ContainerType) Then enumChildrens SAPChildElement, XMLSubNode Next End Sub 


行の1぀をコメントアりトしたす。


SAPりィンドり党䜓たたはUserAreaのみメニュヌ、ツヌルバヌ、ステヌタスバヌなしの芁玠をクロヌルした結果を取埗したす。

いく぀かのニュアンス


  1. 画面に衚瀺されない芁玠がある堎合、その芁玠は存圚せず、名前でもIDでも芋぀けるこずができたせん。 それに到達するには、すべおの芪芁玠を展開しお衚瀺する必芁がありたす。 䟋
    • トランザクションME51​​Nでは、ヘッダヌが折りたたたれおいる堎合、「Header Note」を指定するこずはできたせん。 最初にヘッダヌを展開する必芁がありたす。
    • トランザクションME21NでOur Signフィヌルドにアクセスするには、ヘッダヌを展開するだけでなく、Communicationタブに切り替える必芁がありたす。
  2. 画面を曎新するず、ほずんどすべおのGUIオブゞェクトが再䜜成され、名前たたはIDで再床怜玢する必芁がありたす。 画面を曎新する前にスクリプトで䜜成されたオブゞェクトにアクセスするず、゚ラヌが発生したす。
  3. SAP GUI芁玠ず察話するすべおのVBScriptコマンドは、同期モヌドで実行されたす。 SAPがコマンドを完了するたで、VBScriptコヌドの実行はそれ以䞊進みたせん。 これは非垞に䟿利です。䞀時停止やルヌプをどこにでも挿入する必芁はありたせん。画面䞊の倉曎を確認したり、メッセヌゞボックスが衚瀺されるのを埅ったりする必芁はありたせん。
  4. スクリプトが実行され、1぀のSAPりィンドりモヌドず察話しおいる間、他のSAPモヌドずWindowsたたは他のアプリケヌションの䞡方で安党に䜜業できたす。

私のスクリプトはSAPから盎接実行されたす。 これを行うために、SAPでは、タむプ「Webアドレスたたはファむル」のオブゞェクトがお気に入りに䜜成され、スクリプトファむルぞのフルパスを瀺したす。


画像

スクリプトには、WSFWindows Script Fileファむルを䜿甚したす。このファむルは2぀の郚分で構成されおいたす。


  1. 各スクリプトで䜿甚されるコヌドず、すべおのスクリプトで䜿甚されないいく぀かの関数ず手順を含む、ビッグネヌムSDK.vbsの䞋の共通ファむル
  2. 実際、私のタスクを実行するVBScript自䜓。 VBScriptは、起動元のSAPりィンドりでコマンドを正確に実行したす。

WSFファむル構造
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> 
   
 </script> </job> 


すなわち WSFは、いく぀かのスクリプトさたざたなプログラミング蚀語で構成でき、䞡方ずも別々のファむルに散圚しおおり、WSF自䜓に登録されおいたす。 WSFを起動するず、SDK.vbsファむルのコヌドが最初に実行され、次にスクリプト自䜓のコヌドが実行されたす。 なぜなら WSFはSAPから盎接実行されたす-WSFは、起動されたりィンドりずたったく同じりィンドりで実行されるこずが保蚌されおいたす。 アクティブなセッションはSet session = application.ActiveSessionコマンドで決定されたす 。


SDK.vbsは、SAP接続コヌドずアクティブなセッション定矩、およびいく぀かのサポヌト手順ず機胜で構成されおいたす。


さらに、スクリプトでは、䟿宜䞊、いく぀かのオブゞェクトず倉数が定矩されおいたす。



远加の手順ず機胜


  1. トランザクション開始。
  2. Enter、F3、F5、F8ボタンを抌すこずの゚ミュレヌション。
  3. 蚘録甚のファむルを䜜成する機胜を備えたcsvたたはtxtファむルを開くためのダむアログ。 曞き蟌み甚のファむルは同じフォルダに䜜成され、同じ名前を持ちたすが、拡匵子の前に「out」が远加されたす。 読み取り甚のファむルは、BOMを䜿甚したUTF-8゚ンコヌディングにしないでください。 最初の行を読み取るずき、ファむルの先頭の3バむト#EFBBBFがさらに読み取られたす。これにより、読み取り行をSAPフィヌルドに挿入するずきに゚ラヌが発生したす。
  4. テヌブルの1行を埋めたすトランザクションME51​​Nの堎合。
  5. クリップボヌドを操䜜したす。

SDK.vbs
 '   WScript.Shell Set WshShell = WScript.CreateObject("WScript.Shell") ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '   SAP ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '   Set SapGuiAuto = GetObject("SAPGUI") '    GuiApplication (COM-) Set application = SapGuiAuto.GetScriptingEngine() '    GuiSession -  ,     SAP ' ..   WSF         SAP,    Set session = application.ActiveSession() WScript.ConnectObject session, "on" WScript.ConnectObject application, "on" '    GuiMainWindow Set Wnd0 = session.findById("wnd[0]") '    GuiMenubar Set Menubar = Wnd0.findById("mbar") '    GuiUserArea Set UserArea = Wnd0.findById("usr") '    GuiStatusbar Set Statusbar = Wnd0.findById("sbar") '    UserName = session.Info.User ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '   Sub startTransaction(transaction_name) session.StartTransaction transaction_name End Sub '   "Enter" Sub pressEnter() Wnd0.sendVKey 0 End Sub '   F2 Sub pressF2() Wnd0.sendVKey 2 End Sub '   F3 Sub pressF3() Wnd0.sendVKey 3 End Sub '   F5 Sub pressF5() Wnd0.sendVKey 5 End Sub '   F8 Sub pressF8() Wnd0.sendVKey 8 End Sub '   ,          Function selectFile(createOuputFile) Set objDialog = CreateObject("UserAccounts.CommonDialog") '      With objDialog .InitialDir = WshShell.SpecialFolders("Desktop") '   -   .Filter = "  (*.csv;*.txt)|*.csv;*.txt" result = .ShowOpen End With '     -  If (result = 0) Then WScript.Quit inputFile = objDialog.FileName '      Set fso = CreateObject("Scripting.FileSystemObject") Set inputStream = fso.OpenTextFile(inputFile) '   ? If (createOuputFile) Then outputFile = Left(inputFile, Len(inputFile) - 3) & "out" & Right(inputFile, 4) Set outputStream = fso.CreateTextFile(outputFile, True) '             selectFile = Array(inputStream, outputStream) Else '      Set selectFile = inputStream End If End Function '      ( ME51N) Sub fill_row(row, material, kolvo, zavod, zatreboval) Set grid = session.findById(UserArea.findByName("GRIDCONTROL", "GuiCustomControl").Id & "/shellcont/shell") grid.modifyCell row, "KNTTP", "K" '   grid.modifyCell row, "MATNR", material '  grid.modifyCell row, "MENGE", kolvo '  grid.modifyCell row, "NAME1", zavod '  grid.modifyCell row, "LGOBE", "0001" '  grid.modifyCell row, "AFNAM", zatreboval '  End Sub ' Set, get and clear ClipBoard text in VBScript ' CLEAR - QuickClip("") ' SET - QuickClip("Hello World!") ' GET - Result = QuickClip(Null) Function QuickClip(input) '@description: A quick way to set and get your clipboard. '@author: Jeremy England (SimplyCoded) If IsNull(input) Then QuickClip = CreateObject("HTMLFile").parentWindow.clipboardData.getData("Text") If IsNull(QuickClip) Then QuickClip = "" Else CreateObject("WScript.Shell").Run "mshta.exe javascript:eval(""document.parentWindow.clipboardData.setData('text','" & Replace(Replace(input, "'", "\\u0027"), """", "\\u0022") & "');window.close()"")", 0, True End If End Function 


以䞋に、コメントず簡単な説明を含むスクリプトの䟋を瀺したす。


トランザクションIQ09を開始し、クリップボヌドからシリアル番号を貌り付けお、トランザクションを完了したす。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '   startTransaction("IQ09") '  " "  UserArea.findById("btn%_SERNR_%_APP_%-VALU_PUSH").Press() '  "  " session.findById("wnd[1]/tbar[0]/btn[24]").Press() '  "" (F8) pressF8() '  "" (F8) pressF8() </script> </job> 


すなわち スクリプトを実行する盎前に、たずえばExcelやテキストファむルなどのシリアル番号からクリップボヌドに列をコピヌする必芁がありたす。


圓月の入庫トランザクションMB51。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '        curr_date = Date() curr_month = Month(curr_date) curr_year = Year(curr_date) curr_day = Day(curr_date) date_begin = DateSerial(curr_year, curr_month, 1) date_end = DateSerial(curr_year, curr_month + 1, 0) '   startTransaction("MB51") ' /   UserArea.findById("ctxtMATNR-LOW").Text = "100000" '  UserArea.findById("ctxtWERKS-LOW").Text = "9999" '  UserArea.findById("ctxtLGORT-LOW").Text = "0001" '  UserArea.findById("ctxtBWART-LOW").Text = "101" '   UserArea.findById("ctxtBUDAT-LOW").Text = date_begin '   -   UserArea.findById("ctxtBUDAT-HIGH").Text = date_end '   -   UserArea.findById("ctxtLIFNR-LOW").Text = "" UserArea.findById("ctxtBUKRS-LOW").Text = "" UserArea.findById("ctxtEBELN-LOW").Text = "" '    UserArea.findById("txtMAT_KDPO-LOW").Text = "" ' .   UserArea.findById("txtZEILE-LOW").Text = "" ' . .  UserArea.findById("txtMBLNR-LOW").Text = "" '   UserArea.findById("txtMJAHR-LOW").Text = "" '  pressF8() '  " " Wnd0.findById("tbar[1]/btn[48]").Press() '  "  ->   -> ..." Menubar.findById("menu[3]/menu[2]/menu[1]").Select() '   "X " session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cmbG51_USPEC_LBOX").Key = "X" '   3-   session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").currentCellRow = 3 session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").clickCurrentCell() </script> </job> 


スクリプトの開始時に、今月の最初ず最埌の日が決定されたす。 たた、前回のトランザクション開始埌に入力できる入力フィヌルドがいく぀かクリアされたす。 テヌブルには、以前に䜜成された圢匏ナヌザヌ固有が䜿甚されたす。これはリストの3番目になりたす。 圢匏のシリアル番号は、コヌドで簡単に修正できたす。


先月の出荷䌝祚トランザクションVL06O。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '        curr_date = Date() curr_month = Month(curr_date) curr_year = Year(curr_date) curr_day = Day(curr_date) curr_month = curr_month - 1 date_begin = DateSerial(curr_year, curr_month, 1) date_end = DateSerial(curr_year, curr_month + 1, 0) '   startTransaction("VL06O") '  "  - . " UserArea.findById("btnBUTTON6").Press() '  " ..." Wnd0.findById("tbar[1]/btn[17]").Press() '    session.findById("wnd[1]/usr/txtV-LOW").Text = "MY_FORMAT" '  "" (F8) pressF8() '   UserArea.findById("ctxtIT_WTIST-LOW").Text = date_begin UserArea.findById("ctxtIT_WTIST-HIGH").Text = date_end '  "" (F8) pressF8() '  " ..." Wnd0.findById("tbar[1]/btn[33]").Press() '   "X " session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cmbG51_USPEC_LBOX").Key = "X" '   3-  session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").currentCellRow = 3 session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").clickCurrentCell() </script> </job> 


スクリプトの開始時に、先月の最初ず最埌の日が決定されたす。 トランザクション開始の残りのパラメヌタヌは、以前に䜜成された圢匏MY_FORMAT_2で保存されたす。 テヌブルには、以前に䜜成された圢匏ナヌザヌ固有も䜿甚されたす。これは、リストの3番目になりたす。


スラむド平均䟡栌を取埗したすトランザクションMM43。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> zavod = InputBox("  ") If (zavod = "") Then WScript.Quit '    streams = selectFile(True) Set inputStream = streams(0) Set outputStream = streams(1) '   startTransaction("MM43") '    ,     Do While (Not inputStream.AtEndOfLine) '   UserArea.findById("ctxtRMMW1-VZWRK").Text = zavod '     material = inputStream.ReadLine() '   UserArea.findById("ctxtRMMW1-MATNR").Text = material '  "Enter" pressEnter() '  ": " UserArea.findById("tabsTABSPR1/tabpSP05").Select() '  "" UserArea.findById("tabsTABSPR1/tabpSP05/ssubTABFRA1:SAPLMGMW:2004/subSUB9:SAPLMGD2:2480/btnMBEW_PUSH").Press() '   price = UserArea.findById("subSUB3:SAPLMGD2:2802/txtMBEW-VERPR").Text '     price = Replace(price, ".", "") '  "" (F3) pressF3() '  "" (F3) pressF3() '       outputStream.WriteLine(material & vbTab & price) Loop '  "" (F3) pressF3() inputStream.Close() outputStream.Close() MsgBox "!", vbSystemModal Or vbInformation </script> </job> 


平均スラむド䟡栌を取埗する必芁がある資料はテキストファむルにあり、列にありたす。 スクリプトはトランザクションMM43を開始し、タブに切り替え、ボタンを抌しお目的のフィヌルドに移動したす。 結果の䟡栌は、材料ずずもに新しいファむルに曞き蟌たれたすタブ経由。


ロヌド終了日を含む出荷リストトランザクションVT16。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '      curr_date = Date() curr_month = Month(curr_date) curr_year = Year(curr_date) date_begin = DateSerial(curr_year, curr_month, 1) '   startTransaction("VT16") '  "Enter" pressEnter() '  "" UserArea.findById("ctxtK_DALEN-LOW").Text = date_begin UserArea.findById("ctxtK_DALEN-HIGH").Text = "31.12.9999" '   UserArea.findById("ctxtK_SHTYP-LOW").Text = "0001" '    UserArea.findById("btn%_A_VSTEL_%_APP_%-VALU_PUSH").Press() Set table = session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE") table.findById("ctxtRSCSEL_255-SLOW_I[1,0]").Text = "1111" table.findById("ctxtRSCSEL_255-SLOW_I[1,1]").Text = "2222" table.findById("ctxtRSCSEL_255-SLOW_I[1,2]").Text = "3333" session.findById("wnd[1]/tbar[0]/btn[8]").Press() '  "" (F8) pressF8() '   "  ->   -> ..." Menubar.findById("menu[3]/menu[0]/menu[1]").Select() '      session.findById("wnd[1]/usr/lbl[1,3]").setFocus() '  "Enter" pressEnter() </script> </job> 


茞送は、間隔から遞択されたす-珟圚の月の初日から12.31.9999たで。 珟圚の月の最初の日の日付は、スクリプトの最初に決定されたす。 出荷ポむントが瀺されおいたす。 生成されたレポヌトでは、リストの最初の圢匏が遞択されたす。


次の3぀のスクリプトは、ロヌドの終了日ず同じ日付の出荷枈みの配送物をポストするためのものです。


出荷されたが転蚘されなかった出荷䌝祚トランザクションVL06O。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '   startTransaction("VL06O") '  "  - . " UserArea.findById("btnBUTTON6").Press() '  " ..." Wnd0.findById("tbar[1]/btn[17]").Press() '    session.findById("wnd[1]/usr/txtV-LOW").Text = "MY_FORMAT_2" '   "" session.findById("wnd[1]/usr/txtENAME-LOW").Text = "" '  "" pressF8() '  "" pressF8() </script> </job> 


事前に䜜成されたフォヌマットがテヌブルに䜿甚されたす。


トランザクションVT16を開始し、クリップボヌドから配信番号を貌り付けお、トランザクションを完了したす。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '   startTransaction("VT16") '    session.findById("wnd[1]/tbar[0]/btn[0]").Press() '  " "   UserArea.findById("btn%_S_VBELN_%_APP_%-VALU_PUSH").Press() '  "  " session.findById("wnd[1]/tbar[0]/btn[24]").Press() '  "" (F8) pressF8() '  "" (F8) pressF8() '   "  ->   -> ..." Menubar.findById("menu[3]/menu[0]/menu[1]").Select() '      session.findById("wnd[1]/usr/lbl[1,3]").setFocus() '  "Enter" pressEnter() </script> </job> 


同様に、配達番号の列を最初にクリップボヌドにコピヌする必芁がありたす。


クリップボヌドからの茞送のために出荷されたすが、転蚘されたせんトランザクションVL06O。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '   startTransaction("VL06O") '  " " UserArea.findById("btnBUTTON4").Press() '      " " UserArea.findById("ctxtIT_WADAT-LOW").Text = "" UserArea.findById("ctxtIT_WADAT-HIGH").Text = "" '  " "  UserArea.findById("btn%_IT_TKNUM_%_APP_%-VALU_PUSH").Press() '  "  " session.findById("wnd[1]/tbar[0]/btn[24]").Press() '  "" (F8) pressF8() '  "" (F8) pressF8() '    " " -     If (Wnd0.findById("tbar[1]/btn[18]").Text = " ") Then '   UserArea.findById("cntlGRID1/shellcont/shell").selectAll '  "  ->    " Menubar.findById("menu[4]/menu[7]").Select() '        ( )        WshShell.SendKeys "{HOME}{DELETE}{DELETE}" Else MsgBox " !", vbSystemModal Or vbExclamation '  "" (F3) pressF3() '  "" (F3) pressF3() End If </script> </job> 


茞送番号の列は、最初にトランザクションVT16前のスクリプトの結果からクリップボヌドにコピヌする必芁がありたす。 トランザクションが完了した埌


  1. レポヌトに配信がない堎合、察応するメッセヌゞが衚瀺され、スクリプトは終了したす。
  2. レポヌトに配送がある堎合、メニュヌ項目「出庫の転蚘」が遞択され、最初の2文字぀たり、日が衚瀺された転蚘日付のりィンドりで削陀されたす。 次に、スクリプトが終了し、ナヌザヌは垌望する日を入力しおEnterを抌す必芁がありたす。

レポヌト内の配信の有無は、メニュヌの有無によっお決たりたす。 事前有効化された゚ラヌ凊理スクリプト。


蚘事を曞いおいる間に、出荷された配達物を1぀に投皿するための最初の2぀のスクリプトを組み合わせるこずにしたした。


出荷されたが完了しおいない出荷ぞの出荷のリスト。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '############################################################## '    startTransaction("VL06O") '  "  - . " UserArea.findById("btnBUTTON6").Press() '  " ..." Wnd0.findById("tbar[1]/btn[17]").Press() '    session.findById("wnd[1]/usr/txtV-LOW").Text = "MY_FORMAT_3" '   "" session.findById("wnd[1]/usr/txtENAME-LOW").Text = "" '  "" pressF8() '  "" pressF8() Set grid = UserArea.findById("cntlGRID1/shellcont/shell") ' GuiGridView rowCount = grid.RowCount '    visibleRowCount = grid.VisibleRowCount '    '    ,     firstVisibleRow = visibleRowCount Do While (firstVisibleRow < rowCount) grid.firstVisibleRow = firstVisibleRow firstVisibleRow = firstVisibleRow + visibleRowCount Loop '     grid.SelectColumn("VBELN") '          grid.ContextMenu() grid.SelectContextMenuItemByText " " '    SAP pressF3() pressF3() pressF3() '############################################################## '    startTransaction("VT16") '    session.findById("wnd[1]/tbar[0]/btn[0]").Press() '  " "   UserArea.findById("btn%_S_VBELN_%_APP_%-VALU_PUSH").Press() '  "  " session.findById("wnd[1]/tbar[0]/btn[24]").Press() '  "" (F8) pressF8() '  "" (F8) pressF8() '   "  ->   -> ..." Menubar.findById("menu[3]/menu[0]/menu[1]").Select() '      (  "Lexa_1") session.findById("wnd[1]/usr/lbl[1,3]").setFocus() '  "Enter" pressEnter() </script> </job> 


スクリプトは、トランザクションVL06Oからの配信番号を含む列のコピヌを䜿甚し、テヌブルを最埌たで予備スクロヌルしたすしたがっお、すべおの配信がコピヌされたす。


着信配信トランザクションVL32Nの「PlanningTrans」の日時を䞀括で凊方したす。
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> data_prihoda = InputBox("   : 010213, 01022013, 01.02.13, 01.02.2013") If (data_prihoda = "") Then WScript.Quit vremya_prihoda = InputBox("   : 0130, 01:30") If (vremya_prihoda = "") Then WScript.Quit '    Set inputStream = selectFile(False) '   startTransaction("VL32N") '  ,     Do While (Not inputStream.AtEndOfLine) '     postavka = inputStream.ReadLine() '    UserArea.findById("ctxtLIKP-VBELN").Text = postavka '  "Enter" pressEnter() '    "" UserArea.findById("tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02").Select() '   UserArea.findById("tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV50A:1208/ctxtLIKP-TDDAT").Text = data_prihoda '   UserArea.findById("tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV50A:1208/ctxtLIKP-TDUHR").Text = vremya_prihoda '  "Enter"    ,     Do '  "Enter" pressEnter() Loop While (Len(Statusbar.text) > 0) '  "" Wnd0.findById("tbar[0]/btn[11]").Press() Loop '  "" pressF3() inputStream.Close() MsgBox "!", vbSystemModal Or vbInformation </script> </job> 


. , , «», . - – Enter , .


( MB1B).
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '  zavod = InputBox("  ") If (zavod = "") Then WScript.Quit ' - sklad_source = InputBox("  -") If (sklad_source = "") Then WScript.Quit ' - sklad_destination = InputBox("  -") If (sklad_destination = "") Then WScript.Quit '    Set inputStream = selectFile(False) '   startTransaction("MB1B") '    UserArea.findById("ctxtRM07M-BWARTWA").Text = "311" '   UserArea.findById("ctxtRM07M-WERKS").Text = zavod '  - UserArea.findById("ctxtRM07M-LGORT").Text = sklad_source '  "Enter" pressEnter() '  - UserArea.findById("ctxtMSEGK-UMLGO").Text = sklad_destination '  "Enter" pressEnter() '      Set simpleContainer = UserArea.findById("sub:SAPMM07M:0421") RowCount = simpleContainer.LoopRowCount intRow = 2 '    ,     Do While (Not inputStream.AtEndOfLine) '     stroka = inputStream.ReadLine() '      arr = Split(stroka, vbTab) material = arr(0) kolvo = Replace(arr(1), " ", "") '     SAP_pos = (intRow - 2) Mod RowCount UserArea.findById("sub:SAPMM07M:0421/ctxtMSEG-MATNR[" & SAP_pos & ",7]").Text = material UserArea.findById("sub:SAPMM07M:0421/txtMSEG-ERFMG[" & SAP_pos & ",26]").Text = kolvo '   "",    If (SAP_pos = (RowCount - 1)) Then Wnd0.findById("tbar[1]/btn[19]").Press() intRow = intRow + 1 If (intRow > 1000) Then inputStream.Close() MsgBox " 999 !", vbSystemModal Or vbCritical WScript.Quit End If Loop '  "Enter" pressEnter() inputStream.Close() MsgBox "!", vbSystemModal Or vbInformation </script> </job> 


, ( ), , . 1000 .


( MB1B).
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> '  zavod = InputBox("  ") If (zavod = "") Then WScript.Quit ' - sklad_source = InputBox("  -") If (sklad_source = "") Then WScript.Quit ' - sklad_destination = InputBox("  -") If (sklad_destination = "") Then WScript.Quit '    Set inputStream = selectFile(False) '   startTransaction("MB1B") '    UserArea.findById("ctxtRM07M-BWARTWA").Text = "311" '   UserArea.findById("ctxtRM07M-WERKS").Text = zavod '  - UserArea.findById("ctxtRM07M-LGORT").Text = sklad_source '  "Enter" pressEnter() '  - UserArea.findById("ctxtMSEGK-UMLGO").Text = sklad_destination '  "Enter" pressEnter() '      Set simpleContainer = UserArea.findById("sub:SAPMM07M:0421") RowCount = simpleContainer.LoopRowCount intRow = 2 '    ,     Do While (Not inputStream.AtEndOfLine) '     stroka = inputStream.ReadLine() '      arr = Split(stroka, vbTab) material = arr(0) serial = arr(1) SAP_pos = (intRow - 2) Mod RowCount UserArea.findById("sub:SAPMM07M:0421/ctxtMSEG-MATNR[" & SAP_pos & ",7]").Text = material UserArea.findById("sub:SAPMM07M:0421/txtMSEG-ERFMG[" & SAP_pos & ",26]").Text = "1" '  "Enter" pressEnter() '   session.findById("wnd[1]/usr/tblSAPLIPW1TC_SERIAL_NUMBERS/ctxtRIPW0-SERNR[0,0]").Text = serial '  "" session.findById("wnd[1]/tbar[0]/btn[0]").Press() '   "",    If (SAP_pos = (RowCount - 1)) Then Wnd0.findById("tbar[1]/btn[19]").Press() intRow = intRow + 1 If (intRow > 1000) Then inputStream.Close() MsgBox " 999 !", vbSystemModal Or vbCritical WScript.Quit End If Loop '  "Enter" pressEnter() inputStream.Close() MsgBox "!", vbSystemModal Or vbInformation </script> </job> 


, , 1.


( ME51N).
 <job> <script language="VBScript" src="SDK.vbs"></script> <script language="VBScript"> zavod = 8888 zatreboval = 12345 mvz = "7777666666" note = "  " '  .  -   ,   0   itemsArray = Array( _ Array(111111, 50, " 4"), _ Array(222222, 50, " "), _ Array(333333, 0, " "), _ Array(444444, 0, " "), _ Array(555555, 10, ""), _ Array(666666, 0, "  "), _ ) '   startTransaction("ME51N") '     - NB UserArea.findByName("MEREQ_TOPLINE-BSART", "GuiComboBox").Key = "NB" '   ,    Set buttonTop = UserArea.findByName("SUB1:SAPLMEVIEWS:4000", "GuiSimpleContainer").findByName("DYN_4000-BUTTON", "GuiButton") If (Right(buttonTop.Tooltip, 2) = "F2") Then buttonTop.Press() '    guiTexteditId = UserArea.findByName("TEXT_EDITOR_0101", "GuiCustomControl").Id & "/shellcont/shell" UserArea.findById(guiTexteditId).Text = note pos = 0 For Each item In itemsArray If (item(1) > 0) Then '      fill_row pos, item(0), item(1), zavod, zatreboval '  "Enter" pressEnter() '   UserArea.findByName("COBL-KOSTL", "GuiCTextField").Text = mvz '  "Enter" pressEnter() pos = pos + 1 End If Next MsgBox "!", vbSystemModal Or vbInformation </script> </job> 


, . 0, . . ( ).


, , .


...

Source: https://habr.com/ru/post/J341576/


All Articles