Integrasi dengan SAP ERP, menggunakan Django-python sebagai contoh, menggunakan protokol oData (rest)

Selamat siang, Habr!

Topik integrasi sistem besar seperti SAP dengan yang kecil, tetapi yang lebih fleksibel, bisa dikatakan, adalah mengambil yang terbaik dari keduanya.

Secara khusus, contoh saya akan menjelaskan integrasi SAP ERP dengan Django.

Tantangan


Karena berbagai sistem kontrol yang diperkenalkan oleh negara tercinta kita: Egais, Merkurius, dan banyak lagi, banyak perusahaan telah mulai mengadaptasi beratnya, dan menempatkannya dengan sistem yang canggung (untuk perusahaan besar) ke kondisi baru. Saya tidak akan mengatakan yang mana yang saya adaptasikan secara khusus, tetapi pikiran itu selalu berputar di kepala saya - untuk menciptakan sistem pelacakan terpadu untuk semuanya berdasarkan platform yang terpisah.

Berarti


Tidak butuh waktu terlalu lama untuk memilih alat mana yang harus diambil, saya memilih: Bahasa pemrograman Python - mengingat banyaknya perpustakaan dengan segalanya dan segalanya, platform Django, jangan tanya mengapa Django, bukan Flask atau Odoo. Saya sudah mengambil Odoo untuk platform dan ingin mempelajari salah satunya, mengambil yang pertama, yah, saya tidak tahu mengapa, mungkin karena kesederhanaannya yang lebih besar. Sistem ERP untuk pengembangan SAP-well, di sini saya tidak punya pilihan Saya bekerja untuk perusahaan integrator SAP, jadi saya memiliki pengetahuan dan akses ke kotak pasir sistem ini, sehingga memiliki semua kondisi, saya dengan tenang akan melakukan pekerjaan saya tanpa hambatan.

Frontend Django


Hal pertama yang saya mulai dengan adalah merumuskan tugas tertentu dan menulisnya di selembar kertas, umumnya saya menyarankan semua orang sebelum melakukan pengkodean sesuatu, menjelaskan prosesnya, dan SANGAT penting jika Anda mengubahnya saat bepergian, ubah juga dalam uraiannya.

Berikut adalah versi kasar pertama dari deskripsi program.
Proses keluar

1) Pengiriman keluar dibuat.

2) Saat melewati palet melalui gerbang - Operasi otomatis dan operasi semi-otomatis

a. Operasi otomatis / Ketika palet melewati gerbang, program meminta oleh RFC dalam informasi sistem WMS tentang jenis pengirimannya, nomornya dan mengirimkan kembali respons identifikasi terhadap pengiriman ke sistem WMS (mungkin mengkonfirmasi tugas-tugas gudang (memilih tugas) untuk ini palet dan semua investasi). Juga periksa semua perangko cukai dengan informasi dalam sistem WMS

b. Operasi semi-otomatis / Operator memasukkan nomor pengiriman / mesin dalam sistem gerbang dan mendorong palet melalui gerbang, sistem gerbang mengirimkan permintaan untuk setiap palet ke sistem WMS untuk memeriksa perangko cukai di dalam.

3) Komposisi pengiriman dikirim ke Sistem Akuntansi

Proses masuk

1) Pengiriman masuk dibuat.

2) Pallet melewati gerbang

3) Permintaan dikirim ke sistem akuntansi tentang komposisi piutang di gudang saat ini

4) Komposisi internal palet prangko diperiksa berdasarkan sistem akuntansi ini

5) Sinyal dikirim ke sistem WMS untuk menurunkan palet.

Tabel yang Diperlukan :

Gerbang:
Identifier
Gudang:
Deskripsi
Pesan bagian :

Judul:
Waktu, sistem, nomor gudang, ID gerbang.
Posisi:
Cap cukai, waktu pendaftaran, pengikatan judul
Pesan komposisi ERP (pengiriman masuk)

Judul:
Waktu, sistem, nomor pengiriman,
Posisi:
Bahan, stempel cukai, nomor palet (jika ada)

Pesan teragregasi (berdasarkan data dari ERP) :

Judul:

Waktu, sistem, nomor gudang, pengenal gerbang, nomor pengiriman dari sistem Akuntansi, tanda Tujuan (Keluar masuk), tanda skrip verifikasi, nomor mesin, nomor gerbang gudang,

Posisi: Cukai, nomor palet (opsional), bahan (opsional), nomor pengiriman, nomor mesin, nomor item dalam dokumen, batch (opsional), kemasan (opsional)
Selanjutnya, saya mulai belajar Django dan menggambar proses dan skema database.
Ternyata di Django, membuat model tabel sangat mudah dan nyaman, tampilannya seperti ini:

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 

