Eingabe-Dynpro für Tabelleneinträge

Intension

Eine Kundeneigene Tabelle wird benötigt, um für eine Ausgabenplanung die nötigen Daten zu vor zu halten. Über  ein Pflegedynpro sollen die Daten eingepflegt werden.In einem ersten Ansatz wurde hier der SAP eigene Tabellenpflegegenerator bemüht. Nach relativ kurzer Zeit stellte sich aber heraus, dass die Realisierung von letzten Feinheiten nur noch sehr schwer oder gar nicht möglich war. So konnte die Ansicht des tabellenartigen Einstiegsdynpro nicht durch den Benutzer beeinflusst werden. Auch die Sperrung der kompletten Tabelle war eher störend.Daher habe ich mich entschieden, das Pflegedynpro vollständig selbst zu entwickeln. In diesem kleinen Projekt stecken einige Nettigkeiten die ich an dieser Stelle veröffentlichen will.
Weiterlesen

Datei einlesen und als IDocs verarbeiten

Verwendung des IDoc als periodische Schnittstelle als Hintergrundjob einplanen.

Am Beispiel: Aus den Exportdaten eines Subsystems soll eine Bedarfsanforderung erstellt werden. Es ist eine eine Datei im Filesystem vorhanden die eingelesen und zu IDocs verarbeitet werden soll. Anschließend werden die erzeugten IDocs weiter verarbeitet.

Weiterlesen

Nachrichtenart für Bestellung einrichten

Beispiel: Nachrichtenart ZMAL für Bestellung per email eingerichtet.

Transaktion MN04 – Nachricht für Bestellung anlegen – muss in jedem System ausgeführt werden.

clip_image002

clip_image004

clip_image006

clip_image008

Customizingpfad:

Materialwirtschaft -> Einkauf -> Nachrichten -> Ausgabesteuerung ->

clip_image010

è Nachrichtenarten für Bestellung festlegen -> Nachrichtenarten für Bestellung pflegen

clip_image012

clip_image014

clip_image016

clip_image018

clip_image020

è Feinsteuerung Bestellung

clip_image022

è Partnerrollen für Bestellung festlegen

clip_image024

Webservices in SAP

Webservices in SAP

Allgemeine Infos und Vorbereitung

· Funktionalität wird durch einen RFC-fähigen Funktionsbaustein bereitgestellt.
Der Baustein braucht mindestens einen Exportparameter und kann beliebig viele Importparameter haben. Auch Tabellen oder Felder können als Parameter angegeben werden.

· In der SICF muss der Webservice im Pfad
sap/bc/srt/rfc/sap/ <service Name des Webservices>
aktiviert sein. Außerdem muss, um überhaupt Webservices nutzen zu können der Service
sap/bc/srt/wsdl
ebenfalls aktiviert sein.

· Der Webservice kann von extern über einen Systemuser von SAP angesprochen werden. Dieser braucht mindestens die folgenden Berechtigungsobjekte:
SAP_BC_WEBSERVICE_SERVICE_USER
SAP_BC_WEBSERVICE_CONSUMER

· Der Webservice hat eine eindeutige URL, über die er erreichbar ist.

Wie funktioniert ein Webservice?
Ein Webservice ist im Prinzip eine Schnittstelle zwischen verschiedenen Programmen, die auf unterschiedlichen Systemen oder Plattformen betrieben werden können.
Ein Client sendet eine Anfrage an den Webservice, übergibt dabei ggf. Parameter, anhand deren der Webservice Daten zurück gibt.
Die Kommunikation geschieht über WSDL, ein auf XML basierendes Interface, was für den Betrachter nicht wirklich lesbar ist (zum Glück macht SAP das für uns).
clip_image002

Webservice aus Funktionsbaustein erstellen

Rechtsklick auf Paket, Anlegen, Enterprise Service

clip_image004

Wir wollen einen Service-Provider anlegen…

clip_image006

…dessen Funktion aus dem zuvor angelegten Funktionsbaustein kommen soll: clip_image008

Name und Beschreibung angebenclip_image010

