Ziel: Fertigungsauftrag anzeigen

Fertigungspläne sind ein wesentlicher Bestandteil der Produktionsplanung und -steuerung. Da nicht immer alle Materialien vorrätig sind, wird durch das Anlegen eines Kundenauftrags unter Umständen auch ein Fertigungsauftrag angestoßen. Die Informationen über diesen Fertigungsauftrag sollen in diesem Beispiel als Addon für CIS mobile verfügbar gemacht werden.


Aufgeklappte Details zu einem Fertigungsauftrag
Schritt 1: Platzhalter für Addons anzeigen

Aktivieren Sie in den Einstellungen die Testausgabe für Addons und navigieren Sie anschließend an die Stelle in CIS mobile, an der später Zusatzinformationen angezeigt werden sollen. In diesem Beispiel ist dies die Detailansicht einer Position eines Kundenauftrags. Die Platzhalter in orange stehen für Informationen, die ohne Aufklappen durch den Benutzer sichtbar sind. Wir möchten jedoch dem Benutzer die Möglichkeit bieten, Details zu einem ggf. vorhandenen Fertigungsauftrag anzufordern und zwar nur dann, wenn auch tatsächlich ein solcher Auftrag existiert. Wir werden daher eine Methode "BuildOrderPositionButtons2" in dem VB.net-Projekt "s10cisaddon" implementieren.


Platzhalter für Addons aktivieren


Stellen für mögliche neue Addons


Schritt 2: Schlüssel für die Abfrage prüfen

Klicken Sie auf einen der farbigen Platzhalter, um alle an dieser Stelle verfügbaren Schlüssel und deren aktuelle Werte anzuzeigen. Für die Abfrage aus dem SAP-ERP benötigen wir vor allem die Auftragsnummer (VBELN), die Position (POSNR) und natürlich die Kundennummer (KUNNR). Diese sind, wie wir gleich sehen werden, in VB.net in einem dictionary-Objekt verfügbar.


Für den Fertigungsautrag benötigte Schlüssel

Schritt 3: Methode in VB.net implementieren

Die Methode in VB.net, deren Name sich nach dem zu ersetzenden Platzhalter richtet, hat folgenen Methodenkopf:

VB.net
 ' Position to Order Addon 
    Public Function BuildOrderPositionButtons2 _
       (ByVal keys As Dictionary(Of String, String), _ 
	ByRef buttons As String) As String

Durch das dictionary-Objekt "keys" können wir auf die in Schritt 2 erwähnten Schlüssel-Wertepaare zugreifen. Der Textstring "buttons" wird verwendet, um dem Benutzer weitere Möglichkeiten zum Aufklappen von Zusatzinformationen, in diesem Beispiel sind das die Komponenten und Vorgänge eines Fertigungsauftrages, anzubieten.
Schritt 3.1: Existiert ein Fertigungs- auftrag zum gewählten Kundenauftrag?

Um zu überprüfen, ob ein Fertigungsauftrag zum Kundenauftrag existiert, können wir die Tabelle "AUFK" lesen: Auftragsstammdaten. Dazu legen wir in S10-Repository eine Klasse "aufk" an, die wir auch automatisch aus dem SAP-ERP generieren lassen können. Nach einem Klick auf "generieren" kann die generierte .vb Datei in das Addonprojekt aufgenommen und dort verwendet werden. Es muss hierbei allerdings noch er Assemblyname angepasst werden, da das Addonprojekt eine eigenständige DLL ist, die in CIS mobile angesprochen wird.


Tabellen/Views anzeigen mit SE11



Klassen generieren mit dem S10 Repository



Die Klasse für "s1cisaddon.sln" vorbereiten



Objekt vom Typ "aufk" im Repository definieren


Wir verwenden das S10 Repository, um das Objekt anzulegen. Dass es mehrere Fertigungsaufträge zu einem Kundenauftrag gibt, ist eher unwahrscheinlich. Trotzdem verwenden wir einen "folder", der mehrere Objekte des Typs enthalten kann, und zählen die Elemente nach der Abfrage.

VB.net
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
        ' where-condition for SAP Select
        Dim where As String = ""
        where &= " KDAUF = '" & _
                    GetItem(keys, "VBELN").PadLeft(10, "0") & "'"
        where &= " AND KDPOS = '" & GetItem(keys, "POSNR") & "'"


        productionorders.Clear()
        productionorders.RfcDatabaseSelect(where)

        ' Check, if production order is available 
        ' Yes? Then create (+) button    
        If productionorders.Count > 0 Then

            ' Texts from addon.texts.txt
            Dim buttonText As String = ic.MessageText("PORD")
            Dim processingMessage As String = _
                            ic.MessageText("PORD_MSG1")

            'Define (+)Button 
            buttons = "ProductionOrder|" & buttonText & _
                        "|" & processingMessage

        End If

