Creazione di un servizio Gateway SAP con operazioni CRUDQ
In questo articolo vedremo come creare, e in seguito come testare, un servizio gateway SAP che permetta di interagire con delle semplici tabelle nel Database, attraverso l’utilizzo delle operazioni CRUDQ.
Il termine CRUDQ non è altro che un acronimo delle cinque operazioni che andremo ad integrare nel nostro servizio:
- CREATE
- READ
- UPDATE
- DELETE
- QUERY
Prima di iniziare è necessario disporre di una tabella custom nel Data Dictionary, sulla quale andremo ad agire attraverso il gateway. Una semplice tabella anagrafica, come quella di seguito, è più che sufficiente.
Una volta che abbiamo scelto una tabella, possiamo procedere con la creazione del servizio.
Creazione del Progetto Gateway
Per prima cosa, è necessario recarsi nella transazione del gateway builder di SAP: SEGW.
Da qui, clicchiamo sull’icona di creazione progetto, compiliamo i campi richiesti a seconda delle nostre necessità, e confermiamo.
Fatto ciò, il progetto verrà creato e visualizzato nella transazione.
Creazione del Data Model
Per la creazione del Data Model, possiamo utilizzare la tabella creata in precedenza come una sorta di template. Per farlo, facciamo clic destro su Data Model->Import->DDIC Structure.
Nella finestra successiva, inseriamo il nome della entity e selezioniamo la struttura/tabella da usare come template.
Proseguiamo alla finestra successiva, dove possiamo selezionare i campi che vogliamo nella nostra entity, ovvero quelli su cui agiremo con le operazioni del servizio.
Selezioniamo infine i campi chiave dell’entity.
A questo punto il nostro semplice Data Model è stato creato, ma prima di proseguire con la
realizzazione delle operazioni CRUDQ, dobbiamo generare la classe provider dell’entity. Cliccare quindi sull’icona relativa e confermare.
Implementazione delle operazioni CRUDQ
Le varie operazioni sono selezionabili dalla cartella Service Implementation, in cui vediamo la lista dei vari entityset presenti nel progetto. Esplodiamo l’entityset appena creato e verrano visualizzate le operazioni CRUDQ.
È da qui che partiremo per l’implementazione di ciascuna di esse, facendo clic destro sul nome dell’operazione e cliccando poi ‘Go to ABAP Workbench’, che ci porterà all’editor della classe, nella quale, all’interno della cartella metodi ereditati, troviamo i metodi che modificheremo come mostrato qui sotto.
READ
La read è l’operazione base del servizio gateway, che permette la lettura di record tramite dati che forniamo nell’URL. Per implementarla andremo a modificare il metodo GET_ENTITY per effettuare la lettura di un singolo record, inserendo la chiave nell’URL della richiesta.
Il codice riportato qui sotto leggerà la chiave e la utilizzerà per accedere al record corrispondente.
METHOD employeeset_get_entity.
DATA: ls_key_tab TYPE /iwbep/s_mgw_name_value_pair,
ls_employee TYPE zemployee.
READ TABLE it_key_tab INTO ls_key_tab WITH KEY name = 'CID'.
SELECT SINGLE *
FROM zemployee
INTO ls_employee
WHERE cid EQ ls_key_tab-value.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING ls_employee TO er_entity.
ENDIF.
ENDMETHOD.
QUERY
La query ci permette di effettuare una richiesta più complessa attraverso le query options. Alcune sono disponibili automaticamente, senza bisogno di implementazioni di alcun tipo, come ad esempio la count che fornisce il conteggio dei record trovati. Altre invece devono essere implementate nel codice del metodo GET_ENTITYSET. Una di queste è la filter, che utilizzeremo nel nostro esempio. Il codice seguente permette di implementarla:
METHOD employeeset_get_entityset.
DATA: lt_emp_tab TYPE TABLE OF zemployee,
ls_emp_tab TYPE zemployee,
es_entityset TYPE zcl_zemployee_mpc=>ts_employee.
SELECT * FROM zemployee INTO TABLE lt_emp_tab WHERE (iv_filter_string).
IF sy-subrc EQ 0.
LOOP AT lt_emp_tab INTO ls_emp_tab.
MOVE-CORRESPONDING ls_emp_tab TO es_entityset.
APPEND es_entityset TO et_entityset.
CLEAR ls_emp_tab.
ENDLOOP.
ENDIF.
ENDMETHOD.
CREATE
La create è l’operazione che ci permette di registrare nuovi record all’interno della nostra tabella. Nel codice andremo a leggere i dati che vengono passati nel body della richiesta e che scriveremo nella tabella.
METHOD employeeset_create_entity.
DATA: ls_employee TYPE zemployee.
io_data_provider->read_entry_data( IMPORTING es_data = er_entity ).
MOVE-CORRESPONDING er_entity TO ls_employee.
INSERT zemployee FROM ls_employee.
ENDMETHOD.
UPDATE
La update è molto simile alla create, e ci permette di andare a modificare un record già esistente in tabella, attraverso l’utilizzo della chiave e dei dati da aggiornare nel body.
METHOD employeeset_update_entity.
DATA: ls_employee TYPE zemployee.
io_data_provider->read_entry_data( IMPORTING es_data = er_entity ).
MOVE-CORRESPONDING er_entity TO ls_employee.
MODIFY zemployee FROM ls_employee.
ENDMETHOD.
DELETE
Per ultimo abbiamo la delete, con la quale cancelliamo un record fornendo di nuovo la chiave che lo identifica. Il codice è il seguente:
METHOD employeeset_delete_entity.
DATA: ls_key_tab TYPE /iwbep/s_mgw_name_value_pair,
ls_employee TYPE zemployee.
READ TABLE it_key_tab INTO ls_key_tab WITH KEY name = 'CID'.
IF sy-subrc = 0.
ls_employee-cid = ls_key_tab-value.
DELETE zemployee FROM ls_employee.
ENDIF.
ENDMETHOD.
A questo punto i metodi sono stati implementati e possiamo procedere con i test, per verificare che tutto funzioni correttamente e la tabella venga aggiornata.
Utilizzo e test dei metodi
Per testare i metodi utilizzeremo il SAP Gateway Client, a cui possiamo accedere direttamente dalla SAP GUI senza bisogno di installare software appositi.
Prima però, è necessario registrare il nostro servizio. Per fare ciò, una volta aperta la cartella ‘Service Maintenance’, facciamo clic destro sul nostro sistema (nel mio caso GW_HUB) e clicchiamo Register.
Compiliamo la schermata seguente fornendo il pacchetto che vogliamo utilizzare, e confermiamo.
Il servizio viene creato e possiamo accedere al Gateway Client, stavolta invece che Register, clicchiamo su SAP Gateway Client e confermiamo. Un altro modo per accedere al Gateway Client è attraverso la transazione /IWFND/GW_CLIENT. Per testare i metodi del nostro entityset, inseriamo nell’url, dopo il nome del servizio, il nome dell’entityset.
READ
Per eseguire il metodo read selezioniamo il radiobutton GET, dopodiché scriviamo nell’URL, tra parentesi, il nome del campo chiave della nostra tabella, e il valore della chiave del record che vogliamo leggere.
L’Url avrà quindi questo aspetto:
/sap/opu/odata/SAP/ZEMPLOYEE_SRV/EmployeeSet(Cid=’0001′)
QUERY
La query che abbiamo implementato ci consente di leggere N record in base alla condizione che forniamo nell’URL. Per farlo usiamo la query option $filter, che si inserisce dopo l’entityset; dopodiché scriviamo la nostra condizione.
L’Url avrà quindi questo aspetto:
/sap/opu/odata/SAP/ZEMPLOYEE_SRV/EmployeeSet?$filter=Cid le ‘0002’
In questo caso la query restituirà tutti i record con Cid minore o uguale a ‘0002’.
CREATE
Per utilizzare il metodo create dobbiamo scrivere il body della richiesta. Fortunatamente, il gateway client ci permette di utilizzare la risposta di una get come template di richiesta, cliccando sul pulsante ‘Use as Request’.
Una volta cliccato il pulsante, selezioniamo il radiobutton POST e cancelliamo la chiave dall’URL.
Infine possiamo modificare il body della nostra richiesta, andando a cambiare la chiave della tabella (nel mio caso CID), e se vogliamo anche gli altri campi.
L’Url avrà quindi questo aspetto:
/sap/opu/odata/SAP/ZEMPLOYEE_SRV/EmployeeSet
Se la risposta è positiva, la tabella sarà stata aggiornata con il nuovo record.
UPDATE
Il metodo update è simile a quello create. Valorizziamo il body nuovamente facendo una read del record che vogliamo modificare e utilizziamo il pulsante ‘Use as Request’, però stavolta selezioniamo il radiobutton PUT e lasciamo la chiave nell’URL.
L’Url avrà quindi questo aspetto:
/sap/opu/odata/SAP/ZEMPLOYEE_SRV/EmployeeSet(Cid=’0003′)
Il record che abbiamo selezionato, verrà modificato nella tabella. Nel mio caso ho modificato la data di nascita.
DELETE
L’ultimo metodo, delete, è invece simile alla read singola. Questo perché va ad agire su un singolo record che verrà cancellato, grazie alla chiave che passiamo nell’URL.
L’Url avrà quindi questo aspetto:
/sap/opu/odata/SAP/ZEMPLOYEE_SRV/EmployeeSet(Cid=’0003′)
Il record con la chiave che abbiamo inserito verrà cancellato, come possiamo vedere nella tabella.
Fatto questo, il nostro servizio è funzionante e può essere utilizzato per modificare la nostra tabella attraverso le operazioni CRUDQ.
Vuoi maggiori informazioni?
Vuoi approfondire l’argomento e ottenere maggiori informazioni o supporto da parte dei nostri developer?
Compila i campi qui sotto, ti ricontatteremo quanto prima.