Und im nächsten Bild dann den Funktionsbaustein auswählen.clip_image012

Nun durch „Weiter“ durchklicken, Paket und Transportauftrag angeben und schließlich auf „Fertigstellen“ klicken.

Der Webservice wird nun automatisch generiert, und verfügt über die Funktionalität des Funktionsbausteins.

Nach Aktivierung des Webservices ist dieser aber noch nicht nutzbar! Man muss erst ein sogenanntes binding im SOAMANAGER (s.u.)erstellen!

Was tun, wenn man nachträglich was am Funktionsbaustein ändert?

Verändert man nur etwas am Code, ist das egal, das übernimmt der Service dann. Fügt man jedoch Übergabeparameter hinzu, oder ändert sonst etwas an der „äußeren Erscheinung“, muss man den Webservice neu generieren. Dies tut man, indem man in der SE80 den Webservice anklickt und in den Bearbeitungsmodus geht. Dann mit Rechtsklick auf den Service, und auf Prüfen. Es wird automatisch geprüft, ob Änderungen vorliegen und wenn ja, wird abgefragt, ob die Änderung übernommen werden soll.

clip_image014

SOAMANAGER

Im SOAMANAGER administriert man seine Webservices. Aufruf ist einfach die Transaktion SOAMANAGER.

Reiter „Service_Administration“, Link „Konfiguration einzelner Services“

clip_image016

Nach dem erstellten Webservice suchen und auf „Apply Selection“ klicken.
clip_image018

Im 2. Abschnitt auf den Reiter „Konfiguration“ klicken. Hier sollte man eine leere Tabelle vorfinden. Deshalb klickt man auf „Endpunkt anlegen“ und im folgenden Popup auf Einstellungen übernehmen.
clip_image020

Nun ist es wichtig, dass man unten bei den Authentifizierungseinstellungen ein Häkchen bei „Benutzer-ID und Kennwort“ bei der Transportebene setzt und anschließend auf Sichern klickt, sonst wird das Binding/Endpunkt nicht gespeichert.

clip_image022

Erst jetzt ist der Service von extern ansprechbar. Die WSDL-URL (oder auch das ganze WSDL Dokument) kann man sich im zweiten Abschnitt unter Übersicht anzeigen lassen.
clip_image024