Setelah itu saya sudah mengerti cara menarik direktori dari SAP, sehingga integrasi tampak benar-benar "mulus", kata kunci "tampak", tetapi lebih pada nanti.

Jadi, setelah mempelajari Django (membunuh beberapa malam ini), saya menulis sebuah antarmuka untuk memasukkan informasi dan kemudian mengirimkannya ke SAP ERP.

Layar pertama untuk memasukkan informasi penerimaan terlihat seperti ini:



  • Gudang - integrasi langsung dengan SAP ERP dengan deskripsi singkat,
  • Pengiriman ERP - Pengiriman dari SAP ERP dimasukkan, diverifikasi setelah masuk (permintaan dibuat untuk SAP apakah ada pengiriman seperti itu atau tidak,
  • TTN - semuanya jelas di sini (waybill),
  • Nomor mitra - Ini adalah nomor mitra SAP ERP, bidang ini opsional, dibuat untuk masa depan untuk menemukan pengiriman,
  • Pengidentifikasi Paket - Ini adalah salah satu bidang yang paling penting, ini adalah nomor palet atau paket.

Juga, antarmuka diadaptasi untuk terminal mobile (TSD)



Kolom dibuat sedemikian rupa sehingga setelah setiap menekan ENTER kursor melompat ke bidang input berikutnya, sehingga akan lebih mudah untuk memindai semua informasi dari TTN, Gerbang, Pallet.

Kemudian, setelah memindai bidang terakhir atau mengklik "Simpan", layar masuk ke dialog untuk memasukkan pengidentifikasi setiap produk:



Bidang:

  1. Ini adalah layar daftar pengidentifikasi yang dikirim oleh sistem EGAIS itu sendiri, di mana The Reds adalah pengidentifikasi yang belum dipindai, Kuning adalah pengidentifikasi yang dipindai, tetapi tidak ada dalam pesan EGAIS, dan yang hijau adalah yang dikirim oleh EGAIS dan dipindai.
  2. Memasuki pengidentifikasi, berikut ini juga tombol "+", yang diperlukan untuk tampilan bidang lain, dll.
  3. Tampilkan pesan kesalahan, jika ada.

Implementasi Integrasi:


Untuk integrasi dari Django, semuanya jelas "istirahat" mudah diimplementasikan, tetapi dari SAP ERP, saya harus membaca sedikit).

Jadi bagaimana ini dilakukan, bagaimana itu tidak terlalu sulit

1) Perlu untuk membuat kelas integrasi untuk implementasi, masing-masing paket pengembangan untuk itu. Ini dilakukan dalam transaksi SEGW



2) Setelah membuat kelas, Anda perlu mendefinisikan Model Data, ada beberapa opsi, buat bidang Anda sendiri, atau klik pada tabel SAP. Ini berarti bahwa sebelum membuat model data untuk integrasi, Anda perlu membuat tabel untuk data, ini dilakukan dalam transaksi SE11 dan bagaimana melakukannya dapat ditemukan di Internet. Jadi, seperti strukturnya,



Saya suka struktur tabel yang telah saya buat



3) Ini pekerjaan yang telah kami lakukan:



Klik "Hasilkan". Kelas menghasilkan struktur yang diperlukan untuk integrasi, dan kami akan bekerja dengannya.

4) Selanjutnya, pada tab implementasi Layanan kami, struktur kami muncul dengan semua metode yang tersedia untuk itu, khususnya:

a. Buat - Metode untuk membuat catatan di tabel kami sesuai dengan data yang dikirim dari luar
b. Hapus- Metode untuk menghapus catatan dengan pengidentifikasi
c. GetEntity - Metode Permintaan Rekaman Tunggal
d. GetEntitySet - Metode untuk mendapatkan beberapa catatan berdasarkan kriteria
e. Pembaruan - Metode Modifikasi Rekam
Sebenarnya, semua metode ini cukup abstrak, tetapi tentu saja ada perbedaan

5) Setelah membuat kelas, kami membuat daftar kelas di cabang Artefak Runtime, pilih satu dengan DPC_EXT di akhir


Klik dua kali untuk masuk ke kelas itu sendiri

6) Setelah masuk ke daftar metode kelas, pada akhirnya Anda melihat daftar semua metode, pastikan untuk mendefinisikan kembali, jika tidak setelah perubahan berikutnya dalam model data, semuanya akan dihapus, saya menemukan ini, itu menghina ...


