2012-02-02 8 views
5

Sto cercando un costrutto linguistico o un modulo funzione che sia MOVE-CORRESPONDING IGNORING INITIALS. In poche parole, voglio qualcosa che funzioni esattamente come MOVE-CORRESPONDING source TO dest ma ignori tutti i campi che sono iniziali nello source.C'è qualcosa come MOVE-CORRESPONDING IGNORING INITIALS in ABAP?

C'è qualcosa del genere?

risposta

3

Ho preparato il mio codice personale che voglio condividere. Non è perfetto, non funzionerà con strutture complesse. Comunque non ho bisogno di niente di più adesso che lavorare su strutture piatte.

CLASS lcl_utilities DEFINITION FINAL CREATE PRIVATE. 
    PUBLIC SECTION. 
    CLASS-METHODS: 
     move_corresponding_ignore_init 
     IMPORTING 
      i_str_source TYPE any 
     CHANGING 
      c_str_dest TYPE any. 
ENDCLASS. 

CLASS lcl_utilities IMPLEMENTATION. 
    METHOD move_corresponding_ignore_init. 
    DATA: 
     l_rcl_abap_structdescr TYPE REF TO cl_abap_structdescr. 

    l_rcl_abap_structdescr ?= cl_abap_typedescr=>describe_by_data(i_str_source). 
    LOOP AT l_rcl_abap_structdescr->components ASSIGNING FIELD-SYMBOL(<fs_str_component>). 
     ASSIGN COMPONENT <fs_str_component>-name OF STRUCTURE c_str_dest TO FIELD-SYMBOL(<fs_dest_field>). 
     IF sy-subrc = 0. 
     ASSIGN COMPONENT <fs_str_component>-name OF STRUCTURE i_str_source TO FIELD-SYMBOL(<fs_source_field>). 
     ASSERT sy-subrc = 0. 
     IF <fs_source_field> IS NOT INITIAL. 
      <fs_dest_field> = <fs_source_field>. 
     ENDIF. 
     ENDIF. 
    ENDLOOP. 
    ENDMETHOD.     "move_corresponding_ignore_init 
ENDCLASS. 

... e una piccola macro per usarlo meno come un costrutto linguistico.

DEFINE move_corresponding_ignore_init. 
    lcl_utilities=>move_corresponding_ignore_init(
    exporting 
     i_str_source = &1 
    changing 
     c_str_dest = &2 
). 
END-OF-DEFINITION. 
+1

Se esegui il cast senza controllo, puoi omettere l_rcl_abap_typedescr interamente. – vwegert

+0

@vwegert: hai ragione. Ho già migliorato la codifica. – Jagger

1

Non esiste un linguaggio per strutture arbitrarie. Per i campi dei caratteri, puoi usare OVERLAY ... WITH, ma se provi a farlo con le strutture, questo porta a un codice veramente disordinato e a molti problemi imprevisti con contenuti a lunghezza variabile. La soluzione migliore sarebbe utilizzare RTTI (Runtime Type Identification) per fare ciò, ma fare attenzione quando si controllano i valori iniziali.

+0

Grazie per il suggerimento, ma non è quello che sto cercando. Ho preparato il mio pezzo di codice che non è così complesso, credo. – Jagger

+0

@Jagger: l'utilizzo di RTTI è esattamente ciò che hai fatto nel codice che hai fornito, quindi perché non sarebbe quello che stai cercando? – vwegert

+0

Scusa, forse la mia risposta è stata un po 'incomprensibile. Stavo prendendo circa 'OVERLAY WITH'. La seconda parte della tua risposta è in effetti ciò che ho usato nel mio codice. – Jagger