Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA Status Eingabefeld in SAP
#1
Hallo wertes Forum (insbesondere diejenigen, die sich mich VBA und SAP beschäftigen),

ich möchte in einem kleinen VBA-Tool SAP-Prozessaufträge anpassen und erstellen.
Dazu muss ich in der SAP-Eingabemaske den Status eines Feldes abfragen. Wie frage ich ab, ob das gelb markierte Feld beschreibbar ist oder nicht:
   

Wie muss also die folgende Zeile vervollständigt werden?
If session.findById("wnd[0]/usr/tblSAPLCOMKTCTRL_5120/ctxtRESBD-CHARG[9,0]"). ??? = ??? then

Vielen Dank für Eure Hilfe,
Lutz
Antworten Top
#2
Code:
If session.findById("wnd[0]/usr/tblSAPLCOMKTCTRL_5120/ctxtRESBD-CHARG[9,0]").changeable then
Das ist ein GuiTable Control und es handelt sich um ein GuiTextField
GuiTableControl Object | SAP Help Portal
GuiTextField | SAP Help Portal
Wie findet man das heraus: am schnellsten mit dem Tracker von S. Schnell 
Scripting Tracker for SAP GUI Scripting (stschnell.de)
[-] Folgende(r) 1 Nutzer sagt Danke an Warkings für diesen Beitrag:
  • Lutz Fricke
Antworten Top
#3
Hallo Warkings,

vielen Dank für die schnelle Hilfe. Damit sollte ich klarkommen.
Du bekommst den extra großen Weihnachts-Hilfeorden verliehen.

Auch vielen Dank für die Links.
Schaut extrem hilfreich aus, aber Du kennst ja meine Programmierkenntnisse. Damit werde ich an dem Stoff mächtig zu kauen haben.

Vielen Dank und schon mal frohe Weihnachten,
Lutz
Antworten Top
#4
Hallo Warkings,

wie erwartet hat mich Deine Hilfe weitergebracht. Funktioniert einwandfrei.

Durch die Links steige ich nicht wirklich durch. Hab versucht für ein Problem eine Lösung zu finden, stelle aber fest, dass es echtes englisches Fachchinesisch ist...
Aber vielleicht kannst Du mir daher da auch nochmal helfen.
Ich möchte von einer Tabelle wie im Screenshot (ist ja kein Table) die letzte Zeile ermitteln:
   
Wie mache ich das?

Am Scripting Tracker bin ich dran. Ist halt in einer Konzern-Umgebung etwas zäh.

Vielen Dank,
Lutz
Antworten Top
#5
Soll ich die Transaktion raten, MB52?

Und was soll "  ...die letzte Zeile ermitteln:..." heissen. Benötigst Du die Anzahl der Zeilen? Benötigst Du den Inhalt der letzten Zeile? Oder worum geht es?
Manchmal lassen sich solche Listen tatsächlich umschalten, so dass man ein Grid bekommt, in der MB52 allerdings nicht. Und die Liste und speziell der Inhalt ist vom Layout abhängig.

Ist es tatsächlich eine Liste wie im Screenshot, so muss man die einzelnen GuiLabels durchloopen und so den Inhalt auslesen, dazu muss man ggf. auch scrollen.

Scrollen könnt man ganz grob wie folgt realisieren
Code:
  Dim guiUserArea As SAPFEWSELib.guiUserArea
    Set guiUserArea = guiSes.FindById("wnd[0]/usr")
   
    Dim guiVScrollbar As SAPFEWSELib.GuiScrollbar
    Set guiVScrollbar = guiUserArea.VerticalScrollbar
   
    Dim maxScroll As Long
    Dim pageSize As Long
    pageSize = guiVScrollbar.pageSize
    maxScroll = guiVScrollbar.Maximum
    guiVScrollbar.Position = guiVScrollbar.Maximum
    guiVScrollbar.Position = guiVScrollbar.Minimum
   
    Do
       ' hier den code, um den Inhalt des sichtbaren Bereichs auszulesen

        If guiVScrollbar.Position >= maxScroll Then
            ' Am Ende der Liste 
            Exit Do
        Else
           ' Scrollen
            guiVScrollbar.Position = guiVScrollbar.Position + pageSize - 1
        End If
   
    Loop
Antworten Top
#6
Hallo Warkings,

du hast Recht... ist die LS24. Lässt sich leider nicht in ein Grid umschalten.

Hätte gerne die Zeilennummer gehabt, damit ich dann eine For-Next-Schleife programmieren kann (wie eben beim Grid).