Sebagai contoh, saya akan menunjukkan implementasi metode Buat



Semuanya sangat sederhana, IT_KEY_TAB dimasukkan ke input dan berdasarkan data ini, kami menerapkan beberapa tindakan, dalam kode ini catatan biasa dalam tabel, atau output kesalahan, yang kemudian akan ditransfer ke Django. Output dari kreasi yang sukses ditulis ke struktur ER_ENTITY.

7) Menguji antarmuka kita dalam transaksi / IWFND / MAINT_SERVICE, lama. Kami masuk ke dalamnya, temukan kelas kami dibuat dan klik "SAP Gateway Client"



Kami pada dasarnya dibuka dengan GET \ POST \ PUT \ DELETE permintaan web EMULATOR, hanya dari SAP,

PS. Anda dapat menguji layanan yang dibuat dalam apa saja., Saya menguji dalam program tukang pos



Seperti inilah permintaan get, โ€œGetEntitySetโ€
/ getah / opu / odata / getah / ZLS_SUPPLYCHAIN_SRV / ZLS_INBOUND_HEADSet? $ format = json
Dimana:
/ ZLS_SUPPLYCHAIN_SRV / - Ini adalah kelas yang kami buat
/ ZLS_INBOUND_HEADSet adalah model data kami,
format = json adalah format data yang kita dapatkan, pilihan xml atau json, saya memilih json, karena itulah mengapa lebih nyaman bagi saya.

8) Demikian pula, kami menulis metode

Apa yang kami miliki, membuat front pada Django, membuat antarmuka di sisi SAP
Sekarang kita perlu menghidupkan kembali semuanya, dan di pihak Django kita menulis metode:

1) Metode membuat sesi, untuk masuk, dapatkan scrf-token dan sudah lebih jauh
tarik informasi yang diperlukan dari database menggunakan antarmuka kami yang telah dikonfigurasi atau buat yang baru
merekam. Untuk melakukan ini, buat file terpisah di Django, saya menamainya Sap_connector.py dan dijelaskan
ini memiliki metode dasar.

 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) Metode verifikasi pengiriman dalam 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) Metode mengintegrasikan gudang SAP dengan 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 

Dan bagian kedua di bagian model:

 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 

Integrasi terlihat seperti ini: ketika saya membuat gudang baru di pengaturan Django, sistem menampilkan gudang dari SAP ERP yang saat ini dibuat di sana di bidang gudang.



4) Metode untuk membuat catatan baru dalam 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) 

Bahkan, kami hanya membuat permintaan POST dan menulis data dalam format json di sana

Kesimpulan


Kami telah menciptakan program yang terintegrasi dengan SAP ERP, dengan skenario sederhana,
Mobil tiba, kami memasukkan informasi pada setiap palet di antarmuka, program memeriksa kami apakah semua data dimasukkan dengan benar, dan memberikan informasi tentang apa yang seharusnya dan apa yang sudah dimasukkan. Setelah memasukkan data, ini melaporkan apa yang telah dilakukan dan mentransfer data ke SAP ERP. Juga, antarmuka ini diadaptasi dari antarmuka entri data seluler, yang penting untuk gudang dengan terminal pengumpulan data (TSD). Setelah mentransfer data ke ERP, sistem juga menyimpan semua data ke gudang mana, pengenal mana yang datang, jenis pengenal apa, siapa yang menerimanya, dan sebagainya.

Sebagai hasilnya, kami memiliki program untuk memproses pengidentifikasi produk yang masuk dan keluar di perusahaan, sementara 90% dari semua pekerjaan dilakukan secara tepat dalam sistem eksternal yang terintegrasi dengan sistem utama.

Di masa depan, perlu diselesaikan untuk pemeliharaan batch yang masuk, nomor seri dan hal-hal lain, dan bahkan lebih dekat untuk berintegrasi dengan SAP, misalnya, untuk membuat transaksi penerimaan dari antarmuka ini, baik ini adalah pemikiran untuk pengembangan :)

PS Saya tidak mengecat kode ABAP atau python-django dari solusi yang berfungsi ini, saya tidak mengecat pengaturan template Django atau html, tetapi berkonsentrasi pada integrasi dengan SAP ERP untuk menunjukkan bahwa membuat modul untuk terhubung ke sistem besar seperti SAP tidak sulit. Saya pergi ke sistem seperti itu, jika kita memasukkan studi Django selama sekitar 4 malam.

Terima kasih atas perhatian Anda, saya akan berterima kasih atas kritik yang membangun!

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


All Articles