Komponenten einem Fertigungsauftrag hinzufügen
Für den Fertigungsaufträge sind die BAPIs leider sehr rar gesät und man muss auf andere Bausteine ausweichen. Um einem Auftrag Komponenten hinzuzufügen, habe ich nur den Baustein CO_XT_COMPONENT_ADD gefunden. Die CO_XT-Funktionsbausteine sind zwar prinzipiell “extern” und in der Funktionsgruppe “APIs Fertigungsauftrag”, jedoch sind die Bausteine allesamt sehr mit Vorsicht zu genießen.
Das folgende Coding fügt einem Fertigungsauftrag eine Komponente (Materialnummer) hinzu.
Code
"Lokale Daten DATA ls_return TYPE coxt_bapireturn. DATA lt_return TYPE coxt_t_bapireturn. DATA lv_error_occurred TYPE boolean. DATA ls_resbd_created TYPE resbd. DATA lt_resbt_exp TYPE STANDARD TABLE OF resbb. DATA lv_posnr TYPE positionno. DATA ls_quan TYPE coxt_s_quantity. DATA ls_stor_loc TYPE coxt_s_storage_location. DATA ls_stor_loc_x TYPE coxt_s_storage_locationx. ls_quan-quantity = menge. ls_quan-uom = meins. ls_stor_loc-werks = werks. ls_stor_loc-lgort = lgort. ls_stor_loc_x-werks = abap_true. ls_stor_loc_x-lgort = abap_true. "Komponente hinzufügen CALL FUNCTION 'CO_XT_COMPONENT_ADD' EXPORTING is_order_key = aufnr i_material = matnr is_requ_quan = ls_quan i_operation = 1 is_storage_location = ls_stor_loc is_storage_locationx = ls_stor_loc_x i_postp = 'L' "Lagerposition i_posno = lv_posnr IMPORTING es_bapireturn = ls_return e_error_occurred = lv_error_occurred es_resbd_created = ls_resbd_created TABLES resbt_exp = lt_resbt_exp. IF lv_error_occurred = abap_false. *== PRE-Commit CALL FUNCTION 'CO_XT_ORDER_PREPARE_COMMIT' TABLES et_bapireturn = lt_return. "Keine Fehler! CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. ELSE. "Fehlerbehandlung ENDIF.
Fehlende Positionsnummer
Der Baustein hat leider einen kleinen Schönheitsfehler: Die Positionsnummer (RSB-POSNR) wird leider nicht gesetzt und kann auch nicht ohne weiteres geändert werden. Um die Positionsnummer trotzdem ändern zu können, habe ich zwei Lösungen gefunden:
- Die Änderung der internen Tabelle RESB_BT über einen Dirty-Assign
- Änderung über die Standardbausteine
- CO_BT_RESB_READ_WITH_KEY
- CO_BT_RESB_GET_LAST_POSNR
- CO_BT_RESB_UPDATE
Die Änderung muss nach dem CO_XT_COMPONENT_ADD und vor dem Commit erfolgen.
Positionsnummer ändern über Dirty-Assign
*--------------------------------------------------------------------* * set item number *--------------------------------------------------------------------* TYPES: BEGIN OF ts_resb_bt. INCLUDE TYPE resbb. TYPES: indold LIKE sy-tabix, no_req_upd LIKE sy-datar, END OF ts_resb_bt. TYPES tt_resb_bt TYPE TABLE OF ts_resb_bt. FIELD-SYMBOLS <lt_resb_bt> TYPE tt_resb_bt. FIELD-SYMBOLS <ls_resb_bt> TYPE ts_resb_bt. ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <lt_resb_bt>. LOOP AT <lt_resb_bt> ASSIGNING <ls_resb_bt>. IF <ls_resb_bt>-posnr IS INITIAL. <ls_resb_bt>-posnr = CONV numc04( <ls_resb_bt>-rspos * 10 ). ENDIF. ENDLOOP.
Änderung der Positionsnummer über Funktionsbausteine
DATA resbd_exp TYPE resbd. DATA posnr_max TYPE tcn41-posnr_mat. DATA index_exp TYPE sy-tabix. DATA vbkz_exp TYPE resbb-vbkz. DATA nfgrp_exp TYPE resbd-nfgrp. DATA posnr_exp TYPE resbd-posnr. CALL FUNCTION 'CO_BT_RESB_READ_WITH_KEY' EXPORTING rsart_imp = ls_resbd-rsart rsnum_imp = ls_resbd-rsnum rspos_imp = ls_resbd-rspos IMPORTING index_exp = index_exp " Index interner Tabellen posnr_exp = posnr_exp " Nummer der Stücklistenposition resbd_exp = resbd_exp " Reservierung/Sekundärbedarf nfgrp_exp = nfgrp_exp " Ein-/Auslaufdaten: Nachfolgegruppe vbkz_exp = vbkz_exp " Verbuchungskennzeichen EXCEPTIONS not_found = 1 OTHERS = 2. CALL FUNCTION 'CO_BT_RESB_GET_LAST_POSNR' EXPORTING aufpl = aufpl aplzl = aplzl IMPORTING posnr_max = posnr_max. resbd_exp-posnr = posnr_max + 10. CALL FUNCTION 'CO_BT_RESB_UPDATE' EXPORTING resb_new = resbd_exp tabix_old = index_exp.
Dialog oder nicht Dialog?
Ein weiteres Problem könnte der Baustein CO_XT_ORDER_PREPARE_COMMIT machen, denn bei der Änderung des Fertigungsauftrags können Popups erscheinen, die vom Anwender bestätigt werden müssen.
Wenn man Dialoge verhindern möchte, dann muss der Update-Baustein CO_ZV_ORDER_POST direkt aufgerufen werden. Dieser hat einen Parameter NO_DIALOG, den man entsprechend mit X besetzen kann.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024