글
XML을 Internal table로 보내기
REPORT y_test_xml MESSAGE-ID zmc_qm001.
PARAMETERS: p_filnam TYPE localfile OBLIGATORY
DEFAULT 'C:\test_xml4.xml'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_filnam.
DATA: l_v_fieldname TYPE dynfnam.
l_v_fieldname = p_filnam.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = l_v_fieldname
IMPORTING
file_name = p_filnam.
START-OF-SELECTION.
TYPES:
BEGIN OF ty_tab,
name TYPE string,
value TYPE string,
depth TYPE i,
END OF ty_tab.
DATA:
lcl_xml_doc TYPE REF TO cl_xml_document,
v_subrc TYPE sysubrc,
v_node TYPE REF TO if_ixml_node,
v_child_node TYPE REF TO if_ixml_node,
v_root TYPE REF TO if_ixml_node,
v_iterator TYPE REF TO if_ixml_node_iterator,
v_nodemap TYPE REF TO if_ixml_named_node_map,
v_count TYPE i,
v_index TYPE i,
v_attr TYPE REF TO if_ixml_node,
v_name TYPE string,
v_prefix TYPE string,
v_value TYPE string,
v_depth TYPE i,
v_char TYPE char2.
DATA:
itab TYPE STANDARD TABLE OF ty_tab,
wa TYPE ty_tab.
CREATE OBJECT lcl_xml_doc.
CALL METHOD lcl_xml_doc->import_from_file
EXPORTING
filename = p_filnam
RECEIVING
retcode = v_subrc.
CHECK v_subrc = 0.
v_node = lcl_xml_doc->m_document.
CHECK NOT v_node IS INITIAL.
v_iterator = v_node->create_iterator( ).
v_node = v_iterator->get_next( ).
WHILE NOT v_node IS INITIAL.
CASE v_node->get_type( ).
WHEN if_ixml_node=>co_node_element.
v_name = v_node->get_name( ).
v_nodemap = v_node->get_attributes( ).
v_depth = v_node->get_depth( ).
IF NOT v_nodemap IS INITIAL.
* attributes
v_count = v_nodemap->get_length( ).
DO v_count TIMES.
v_index = sy-index - 1.
v_attr = v_nodemap->get_item( v_index ).
v_name = v_attr->get_name( ).
v_prefix = v_attr->get_namespace_prefix( ).
v_value = v_attr->get_value( ).
* v_depth = v_node->get_depth( ).
ENDDO.
ENDIF.
WHEN if_ixml_node=>co_node_text OR
if_ixml_node=>co_node_cdata_section.
* text node
v_value = v_node->get_value( ).
* v_depth = v_node->get_depth( ).
MOVE v_value TO v_char.
IF v_char <> cl_abap_char_utilities=>cr_lf.
wa-name = v_name.
wa-value = v_value.
wa-depth = v_depth.
APPEND wa TO itab.
CLEAR wa.
ENDIF.
ENDCASE.
* advance to next node
v_node = v_iterator->get_next( ).
ENDWHILE.
LOOP AT itab INTO wa.
WRITE: / 'Name :', wa-name, AT 30 'Valeu:', wa-value, AT 60 'Depth:', wa-depth.
ENDLOOP.
'SAP Program > ABAP' 카테고리의 다른 글
Internal table에서 중복 데이타 찾기 (0) | 2017.11.23 |
---|---|
Internal table data to xml (0) | 2017.11.22 |
GUI Status 생성시 덤프 발생하는 경우 (0) | 2017.11.20 |
BADI 생성/조회 t-code (0) | 2017.11.03 |
BP Relation Table (0) | 2017.11.02 |
글
Non Unicode system에서 받은 한글 파일 작업시
Non Unicode System에서 한글(2Byte 한글)이 포함된 Text File을
Unicode SAP System에서 읽을때 한글을 1Byte 씩 읽게되면 문제가 발생하는데
이를 해결하는 방법
DATA: BEGIN OF GT_DATA OCCURS 0,
PONO(6) TYPE C,
ZEVT_DTTM(19) TYPE C,
ZBFEVT(3) TYPE C,
ZAFEVT(3) TYPE C,
EVT(3) TYPE C,
ZFAULT(630) TYPE C,
END OF GT_DATA.
DATA: BEGIN OF GT_REC OCCURS 0,
TDATA(999) TYPE C,
END OF GT_REC.
DATA:GT_TEST LIKE TABLE OF GT_REC WITH HEADER LINE.
DATA: W_DSN(500) TYPE C,
W_FILEPATH(500) TYPE C,
W_REC(999) TYPE C,
W_CNV(999) TYPE C.
FORM DATA_UPLOAD USING U_FILENM.
DATA: LW_FILENM TYPE STRING.
DATA: W_STR TYPE STRING.
DATA: CP_TAB TYPE NLS_LANGU_CP_TAB,
L_WA TYPE NLS_LANGU_CP_LINE,
CC TYPE REF TO CL_NLS_STRUC_CONTAINER.
DATA: BEGIN OF HEAD OCCURS 0,
H_STR(1056),
END OF HEAD.
W_DSN = U_FILENM.
PERFORM OPEN_DATASET.
IF G_ERR2 IS INITIAL.
PERFORM READ_DATASET.
ENDIF.
PERFORM CLOSE_DATASET.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " DATA_UPLOAD
FORM OPEN_DATASET .
DATA MESS TYPE STRING.
CLEAR : G_ERR2.
OPEN DATASET W_DSN FOR INPUT IN LEGACY TEXT MODE CODE PAGE '8500'.
IF SY-SUBRC = 8.
MESSAGE S000 WITH 'File not exists'.
G_ERR2 = 'X'.
EXIT.
ENDIF.
IF SY-SUBRC <> 0.
MESSAGE S000 WITH 'File not exists'.
G_ERR2 = 'X'.
EXIT.
ENDIF.
ENDFORM. " OPEN_DATASET
FORM READ_DATASET .
DATA: CP_TAB TYPE NLS_LANGU_CP_TAB,
L_WA TYPE NLS_LANGU_CP_LINE,
L_CODEPAGE TYPE CPCODEPAGE,
CC TYPE REF TO CL_NLS_STRUC_CONTAINER,
L_BUF(999) TYPE C.
CLEAR : GT_DATA, GT_DATA[].
* NON UNICODE(한글 2바이트로 인식)
DO.
CLEAR W_REC.
READ DATASET W_DSN INTO W_REC.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
GT_REC = W_REC.
APPEND GT_REC.
ENDDO.
LOOP AT GT_REC.
L_WA-LANGU = '3'.
L_WA-CODEPAGE = '8500'.
INSERT L_WA INTO TABLE CP_TAB.
CC = CL_NLS_STRUC_CONTAINER=>CREATE( CP_TAB = CP_TAB ).
TRY.
CALL METHOD CC->STRUC_TO_CONT
EXPORTING
STRUC = GT_REC
LANGU = '3'
IMPORTING
CONT = GT_TEST-TDATA.
CATCH CX_SY_CONVERSION_CODEPAGE .
CATCH CX_PARAMETER_INVALID_RANGE .
ENDTRY.
CC = CL_NLS_STRUC_CONTAINER=>CREATE( CP_TAB = CP_TAB ).
TRY.
CALL METHOD CC->CONT_TO_STRUC
EXPORTING
CONT = GT_TEST-TDATA
LANGU = '3'
IMPORTING
STRUC = GT_DATA.
CATCH CX_SY_CONVERSION_CODEPAGE .
CATCH CX_PARAMETER_INVALID_RANGE .
ENDTRY.
APPEND GT_DATA.
ENDLOOP.
ENDFORM. " READ_DATASET
글
GUI Status 생성시 덤프 발생하는 경우
GUI Status 생성시 덤프 발생하는 경우 조치 방법
LSMPEF30의 847 Line의
new_adm-actcode 에 X 값을 지워준다.
'SAP Program > ABAP' 카테고리의 다른 글
Internal table data to xml (0) | 2017.11.22 |
---|---|
XML을 Internal table로 보내기 (0) | 2017.11.22 |
BADI 생성/조회 t-code (0) | 2017.11.03 |
BP Relation Table (0) | 2017.11.02 |
MCHBH LFGJA LFMON Max 값 select (0) | 2017.10.26 |