2
votes

I have an internal table this is written to file and then pulled into the BW as a datasource. Occasionally a non printable character makes it into the file output and breaks the import process into the BW. Below is a sample of my code. Since the itab is not type c or string I am unable to use the find/replace regex on it. Has anyone else had to solve this type of problem before?

    FORM eliminate_non_print_char TABLES p_shiptab STRUCTURE shiptab.     

  LOOP AT p_shiptab INTO wa_shiptab.

    FIND REGEX '[^[:print:]]+(?!$)'
      IN wa_shiptab
    IGNORING CASE.
    "RESULTS result.
    IF  sy-subrc = 0.

     REPLACE REGEX '[^[:print:]]+(?!$)'
        IN wa_shiptab WITH ''
     IGNORING CASE.

    ENDIF.
  ENDLOOP.

DATA: BEGIN OF shiptab OCCURS 2000.
        INCLUDE STRUCTURE ship1.
        INCLUDE STRUCTURE ship2.
DATA: landtx            LIKE vbrk-landtx,
      bl_konwa          LIKE vbak-waerk.                    
        INCLUDE STRUCTURE ship3.
        INCLUDE STRUCTURE ship4.
DATA: frght_amnt_usd    LIKE konv-kwert,                    
      revenue_amnt_usd  LIKE vbap-netwr,                    
      unit_price_usd    LIKE vbap-netpr,                    
      pgi_posting_date  LIKE mkpf-budat,                    
      ord_line_item_qty LIKE lips-lfimg,                    
      asm_no            LIKE kna1-kunnr,
      asm_username      LIKE adrc-sort1,
      va_augru_t        LIKE tvaut-bezei,         
      ship_to_name      LIKE adrc-name1,
      bill_to_name      LIKE adrc-name1,
      forward_to_name   LIKE adrc-name1,
      fmv_amnt           LIKE konv-kbetr,    
      va_butxt           LIKE t001-butxt,    
      sold_to_search_term LIKE adrc-sort1,   
      bill_to_search_term LIKE adrc-sort1,  
      va_prctr           LIKE vbap-prctr,    
      va_bezei           LIKE tvrot-bezei.   
        INCLUDE STRUCTURE zorder_attr.         
DATA: extended_bits_count(20),              
      va_bstkd_hdr LIKE char32.            
DATA: gsm_bp_katr6      LIKE kna1-katr6,    
      gsm_bp_vtext6     LIKE tvk6t-vtext,   
      asm_ze_katr7      LIKE kna1-katr7,    
      asm_ze_vtext7     LIKE tvk7t-vtext,   
      gsm_ze_katr6      LIKE kna1-katr6,    
      gsm_ze_vtext6     LIKE tvk7t-vtext.
DATA:  END OF shiptab

.

The error I get is: "WA_SHIPTAB" must be a character-type data object (data type C, N, D,T, or STRING). I have non character types in the itab shiptab. I know I can do this lookup on each field individually, but the itab has 235 fields and that does not seem efficient.

2
Could you please add the type definition of shiptab?vwegert
Done, I can also add the structures inside shiptab, but they are rather large and would make the post harder to read. Let me know if you would like to see them as well.CodeMonkey
Would it be a possibility to move all non-character fields to a separate substructure?vwegert
Yes, it would result in quite the change to the code base as the existing structure is utilized in different parts of the entire program. I am trying to intercept it at the end. Another option would be to change the other corresponding itab's that write to shiptab after they are populated but before they write to shiptab. I was hoping to simply loop through the finished product and search for non printable chars and replace and or delete them.CodeMonkey
I'd rather not automatically convert all data fields - you wouldn't want to get your business keys, values or dates messed up. Personally, I'd call a method (or even form) for every single text field that might contain unprintable characters.vwegert

2 Answers

2
votes

The program has another copy of the main itab that is char based fields, I looped through this and placed the following code:

REPLACE ALL OCCURRENCES OF REGEX '[^[:print:]]+$'
  IN transtab WITH ''
  IGNORING CASE.

Links for the answer:

SCN Link

Help.SAP Link

1
votes

You could use Runtime Type Sevices to loop through the definition of each field in the table to determine which are type-compatable with the REGEX operation. You can then use dynamic assignment to process only those fields which are compatable, one at a time. For example:

" Initalize Range of typekinds that are compatable with REGEX. See constant 
" attributes of CL_ABAP_DATADESCR for typekind definitions. You'll have to
" define these explicitly
lr_typekind_regex = <...>. 

" Get components of table structure
lo_tabdescr = cl_abap_typedescr=>describe_by_data( p_shiptab ).
lo_strdescr = lo_tabdescr->get_table_ine_type( ).
li_comp = lo_structdescr->get_components( ).

" Loop through table, sanitizing regex-compatable fields in each row
LOOP AT p_shiptab ASSIGNING <la_shiptab>.
  LOOP AT li_comp INTO la_comp.
    CHECK la_comp-type->type_kind IN lr_typekind_regex.

    " Call subroutine containing Regex to remove non-printable chars from field        
    ASSIGN COMPONENT la_comp-name OF STRUCTURE <la_shiptab> TO <l_charvalue>.
    PERFORM sanitize_field CHANGING <l_charvalue>. 

  ENDLOOP.
ENDLOOP.