Ändern von Daten eines SAP Objekts mit qRFC
In vielen Fällen ist es notwendig, Daten eines Objekts nach dem Sichern nochmals zu verändern.
Gründe hierfür können sein:
- Es gibt keinen entsprechenden Userexit, um Daten des Objekts vor dem Sichern zu manipulieren.
- Es stehen erst nach dem Sichern die entsprechenden Felder zur Verfügung, mit deren Hilfe man Daten des Objekts manipulieren möchte.
Szenario
Beim Sichern des Fertigungsauftrags soll der Kurztext des Arbeitsvorgangs geändert werden.
Es gibt zwar im Fertigungsauftrag sowohl den zentralen Userexit EXIT_SAPLCOBT_001 als auch den BADI WORKORDER_UPDATE beim Sichern, aber es lassen sich hier keine Daten des Fertigungsauftrags ändern.
Ändern von Daten eines Objekts mit qRFC
Das Problem besteht darin, dass man den Fertigungsauftrag nicht ändern kann, bevor er gespeichert ist und die Sperre aufgehoben wurde.
Es bieten sich folgende Möglichkeiten an, einen Fertigungsauftrag nach dem Sichern nochmals zu ändern.
- Im Userexit EXIT_SAPLCOBT_001 wird ein Funktionsbaustein eingefügt, der IN BACKGROUND TASK, d.h. nach COMMIT WORK aufgerufen wird. Im Funktionsbaustein fügt man den WAIT-Befehl ein, um das dortige Coding nach z.B. 5 sec Wartezeit zu durchlaufen. Alternativ kann man zu Beginn des Funktionsbausteins in einer DO-Schleife in Verbindung mit dem WAIT-Befehl das Sperrobjekt zum Fertigungsauftrag abfragen. Wenn die Sperre aufgehoben wurde, wird das Coding des Funktionsbausteins durchlaufen.
- Im Userexit EXIT_SAPLCOBT_001 wird ein Report eingefügt, der als Job nach z.B. 5 sec Wartezeit gestartet wird.
SAP bietet jedoch zusätzlich zu den genannten Methoden mit dem queued Remote Function Call (qRFC) eine elegante Möglichkeit, den Fertigungsauftrag nachträglich in einer Queue zu ändern und eventuelle Fehler transparent zu machen.
Im Folgenden werden die Arbeitsschritte aufgezeigt, wie man einen Funktionsbaustein via qRFC im Userexit EXIT_SAPLCOBT_001 aufruft.
Anlegen eines RFC-fähigen Funktionsbausteins
Zunächst wird ein RFC-fähiger Funktionsbaustein angelegt.
FUNCTION z_pp_change_avfc_qrfc.
*“———————————————————————-
*“*“Lokale Schnittstelle:
*“ TABLES
*“ HEADER_TABLE STRUCTURE CAUFVDB OPTIONAL
*“ OPERATION_TABLE STRUCTURE AFVGB OPTIONAL
*“———————————————————————-
* Deklarationen —————————————————— *
DATA: ls_header TYPE caufvdb,
ls_operation TYPE afvgb,
lv_tabix TYPE i,
lt_opr_change TYPE cose_t_opr_change,
ls_opr_change TYPE cose_s_opr_change,
lv_order_number TYPE aufnr.
DATA: lt_return TYPE TABLE OF bapiret2.
DATA: ls_return TYPE bapiret2.
* Update the oparation table AFVC ———————————— *
LOOP AT header_table INTO ls_header.
lv_order_number = ls_header-aufnr.
LOOP AT operation_table INTO ls_operation
WHERE aufpl = ls_header-aufpl.
ls_operation-ltxa1 = ‚123456‘.
MOVE-CORRESPONDING ls_operation TO ls_opr_change.
ls_opr_change-ltxa1_x = ‚X‘.
APPEND ls_opr_change TO lt_opr_change.
* Fertigungsauftrag: Vorgänge ändern ——————————— *
CALL FUNCTION ‚CO_SE_PRODORD_OPR_CHANGE‘
EXPORTING
iv_order_number = lv_order_number
it_opr_change = lt_opr_change
iv_refresh = ‚X‘
iv_order_post = ‚X‘
iv_commit = ‚X‘
IMPORTING
es_return = ls_return.
IF ls_return-type = ‚E‘.
MESSAGE ID ls_return-id
TYPE ls_return-type
NUMBER ls_return-number
WITH ls_return-message_v1
ls_return-message_v2
ls_return-message_v3.
ENDIF.
Der Funktionsbaustein wird im Userexit EXIT_SAPLCOBT_001 mit dem Attribut IN BACKGROUND TASK eingefügt. Er soll nur ein einziges mal beim initialen Anlegen des Fertigungsauftrags aufgerufen werden.
Triggern des Funktionsbausteins als qRFC in der Eingangsqueue
Der Funktionsbaustein soll als qRFC in der Eingangsqueue der Transaktion SMQ2 ausgeführt werden. Dazu ist es notwendig, dass vor dem Funktionsbaustein IN BACKGROUND TASK der Funktionsbaustein TRFC_SET_QIN_PROPERTIES aufgrufen wird. Dem Funktionsbaustein TRFC_SET_QIN_PROPERTIES ist ein eindeutiger Queue-Name mitzugeben. Der Queue-Name sollte mit einem “Z” beginnen und zur eindeutigen Identifizierung die Fertigungsauftragsnummer enthalten. Ein Name könnte z.B. “ZPP_FAUF_0000100373” sein.
DATA: lv_queue_name TYPE trfcqin-qname.
READ TABLE header_table_old INDEX 1.
IF sy-subrc NE 0.
CONCATENATE ‚ZPP_FAUF_‘
header_table-aufnr
INTO lv_queue_name.
CALL FUNCTION ‚TRFC_SET_QIN_PROPERTIES‘
EXPORTING
qin_name = lv_queue_name
EXCEPTIONS
invalid_queue_name = 1
OTHERS = 2.
CALL FUNCTION ‚Z_PP_CHANGE_AVFC_QRFC‘
IN BACKGROUND TASK DESTINATION ‚NONE‘
TABLES
header_table = header_table
operation_table = operation_table.
Beim Sichern des Fertigungsauftrags wird nun nach COMMIT WORK der Funktionsbaustein Z_PP_CHANGE_AVFC_QRFC in der Queue ZPP_FAUF_<AUFNR> abgearbeitet. Wenn der Fertigungsauftrag noch gesperrt ist, wird die Verarbeitung abgebrochen und eine Fehlermeldung in die Queue gestellt. Der Queue-Scheduler ruft nun periodisch je nach Einstellung die Queue nun so lange auf, bis der Funktionsbaustein der Queue erfolgreich verarbeitet wurde. Je nach Einstellung erfolgt die Abarbeitung der Queue n mal.
Anzeigen der Queue in der Eingangsqueue-Verarbeitung SMQ2
Wenn man jetzt einen Fertigungsauftrag initial anleget und sichert, wird ein Queue-Eintrag zur aktuellen Fertigungsauftragsnummer in Transaktion SMQ2 erzeugt.
In Transaktion SMQs ist der Eintrag sichtbar.
Durch Doppelklick auf den Queue-Eintrag kommt man in die Sicht, um die Queue zu registrieren und anzustarten.
Die Queue erhält den Status RUNNING und der Funktionsbaustein Z_PP_CHANGE_AVFC_QRFC wird jetzt aufgerufen und verarbeitet.
Wenn alles ok ist, dann verschwindet der Queue-Eintrag. In einer Endlosschleife bleibt der Status auf RUNNING, im Fehlerfall wird eine Fehlermeldung ausgegeben.
Registrierung der Queue im QIN-Scheduler
Der soeben gezeigte Weg erfordert, dass die Queue immer manuell gegistriert und angestartet werden muss. Zur automatischen Queue-Verarbeitung registriert man die Queue im QIN-Scheduler. Der QIN-Scheduler plant dann die Verarbeitung der Queue nach dem Sichern eines Fertigungsauftrags automatisch ein.
Nun geht man in die Transaktion SMQ2 und registriert die Queue.
Im QIN-Scheduler wird jetzt der Präfix des Queue-Namens eingetragen.
Weitere Informationen
Spezialthemen zu SAP Formularen
SAP Formulare zum Festpreis
SAP Formularentwicklung