|
In zahlreichen SAP Transaktionen wird ein “table control” verwendet, um Daten in tabellarischer Form anzuzeigen oder eingeben zu lassen. Mit dem InputAssistant können Sie eigene Spalten in einem “table control” hinzufügen, und zwar sowohl zur Anzeige von Informationen als auch zur Dateneingabe. Die in den eigenen Spalten eingegebenen Werte können in einem InputScript verarbeitet werden. |
Die Anzeige von Daten in eigenen Tabellenspalten ist nicht allzu schwierig, während die Dateneingabe mehr Aufwand erfordert. Wir beschäftigen uns im ersten Teil des Tutorials mit der Anzeige, im zweiten mit der Dateneingabe. Unsere Beispielanwendung zur Anzeige ist folgende: In Transaktion VA01 (Auftragserfassung) wollen wir eine neue Drucktaste “Anzeigen Daten vorhergehende Bestellung” anbieten, über die der Benutzer drei neue Spalten einblenden kann. In den neuen Spalten werden pro Material der neu erfassten Bestellung einige Daten der vorhergehenden Bestellung des jeweiligen Materials durch den gleichen Kunden angezeigt: jeweils bestellte Menge, Datum und Auftragsnummer. Wir rufen dazu pro Bestellposition ein BAPI auf und füllen unsere Spalten mit den zurückgelieferten Werten. Die nachfolgenden Bilder zu diesem Beispiel wurden in einem SAP ERP 2004 IDES System unter Verwendung von SAP GUI 7.1 erstellt. Sie können die Skripte aber ohne Änderung auch in diversen anderen SAP Releaseständen verwenden, zum Beispiel in einem 4.6C System mit SAP GUI 6.20 or 6.40.
Zur Implementierung gehen wir am besten in zwei Schritten vor. Als erstes realisieren wir die Anzeige der zusätzlichen Spalten über eine Drucktaste: // GuiXT Script SAPMV45A.D4001.TXT // nur für Transaktion VA01, Reiter Verkauf // Drucktaste am Ende der Tabelle anzeigen, rechts neben dem Button “Liefergruppenkorrelation APO” (nur als Ikone angezeigt) // drei neue Spalten hinzufügen endif
Die beiden InputScripte sind sehr einfach; sie setzen nur die Variable zur Anzeige der Spalten: // InputScript VA_show_cols // InputScript VA_hide_cols
Man kann die Spalten auch mit einer geeigneten Ikone hervorheben, zum Beispiel so:
Hierzu verwenden wir (wie generell bei Textelementen möglich) die Notation “@xx@text…” wobei xx die SAP Ikonen-Id ist. // Hinzufügen dreier neuer Spalten mit Ikonen Nun fehlen uns nur noch die Daten in den neuen Spalten. Jeder Zelle in den neuen Spalten ist eine Variable zugeordnet, deren Name sich aus dem durch “name=” angegebenen Namen, einem Punkt sowie der Zeilennummer ergibt. Beispiel: Zeile1: V[VA_pq.1] V[VA_pd.1] V[VA_po.1] Dabei bezieht sich der Zeilenindex auf die gesamte Tabelle, nicht nur auf den gerade angezeigten Bereich. Falls der Benutzer zum Beispiel in der Tabelle auf Zeile 4 vorwärtsgeblättert hat, sind nur die oben blau dargestellten Zeilen sichtbar, und die Variablennamen im angezeigten Bereich beginnen mit Zeile 4. Zum Füllen der Spaltenvariablen sind zwei verschiedene Vorgehensweisen möglich. Entweder füllt man die Variablen für sämtliche Zeilen, auch für die gerade nicht sichtbaren, zu Beginn der Transaktion. Man muss dann beim Blättern durch die Tabelle nichts mehr tun. Das funktioniert allerdings nur, wenn sich der Inhalt der Tabelle in der Transaktion nicht ändern kann. In unserem Fall (VA01) brauchen wir ein anderes Verfahren, da die Materialnummer jederzeit überschrieben werden kann, und auch Zeilen gelöscht oder eingefügt werden können. In solchen Fällen ist es am besten, nur den jeweils sichtbaren Bereich der Tabelle (also den o Hierzu benötigen wir eine Schleife über den sichtbaren Bereich der Tabelle: // Alle sichtbaren Tabellenzeilen verarbeiten Set V[i] 1 // Zeilennummer in der Anzeige label prev_order_beg // Zeile gefüllt? // Die angezeigte Zeile i verarbeiten. Die absolute Zeilennummer ist k … Set V[colvar.&V[k]] “…neuer Wert…” // nächste Zeile label prev_order_end Innerhalb dieses Rahmens müssen wir jetzt noch die eigentlichen Daten lesen. Hierzu rufen wir pro Zeile die Funktion “BAPI_SALESORDER_GETLIST” auf. Die EIngabeparameter für das BAPI sind die Kundennummer, die Materialnummer und der Vertriebsbereich. Das BAPI liefert eine Tabelle mit den vorhergehenden Bestellungen dieses Materials zurück, absteigend sortiert nach Datum. Aus der ersten Tabellenzeile können wir daher die gewünschten Daten entnehmen. Das ganze Skript sieht damit wie folgt aus: / GuiXT Script SAPMV45A.D4001.TXT // nur für Transaktion VA01, Reiter Verkauf // Drucktaste am Ende der Tabelle anzeigen, rechts neben dem Button “Liefergruppenkorrelation APO” (nur als Ikone angezeigt) // drei neue Spalten hinzufügen // Alle sichtbaren Tabellenzeilen verarbeiten Set V[i] 1 // Alte Werte löschen Set V[customer] “&F[Auftraggeber]“ label prev_order_beg // Zeile gefüllt? Set V[matnr] “&cell[Alle Positionen,Material,&V[i]]” // über SAP BAPI vorhergehende Bestellungen lesen // die erste Zeile enthält die jüngste Bestellung if Q[ok] // andernfalls hat der Kunde das material noch nie bestellt // gewünschte Felder in unsere Spaltenvariablen übertragen // “Menge”: Das BAPI liefert sie in “dezimal gepacktem” Format mit 3 Nachkommastellen // “Datum”: Wird im Format YYYYMM geliefert, wir machen DD.MM.YYYY daraus // “Auftragsnummer”: mit führenden Nullen geliefert, die wir über eine Rechenoperation entfernen endif Set V[i] &V[i] + 1 label prev_order_end endif // V[VA_show_cols] endif // VA01 + page=Verkauf
Unser zweites Beispiel behandelt die Dateineingabe in zusätzlichen Tabellenspalten. In Transaktion ME51N (Bestellanforderung anlegen) wollen wir das Feld “Einkaufsorganisation” als neue Tabellenspalte anbieten. Im Standard ist die Eingabe der Einkaufsorganisation im Detailbild der Bestellposition auf dem Reiter “Bezugsquelle” möglich, erfordert also jeweils die Auswahl der Position und in der Detailansicht eventuell den Klick auf den richtigen Reiter. Bemerkung: In relativ neuen SAP Systemen (z.B. SAP ERP2004 and höher) kann der Benutzer über die Drucktaste “Pers. Einstellungen” entweder ein “grid control” oder ein “table control” auswählen . Nur im “table control” ist die hier vorgestellte Technik anwendbar. In dem GuiXT Script fragen wir daher als erstes ab, ob überhaupt eine Tabelle angezeigt wird.
Mit der neu eingefügten Spalte “EOrg” wird die Eingabe der Einkaufsorganisation unmittelbar in der Tabelle ermöglicht:
Transaktion ME51N besitzt einige Besonderheiten, verglichen mit anderen SAP Transaktionen:
Eine weitere Schwierigkeit, die auch in zahlreichen anderen Transaktionen auftritt, besteht darin, dass der Benutzer auch nach F3, F12 oder F15 (Zurück, Abbrechen, Beenden) noch in einem Popup-Bild “Sichern” kann. Auch in diesem Fall soll unser InputScript ablaufen, das die Werte aus der Spalte “EOrg” in das Eingabefeld im Detailbild der jeweiligen Position einträgt. Beginnen wir mit dem GuiXT Script: if Q[Transaction=ME51N] // nur falls Tabelle sichtbar ist (könnte durch Benutzer ausgeblendet sein, oder “grid control” aktiviert) // Tabelle noch leer? Dann alle Variablen zurücksetzen if V[fvr=1] // Zusatzspalte mit Bezug auf Positionsnummer // Merken Zusatzspalte aktiv
// Zusatzspalte aktiv? sonst Skript beenden // Eingabefeld im Detailbild ausblenden, sonst müssen Tabelle und das Eingabefeld synchron gehalten werden // bei Sichern eigenes InputScript aufrufen // bei Prüfen ebenfalls // falls der Benutzer die Transaktion verlässt, das Popup abfangen endif Einige Erläuterungen zu dem Skript:
Das “ME51N_D_leave.txt” Script wartet in dem Popup auf eine Benutzereingabe, um bei Anwahl von “Sichern” das eigene InputScript zu starten: // InputScript “ME51N_D_leave.txt” // popup “Soll der erfasste Beleg vorher gesichert werden?” Wir starten bei “Ja” im Popup ebefalls das Sichern-Skript und setzen den Parameter POPUP = “X”. Das Sichern-Skript bricht dann zunächst das Popup ab und läuft anschliessend so ab wie bei “Sichern” im Hauptbild. Im “Sichern”-Skript wird geprüft, ob die Positionstabelle und das Detailbild geöffnet sind. Das Detailbild wird am Ende wieder geschlossen, falls es durch das InputScript geöffnet wurde, damit der Benutzer bei der “Prüfen” Funktion in der vollen Tabellenanzeige bleiben kann. // InputScript “ME51N_D_save.txt” // Den automatischen Neuaufruf der Transaktion bei Fehlern abschalten, sonst würden die eingegebenen Daten verloren gehen // Merken ob das InputScript das Detailbild selbst öffnen musste // Vom Popup gestartet? // Während der Verarbeitung des InputScript soll ein entsprechender Titel sichtbar sein Screen saplmegui.0014 // Positionstabelle aufgeklappt? Screen saplmegui.0014 label Pos_table_open // Zeilenindex // Positionsdetails aufgeklappt? // Positionsdetails aufklappen Screen saplmegui.0014 label position_details_open GetTableAttribute T[Table] FirstVisibleRow=FVisZeile if V[FVisZeile=1] // Auf erste Zeile positionieren label new_screen Screen saplmegui.0014 label scroll_beg_done GetTableAttribute T[Table] FirstVisibleRow=FVisZeile LastVisibleRow=LVisZeile LastRow=LastRow label new_Zeile // Ende der Tabelle? // keine weiteren Zeilen mehr in der Anzeige? Set V[Pos] “&cell[Table,Requisn. Pos,&V[relRow]]” Set V[ME51N_EKORG] “&V[ME51N_EKORG.&V[Pos]]” // keine neue Eingabe in der EOrg-Spalte?? // Eingabe sichern für spätere Vergleiche // Set cursor into Zeile and choose detail view Screen SAPLMEGUI.0014 if F[EinkOrganisation] // Auf Reiter “Bezugsquelle” wechseln Screen SAPLMEGUI.0014 label screen_EKORG Set F[EinkOrganisation] “&V[ME51N_EKORG]“ label end_of_table // Detailbild im InputScript aufgeklappt? // Detailbild zuklappen Screen SAPLMEGUI.0014 label screen_collapse_done // Sichern oder Prüfen? // Aus Popup gestartet? sonst sind wir jetzt fertig
// Transaktion verlassen // Falls Popup nochmal erscheint: nicht Sichern, ist ja schon durchgeführt
Noch einige Erläuterungen zu “Goto” und “Label” in einem InputScript: Bei der Verwendung von “goto” und “label” muss man beachten, ob das “label” vor oder nach einer “Screen”-Anweisung gesetzt wird. Bei den folgenden beiden Varianten ist (1) richtig, (2) dagegen falsch: (1) Screen saplmegui.0014 Screen saplmegui.0014 (2) Screen saplmegui.0014 label item_table_open In der zweiten Variante (label vor Screen) wird kein “Enter” durchlaufen für die erste “Screen” Anweisung. Das InputScript zeigt dann den Screen einfach an und wartet auf eine Benutzereingabe, statt automatisch weiterzulaufen. EIn anderer möglicher Fehler wäre, die Screen Anweisung in if..endif einzuschliessen: Screen saplmegui.0014 // Positionstabelle aufklappen Screen saplmegui.0014 Nach diesen negativen Beispielen noch eine korrekte Alternative: Wir verwenden “goto“, um jeweils zu der gleichen Screen Anweisung zurückzuspringen, nachdem wir über einen Funktionscode die Tabelle oder die Detailsicht aufgeklappt haben: … Screen saplmegui.0014 // Positionstabelle aufg // Positionsdetails aufgeklappt? GetTableAttribute T[Table] FirstVisibleRow=FVisRow // auf erste Zeile positionieren label new_screen Screen saplmegui.0014 label scroll_beg_done … Hier ist es wichtig, das Label “main_screen” vor die Screen Anweisung zu setzen. Falls es hinter der Screen-Anweisung steht, fährt GuiXT nach dem Enter mit der Verarbeitung fort und durchläuft ein weiteres Enter. Mehr als ein Enter pro Screen macht aber keinen Sinn; es führt zu einer GuiXT-Fehlermeldung und das erste Enter wird verschluckt. Generell gilt daher die Regel, pro Screen höchstens einmal ein Enter abzusetzen, und in der Regel auch genau einmal. Nur in den folgenden beiden Fällen macht eine Screen-Anweisung ohne Enter Sinn: Entweder wenn man in einem Popup-Screen auf die Eingabe des Benutzers warten will und dann im InputScript weitermacht, wie wir es in “ME51N_D_leave.txt” benutzt haben. Oder (ein sehr spezieller Fall), wenn man über “ApplyGUIScript” ein VBScript-Programm aufruft, das seinerseits eine “Enter”-Aktion enthält, also z.B. einen Pushbutton drückt.
|
|