mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
SSFO, fix #813
This commit is contained in:
parent
5893634906
commit
99868e1e2c
|
@ -13,6 +13,9 @@ CLASS lcl_object_ssfo DEFINITION INHERITING FROM lcl_objects_super FINAL.
|
||||||
INTERFACES lif_object.
|
INTERFACES lif_object.
|
||||||
ALIASES mo_files FOR lif_object~mo_files.
|
ALIASES mo_files FOR lif_object~mo_files.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
METHODS: fix_ids IMPORTING ii_xml_doc TYPE REF TO if_ixml_document.
|
||||||
|
|
||||||
ENDCLASS. "lcl_object_dtel DEFINITION
|
ENDCLASS. "lcl_object_dtel DEFINITION
|
||||||
|
|
||||||
*----------------------------------------------------------------------*
|
*----------------------------------------------------------------------*
|
||||||
|
@ -163,16 +166,11 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
|
||||||
li_node->set_value( 'DUMMY' ).
|
li_node->set_value( 'DUMMY' ).
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
* remove IDs it seems that they are not used for anything
|
|
||||||
* the IDs are "random" so it caused diff files
|
|
||||||
IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
|
|
||||||
li_attr = li_node->get_attributes( ).
|
|
||||||
li_attr->remove_named_item( 'ID' ).
|
|
||||||
ENDIF.
|
|
||||||
|
|
||||||
li_node = li_iterator->get_next( ).
|
li_node = li_iterator->get_next( ).
|
||||||
ENDWHILE.
|
ENDWHILE.
|
||||||
|
|
||||||
|
fix_ids( li_xml_doc ).
|
||||||
|
|
||||||
li_element = li_xml_doc->get_root_element( ).
|
li_element = li_xml_doc->get_root_element( ).
|
||||||
li_element->set_attribute(
|
li_element->set_attribute(
|
||||||
name = 'sf'
|
name = 'sf'
|
||||||
|
@ -186,6 +184,54 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
|
||||||
|
|
||||||
ENDMETHOD. "serialize
|
ENDMETHOD. "serialize
|
||||||
|
|
||||||
|
METHOD fix_ids.
|
||||||
|
* makes sure ID and IDREF values are the same values for each serialization run
|
||||||
|
* the standard code has a counter that keeps increasing values
|
||||||
|
|
||||||
|
DATA: lv_name TYPE string,
|
||||||
|
li_idref TYPE REF TO if_ixml_node,
|
||||||
|
li_node TYPE REF TO if_ixml_node,
|
||||||
|
li_attr TYPE REF TO if_ixml_named_node_map,
|
||||||
|
li_iterator TYPE REF TO if_ixml_node_iterator,
|
||||||
|
lt_idref TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
|
||||||
|
|
||||||
|
|
||||||
|
li_iterator = ii_xml_doc->create_iterator( ).
|
||||||
|
li_node = li_iterator->get_next( ).
|
||||||
|
WHILE NOT li_node IS INITIAL.
|
||||||
|
lv_name = li_node->get_name( ).
|
||||||
|
IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
|
||||||
|
li_idref = li_node->get_attributes( )->get_named_item( 'IDREF' ).
|
||||||
|
IF li_idref IS BOUND.
|
||||||
|
APPEND li_idref->get_value( ) TO lt_idref.
|
||||||
|
li_idref->set_value( |{ sy-tabix }| ).
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
li_node = li_iterator->get_next( ).
|
||||||
|
ENDWHILE.
|
||||||
|
|
||||||
|
li_iterator = ii_xml_doc->create_iterator( ).
|
||||||
|
li_node = li_iterator->get_next( ).
|
||||||
|
WHILE NOT li_node IS INITIAL.
|
||||||
|
lv_name = li_node->get_name( ).
|
||||||
|
IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
|
||||||
|
li_idref = li_node->get_attributes( )->get_named_item( 'ID' ).
|
||||||
|
IF li_idref IS BOUND.
|
||||||
|
lv_name = li_idref->get_value( ).
|
||||||
|
READ TABLE lt_idref WITH KEY table_line = lv_name TRANSPORTING NO FIELDS.
|
||||||
|
IF sy-subrc = 0.
|
||||||
|
li_idref->set_value( |{ sy-tabix }| ).
|
||||||
|
ELSE.
|
||||||
|
li_attr = li_node->get_attributes( ).
|
||||||
|
li_attr->remove_named_item( 'ID' ).
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
li_node = li_iterator->get_next( ).
|
||||||
|
ENDWHILE.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD lif_object~deserialize.
|
METHOD lif_object~deserialize.
|
||||||
* see function module FB_UPLOAD_FORM
|
* see function module FB_UPLOAD_FORM
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user