Integration in SAP ERP am Beispiel von Django-Python am Beispiel des oData (Rest) -Protokolls

Guten Tag, Habr!

Das Thema der Integration großer Systeme wie SAP in kleine, aber flexiblere Systeme bestand sozusagen darin, das Beste aus beiden herauszuholen.

In meinem Beispiel wird insbesondere die Integration von SAP ERP in Django beschrieben.

Herausforderung


Aufgrund der vielen verschiedenen Steuerungssysteme, die unser geliebter Staat eingeführt hat: Egais, Mercury und vieles mehr, haben viele Unternehmen begonnen, ihre schweren und leicht ungeschickten Systeme (für große Unternehmen) an neue Bedingungen anzupassen. Ich werde nicht sagen, welche ich speziell angepasst habe, aber der Gedanke drehte sich immer in meinem Kopf - ein einheitliches Tracking-System für alles auf der Basis einer separaten Plattform zu schaffen.

Mittel


Ich habe mich nicht für die Auswahl der Tools entschieden und mich für Folgendes entschieden: Python-Programmiersprache - Angesichts der Fülle an Bibliotheken mit allem und jedem, der Django-Plattform, fragen Sie nicht, warum Django, nicht Flask oder Odoo. Ich habe Odoo bereits für die Plattform genommen und wollte eines davon studieren. Ich habe das erste genommen. Nun, ich weiß nicht warum, wahrscheinlich wegen seiner größeren Einfachheit. ERP-System für die Entwicklung von SAP - hier hatte ich eigentlich keine Wahl, weil Ich arbeite für ein SAP-Integrator-Unternehmen, habe also sowohl Wissen als auch Zugriff auf die Sandboxen dieses Systems, sodass ich alle Voraussetzungen habe, um meine Arbeit ungehindert und ruhig zu erledigen.

Frontend Django


Das erste, mit dem ich angefangen habe, war, eine bestimmte Aufgabe zu formulieren und auf ein Blatt Papier zu schreiben. Im Allgemeinen rate ich jedem, bevor er etwas codiert und den Prozess beschreibt. Es ist SEHR wichtig, wenn Sie es unterwegs ändern, ändern Sie es auch in der Beschreibung.

Hier ist die erste SEHR grobe Version der Programmbeschreibung.
Ausgehender Prozess

1) Auslieferung wird erstellt.

2) Beim Durchführen von Paletten durch das Tor - Automatikbetrieb und halbautomatischer Betrieb

a. Automatischer Betrieb / Wenn eine Palette das Tor passiert, fordert das Programm von RFC im WMS-System Informationen über die Art der Lieferung und deren Nummer an und sendet eine Identifikationsantwort auf die Lieferung an das WMS-System zurück (bestätigt möglicherweise Lageraufgaben (Kommissionieraufgaben) dafür Palette und alle Investitionen). Überprüft auch alle Verbrauchsteuerstempel mit Informationen im WMS-System

b. Halbautomatischer Betrieb / Der Bediener gibt die Liefer- / Maschinennummer in das Torsystem ein und treibt die Paletten durch das Tor. Das Torsystem sendet eine Anforderung für jede Palette an das WMS-System zur Überprüfung der verbrauchsteuerpflichtigen Stempel im Inneren.

3) Die Zusammensetzung der Lieferung wird an das Buchhaltungssystem gesendet

Eingehender Prozess

1) Anlieferung wird erstellt.

2) Palettendurchgang durch das Tor

3) An das Buchhaltungssystem wird eine Anfrage bezüglich der Zusammensetzung der Forderung im aktuellen Lager gesendet

4) Die interne Zusammensetzung der Palette der Verbrauchsteuerstempel wird anhand dieses Abrechnungssystems überprüft

5) Zum Entladen von Paletten wird ein Signal an das WMS-System gesendet.

Erforderliche Tabellen :

Tor:
Kennung
Lager:
Beschreibung
Passage Nachricht :

