Bonjour, Habr!
Le thème de l'intégration de grands systèmes tels que SAP avec des systèmes petits mais plus flexibles, pour ainsi dire, était de tirer le meilleur parti des deux.
En particulier, mon exemple décrira l'intégration de SAP ERP avec Django.
Défi
En raison des nombreux systèmes de contrôle différents introduits par notre État bien-aimé: Egais, Mercury et bien plus encore, de nombreuses entreprises ont commencé à adapter leurs systèmes lourds et à les mettre légèrement en difficulté (pour les grandes entreprises) à de nouvelles conditions. Je ne dirai pas lesquels j'ai adapté en particulier, mais la pensée a toujours tourné dans ma tête - créer un système de suivi unifié pour tout sur la base d'une plate-forme séparée.
Moyens
Ne prenant pas trop de temps pour choisir les outils à prendre, j'ai choisi: le langage de programmation Python - vu l'abondance de bibliothèques avec tout et tout, la plateforme Django, ne demandez pas pourquoi Django, pas Flask ou Odoo. J'ai déjà pris Odoo pour la plate-forme et je voulais étudier l'un d'eux, j'ai pris le premier, eh bien, je ne sais pas pourquoi, probablement à cause de sa plus grande simplicité. Système ERP pour le développement de SAP - eh bien, ici, je n'avais pas vraiment le choix, car Je travaille pour une entreprise d'intégrateur SAP, j'ai donc à la fois des connaissances et un accès aux bacs à sable de ce système, afin d'avoir toutes les conditions pour faire mon travail sereinement et sans entrave.
Django frontend
La première chose avec laquelle j'ai commencé était de formuler une tâche spécifique et de l'écrire sur un morceau de papier, généralement je conseille à tout le monde avant de coder quelque chose, de décrire le processus, et c'est TRÈS important si vous le changez en cours de route, changez-le aussi dans la description.
Voici la première version
TRÈS grossière de la description du programme.
Processus sortant
1) La livraison sortante est créée.
2) Lors du passage de palettes à travers la porte - Fonctionnement automatique et fonctionnement semi-automatique
a. Opération automatique / Lorsque la palette passe par la porte, le programme demande par RFC dans le système WMS des informations sur le type de livraison, son numéro et renvoie une réponse d'identification à la livraison au système WMS (confirme éventuellement les tâches de l'entrepôt (tâches de prélèvement) pour cela palette et tous les investissements). Vérifie également tous les timbres d'accise avec des informations dans le système WMS
b. Fonctionnement semi-automatique / L'opérateur saisit le numéro de livraison / machine dans le système de portail et conduit les palettes à travers le portail, le système de portail envoie une demande pour chaque palette au système WMS pour vérifier les timbres d'accise à l'intérieur.
3) La composition de la livraison est envoyée au système comptable
Processus entrant
1) La livraison entrante est créée.
2) Passage des palettes à travers la porte
3) Une demande est envoyée au système comptable concernant la composition de la créance à l'entrepôt actuel
4) La composition interne de la palette de timbres d'accise est vérifiée sur la base de ce système comptable
5) Un signal est envoyé au système WMS pour décharger les palettes.
Tableaux requis :
Porte:
Identifiant
Entrepôt:
La description
Message de passage :
Titre:
Heure, système, numéro d'entrepôt, ID de porte.
Poste:
Timbre d'accise, heure d'enregistrement, reliure du titre
Message de composition ERP (livraison entrante)
Titre:
Heure, système, numéro de livraison,
Poste:
Matériel, timbre d'accise, numéro de palette (le cas échéant)
Message agrégé (basé sur les données de l'ERP) :
Titre:
Heure, système, numéro de magasin, identifiant de porte, numéro de livraison du système de comptabilité, panneau de direction (entrant sortant), panneau de script de vérification, numéro de machine, numéro de porte de magasin,
Position: timbre d'accise, numéro de palette (facultatif), matériau (facultatif), numéro de livraison, numéro de machine, numéro d'article dans le document, lot (facultatif), emballage (facultatif)
Ensuite, j'ai commencé à apprendre Django et à dessiner un processus et un schéma de base de données.
Comme il s'est avéré dans Django, la création de modèles de table est très facile et pratique, cela ressemble à ceci:
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/"')
Après cela, j'ai déjà compris comment extraire des répertoires de SAP, de sorte que l'intégration semblait complètement «transparente», le mot-clé «semblait», mais plus à ce sujet plus tard.
Donc, après avoir appris Django (tués quelques-uns ce soir), j'ai écrit une interface pour saisir des informations puis les envoyer à SAP ERP.
Le premier écran de saisie des informations d'acceptation ressemble à ceci:

- Entrepôt - intégration directe avec SAP ERP avec une brève description,
- Livraison ERP - Une livraison de SAP ERP est entrée, elle est vérifiée lors de l'entrée (une demande est faite à SAP, qu'il y ait une telle livraison ou non,
- TTN - tout est clair ici (lettre de voiture),
- Numéro de partenaire - Il s'agit du numéro de partenaire de SAP ERP, le champ est facultatif, il est fait pour l'avenir afin de trouver une livraison,
- Identifiant du colis - Il s'agit de l'un des champs les plus importants; il s'agit du numéro de la palette ou du colis.
De plus, l'interface est adaptée pour un terminal mobile (TSD)

Les champs sont créés de telle manière qu'après chaque pression sur ENTER, le curseur saute au champ de saisie suivant, de sorte qu'il serait pratique de numériser toutes les informations du TTN, Gate, Pallet.
Ensuite, après avoir scanné le dernier champ ou cliqué sur «Enregistrer», l'écran passe à la boîte de dialogue de saisie des identifiants de chaque produit:

Champs:
- Ceci est l'écran de la liste des identifiants qui ont été envoyés par le système EGAIS lui-même, où les rouges sont les identifiants qui n'ont pas encore été scannés, le jaune sont les identifiants qui ont été scannés mais qui n'étaient pas dans le message EGAIS, et les verts sont ceux envoyés par le EGAIS et ont été scannés
- En entrant les identifiants, voici également le bouton «+», qui est nécessaire pour l'apparition d'un autre champ, etc.
- Afficher les messages d'erreur, le cas échéant.
Mise en œuvre de l'intégration:
Pour l'intégration depuis Django, tout est clair "le repos" est simple à implémenter, mais depuis SAP ERP, j'ai dû lire un peu).
Alors, comment cela se fait-il, comment n'est-ce pas très difficile
1) Il est nécessaire de créer une classe d'intégration pour l'implémentation, respectivement un package de développement pour celle-ci. Cela se fait dans la transaction SEGW

2) Après avoir créé la classe, vous devez définir le modèle de données, il existe plusieurs options, créer vos propres champs ou cliquer sur SAP dans le tableau. Cela signifie qu'avant de créer un modèle de données pour l'intégration, vous devez créer une table pour les données, cela se fait dans la transaction SE11 et comment le faire peut être trouvé sur Internet. Donc, comme la structure,

J'aime la structure de table que j'ai déjà créée

3) Voici le travail que nous avons fait:

Cliquez sur "Générer". La classe a généré la structure nécessaire à l'intégration, et nous allons travailler avec elle.
4) Ensuite, dans notre onglet Implémentation du service, notre structure apparaît avec toutes les méthodes à sa disposition, notamment:
a. Créer - Méthode de création d'un enregistrement dans notre tableau en fonction des données envoyées de l'extérieur
b. Supprimer - Méthode pour supprimer des enregistrements par identifiant
c. GetEntity - Méthode de demande d'enregistrement unique
d. GetEntitySet - Méthode pour obtenir plusieurs enregistrements par critères
e. Mise à jour - Méthode de modification d'enregistrement
En fait, toutes ces méthodes sont assez abstraites, mais bien sûr, il existe des différences
5) Après avoir généré la classe, nous créons une liste de classes dans la branche Artefacts d'exécution, sélectionnez celle avec DPC_EXT à la fin

Double-cliquez pour entrer dans la classe elle-même
6) Après être entré dans la liste des méthodes de classe, à la fin vous voyez une liste de toutes les méthodes, assurez-vous de la redéfinir, sinon après le prochain changement dans le modèle de données, tout sera effacé, je suis tombé sur cela, c'était insultant ...

Par exemple, je vais montrer l'implémentation de la méthode Create

Tout est très simple, IT_KEY_TAB est alimenté en entrée et sur la base de ces données, nous implémentons quelques actions, dans ce code un enregistrement régulier dans la table, ou sortie d'erreur, qui seront ensuite transférées à Django. La sortie de la création réussie est écrite dans la structure ER_ENTITY.
7) Tester notre interface dans la transaction / IWFND / MAINT_SERVICE, longue. Nous y allons, trouvons notre classe créée et cliquez sur "SAP Gateway Client"

Nous sommes essentiellement ouverts avec l'émulateur de requêtes Web GET \ POST \ PUT \ DELETE, uniquement de SAP,
PS. Vous pouvez tester le service créé dans n'importe quoi., Je teste dans le programme
postier
Voici à quoi ressemble la demande get, "GetEntitySet"
/ sap / opu / odata / sap / ZLS_SUPPLYCHAIN_SRV / ZLS_INBOUND_HEADSet? $ format = jsonOù:
/ ZLS_SUPPLYCHAIN_SRV / - Ceci est notre classe créée
/ ZLS_INBOUND_HEADSet est notre modèle de données,
format = json est le format de données que nous obtenons, le choix de xml ou json, je choisis json, car c'est pourquoi c'est plus pratique pour moi.
8) De même, nous écrivons des méthodes
Ce que nous avons, créé une façade sur Django, créé une interface côté SAP
Maintenant, nous devons tout relancer, et c'est du côté de Django que nous écrivons les méthodes:
1) La méthode de création d'une session, afin de se connecter, obtenir un jeton scrf et déjà plus loin
extraire les informations nécessaires de la base de données en utilisant notre interface configurée ou en créer une nouvelle
record. Pour ce faire, créez un fichier séparé dans Django, je l'ai nommé Sap_connector.py et décrit
en elle sont les principales méthodes.
def sap_createSession():
2) Méthode de vérification de la livraison dans SAP ERP
def sap_delivery_verify(token, session, delivery):
3) La méthode d'intégration des entrepôts SAP à Django
def get_lgorts_fromsap(): from scanner.models import SapOptions session = sap_createSession()
Et sa deuxième partie dans la partie modèles: 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:
L'intégration ressemble à ceci: lorsque je crée un nouvel entrepôt dans les paramètres de Django, le système affiche les entrepôts de SAP ERP qui y sont actuellement créés dans le champ d'entrepôt.

4) Méthode de création d'un nouvel enregistrement dans SAP ERP
def sap_connect(token, session, data): from scanner.models import SapOptions, Gates
En fait, nous faisons juste une requête POST et y écrivons les données au format json
Conclusion
Nous avons créé un programme intégré à SAP ERP, avec un scénario simple,
La voiture arrive, nous entrons des informations sur chaque palette dans l'interface, le programme vérifie pour nous si toutes les données sont saisies correctement et fournit des informations sur ce qui devrait être et ce qui a déjà été entré. Après avoir saisi les données, il rend compte de ce qui a été fait et transfère les données vers SAP ERP. De plus, cette interface est adaptée des interfaces de saisie de données mobiles, ce qui est important pour les entrepôts dotés de terminaux de collecte de données (TSD). Après avoir transféré les données vers l'ERP, le système enregistre également toutes les données dans quel entrepôt, quel identifiant est venu, quel type d'identifiant, qui l'a accepté, etc.
En conséquence, nous avons un programme de traitement des identifiants de produits entrants et sortants dans l'entreprise, tandis que 90% de tous les travaux sont effectués précisément dans un système externe intégré au système principal.
À l'avenir, il doit être finalisé pour la maintenance des lots entrants, des numéros de série et d'autres choses, et encore plus proche de l'intégration avec SAP, par exemple, pour créer une publication de reçus à partir de cette interface, eh bien c'est une idée pour le développement :)
PS Je n'ai pas peint le code ABAP ou python-django de cette solution de travail, je n'ai pas peint les paramètres du modèle Django ou html, mais je me suis concentré sur l'intégration avec SAP ERP pour montrer que créer un module pour se connecter à un si grand système comme SAP n'est pas difficile Je suis allé à un tel système, si l'on inclut l'étude de Django pendant environ 4 soirées.Merci à tous pour votre attention, je serai reconnaissant pour les critiques constructives!