Zu Beginn wird das statement für die select-Abfrage festgelegt. Anschließend wird in Zeile 8 die Abfrage für die Tabelle "aufk" aufgerufen. Wir zählen die gelieferten Elemente und erstellen nur im Fall n>0 den Textstring, der dafür sorgt, dass ein (+) Symbol zum Aufklappen der Informationen zum Fertigungsauftrag angezeigt wird.

Da die Bezeichnung des Aufklappbuttons in CIS mobile sprachabhängig sein soll, lesen wir den Text zur Laufzeit entsprechend einer ID aus dem Repository (Zeile 15).

Bemerkung: Die Auftragsnummer wird in der Tabelle AUFK in der Spalte KDAUF gespeichert und muss 10-stellig sein. Daher wird VBELN ggf. mit führenden Nullen aufgefüllt.
Empfehlenswert: Passenden Index anlegen

Zur Beschleunigung der Datenselektion aus der Tabelle AUFK empfiehlt sich die Verwendung eines Index, der nur die für das Add-on benötigten Felder enthält. Legen Sie den Index in der Transaktion SE11 an.


Neuen Index erstellen für Tabelle AUFK
Ergebnis von Schritt 3.1

Das Symbol zum Aufklappen der Details zu einem Fertigungsauftrag ist jetzt nur bei Position 20 ("Pumpe"), nicht aber bei Nr. 10 ("Kabinentür") vorhanden.
Im nächsten Schritt werden wir dafür Sorge tragen, dass auch beim Aufklappen die richtigen Informationen zum jeweiligen Fertigungsauftrag erscheinen.


Das neue Add-on wird farblich hervorgehoben


Schritt 4: Details zum Fertigungsauftrag

In Schritt 3.1 hatten wir die Möglichkeit zum Aufklappen von Zusatzinformationen für den Fertigungsauftrag definiert durch:

VB.net
            'Define (+)Button 
            buttons = "ProductionOrder|" & buttonText & _
                       "|" & processingMessage

Wir müssen daher nun eine Methode "BuildProductionOrder" in VB.net implementieren, die die Daten zum Fertigungsauftrag aus dem ERP-System ausliest und in Form von HTML aufbereitet.

Schauen Sie sich am besten den Beispielcode im mitgelieferten Projekt an, die Vorgehensweise ist grundsätzlich die gleiche wie in Schritt 3.1: Eine where-Bedingung wird definiert und damit ein select-Aufruf an das ERP-System geschickt. Anschließend werden die zurückgelieferten Daten in HTML eingearbeitet und dieses von der Methode zurückgegeben.

Eine Besonderheit stellt jedoch folgender Aufruf innerhalb der Methode dar, der einen Zugriff auf Daten im ERP mittels der SAP GUI Scripting Schnittstelle durchführt:

VB.net
        ' read some values with sapgui-scripting
        Dim dic As New Dictionary(Of String, String)
        ReadWithSapGui_ProductionOrder(productionorder.aufnr, dic)

Diesen werden wir im nächsten Schritt etwas genauer betrachten.

Schritt 4.1: SAP GUI Scripting Schnittstelle verwenden

Wir setzen im Beispiel voraus, dass die SAP GUI Scripting Schnittstelle bereits richtig installiert und konfiguriert ist. Schauen Sie ggf. in die Einstellungen von CIS mobile, und testen Sie die Verbindung zum SAP-System mit dem S10 Repository.
Details finden Sie in dem Installationsleitfaden.

Die Benutzung der Schnittstelle ist nun denkbar einfach: Nach einem erfolgreichen Logon (Zeilen 7 bis 10) können Transaktionen gestartet und Feldinhalte (und auch ganze Tabelleninhalte) ausgelesen werden.

Tipp: Oft befinden sich die gesuchten Daten auf unterschiedlichen Reitern. Diese können Sie ebenfalls durch Angabe eines Transaktionscodes ansprechen. Nutzen Sie z.B. das Aufzeichnungswerkzeug für InputScripte von GuXT, um die entsprechenden Tcodes zu ermitteln.

Bemerkung: Der Zugriff mit dieser Methode ist in der Regel langsamer als mit RFC-Aufrufen. Die Prüfung von Berechtigungen entfällt jedoch, da ja eine richtige Benutzersession stattfindet. Auch Meldungen bzw. Fehlermeldungen werden an CIS mobile weitergereicht und in der Webanwendung angezeigt.