Titel:
Zeit, System, Lagernummer, Gate-ID.
Position:
Verbrauchsteuerstempel, Anmeldezeit, Titelbindung
ERP-Kompositionsnachricht (Anlieferung)

Titel:
Zeit, System, Lieferungsnummer,
Position:
Material, Verbrauchsteuerstempel, Palettennummer (falls vorhanden)

Aggregierte Nachricht (basierend auf ERP-Daten) :

Titel:

Zeit, System, Lagernummer, Gate-ID, Lieferungsnummer aus dem Buchhaltungssystem, Wegweiser (eingehend ausgehend), Verifizierungsskriptzeichen, Maschinennummer, Warehouse-Gate-Nummer,

Position: Verbrauchsteuerstempel, Palettennummer (optional), Material (optional), Lieferungsnummer, Maschinennummer, Artikelnummer im Dokument, Charge (optional), Verpackung (optional)
Als nächstes lernte ich Django und zeichnete einen Prozess und ein Datenbankschema.
Wie sich in Django herausstellte, ist das Erstellen von Tischmodellen sehr einfach und bequem. Es sieht ungefähr so ​​aus:

class SapOptions(models.Model): name = models.CharField(verbose_name=' ', max_length=50) baseurl = models.CharField(max_length=500, verbose_name='Url  ', help_text = 'URL  ,  ,  :"https://moses1005:44300/sap/opu/odata/sap/ZLS_SUPPLYCHAIN_SRV/"')#  URL sapset = models.CharField(default='Enter Sapset', max_length=100, verbose_name=' ()') mandt = models.CharField(max_length=3, verbose_name='') user = models.CharField(max_length=15, verbose_name='       ') passwd = models.CharField(max_length=15, verbose_name='') verify = models.BooleanField(default=False, help_text = '   ') def __str__(self): return ': '+self.name + ',  : '+self.mandt class Gates(models.Model): from mainAPP.sap_connector import get_lgorts_fromsap ident = models.CharField(verbose_name='', max_length=10, help_text='',unique=True) wh = models.CharField(verbose_name='  ', default='',max_length=10, help_text='   WMS') help = models.CharField(verbose_name='', default='',max_length= 500,help_text=' , ,  ,   ') try: lgorts = get_lgorts_fromsap() except: lgorts = [('No Connect', 'No Connect'),] lgort = models.CharField(verbose_name='',default='0000', max_length=20, choices=lgorts) def __str__(self): return self.ident +' : '+self.wh+' : '+self.help 

Danach habe ich bereits verstanden, wie man Verzeichnisse aus SAP abruft, so dass die Integration völlig "nahtlos" schien, das Schlüsselwort "schien", aber dazu später mehr.

Nachdem ich Django gelernt hatte (heute Abend einige getötet), schrieb ich eine Schnittstelle zum Eingeben von Informationen und zum Senden an SAP ERP.

Der erste Bildschirm zur Eingabe von Akzeptanzinformationen sieht folgendermaßen aus:



  • Warehouse - direkte Integration in SAP ERP mit einer kurzen Beschreibung,
  • ERP-Lieferung - Eine Lieferung aus SAP ERP wird eingegeben und bei der Eingabe überprüft (eine Anfrage an SAP wird gestellt, ob eine solche Lieferung vorliegt oder nicht).
  • TTN - hier ist alles klar (Frachtbrief),
  • Partnernummer - Dies ist die Partnernummer von SAP ERP. Das Feld ist optional und wird für die Zukunft erstellt, um eine Lieferung zu finden.
  • Paketkennung - Dies ist eines der wichtigsten Felder, dies ist die Nummer der Palette oder des Pakets.

Die Schnittstelle ist auch für ein mobiles Endgerät (TSD) angepasst.



Die Felder werden so erstellt, dass der Cursor nach jedem Drücken von ENTER zum nächsten Eingabefeld springt, so dass es bequem wäre, alle Informationen von TTN, Gate, Pallet zu scannen.