Habe es mit ner Do-Loop-Schleife umgesetzt, die beim Auslesen des Textes den Fehler 619 (The control could not be found by id.) beendet wird.
Fnde ich allerdings nicht wirklich gut gelungen.
Code:
       With SAPSessionLS24
           intPos = 1
           Do
                On Error Resume Next
                strPos = Trim(.findById("wnd[0]/usr/lbl[" & intPos & "," & intRow & "]").Text)
                intFehler = Err.Number
                Debug.Print intPos; strPos, intFehler, Err.Description
                On Error GoTo 0
               
                If intFehler = 619 Then
                    Exit Do
                ElseIf intFehler <> 0 Then
                    MsgBox "Es ist ein Fehler in der LS24 aufgetreten!"
                    Call Y_SAPEndConnection
                    End
                End If
                intRow = intRow+2
            Loop
       End With

Aber evtl. gibt's da ja was besseres.

Gruß,
Lutz
Antworten Top
#7
Aber was benötigt Du jetzt, die Anzahl der Sätze lässt sich mit dem Listenstatus einfacher ermitteln.
Antworten Top
#8
Hallo Warkings,

das Ziel ist, die Daten aus der LS24 auszulesen und nach Lagertypen gefiltert in einem Userform zur Auswahl darzustellen.
Das funzt auch.

Ich hatte aus dem Code alles, was stört, entfernt.
Er läuft jetzt in der Spalte 1 nach unten und liest den Text aus der ersten Spalte aus (strPos). Im echten Code legt er dann die Werte in ein Array und arbeitet am Ende damit weiter.
Das Listenende erkenne ich über den Fehler 619, der aber nicht wirklich spezifisch für das Ende der Liste ist.
Daher hätte ich es lieber besser gelöst.

Ich habe gestern in einem deiner Links irgendwo etwas von Listenstatus gelesen, finde es aber nicht mehr  Huh.
Wie lese ich den Listenstatus aus?

Grundsätzlich brauche ich wohl noch die Programmier-Einführung für Dummies...
Ich kann die Properties aus meinen GuiLabels auslesen ("Public Property CaretPosition As Long" etc.). Aber wie bringe ich Methoden wie "Public Function GetListProperty(ByVal Property As String) As String" in meinem Code unter??
Brauche ich noch irgendein Add-In?

Habe jetzt auch Stefans Tool, aber das bringt mich da auch nicht weiter...

Vielen Dank,
Lutz
[-] Folgende(r) 1 Nutzer sagt Danke an Lutz Fricke für diesen Beitrag:
  • Warkings
Antworten Top
#9
Wenn es funktioniert, was ist dann das Problem.

Ich hätte es in diesem Fall sowieso ganz anders gelöst, indem ich die Daten in die Zwischenablage kopiere

Wie macht man das, z.B. wie folgt
Code:
    With session
        .FindById("wnd[0]/tbar[0]/okcd").Text = "%pc"
        .FindById("wnd[0]").SendVKey 0
        .FindById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[4,0]").Select
        .FindById("wnd[1]/tbar[0]/btn[0]").Press
    End With
Und wie verarbeitet man die Daten, z.B. 
Code:
    Dim v As Variant
    v = GetClipboard
    v = Split(v, vbCrLf)
Im Array v steht dann die Liste zeilenweise, kein Scrollen nötig.
Die spannende Frage, wie sieht der Code für GetClipboard aus, siehe https://stackoverflow.com/a/54978696

Da LS24 eine "alte" Transaktion ist, ist das IMHO der bequemste Weg. Listen werden dort mit Hilfe von Labeln dargestellt, das sieht man ganz gut im Tracker. 
Aufbau: Lbl(col,row), wobei row die Zeile im SAPGUI Screen ist und col entsprechend die Spalte, das hat nicht so viel mit den Daten in der Liste zu tun.
   

Abgesehen davon bin ich kein guter "Erklärbär" und kann Dir in Deinem Bemühen die SAPGUI Automation Schnittstelle zu verstehen nicht wirklich weiterhelfen. Und wenn man das nicht verstanden hat, ist S. Schnells Tool auch nicht hilfreich.

Zum Thema Label, hat jetzt aber nicht direkt mit dem Problem hier zu tun.
Tip: How to Find an SAP Label by its Text - News / Tutorials - UiPath Community Forum
Antworten Top
#10
Hallo Warkings,

den Gedanken habe ich noch nicht gehabt...

Hab's mir mal angeschaut und gefühlt tausend Fragen:
Warum gehst Du den Weg über API (habe ich keine Ahnung von und kommt mir total kompliziert vor...)?
Warum nicht über das DataObject mit
Code:
    Set zw = New DataObject
    v.GetFromClipboard
Habe das Ganze (per DataObject) dann mit Split bearbeitet und in Excel ausgegeben:
   

So wirklich bearbeitbar schaut das nicht aus (oder liegts am Unterschied API / DataObject)...
Oder übersehe ich den Vorteil?

Gruß,
Lutz
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste