Buenas tardes, Habr!
El tema de la integración de sistemas grandes como SAP con pequeños, pero más flexibles, por así decirlo, fue tomar lo mejor de ambos.
En particular, mi ejemplo describirá la integración de SAP ERP con Django.
Desafío
Debido a los muchos sistemas de control diferentes introducidos por nuestro amado estado: Egais, Mercury y mucho más, muchas compañías han comenzado a adaptar sus sistemas pesados y a ponerlos en condiciones ligeramente torpes (para grandes empresas) a las nuevas condiciones. No diré cuáles adapté en particular, pero la idea siempre giró en mi cabeza: crear un sistema de seguimiento unificado para todo sobre la base de una plataforma separada.
Significa
No tardé demasiado en elegir qué herramientas tomar, elegí: lenguaje de programación Python, en vista de la abundancia de bibliotecas con todo y todo, la plataforma Django, no pregunte por qué Django, no Flask u Odoo. Ya tomé Odoo para la plataforma y quería estudiar uno de estos, tomé el primero, bueno, no sé por qué, probablemente debido a su mayor simplicidad. Sistema ERP para el desarrollo de SAP, bueno, aquí realmente no tenía otra opción, porque Trabajo para una empresa integradora de SAP, por lo que tengo tanto el conocimiento como el acceso a los sandboxes de este sistema, de modo que, teniendo todas las condiciones, con calma haré mi trabajo sin obstáculos.
Frontend django
Lo primero con lo que comencé fue formular una tarea específica y escribirla en una hoja de papel, generalmente aconsejo a todos antes de codificar algo, describir el proceso, y es MUY importante si lo cambias sobre la marcha, cámbialo también en la descripción.
Aquí está la primera versión
MUY cruda de la descripción del programa.
Proceso saliente
1) Se crea la entrega de salida.
2) Al pasar paletas a través de la puerta: funcionamiento automático y funcionamiento semiautomático
a. Operación automática / Cuando el palet pasa a través de la puerta, el programa solicita por RFC en el sistema WMS información sobre qué tipo de entrega es, su número y envía una respuesta de identificación a la entrega al sistema WMS (posiblemente confirma las tareas de almacén (tareas de picking) para esto palet y todas las inversiones). También verifica todos los sellos especiales con información en el sistema WMS
b. Operación semiautomática / El operador ingresa el número de entrega / máquina en el sistema de compuerta y conduce las paletas a través de la compuerta, el sistema de compuerta envía una solicitud de cada paleta al sistema WMS para verificar los sellos especiales en el interior.
3) La composición de la entrega se envía al sistema de contabilidad
Proceso de entrada
1) Se crea la entrega entrante.
2) Pasaje de palets a través de la puerta
3) Se envía una solicitud al sistema de contabilidad sobre la composición de las cuentas por cobrar en el almacén actual
4) La composición interna de la paleta de sellos especiales se verifica sobre la base de este sistema contable
5) Se envía una señal al sistema WMS para descargar paletas.
Tablas requeridas :
Puerta:
Identificador
Almacén:
Descripción
Mensaje de paso :
Titulo:
Hora, sistema, número de almacén, ID de puerta.
Puesto:
Sello de impuestos especiales, tiempo de registro, encuadernación del título
Mensaje de composición ERP (entrega entrante)
Titulo:
Hora, sistema, número de entrega,
Puesto:
Material, sello especial, número de paleta (si corresponde)
Mensaje agregado (basado en datos de ERP) :
Titulo:
Hora, sistema, número de almacén, identificador de puerta, número de entrega del sistema de contabilidad, señal de dirección (entrante saliente), señal de script de verificación, número de máquina, número de puerta de almacén,
Posición: sello de impuestos especiales, número de paleta (opcional), material (opcional), número de entrega, número de máquina, número de artículo en el documento, lote (opcional), embalaje (opcional)
Luego, comencé a aprender Django y a dibujar un proceso y un esquema de base de datos.
Como resultó en Django, crear modelos de mesa es muy fácil y conveniente, se ve así:
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/"')
Después de eso, ya entendí cómo extraer directorios de SAP, de modo que la integración parecía completamente "perfecta", la palabra clave "parecía", pero más sobre eso más adelante.
Entonces, después de aprender Django (maté a algunos esta noche), escribí una interfaz para ingresar información y luego enviarla a SAP ERP.
La primera pantalla para ingresar información de aceptación se ve así:

- Almacén: integración directa con SAP ERP con una breve descripción,
- Entrega de ERP: se ingresa una entrega de SAP ERP, se verifica a la entrada (se realiza una solicitud a SAP si existe dicha entrega o no,
- TTN: aquí todo está claro (hoja de ruta),
- Número de socio: este es el número de socio de SAP ERP, el campo es opcional, está hecho para el futuro con el fin de encontrar una entrega,
- Identificador de paquete: este es uno de los campos más importantes; este es el número de paleta o paquete.
Además, la interfaz está adaptada para un terminal móvil (TSD)

Los campos están hechos de tal manera que después de presionar ENTER, el cursor salta al siguiente campo de entrada, por lo que sería conveniente escanear toda la información del TTN, Gate, Pallet.
Luego, después de escanear el último campo o hacer clic en "Guardar", la pantalla va al cuadro de diálogo para ingresar los identificadores de cada producto:

Campos:
- Esta es una pantalla de la lista de identificadores que fueron enviados por el sistema EGAIS en sí, donde los rojos son los identificadores que aún no se han escaneado, el amarillo son los identificadores que fueron escaneados, pero no estaban en el mensaje EGAIS, y los verdes son los enviados por el EGAIS y fueron escaneados
- Al ingresar identificadores, aquí también está el botón "+", que es necesario para la aparición de otro campo, etc.
- Mostrar mensajes de error, si hay alguno.
Implementación de integración:
Para la integración de Django, todo está claro "el descanso" es simple de implementar, pero desde SAP ERP, tuve que leer un poco).
Entonces, ¿cómo se hace esto, cómo no es muy difícil
1) Es necesario crear una clase de integración para la implementación, respectivamente, un paquete de desarrollo para ello. Esto se hace en la transacción SEGW

2) Después de crear la clase, debe definir el Modelo de datos, hay varias opciones, crear sus propios campos o hacer clic en SAP en la tabla. Esto significa que antes de crear un modelo de datos para la integración, debe crear una tabla para los datos, esto se hace en la transacción SE11 y cómo hacerlo se puede encontrar en Internet. Entonces, como la estructura,

Me gusta la estructura de la tabla que ya he creado.

3) Aquí está el trabajo que hemos realizado:

Haga clic en "Generar". La clase generó la estructura necesaria para la integración, y trabajaremos con ella.
4) A continuación, en nuestra pestaña de implementación del Servicio, nuestra estructura aparece con todos los métodos disponibles, en particular:
a. Crear: método para crear un registro en nuestra tabla de acuerdo con los datos enviados desde el exterior
b. Eliminar: método para eliminar registros por identificador
c. GetEntity - Método de solicitud de registro único
d. GetEntitySet: método para obtener múltiples registros por criterios
e. Actualización - Método de modificación de registro
De hecho, todos estos métodos son bastante abstractos, pero por supuesto hay diferencias.
5) Después de generar la clase, creamos una lista de clases en la rama Artefactos de tiempo de ejecución, seleccione la que tenga DPC_EXT al final

Haga doble clic para ingresar a la clase misma
6) Después de entrar en la lista de métodos de clase, al final verá una lista de todos los métodos, asegúrese de redefinirla, de lo contrario, después del próximo cambio en el modelo de datos, todo se borrará, me encontré con esto, fue insultante ...

Por ejemplo, mostraré la implementación del método Create

Todo es muy simple, IT_KEY_TAB se introduce en la entrada y, con base en estos datos, implementamos algunas acciones, en este código, un registro regular en la tabla o salida de error, que luego se transferirá a Django. El resultado de la creación exitosa se escribe en la estructura ER_ENTITY.
7) Probar nuestra interfaz en transacción / IWFND / MAINT_SERVICE, larga. Entramos en él, encontramos nuestra clase creada y hacemos clic en "SAP Gateway Client"

Básicamente, estamos abiertos con el EMULADOR de solicitudes web GET \ POST \ PUT \ DELETE, solo de SAP,
PD. Puedes probar el servicio creado en cualquier cosa. Estoy probando en el programa
cartero
Así es como se ve la solicitud de obtención, "GetEntitySet"
/ sap / opu / odata / sap / ZLS_SUPPLYCHAIN_SRV / ZLS_INBOUND_HEADSet? $ format = jsonDonde:
/ ZLS_SUPPLYCHAIN_SRV / - Esta es nuestra clase creada
/ ZLS_INBOUND_HEADSet es nuestro modelo de datos,
format = json es el formato de datos que obtenemos, la elección de xml o json, elijo json, porque es por eso que es más conveniente para mí.
8) Del mismo modo, escribimos métodos
Lo que tenemos, creó un frente en Django, creó una interfaz en el lado de SAP
Ahora necesitamos revivirlo todo, y es en el lado de Django donde escribimos los métodos:
1) El método de crear una sesión, para iniciar sesión, obtener scrf-token y ya más
extraer la información necesaria de la base de datos utilizando nuestra interfaz configurada o crear una nueva
registro. Para hacer esto, cree un archivo separado en Django, lo llamé Sap_connector.py y describí
en él están los principales métodos.
def sap_createSession():
2) Método de verificación de entrega en SAP ERP
def sap_delivery_verify(token, session, delivery):
3) El método de integración de almacenes SAP con Django
def get_lgorts_fromsap(): from scanner.models import SapOptions session = sap_createSession()
Y su segunda parte en la parte de modelos: 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:
La integración se ve así: cuando creo un nuevo almacén en la configuración de Django, el sistema muestra los almacenes del SAP ERP que actualmente se crean allí en el campo de almacén.

4) Método para crear un nuevo registro en SAP ERP
def sap_connect(token, session, data): from scanner.models import SapOptions, Gates
De hecho, solo hacemos una solicitud POST y allí escribimos los datos en formato json
Conclusión
Hemos creado un programa integrado con SAP ERP, con un escenario simple,
Llega el automóvil, ingresamos información en cada paleta en la interfaz, el programa verifica si todos los datos se ingresaron correctamente y proporciona información sobre lo que debería ser y lo que ya se ingresó. Después de ingresar los datos, informa sobre lo que se ha hecho y transfiere los datos a SAP ERP. Además, esta interfaz está adaptada de las interfaces de entrada de datos móviles, lo cual es importante para almacenes con terminales de recopilación de datos (TSD). Después de transferir datos a ERP, el sistema también guarda todos los datos en qué almacén, qué identificador vino, qué tipo de identificador, quién lo aceptó, etc.
Como resultado, tenemos un programa para procesar identificadores de productos entrantes y salientes en la empresa, mientras que el 90% de todo el trabajo se lleva a cabo precisamente en un sistema externo integrado con el sistema principal.
En el futuro, debe finalizarse para el mantenimiento de lotes entrantes, números de serie y otras cosas, y aún más cerca de integrarse con SAP, por ejemplo, para crear un registro de recibos desde esta interfaz, bueno, esto es un pensamiento para el desarrollo :)
PD: no pinté el código ABAP o python-django de esta solución de trabajo, no pinté la configuración de la plantilla Django o html, sino que me concentré en la integración con SAP ERP para mostrar que crear un módulo para conectarse a un sistema tan grande como SAP no es difícil Fui a ese sistema, si incluimos el estudio de Django durante aproximadamente 4 noches.¡Gracias a todos por su atención, les agradeceré las críticas constructivas!