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:

  1. Die Änderung der internen Tabelle RESB_BT  über einen Dirty-Assign
  2. Ä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.

 

 

Enno Wulff