SAP Jobsuche bei DV-Treff
newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 10 Jahre
Hallo zusammen,

hätte da jetzt wieder mal ein Thema.

Wir müssen in der Transaktion vk12 Preise aktualisieren. Das ist immer aus den Materialstammdaten der aktuelle Wert * 1,25. Dieser Wert ändert sich immer monatlich und muss zzt. für fast 1000 Materialien somit auch monatlich aktualisiert werden.

Ich habe dazu ein query erstellt, das ein kompl. Liste zu einem Kunden anzeigt mit Materialnr. und neuem Wert (errechnet aus Stammdaten in einem lokalen Feld) - sieht dann verkürzt in etwa so aus.

Matnr Wert_neu

X0123 523,80

X0222 212,25

..

Danach springe ich aus dem query in die Transaktion (Berichtszuordnung im query). Die Schleife ist jetzt nicht das große Problem sondern eher wie kann ich die Materialnr. und den Wert aus der ALV-Grid mit den aktuellen Werten je Zeile auslesen und in die VK12 übertragen.

Kann ev. notwendig sein den Wert erst im script errechnen zu lassen, da ein lokales Feld nicht über ein Datenelement in der grid definiert ist.

Hier das script mal ohne Variablen.

LastLine = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").rowCount

For Count = 0 to LastLine

session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").CurrentCellRow = Count

session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").doubleClickCurrentCell

'--------------Anfang --------------------------------

session.findById("wnd[1]/usr/sub:SAPLV14A:0100/radRV130-SELKZ[7,0]").select

session.findById("wnd[1]/usr/sub:SAPLV14A:0100/radRV130-SELKZ[7,0]").setFocus

session.findById("wnd[1]").sendVKey 0

session.findById("wnd[0]/usr/ctxtF003-LOW").text = "X0123" -> Materialnummer

session.findById("wnd[0]/usr/ctxtF003-LOW").setFocus

session.findById("wnd[0]/usr/ctxtF003-LOW").caretPosition = 11

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]").sendVKey 8

session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/txtKONP-KBETR[2,0]").text = "523,80" -> Wert neu

session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/txtKONP-KBETR[2,0]").setFocus

session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/txtKONP-KBETR[2,0]").caretPosition = 16

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/tbar[0]/btn[11]").press

'-------------Ende --------------------------------------

next

Hoffe, die Anforderung ist soweit halbwegs verständlich. Ev. muss auch ein Teil über guixt erfolgen, darum hab ich es auch hier eingestellt.

mfg

newgui

.fetox
vor 10 Jahre
Moin,

ähm.. dazu gibt es Standartfunktionalität (VK14 oder 15 meine ich, komme grad nicht auf ein System) mit der Du Preise mit Vorlage Massenpflegen, kannst mit genau solchen prozentualen oder Absolutbeträgen (mit sogar komplett customizebaren Rundungsregeln).. Auch mit den entsprechenden Selektionsmöglichkeiten.. Das geht viel einfacher als über GUI-Scripting.

Ich guck grad mal ob ich ne Doku im Netz finde, ansonsten kann ich Dir unsere zuschicken wenn du mir ne PN schickst..

Grüße,

Olli

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 10 Jahre
Hallo Olli,

danke für deine rasche Antwort. Auf die VK15 habe ich leider keinen Zugriff. Ich fürchte aber, dass die Transaktion nicht wirklich hilft. Ich greife nicht auf die vorhandenen Preise in der vk12 zurück sondern hole mir diese aus der Kostensicht im Materialstamm und rechne dann die 25% dazu. Das heißt die neuen Werte haben mit den bisherigen eigentlich nichts zu tun.

Wenn man sich natürlich Werte aus einer Tabelle dazuholen könnte wäre das über die vk15 eine Lösung. Weiters gibt es ja auch noch den Export und Import in der vk12. Muss man halt wieder exportieren, die Preise aus dem Matstamm abrufen und in excel wieder dazu spielen und importieren.

So wollte ich das ganze eigentlich total automatisieren. Ein Button würde dann genügen und das ganze würde sich von alleine ändern. Aber naja viele Wege führen nach Rom 🙂.

mfg newgui

ScriptMan
vor 10 Jahre
Hallo newgui,

wenn ich es richtig verstehe, fehlt dir jetzt noch der Part mit Excel. Dazu kannst du dir meine Antwort unter dem folgenden Link anschauen:

http://www.dv-treff.de/yaf_postst13472_Rechnungsdaten-automatisiert-einlesen.aspx 

Grüße,

ScriptMan

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 10 Jahre
Hallo scriptman,

danke für deine Antwort. Das wäre ja kein Problem mehr, das mache ich dank deiner Hilfe inzwischen schon seit geraumer Zeit. Damit spiele ich Kundenaufträge ein, mach Materialänderungen, jetzt zB gerade wieder muss ich auf einem bestimmten PSP-Element über zig Projekte eine Kostenstelle einspielen. Das hat mir und speziell meinen Kollegen schon jede Menge Arbeit erspart.