VB.net
   Public Sub ReadWithSapGui_ProductionOrder(ByVal AUFNR As String, _ 
      ByRef dic As Dictionary(Of String, String))

        'SAP-Connectionsettings saved in config-textfile
        ReadSapSettings()

        'Logon to SAP-GUI
        If addon.sapgui Is Nothing Then
            addon.sapgui = New sapguisession(sapconnect, _
                     sapconnectclient, sapconnectuser, _ 
            sapconnectpassword, ic.Session.Language)
            addon.sapgui.Logon()
        End If

        Dim sapgui As sapguisession = addon.sapgui

        ' Start transaktion CO03
        sapgui.Enter("/nCO03")

        ' Enter number of productionorder
        sapgui.SetField("CAUFVD-AUFNR", AUFNR)
        sapgui.Enter()

        'Collect some data
        dic.Add("GWEMG", sapgui.GetField("CAUFVD-GWEMG"))
        dic.Add("GASMG", sapgui.GetField("CAUFVD-GASMG")) 
        dic.Add("APROZ", sapgui.GetField("CAUFVD-APROZ")) 
        dic.Add("MIMEZ", sapgui.GetField("CAUFVD-MIMEZ")) 

        'Goto Tab "Assignment"
        sapgui.Enter("=KOAL")

        'Collect some data
        dic.Add("DISPO", sapgui.GetField("CAUFVD-DISPO"))  
        dic.Add("DSNAM", sapgui.GetField("T024D-DSNAM"))   
        dic.Add("FEVOR", sapgui.GetField("CAUFVD-FEVOR"))  
        dic.Add("T024F-TXT", sapgui.GetField("T024F-TXT"))

    End Sub
Schritt 5: Diagramm anzeigen

Im Beispiel können nicht nur Details zu dem entsprechenden Fertigungsauftrag angezeigt werden, sondern auch die zugehörigen Vorgänge sowie die Komponenten. Dazu wurden zwei weitere Aufklappbuttons definiert:

VB.net
        Dim buttonText1 As String = ic.MessageText("PORD_OPER")
        Dim buttontext2 As String = ic.MessageText("PORD_COMP")

        Dim processingMessage1 As String = _ 
                ic.MessageText("PORD_OPERMSG")
        Dim processingMessage2 As String = _
                ic.MessageText("PORD_COMPMSG")

        buttons = "ProductionOrderOperations|" & buttonText1 &_
              "|" & processingMessage1 _
        & ",ProductionOrderComponents|" & buttontext2 & _
              "|" & processingMessage2


Hinweis: In Zeile 7 werden zwei Aufklappbuttons definiert. Dabei wird die jeweilige Definition im String durch ein Komma getrennt.


Wir möchten nun dem Benutzer noch die Möglichkeit geben, die Vorgänge anhand eines Ganttdiagramms zu prüfen. Dazu definieren wir einen weiteren Button mit Verweis auf eine Methode, die dann die Bilddatei des Diagramms mit Hilfe des ChartDirectors erstellt und an CIS mobile zurückliefert. Es kann selbstverständlich ein beliebiges anderes Tool für die Erzeugung der Grafiken verwendet werden.


VB.net
        ' Create (+)Button to show GanttDiagram
        buttons = "ProductionOrderOperationsDiagram|" & _ 
           ic.MessageText("PORD_DIAGSCHED") & "|" _ 
        & ic.MessageText("PORD_DIAGCREATE")

    'Create Ganttchart with tool ChartDirector
    Public Function BuildProductionOrderOperationsDiagram _
         (ByVal keys As Dictionary _ 
           (Of String, String), ByRef buttons As String) As String

        'Define path for imagefile
        Dim outputpath = ic.Session.RootPath + "\" + _ 
                ic.Session.TempPath + "\charts\" + ic.Session.User

        'Create path if it does not exist
        System.IO.Directory.CreateDirectory(outputpath)

        <...>


        'Let ChartDirector create the diagram-imagefile
        Dim img As System.Drawing.Image
        img = c.makeImage()

        'Save image to disk
        img.Save(outputpath + "\" + "diagram_" + timestamp +_
           ".png", _ 
        System.Drawing.Imaging.ImageFormat.Png)

        ' Create img-tag in html-code 
        Dim htmlstring As String = ""
        htmlstring = "<img alt='' src='../../../" + _
             ic.Session.TempPath + "/charts/" _
        + ic.Session.User + "/diagram_" + timestamp + ".png'>"

        Return htmlstring


    End Function

Ergebnis von Schritt 5



Keine Pufferzeiten in diesem Fall