Nach dem Scannen des letzten Felds oder dem Klicken auf "Speichern" wechselt der Bildschirm zum Dialogfeld zur Eingabe der Kennungen der einzelnen Produkte:



Felder:

  1. Dies ist ein Bildschirm der Liste der vom EGAIS-System selbst gesendeten Kennungen, wobei die Rottöne die noch nicht gescannten Kennungen sind, Gelb die gescannten Kennungen, die jedoch nicht in der EGAIS-Nachricht enthalten waren, und die grünen die vom EGAIS gesendeten und gescannten Kennungen
  2. Wenn Sie Bezeichner eingeben, finden Sie hier auch die Schaltfläche „+“, die für die Anzeige eines anderen Felds usw. erforderlich ist.
  3. Zeigen Sie ggf. Fehlermeldungen an.

Implementierung der Integration:


Für die Integration von Django ist alles klar. „Rest“ ist einfach zu implementieren, aber von SAP ERP musste ich ein wenig lesen.

Wie wird das gemacht, wie ist es nicht sehr schwierig?

1) Es ist erforderlich, eine Integrationsklasse für die Implementierung bzw. ein Entwicklungspaket dafür zu erstellen. Dies erfolgt in der Transaktion SEGW



2) Nach dem Anlegen der Klasse müssen Sie das Datenmodell definieren, es gibt verschiedene Möglichkeiten, eigene Felder anlegen oder in der Tabelle auf SAP klicken. Dies bedeutet, dass Sie vor dem Erstellen eines Datenmodells für die Integration eine Tabelle für die Daten erstellen müssen. Dies erfolgt in der Transaktion SE11. Informationen dazu finden Sie im Internet. Also, wie die Struktur,



Ich mag die Tabellenstruktur, die ich bereits erstellt habe



3) Hier ist die Arbeit, die wir geleistet haben:



Klicken Sie auf "Generieren". Die Klasse hat die für die Integration erforderliche Struktur generiert, und wir werden damit arbeiten.

4) Als Nächstes wird auf unserer Registerkarte "Service-Implementierung" unsere Struktur mit allen ihr zur Verfügung stehenden Methoden angezeigt, insbesondere:

a. Erstellen - Methode zum Erstellen eines Datensatzes in unserer Tabelle anhand der von außen gesendeten Daten
b. Löschen - Methode zum Löschen von Datensätzen nach Kennung
c. GetEntity - Single Record Request-Methode
d. GetEntitySet - Methode zum Abrufen mehrerer Datensätze nach Kriterien
e. Update - Datensatzänderungsmethode
Tatsächlich sind alle diese Methoden ziemlich abstrakt, aber natürlich gibt es Unterschiede

5) Nach dem Generieren der Klasse erstellen wir eine Liste der Klassen im Zweig Runtime Artifacts. Wählen Sie am Ende die Klasse mit DPC_EXT aus


Doppelklicken Sie, um in die Klasse selbst zu gelangen

6) Nachdem Sie in die Liste der Klassenmethoden aufgenommen wurden, sehen Sie am Ende eine Liste aller Methoden. Definieren Sie sie neu. Andernfalls wird nach der nächsten Änderung des Datenmodells alles gelöscht. Ich bin darauf gestoßen, es war beleidigend ...


Zum Beispiel werde ich die Implementierung der Create-Methode zeigen



Alles ist sehr einfach, IT_KEY_TAB wird in die Eingabe eingespeist und basierend auf diesen Daten implementieren wir einige Aktionen, in diesem Code einen regulären Datensatz in der Tabelle oder eine Fehlerausgabe, die dann an Django übertragen werden. Die Ausgabe der erfolgreichen Erstellung wird in die Struktur ER_ENTITY geschrieben.

7) Testen unserer Schnittstelle in Transaktion / IWFND / MAINT_SERVICE, lange. Wir gehen hinein, finden unsere Klasse erstellt und klicken auf "SAP Gateway Client".



Wir werden im Wesentlichen mit den Webanforderungen EMULATOR GET \ POST \ PUT \ DELETE nur von SAP geöffnet.

