Datenbeschaffung
Die Preisfindungsdaten lesen wir aus dem Kundenstamm, Vertriebsdaten
(Tabelle KNVV), die Texte aus den entsprechenden Texttabellen. Die Namen
der Tabellen findet man häufig am einfachsten über die F1-Hilfe,
"Technische Info", auf den entsprechenden Feldern. Hier in Transaktion
VD03, F1 drücken auf "01" bei Preisgruppe (unten links) sowie auf dem Text
"Großabnehmer" (unten rechts):
Das heißt, aus Tabelle KNVV
benötigen wir das Feld KONDA und dazu aus der Texttabelle T188T den Text
VTEXT.
Das Verfahren über
F1->Technische Info funktioniert nicht in allen SAP-Transaktionen, da
manchmal nicht direkt die Datenbankfelder angezeigt werden, sondern eine
Zwischentabelle benutzt wird. In diesem Fall ist z.B. der Datenbanktrace
ST01 eine Möglichkeit, die Tabellen ausfindig zu machen.
Zum Lesen der Daten
haben wir zwei Möglichkeiten:
-
Datenbeschaffung über die CIS ABAP Schnittstelle
- Datenbeschaffung über
die RFC Select-Schnittstelle
Der Vorteil bei dem Weg
über die CIS ABAP Schnittstelle ist, dass wir die Texte zu Preisgruppe,
Kundenschema und Preisliste gleich mitlesen können. Bei Verwendung der
RFC Select Schnittstelle könnten wir dazu entweder im SAP Data
Dictionary einen View definieren, der bereits alle Texte enthält (Join),
und diesen lesen. Dabei würden die Texte allerdings neu von der Datenbank
gelesen, obwohl sie eventuell bereits im Tabellenpuffer des
Applikationsservers stehen. Oder wir besorgen zunächst nur die
"Rohdaten" und lesen die Texte separat in VB.NET dazu. In diesem Fall
sollten wir bei den Texttabellen unbedingt den Parameter cache="yes" im
S10 Repository setzen, um zu vermeiden, dass pro Kunde drei RFC-Zugriffe
auf die Texttabellen anfallen.
Insgesamt ist der Weg über die CIS ABAP Schnittstelle unproblematischer:
VB.net
' Report Pricing
Public Function CreateReportPricing(ByVal keys _
As Dictionary(Of String, String), _
ByVal id As String, ByVal customernumbers() As String, _
ByVal customernames() As String) As String
' We use CIS addon ABAP function to read the VIS statistics S667
' Clear input/output
rfc_input.Clear()
rfc_output.Clear()
' Build up input
Dim s As addonsimplestring =_
DirectCast(rfc_input.AddNew(), addonsimplestring)
s.content = GetItem(keys, "VKORG")
s = DirectCast(rfc_input.AddNew(), addonsimplestring)
s.content = GetItem(keys, "VTWKU")
s = DirectCast(rfc_input.AddNew(), addonsimplestring)
s.content = GetItem(keys, "SPART")
' following parameters: customer numbers
For Each cn As String In customernumbers
s = DirectCast(rfc_input.AddNew(), addonsimplestring)
s.content = cn
Next
' Request data
ic.RfcRequest("CISADDON.PRICING", "S", rfc_input, _
rfc_output, deferred:=True)
' execute all requests (one only in our case)
ic.RfcExecuteDeferredCalls(rfcmessages)
|
In der ABAP-Routine erhalten wir die Organisationsschlüssel VKORG, VTWEG,
SPART und anschließend alle selektierten Kundennummern. Es ist nun
aus Performance-Gründen wichtig, nicht pro Kundennummer einen separaten Select-Zugriff
abzusetzen, sondern in einem einzigen Select alle Kundennummern
anzufordern. Dazu nutzen wir die Option "for all entries in table" der
ABAP Select-Anweisung.
Die gesamte ABAP-Routine
sieht dann wie folgt aus:
ABAP
* Pricing
* In
* 1 VKORG
* 2 VTWEG
* 3 SPART
* 4 KUNNR and following: customer numbers
*
* Out
* KUNNR KONDA KONDATEXT KALKS KALKSTEXT PLTYP PLTYPTEXT
form PRICING tables reqparm resparm changing rc type c msg type c.
data: wa(8000).
data: vkorg like knvv-vkorg,
vtweg like knvv-vtweg,
spart like knvv-spart.
Read Table reqparm index 1 into vkorg.
Read Table reqparm index 2 into vtweg.
Read Table reqparm index 3 into spart.
Read Table reqparm index 4 into wa.
* Customer numbers
data: begin of customers occurs 10,
kunnr like kna1-kunnr,
end of customers.
Data: k type i value 4.
Read Table reqparm index k into customers-kunnr.
While sy-subrc EQ 0.
Append customers.
k = k + 1.
Read Table reqparm index k into customers-kunnr.
Endwhile.
* no customers?
if customers[] is initial.
exit.
endif.
* Result tables
data: begin of r1 occurs 10,
kunnr like knvv-kunnr,
konda like knvv-konda,
kalks like knvv-kalks,
pltyp like knvv-pltyp,
end of r1.
Select kunnr konda kalks pltyp
from knvv
into corresponding fields of table r1
for all entries in customers
where vkorg = vkorg
and vtweg = vtweg
and spart = spart
and kunnr = customers-kunnr.
sort r1.
Data: kondatext like t188t-vtext,
kalkstext like tvkdt-vtext,
pltyptext like t189t-ptext.
Loop at r1.
kondatext = ''.
kalkstext = ''.
pltyptext = ''.
Select single vtext from t188t into kondatext
where spras = sy-langu and konda = r1-konda.
Select single vtext from tvkdt into kalkstext
where spras = sy-langu and kalks = r1-kalks.
Select single ptext from t189t into pltyptext
where spras = sy-langu and pltyp = r1-pltyp.
* output result
Concatenate
r1-kunnr
r1-konda
kondatext
r1-kalks
kalkstext
r1-pltyp
pltyptext
into wa separated by cl_abap_char_utilities=>horizontal_tab.
Append wa to resparm.
Endloop.
Endform.
|
|