In dem Fall wollte ich aber tatsächlich aus der ALV Grid die Änderung durchführen lassen. Wenn es nicht geht ist es aber auch kein Problem, dann machen wir es auf die gewohnte Weise. Wär für mich nur interessant ob es überhaupt geht, wovon ich jetzt mal ausgehe.

Hab dazu auch schon was bei Koehn Consulting gefunden, aber in Verbindung mit guixt. Nur weiß ich nicht genau wie ich das zum Code meine ersten Postings hinzufügen soll.

Set aw = session.ActiveWindow

Dim GRID1

Set GRID1 = aw.FindById("usr/cntlGRID1/shellcont/shell")

Dim oFS

Set oFS = CreateObject("Scripting.FileSystemObject")

Dim oTS

Set oTS = oFS.CreateTextFile("&[Filename]")

row = GRID1.selectedRows

if not row = "" Then

oTS.writeLine(GRID1.getCellValue(row,"VBELN"))

oTS.writeLine(GRID1.getCellValue(row,"AUART"))

oTS.writeLine(GRID1.getCellValue(row,"KUNNR"))

oTS.writeLine(GRID1.getCellValue(row,"BSTKD"))

End If

oTS.Close

mfg

newgui

ScriptMan
vor 10 Jahre
Hallo newgui,

dann habe ich es doch missverstanden. Aber besser verstehen tue ich es immer noch nicht. Vielleicht kannst du mit den folgenden Aufführungen was anfangen:

set GRID1 = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell")

LastLine = GRID1.rowCount

For Count = 0 to LastLine

MATNR = GRID1.getCellValue(Count,"SAP-MATNR")

WERT_NEU = GRID1.getCellValue(Count,"SAP-WERT")

session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").doubleClickCurrentCell

'--------------Anfang --------------------------------

session.findById("wnd[1]/usr/sub:SAPLV14A:0100/radRV130-SELKZ[7,0]").select

session.findById("wnd[1]/usr/sub:SAPLV14A:0100/radRV130-SELKZ[7,0]").setFocus

session.findById("wnd[1]").sendVKey 0

session.findById("wnd[0]/usr/ctxtF003-LOW").text = MATNR

session.findById("wnd[0]/usr/ctxtF003-LOW").setFocus

session.findById("wnd[0]/usr/ctxtF003-LOW").caretPosition = 11

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]").sendVKey 8

session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/txtKONP-KBETR[2,0]").text = WERT_NEU

session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/txtKONP-KBETR[2,0]").setFocus

session.findById("wnd[0]/usr/tblSAPMV13ATCTRL_FAST_ENTRY/txtKONP-KBETR[2,0]").caretPosition = 16

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/tbar[0]/btn[11]").press

'-------------Ende --------------------------------------

next

Die Bezeichnungen der Spalten als SAP-MATNR und SAP-WERT habe ich frei erfunden. Ich habe keinen Zugriff auf die entsprechende Transaktion. Die richtigen Namen der Spalten muss du selbst herausbekommen, indem du ein wenig mit dem SAP-Skriptrecorder herumprobierst, etwas von dem GRID aufzuzeichnen. Zum Beispiel das Sortieren nach der Materialnummer oder nach dem Betrag. Dann müsstest du in der Aufzeichnung erkennen, wie die Spaltenbezeichnung in Wirklichkeit ist und diese dann statt den beiden dort oben einsetzen.

Viel Spaß beim Testen!

ScriptMan

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 10 Jahre
Hallo scriptman,

danke wieder mal für deine Hilfe. Habs gerade getestet und wie könnt es anders sein - es funktioniert.

Vielleicht nochmal zum besseren Verständnis. Auf der einen Seite gibt es eine Tabelle mit Material und Wert. Diese muss monatlich aktualisiert werden. Die Werte sind auch im System vorhanden nur kann man die nicht über den Standard einspielen. Somit habe ich ein query gebastelt, dass die Verbindung zwischen Materialnr. und dem neuen Wert herstellt.

Mit dem Script kann ich somit direkt aus dem query die Änderungen durchführen lassen. Die Kollegin die das braucht bekommt jetzt noch einen Button über guixt ins SAP auf den Sie dann nur mehr drücken braucht und alles wird automatisch aktualisiert, also der einfachste Weg. Bin mir auch ziemlich sicher, dass ich das auch noch bei einer anderen Gelegenheit brauchen werde.

Also danke nochmals und schönen Tag.

mfg

newgui

ScriptMan
vor 10 Jahre
Hallo newgui,

das freut mich aber, wenn ich jetzt ins Schwarze getroffen habe. Es könnte aber sein, dass man zwischendurch den Cursor im Grid bewegen muss. Das kannst du wie folgt realisieren.

z.B.

. . .

For Count = 0 to LastLine

GRID.setCurrentCell Count,"SAP-MATNR"

GRID.clickCurrentCell

MATNR = GRID1.getCellValue(Count,"SAP-MATNR")

WERT_NEU = GRID1.getCellValue(Count,"SAP-WERT")

GRID1.doubleClickCurrentCell

. . .

Grüße,

ScriptMan