PS. Sie können den erstellten Dienst in allem testen. Ich teste im Postbotenprogramm



So sieht die Get-Anfrage aus: "GetEntitySet"
/ sap / opu / odata / sap / ZLS_SUPPLYCHAIN_SRV / ZLS_INBOUND_HEADSet? $ format = json
Wo:
/ ZLS_SUPPLYCHAIN_SRV / - Dies ist unsere erstellte Klasse
/ ZLS_INBOUND_HEADSet ist unser Datenmodell,
format = json ist das Datenformat, das wir erhalten, die Wahl von xml oder json, ich wähle json, weil es deshalb für mich bequemer ist.

8) Ebenso schreiben wir Methoden

Was wir haben, eine Front auf Django erstellt, hat eine Schnittstelle auf der SAP-Seite erstellt
Jetzt müssen wir alles wiederbeleben, und auf der Django-Seite schreiben wir die Methoden:

1) Die Methode zum Erstellen einer Sitzung, um sich anzumelden, scrf-Token zu erhalten und schon weiter
Ziehen Sie die erforderlichen Informationen über unsere konfigurierte Schnittstelle aus der Datenbank oder erstellen Sie eine neue
aufnehmen. Erstellen Sie dazu eine separate Datei in Django, die ich Sap_connector.py nannte und beschrieben habe
Darin sind die Hauptmethoden.

 def sap_createSession(): #     oDATA from scanner.models import SapOptions #   SAP sap_opt = SapOptions.objects.all()[0] #       s = requests.Session() s.headers.update({'Connection': 'keep-alive', 'X-CSRF-TOKEN': 'Fetch'}) auth = (sap_opt.user, sap_opt.passwd) try: r = s.get(sap_opt.baseurl, auth=auth,verify=sap_opt.verify) except: message = "    %s %s"%(sap_opt.mandt, sap_opt.name) return ('NO TOKEN', 'NoSession', message) token = r.headers['x-csrf-token'] session = s sess = (token, session, None) return sess 

2) Lieferüberprüfungsmethode in SAP ERP

 def sap_delivery_verify(token, session, delivery): #      ERP from scanner.models import SapOptions, Gates sap_opt = SapOptions.objects.all()[0] s = session format = '?$format=json' set = 'likpSet' url = sap_opt.baseurl + set + "('"+delivery+"')"+format headers = {'Content-type': 'application/json;charset=utf-8', 'X-CSRF-TOKEN': token} #      auth = (sap_opt.user, sap_opt.passwd) # auth get = s.get(url, headers=headers, auth=auth,verify=sap_opt.verify)#   if get.status_code ==200: delivery_out = json.loads(get.text).get('d').get('Vbeln') return (True, 'OK') else: error_text = json.loads(get.text).get('error').get('message').get('value') return (False, error_text) 

3) Die Methode zur Integration von SAP-Lagern in Django

 def get_lgorts_fromsap(): from scanner.models import SapOptions session = sap_createSession() #   token = session[0] session = session[1] sap_opt = SapOptions.objects.all()[0] #   s = session format = '?$format=json' set = 't001lSet' url = sap_opt.baseurl + set +format headers = {'Content-type': 'application/json;charset=utf-8', 'X-CSRF-TOKEN': token} #      auth = (sap_opt.user, sap_opt.passwd) # auth get = s.get(url, headers=headers, auth=auth,verify=sap_opt.verify)#   jdata = json.loads(get.text) lgorts = [] for l in jdata.get('d').get('results'): l.get('lgort') lgorts.append((l.get('Lgort'),l.get('Lgort'))) return lgorts 

Und sein zweiter Teil im Modellteil:

 class Gates(models.Model): from mainAPP.sap_connector import get_lgorts_fromsap ident = models.CharField(verbose_name='', max_length=10, help_text='',unique=True) wh = models.CharField(verbose_name='  ', default='',max_length=10, help_text='   WMS') help = models.CharField(verbose_name='', default='',max_length= 500,help_text=' , ,  ,   ') try: #   SAP lgorts = get_lgorts_fromsap() except: lgorts = [('No Connect', 'No Connect'),] lgort = models.CharField(verbose_name='',default='0000', max_length=20, choices=lgorts) def __str__(self): return self.ident +' : '+self.wh+' : '+self.help 

