Hirdetés

Új hozzászólás Aktív témák

  • Mutt

    senior tag

    válasz dm1970 #52644 üzenetére

    Szia,

    Van programozási tapasztalatod (For - Next ciklus)?

    Én MM/FI modulokban dolgozom, onnan tudok példát mutatni.
    Egy komplex változat fent van a GitHub-on.
    Illetve YT-on Varga Csongor videói is tudnak segíteni.

    Mielőtt tovább megyünk, pár tanács!
    1. Óvatosan a szkriptekkel, mert nagy kárt tudsz okozni!
    2. Ha nincs teszt környezeted, ahol tudod ellenőrízni a szkriptet, akkor nagyon legyél körültekintő.
    3. A SAP bonyolult, a SAP szkript mégrosszabb. Előbb kérdezz vkit.
    4. Használd a Scripting Trackert (letölthető innen), hogy kiderítsd melyik mező miről szól.

    Itt egy Móricka példa. MM02-es tranzakcióval a 93062409-es anyagnak a material group-ját LEDG101-re írtam át. A script ez lett:

    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 = "mm02"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "93062409" 'ez az anyagszám
    session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").caretPosition = 8
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").text = "LEDG101" 'ennek a mezőnek az értékét akarom módosítani vmire
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").setFocus
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").caretPosition = 7
    session.findById("wnd[0]/tbar[0]/btn[11]").press
    session.findById("wnd[0]").sendVKey 0

    A példámban a szkriptet szeretném lefuttatni másik anyagszámokon (19-es sor) és akár más értéket megadni (24-es sor)

    1. Excelben egy lapon megadom hogy mely anyagoknak milyen új értéket akarok megadni
    pl.
    2. Kell egy For - Next ciklus ami ezen végigmegy.
    VBA Editorban egy új modulban ez például az A-oszlopban lévő értéket kiírja.
    Sub minta()

    With ActiveSheet
    lastrow = .Range("A" & Rows.Count).End(xlUp).Row

    For c = 2 To lastrow

    Debug.Print .Range("A" & c)

    Next c
    End With

    End Sub

    3. Most már csak a SAP scriptet kell ide tenni. Az első 14 sor a SAP-hoz kapcsolódást csinálja, ezt elég egyszer megtenni. Vagyis ez a For-Next elé kerül. A többi lépés pedig bele a For-Next-be.
    Annyi javítás kell, hogy az "Application" Excelben már foglalt, így más kell helyette használni pl. "SAPApplication".

    4. Nekem két változó értékem van az A és B-oszlopban, amit szeretném ha a szkript használna.
    A lenti sornak a végén a fix anyagszám helyett kell nekem az A-oszlop értéke.
    session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "93062409"

    A helyes kód a fenti helyett ez lesz:
    session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = .Range("A" & c)

    A session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").text = "LEDG101" sor helyett pedig ez session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").Text = .Range("B" & c)

    5. Érdemes egy visszajelzést is adni, hogy melyik sorban járunk és ha kell akkor meg is tudjuk szakítani a futtatást. Ezért a "Next c" elé kerüljön be ez.

    DoEvents
    .Range("C" & c) = "Kész"

    6. Rakj ki egy gombot és rendeld hozzá a makrót. Érdemes tesztelni 1-2 kombináción, ha van teszt environment akkor azon, ha nincs akkor a mentést sort kommenteld ki először.

    A teljes minta kód:
    Sub minta()

    If Not IsObject(SAPApplication) Then
    Set SapGuiAuto = GetObject("SAPGUI")
    Set SAPApplication = SapGuiAuto.GetScriptingEngine
    End If
    If Not IsObject(Connection) Then
    Set Connection = SAPApplication.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 SAPApplication, "on"
    End If

    With ActiveSheet
    lastrow = .Range("A" & Rows.Count).End(xlUp).Row

    For c = 2 To lastrow

    session.findById("wnd[0]").maximize
    session.findById("wnd[0]/tbar[0]/okcd").Text = "mm02"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = .Range("A" & c)
    session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").caretPosition = 8
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").Text = .Range("B" & c)
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").SetFocus
    session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").caretPosition = 7
    session.findById("wnd[0]/tbar[0]/btn[11]").press
    session.findById("wnd[0]").sendVKey 0

    DoEvents
    .Range("C" & c) = "Kész"

    Next c
    End With

    End Sub

    Ezzel készen is vagy, de azért sok mindent lehet rajta fejleszteni mint például
    - vannak felesleges sorok (általában a caretPosition-osok ilyenek)
    - nincs semmilyen hibaellenőrzés (pl. nincs jogosultságod vmihez, nem jó érték van az inputban)
    - nem annyira jó az első kliens első sessionjéhez csatlakozni, lehet hogy éppen másra használod.

    Ha kell segítség akkor dobd fel ide/keress meg.

    üdv

Új hozzászólás Aktív témák