Inhalt


 

Der Bericht "Fakturavorrat" zeigt für die auswählten Kunden den auftragsbezogenen Fakturavorrat (SAP Transaktion VF04).

 

Datenbeschaffung

Im SAP-System wird der Fakturavorrat in Transaktion VF04 als "ALV Grid" angezeigt:

Eine Möglichkeit, die Werte des Grid zu lesen, ist die Funktion "GridToTable" der SAP GUI Scripting Schnitstelle in CIS mobile. Das geht analog wie Schritt 4.01 in der Beschreibung Add-on Fertigungsauftrag.

Wir verwenden hier eine andere Methode. die etwas schneller ist. Über System->Status in Transaktion VF04 sehen wir, dass das ALV Grid durch den SAP-Report "SDBILLDL" aufgebaut wird:

Wir starten aus VB.NET diesen Report und erhalten die Daten des ALV Grid als Texttabelle zurück, in der die einzelnen Spalten durch "|" getrennt sind:

VB.net
' Report Billing
    Public Function CreateReportBilling_
            (ByVal keys As Dictionary(Of String, String), _
             ByVal id As String, _
             ByVal customernumbers() As String, _
             ByVal customernames() As String) As String

        ' We use ABAP report SDBILLDL 
        '  to display billing data (ALV Grid VF04)

        ' Clear input/output
        rfc_input.Clear()
        rfc_output.Clear()


        ' Build up input
        For Each knr As String In customernumbers
            add_report_selection(rfc_input, "P_KUNNR", knr, knr)
        Next


        Dim vkorg As String = GetItem(keys, "VKORG")
        Dim vtweg As String = GetItem(keys, "VTWKU")
        Dim spart As String = GetItem(keys, "SPART")

        add_report_selection(rfc_input, "P_FKDAT", "")
        add_report_selection(rfc_input, "P_FKDAB", "")
        add_report_selection(rfc_input, "P_VKORG", vkorg)
        add_report_selection(rfc_input, "S_VTWEG", vtweg, vtweg)
        add_report_selection(rfc_input, "S_SPART", spart, spart)
        add_report_selection(rfc_input, "P_ALLEL", "X")
        add_report_selection(rfc_input, "P_ALLEA", "X")


        ' Request report via RFC
        ic.RfcRequest("SDBILLDL", "R", rfc_input, rfc_output)

Der Text zur Fakturaart, also zum Beispiel "Rechnung (F2)", ist nicht als Spalte im ALV Grid enthalten. Wir lesen deshalb über die RFC Datenbankschnittstelle aus Tabelle TVFKT den Text für die Anzeige noch hinzu. Da hierfür viele einzelne Zugriffe anfallen, ist es wichtig, durch den Parameter dbcache="yes" im S10 Repository die Tabelle TVFKT zu puffern (siehe nächster Abschnitt).

                    ' read billing type text via SAP Select
                    vtext = ""
                    saptvfkt.fkart = fkart
                    If saptvfkt.ic.RfcDatabaseRead() Then
                        vtext = saptvfkt.vtext
                    End If

Performance

Im S10 Repository steht Ihnen über Runtime->Trace eine oft nützliche Trace-Funktion zur Verfügung. Sie zeigt bei Reportaufrufen die Selektionsparameter und die verbrauchte Zeit:

Ebenso alle Datenbankzugriffe der RFC Select Schnittstelle. Wir haben sie im CIS mobile Testsystem in verschiedenen Konstellationen gemessen:

  • Nr 1 mit dbcache="yes" für Tabelle addontvfkt
  • Nr 2 ohne Cache, mit CIS mobile und SAP Applikationsserver auf gleichem Rechner
  • Nr 3 ohne Cache, auf entfernten Rechnern (Internet-Verbindung)<
  • Nr 4 ohne Cache, gebündelte Zugriffe auf entfernten Rechnern (Internet-Verbindung), Details dazu siehe unten
  1   2
  3   4

Falls man Daten dazu lesen möchte, die nicht im Cache gehalten werden können und mit vielen Einzelzugriffen zu rechnen ist, kann man zunächst alle Schlüssel sammeln und dann die Zugriffe gebündelt absetzen.

Das VB.NET Coding ist für diesen Fall etwas anspruchsvoller, hier die dafür relevanten Teile:

VB.net
 
       ' ....
 
       ' VB.NET dictionary object for billing types and texts
        Dim ftexts As New Dictionary(Of String, addontvfkt)

        ' flag to skip column header line of ALV grid
        Dim columnheader As Boolean = True

        ' collect all billing types
        For Each line As addonsimplestring In rfc_output

            Dim fields() As String = line.content.Split("|")

            If fields.Length > 8 Then

                If columnheader Then
                    columnheader = False
                Else

                    Dim loc_fkart As String = fields(5).Trim
                    If Not ftexts.ContainsKey(loc_fkart) Then
                        Dim tvfkt As New addontvfkt
                        tvfkt.fkart = loc_fkart
                        tvfkt.ic.RfcDatabaseRead(deferred:=True)

                        ' add to dictionary
                        ftexts.Add(loc_fkart, tvfkt)

                    End If
                End If
            End If

        Next

        ' read texts for all billing types
        ic.RfcExecuteDeferredCalls(rfcmessages)



        ' .... 

         For Each line As addonsimplestring In rfc_output

            ' .... 
   
            ' read billing type text from dictionary object 
            vtext = ftexts.Item(fkart).vtext
            
             ' .... 
         Next

In unserem Beispiel werden nur zwei Zugriffe gebündelt abgesetzt (siehe Trace 4 oben), da nur "F2" und "BV" als Fakturatypen vorkommen.

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. Das Coding ist analog dem Beispiel Umsätze.

 
Zusatzparameter

Keine Zusatzparameter.