Die Integration sieht folgendermaßen aus: Wenn ich in den Django-Einstellungen ein neues Lager anlege, zeigt das System die Lager aus dem SAP-ERP an, die derzeit dort im Lagerfeld angelegt sind.



4) Methode zum Anlegen eines neuen Datensatzes in SAP ERP

 def sap_connect(token, session, data): from scanner.models import SapOptions, Gates #      SAP ERP sap_opt = SapOptions.objects.all()[0] s = session delivery = data.get('delivery') url = sap_opt.baseurl + sap_opt.sapset #  URL +    headers = {'Content-type': 'application/json;charset=utf-8', 'X-CSRF-TOKEN': token} #      auth = (sap_opt.user, sap_opt.passwd) # auth data =json.dumps({"d":{ "Mandt": sap_opt.mandt, "Lgort": Gates.objects.get(id=data.get('gates')).wh, "Vbeln":data.get('delivery'), "Mark": data.get('mark'), "Matnr": "", "Posnr": "", "Mbl": "", "InbDicid":"AAAAAAAAAAAAAAAAAAAAAA==", "DocExt": data.get('ttn'), "Exidv": data.get('pack') }}) try: r2 = s.post(url, data=data, headers=headers, auth=auth) except: return (False, '   ') if r2.status_code ==201: print(' %s   '%(delivery)) return (True, '  %s : '%delivery) else: print('  %s   '%(delivery)) text = r2.text SO = soup(text) s = SO.find_all("message")[0].text return (False, s) 

Tatsächlich stellen wir einfach eine POST-Anfrage und schreiben dort die Daten im JSON-Format

Fazit


Wir haben ein in SAP ERP integriertes Programm mit einem einfachen Szenario erstellt.
Das Auto kommt an, wir geben Informationen zu jeder Palette in die Schnittstelle ein, das Programm prüft für uns, ob alle Daten korrekt eingegeben wurden, und gibt Auskunft darüber, was sein soll und was bereits eingegeben wurde. Nach Eingabe der Daten wird berichtet, was getan wurde, und die Daten werden an SAP ERP übertragen. Diese Schnittstelle ist auch an mobile Dateneingabeschnittstellen angepasst, was für Lager mit Datenerfassungsterminals (TSD) wichtig ist. Nach der Übertragung der Daten an ERP speichert das System auch alle Daten, in welches Lager, welche Kennung, welche Art von Kennung, wer sie akzeptiert hat usw.

Aus diesem Grund verfügen wir über ein Programm zur Verarbeitung eingehender und ausgehender Produktkennungen im Unternehmen, während 90% aller Arbeiten in einem externen System ausgeführt werden, das in das Hauptsystem integriert ist.

In Zukunft muss es für die Pflege eingehender Chargen, Seriennummern und anderer Dinge fertiggestellt werden und noch enger in SAP integriert werden, um beispielsweise eine Quittungstransaktion über diese Schnittstelle zu erstellen. Nun, dies ist ein Gedanke für die Entwicklung :)

PS Ich habe den ABAP- oder Python-Django-Code dieser Arbeitslösung nicht gezeichnet, ich habe die Django- oder HTML-Vorlageneinstellungen nicht gezeichnet, sondern mich auf die Integration mit SAP ERP konzentriert, um zu zeigen, dass das Erstellen eines Moduls für die Verbindung mit einem so großen System wie SAP nicht schwierig ist Ich ging zu einem solchen System, wenn wir das Studium von Django für ungefähr 4 Abende mit einbeziehen.

Vielen Dank für Ihre Aufmerksamkeit, ich bin dankbar für konstruktive Kritik!

Source: https://habr.com/ru/post/de426611/


All Articles