(Ein geeignetes Programm, um den Webservice von Extern zu testen ist soapUI
http://www.soapui.org/)

12 Monate sind keine 365 Tage!?

In diesem Beispiel wird ein Gesamtbetrag errechnet der sich auf eine bestimmte Zeitspanne bezieht. Werden hier 12 Monate angegeben, wird ein anderer Gesamtbetrag errechnet als wenn 1 Jahr zu Grunde liegt. Das ergibt sich aus der unterschiedlichen Sichtweise auf die Zeitspanne.

Systemeinstellung aus kaufmännischer Sicht:

1 Monat = 30Tage

=> 12Monate=360Tage; es fehlen demnach 5Tage im Jahr .

Beispiel:

Es wird eine Position bestellt die, für einen Monat berechnet, 3,- € kostet. Folgerichtig sollte diese Position auf ein Jahr gesehen dann (12×3,-€) 36,- € kosten. Gibt man in der Bestellposition nun 1 Jahr ein, dann wird aber der Betrag von 36,50 € berechnet – große Verwirrung!

Erklärung:

Das System rechnet hier nun :

1Jahr bestellt

Im System ist der Wert für 6Jahre = 73 Monate hinterlegt , dies ist so eingestellt, damit die Ungenauigkeit – es fehlen ja sonst für jedes Jahr 5 Tage – ausgeglichen wird.

Also resultiert hieraus für 1 Jahr = 73Monate (30 Tage) / 6Jahre = 12,166666666666666666666666666667 Monate

Dieser Wert wird nun mit dem Preis multipliziert:

12,166666666666666666666666666667Monate x 3€ = 36,50€

Hier an diesem Beispiel kann man das Rechenverhalten nachvollziehen:

Bestellt 12MON – für 3€ pro Monat = 36€

clip_image002

Wenn ich aber nun 1Jahr bestelle für 3€ pro Monat … = 36,50€

clip_image004

Erklärung:

Das System rechnet hier nun :

1Jahr bestellt

Im System ist der Wert für 6Jahre hinterlegt = 73 Monate, also

73Monate / 6Jahre = 12,166666666666666666666666666667 Monate

Dieser Wert wird nun mit dem Preis multipliziert:

12,166666666666666666666666666667Monate x 3€ = 36,50€

im Hintergrund ausgeführter Report / Ausgabe weiterverarbeiten

Wir benötigen eine Auswertung, die periodisch im Hintergrund ausgeführt werden soll und die Daten in eine Kundeneigene Tabelle schreibt. Normalerweise würden wir die Auswertelogik in ein programm packen. Da der Programmierer aber eine Menge Arbeit sparen kann, soll hier die Möglichkeit aufgezeigt werden wie man mit einen Standard-Report die ausgegebenen daten nutzen kann.

Weiterlesen

Datenbankcluster schreiben und lesen

Ein externes Auswertetool (z.B. SAS BI) soll Daten zu bestimmten Inhalten lesen die, in SAP R3, nicht in Tabellen vorgehalten werden sondern über Funktionsbausteine zusammengestellt werden müssen. Hierfür ist ein Report erstellt worden, der die Daten in ein Datenbankcluster schreibt. Es handelt sich um eine Kopie des Programms RM06EL00 (Einkaufsbelege) das um die genannte Funktion erweitert wurde.

Ein Beispiel zum befüllen eines Datenbankclusters = Anhang Cluster_1.pdf

Das Cluster hält nun die Daten in komprimierter Form in der Datenbank. Ein direktes auslesen der Tabelle macht keinen Sinn un deswegen geschieht das auslesen des Clusters hier mit einem Funktionsbaustein, der per RFC-Aufruf aus dem Fremdsystem gestartet wird und die entsprechenden Daten zurückliefert.

CALL FUNCTION ‚Z_WE_SAS‘ „DESTINATION ‚XXXXXXXX‘
EXPORTING
VARIANTE = VARIANTE
ZUVON_N = ZUVON_N
ZUBIS_N = ZUBIS_N
DATVON_M = DATVON_M
DATBIS_M = DATBIS_M
ACTION = ACTION
TABLES
LISTE = LISTE
LISTETXT = LISTETXT
CONTAINER = CONTAINER
* EXCEPTIONS
* NOT_FOUND = 1
* OTHERS = 2
.

Ein Beispiel zum auslesen eines Datenbankclusters = Anhang Cluster_2.pdf

Rahmenprogramm mit Absprung

Die Transaktionen ZME21n und ZME22n wurden eingeführt um einen eigenen Weg bei der Bestellschreibung zu beschreiten. Die Hintergründe hierzu möche ich nicht weiter erläutern, es geht nur darum, einige Möglichkeiten der Programmierung festzuhalten. Die Besonderheit besteht darin, dass hier ein Programm mit den o.g. Transaktionen gestartet wird und in Abhängigkeit verschiederner Randbedingungen Parameter gesetzt und im Speicher gehalten werden obwohl das aufrufende Programm verlassen wird. Weiterhin werden Unterprogramme mit Parameterübergabe gestartet, die nicht im Rahmenprogramm sondern in eigenen Reports vorhanden sind.


Schnittstellenprogramm über Batch-Input

Intension

Hauseigene Versorgungskräfte sind für die Pflege der Materialschränke auf verschiedenen Stationen verantwortlich. Sie sollen ständig den Vorrat auffüllen den die Stationskräfte dort entnehmen. Dazu wurde bisher händich ein Bestellformular ausgefüllt dem Lager übermittelt. Mittlerweile wurde dieses Verfahren elektronisch abgebildet. Dafür wurden sog. Handlesegeräte angeschafft die mittels Barcodescanner die erforderlichen Daten elektronisch erfassen. Damit diese Daten weiterhin automatisch in das SAP-System aufgenommen werden, wurde eine Schnittstelle entwickelt. Dabei wird eine von den Handlesegeräten erzeugte Datei über einen cronologisch laufenden Job Im SAP eingelesen und verbucht. Als Resultat stehen Reservierungen bereit die dann im Lager weiter bearbeitet werden können.

Vereinbarungen

Die Bewegungsart wird aus der Länge des Adresscodes abgeleitet.

Länge des Adcodes = 8-stellig, =>Bewegungsart = 261,

Länge des Adcodes = 9-stellig, =>Bewegungsart = 201.

Basisdatum = akt. Datum

Werk = 100 (fest vorgegeben)

Warenempfänger = Adresscode (kommt aus der Schnittstellendatei)

Kostenstelle wird abgeleitet aus dem Adresscode (Adresscode minus letzte 2 Stellen)

Material = Materialnummer (aus Schnittstellendatei)

Menge = Menge (aus Schnittstellendatei)

LORT =

Besonderheit:

Bei Bewart 261 erhält das Feld Auftrag die Kostenstelle, das Feld Kostenstelle bleibt leer.

Kostenstellen werden zusammenhängend erfasst. D.h. Zu je einer Kostenstelle werden alle Reservierungen in eine Liste aufgenommen.

Schnittstellendatei

Die Spalten der Datei sind folgendermaßen strukturiert:

Personalnummer

Wird von SAP nicht benötigt, bleibt aber als Kopie im Dateisystem

Kostenstelle

Zeitstempel

Zeitpunkt des einlesens in den Handscanner

Materialnummer

Menge

Sicherheitskopie

Nach erfolgreichem lesen der Datei wird eine Kopie angelegt die jeweils Daten eines Tages abbildet, z.B. CBSI20041213 für den 13.12.2004.

Spalten der Datei

Personalnummer

Kostenstelle

Materialnummer

Menge

Zeitstempel

Aus Schnittstellendatei

Datum und Zeit

Zeitpunkt der Verbuchung in SAP

Fehlerhafte Datensätze

Datensätze die nicht verbucht werden konnten, Gründe hierfür sind Bspw. Material wird gesperrt, Adresscode nicht vorhanden etc., werden in einer gesonderten Datei im Verzeichnispfad aufbewahrt.

Diese Datei kann mit dem gleichen Report zu einem späteren Zeitpunkt beliebig oft neu eingelesen werden. Dabei ist zu beachten, dass das Kontrollfeld „Datei löschen“ in jedem Fall zu kennzeichnen ist. Andernfalls werden bei wiederholtem Fehler die Datensätze erneut in diese Datei geschrieben, und diese würden dann später mehrfach in der Reservierungsliste erscheinen.

28.2.2005 Änderung:

Die Fehlerdatei wird automatisch beim nächsten Lauf wieder eingelesen. Dadurch werden Datensätze die vorher evtl. gesperrt waren erneut eingelesen.

ABAP-Programm

Name : Z_Reservierungsliste

Beteiligt: TC MB21

Start: im Hintergrund

Periode: alle 5 Minuten

Der Report ist auch im Dialog lauffähig. Hier ist es möglich abweichende Parameter als Variante zu speichern, oder für Diagnosezwecke das Debugging einzuschalten. Die Daten werden als BATCH-Input Datei verarbeitet und mit der Transaktion MB21 verbucht.

Name des Dateipfades: Zeigt auf die Schnitstellendatei. (Default)

Anzulegende Sicherheitskopie: Diese Datei wird enthält alle Datensätze die von SAP eingelesen wurden. (Default)

Sichtbar abspielen: Führt im Dialogbetrieb dazu jede Transaktion im GUI anzuzeigen, ähnlich wie bei Batch-Input-mappen.

Debug: Das Protokoll enthält ausser den Angeben zu den verbuchten Reservierungen auch weitere Angaben zur evtl. Fehlersuche.

Datei löschen: löscht die Schnittstellendatei nach dem einlesen. Sollte für Produktivbetrieb auf jeden Fall gekennzeichnet sein, da sonst die gleichen Daten immer wieder neu eingelesen werden. (Default)