Inhalt



 

Der Bericht "Preisfindung" zeigt für die auswählten Kunden die Daten zur Preisfindung an.

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.
Layout

Die Ausgabetabelle bauen wir in VB.NET als HTML-String auf, wobei über CSS die Angaben für Fonts, Abmessungen, Farben etc. gesetzt werden. Ein typischer Ausschnitt aus dem VB.NET Coding:
 
VB.net
 For Each line As addonsimplestring In rfc_output

            Dim fields() As String = line.content.Split(vbTab)

            kunnr = fields(0)
            konda = fields(1)
            kondatext = fields(2)
            kalks = fields(3)
            kalkstext = fields(4)
            pltyp = fields(5)
            pltyptext = fields(6)


            sb.Append("<div style='width:740px; 
                         font-size:13px; margin-left:8px; clear:both;'>")

            ' customer nr
            sb.Append("<div class='outputcelldiv'  
                            style='text-align:left; width:80px;'>")
            AppendString(sb, kunnr.TrimStart("0"))
            sb.Append("</div>")


            ' customer
            sb.Append("<div class='outputcelldiv'  
                             style='text-align:left; width:220px; 
                                margin-right:4px; text-overflow: ellipsis;'>")
            AppendString(sb, customername(kunnr, customernumbers, customernames))
            sb.Append("</div>")


            ' konda
            sb.Append("<div  class='outputcelldiv'  
                               style='text-align:left; width:150px;'>")
            AppendString(sb, konda & " " & kondatext)
            sb.Append("</div>")

            ' kalks
            sb.Append("<div  class='outputcelldiv'  
                               style='text-align:left; width:120px;'>")
            AppendString(sb, kalks & " " & kalkstext)
            sb.Append("</div>")


            ' pltyp
            sb.Append("<div  class='outputcelldiv'  
                               style='text-align:left; width:150px;'>")
            AppendString(sb, pltyp & " " & pltyptext)
            sb.Append("</div>")

            sb.Append("</div>")


        Next


Zusatzparameter

Keine Zusatzparameter.