Cerca nel blog

domenica 7 ottobre 2018

ABAP: Creare Campo custom in Tabella FMBL e visualizzarlo nella FMBB

Creare Campo custom in Tabella FMBL e visualizzarlo nella FMBB

Per Aggiungere un campo custom non editabile da poter visualizzare sulla transazione SAP FMBB  (Budgeting Workbench) bisogna modificare la Customer Include  CI_FMBL  contenuta all’interno della tabella FMBL : Gestione fondi: righe doc. budget (documenti di acq.)
Dalla transazione SE11, nel campo tipo dati inserite CI_FMBL e premete il pulsante Modifica:


Nella struttura che stiamo modificando inseriamo il nostro campo custom, salviamo e attiviamo, in questo modo avremo il nuovo campo anche sulla tabella FMBL:


Dopo l’aggiunta del campo e  lanciando la transazione FMBB, il campo che è stato aggiunto verrà visualizzato sulle posizioni:


Per rendere tale campo non editabile e per far si che in fase di parcheggio tale campo sia sempre visualizzabile alla  fine della tabella degli item (usando il campo col_pos della fieldcat)bisogna creare un enhancment implicito  all’interno dell’include LFMBWBF05 alla fine della form update_structure.
Creato l’Enhancment bisogna agire sulla tabella della fiedlcat dal nome c_t_field_catalog andando a modificare la proprità edit del campo custom nel seguente modo:

ENHANCEMENT 1  ZHEN_FM_FIELDCAT_CORRISPETTIVO.    "active version
  if sy-tcode eq 'FMBB'.
     if not c_t_field_catalog[] is INITIAL.
        READ TABLE c_t_field_catalog ASSIGNING FIELD-SYMBOL(<fs_fieldcatalog>)
                    WITH KEY fieldname = 'ZPERC_CORRISPETTIVO'.
                if <fs_fieldcatalog> is ASSIGNED.
                     CLEAR : <fs_fieldcatalog>-edit.
                   <fs_fieldcatalog>-outputlen = '15'.
                   <fs_fieldcatalog>-col_pos = '33'.
                endif.
     endif.
  endif.
ENDENHANCEMENT.
ENDFORM.


I dati presenti all’interno del DB vengono riportati all’interno della tabella c_t_doc_lines e per essere mostrati a video bisogna riportarli all’interno della tabella c_t_alv. Le due tabelle possono essere messe in relazione con il campo docln.
Di seguito il codice relativo dell’enhancment:

ENHANCEMENT 1  ZHEN_FM_POP_CORRISPETTIVO.    "active version
if sy-tcode eq 'FMBB' and not c_t_doc_lines[] is INITIAL and not c_t_alv[] is INITIAL.
    loop at c_t_doc_lines ASSIGNING FIELD-SYMBOL(<fs_doc_line>).
      READ TABLE c_t_alv ASSIGNING FIELD-SYMBOL(<fs_c_t_alv>)
                                       WITH KEY docln = <fs_doc_line>-docln.
      if <fs_c_t_alv> is ASSIGNED.
      <fs_c_t_alv>-zperc_corr = <fs_doc_line>-zperc_corr.
      endif.
    ENDLOOP.
    UNASSIGN : <fs_doc_line>,
               <fs_c_t_alv>.
  endif.
ENDENHANCEMENT.

Nella BAPI STANDARD per la creazione del documento che simula la FMBB BAPI_0050_CREATE bisogna valorizza la struttura EXTENSION_IN nel seguente modo, 1 record per i campi custom di testata se ci sono, e tanti record quanti sono le posizione per i campi custom di posizione:


In particolare i campi obbligatori da inserire per i campi cusotmo di posizione oltre al campo creato bisogna valorizzare l'item e RPMAX =016. Esempio:

Nel caso si dovessero effettuare dei controlli sui campi custom bisogna creare un enhancement della BADI BAPI_0050 nel metodo CRATE_IN

METHOD if_ex_bapi_0050~create_in.

  DATArec_fmbh TYPE fmbh.
  DATArec_head TYPE bapi_0050_header.
  DATArec_mes TYPE bapiret2.
  DATArec_ext TYPE bapiparex.

******Sivestri.
Data t_ritem TYPE BAPI_0050_ITEM,
       t_sitem TYPE BAPI_0050_ITEM.

  IF headerdata-doctype 'Z002'.
    EXIT.
  ENDIF.
  READ TABLE extension_in INTO rec_ext WITH KEY  structure  'BAPI_TE_FMBH'.

****** Vietri
  IF headerdata-PROCESS <> 'ENTR'.
    IF sy-subrc 0.
      SELECT SINGLE FROM  fmbh INTO rec_fmbh WHERE
      zid_impegno rec_ext-valuepart1+52(16).
      IF sy-subrc 0.

        rec_mes-type 'E'.
        rec_mes-id 'DB'.
        rec_mes-number '000'.
        rec_mes-message 'Id impegno già utilizzato.'.
        APPEND rec_mes TO return.
     ENDIF.
    ENDIF.
  ENDIF.
ENDMETHOD.


Ringrazio il collega Marco Savastano per questa documentazione.