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:
[
attachment=50282]
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
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
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:
[
attachment=50512]
Wie mache ich das?
Am Scripting Tracker bin ich dran. Ist halt in einer Konzern-Umgebung etwas zäh.
Vielen Dank,
Lutz
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
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
Aber was benötigt Du jetzt, die Anzahl der Sätze lässt sich mit dem Listenstatus einfacher ermitteln.
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
.
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
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.
[
attachment=50525]
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
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:
[
attachment=50530]
So wirklich bearbeitbar schaut das nicht aus (oder liegts am Unterschied API / DataObject)...
Oder übersehe ich den Vorteil?
Gruß,
Lutz