SAP Interactive Forms by Adobe

Ä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.

  1. 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.
  2. 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.

SAP qRFC

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.

SAP qRFC

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.

SAP qRFC

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.

SAP qRFC

Durch Doppelklick auf den Queue-Eintrag kommt man in die Sicht, um die Queue zu registrieren und anzustarten.

SAP qRFC

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.

SAP qRFC
SAP qRFC

Im QIN-Scheduler wird jetzt der Präfix des Queue-Namens eingetragen.

SAP qRFC

 

SAP qRFC

 

Weitere Informationen

Spezialthemen zu SAP Formularen
SAP Formulare zum Festpreis
SAP Formularentwicklung