Permalink
Fetching contributors…
Cannot retrieve contributors at this time
429 lines (377 sloc) 19.1 KB
<?xml version="1.0" encoding="iso-8859-1"?>
<CLAS CLSNAME="ZSAPLINK_TABLE_CONTENTS" VERSION="1" LANGU="E" DESCRIPT="SAPlink - Table Contents" UUID="FAD377BAD34F5248A16A198E70B1EA84" CATEGORY="00" EXPOSURE="2" STATE="1" RELEASE="0" AUTHOR="BCUSER" CREATEDON="20070901" CHANGEDBY="BCUSER" CHANGEDON="00000000" CHGDANYON="00000000" CLSFINAL="X" CLSCCINCL="X" FIXPT="X" UNICODE="X" R3RELEASE="700" CLSBCCAT="00" DURATION_TYPE="0 " RISK_LEVEL="0 " REFCLSNAME="ZSAPLINK">
<publicSection>class ZSAPLINK_TABLE_CONTENTS definition
public
inheriting from ZSAPLINK
final
create public .
*&quot;* public components of class ZSAPLINK_TABLE_CONTENTS
*&quot;* do not include other source files here!!!
public section.
methods CHECKEXISTS
redefinition .
methods CREATEIXMLDOCFROMOBJECT
redefinition .
methods CREATEOBJECTFROMIXMLDOC
redefinition .</publicSection>
<protectedSection>*&quot;* protected components of class ZSAPLINK_TABLES
*&quot;* do not include other source files here!!!
protected section.
methods DELETEOBJECT
redefinition .
methods GETOBJECTTYPE
redefinition .</protectedSection>
<privateSection>*&quot;* private components of class ZSAPLINK_TABLES
*&quot;* do not include other source files here!!!
private section.</privateSection>
<localImplementation>*&quot;* local class implementation for public class
*&quot;* use this source file for the implementation part of
*&quot;* local helper classes</localImplementation>
<localTypes>*&quot;* use this source file for any type declarations (class
*&quot;* definitions, interfaces or data types) you need for method
*&quot;* implementation or private method&apos;s signature</localTypes>
<localMacros>*&quot;* use this source file for any macro definitions you need
*&quot;* in the implementation part of the class</localMacros>
<inheritance CLSNAME="ZSAPLINK_TABLE_CONTENTS" REFCLSNAME="ZSAPLINK" VERSION="1" STATE="1" AUTHOR="BCUSER" CREATEDON="20070901" CHANGEDON="00000000">
<redefinition CLSNAME="ZSAPLINK_TABLE_CONTENTS" REFCLSNAME="ZSAPLINK" VERSION="1" MTDNAME="CHECKEXISTS"/>
<redefinition CLSNAME="ZSAPLINK_TABLE_CONTENTS" REFCLSNAME="ZSAPLINK" VERSION="1" MTDNAME="CREATEIXMLDOCFROMOBJECT"/>
<redefinition CLSNAME="ZSAPLINK_TABLE_CONTENTS" REFCLSNAME="ZSAPLINK" VERSION="1" MTDNAME="CREATEOBJECTFROMIXMLDOC"/>
<redefinition CLSNAME="ZSAPLINK_TABLE_CONTENTS" REFCLSNAME="ZSAPLINK" VERSION="1" MTDNAME="DELETEOBJECT"/>
<redefinition CLSNAME="ZSAPLINK_TABLE_CONTENTS" REFCLSNAME="ZSAPLINK" VERSION="1" MTDNAME="GETOBJECTTYPE"/>
</inheritance>
<method CLSNAME="ZSAPLINK" CMPNAME="CHECKEXISTS" VERSION="0" EXPOSURE="0" STATE="0" EDITORDER="0 " DISPID="0 " CREATEDON="00000000" CHANGEDON="00000000" MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<source>*/---------------------------------------------------------------------\
*| This file is part of SAPlink. |
*| |
*| SAPlink is free software; you can redistribute it and/or modify |
*| it under the terms of the GNU General Public License as published |
*| by the Free Software Foundation; either version 2 of the License, |
*| or (at your option) any later version. |
*| |
*| SAPlink is distributed in the hope that it will be useful, |
*| but WITHOUT ANY WARRANTY; without even the implied warranty of |
*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
*| GNU General Public License for more details. |
*| |
*| You should have received a copy of the GNU General Public License |
*| along with SAPlink; if not, write to the |
*| Free Software Foundation, Inc., |
*| 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
*\---------------------------------------------------------------------/
METHOD checkexists.
* Plugin created by:
* Rich Heilman
* rich.heilman.jr@gmail.com
* No implementation
ENDMETHOD.</source>
</method>
<method CLSNAME="ZSAPLINK" CMPNAME="CREATEIXMLDOCFROMOBJECT" VERSION="0" EXPOSURE="0" STATE="0" EDITORDER="0 " DISPID="0 " CREATEDON="00000000" CHANGEDON="00000000" MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<source>*/---------------------------------------------------------------------\
*| This file is part of SAPlink. |
*| |
*| SAPlink is free software; you can redistribute it and/or modify |
*| it under the terms of the GNU General Public License as published |
*| by the Free Software Foundation; either version 2 of the License, |
*| or (at your option) any later version. |
*| |
*| SAPlink is distributed in the hope that it will be useful, |
*| but WITHOUT ANY WARRANTY; without even the implied warranty of |
*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
*| GNU General Public License for more details. |
*| |
*| You should have received a copy of the GNU General Public License |
*| along with SAPlink; if not, write to the |
*| Free Software Foundation, Inc., |
*| 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
*\---------------------------------------------------------------------/
METHOD createixmldocfromobject.
* Plugin created by:
* Rich Heilman
* rich.heilman.jr@gmail.com
TYPES: BEGIN OF ttabname,
tabname TYPE dd02v-tabname,
END OF ttabname.
DATA xtabname TYPE ttabname.
DATA xdd02v TYPE dd02v.
DATA root_node TYPE REF TO if_ixml_element.
DATA datarow_node TYPE REF TO if_ixml_element.
DATA rc TYPE sysubrc.
DATA _tablname TYPE ddobjname.
DATA _objtype TYPE string.
DATA dref_tab TYPE REF TO data.
DATA dref_wa TYPE REF TO data.
FIELD-SYMBOLS: &lt;dyn_tab&gt; TYPE table.
FIELD-SYMBOLS: &lt;dyn_wa&gt; TYPE ANY.
* Check that table exits.
_tablname = objname.
* Does the table exist?
CALL FUNCTION &apos;DDIF_TABL_GET&apos;
EXPORTING
name = _tablname
IMPORTING
dd02v_wa = xdd02v
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc &lt;&gt; 0 OR xdd02v-tabname IS INITIAL.
RAISE EXCEPTION TYPE zcx_saplink
EXPORTING textid = zcx_saplink=&gt;error_message
msg = `Table not found`.
ENDIF.
* Create parent node
_objtype = getobjecttype( ).
root_node = xmldoc-&gt;create_element( _objtype ).
xtabname-tabname = xdd02v-tabname.
me-&gt;setattributesfromstructure( node = root_node structure = xtabname ).
* Create dynamic internal table and work area
CREATE DATA dref_tab TYPE TABLE OF (xdd02v-tabname).
ASSIGN dref_tab-&gt;* TO &lt;dyn_tab&gt;.
CREATE DATA dref_wa LIKE LINE OF &lt;dyn_tab&gt;.
ASSIGN dref_wa-&gt;* TO &lt;dyn_wa&gt;.
* Select all data
SELECT * INTO TABLE &lt;dyn_tab&gt; FROM (xdd02v-tabname).
* Write records to XML node
LOOP AT &lt;dyn_tab&gt; ASSIGNING &lt;dyn_wa&gt;.
datarow_node = xmldoc-&gt;create_element( `DataRow` ).
me-&gt;setattributesfromstructure( node = datarow_node structure = &lt;dyn_wa&gt; ).
rc = root_node-&gt;append_child( datarow_node ).
ENDLOOP.
* Add node
rc = xmldoc-&gt;append_child( root_node ).
ixmldocument = xmldoc.
ENDMETHOD.</source>
</method>
<method CLSNAME="ZSAPLINK" CMPNAME="CREATEOBJECTFROMIXMLDOC" VERSION="0" EXPOSURE="0" STATE="0" EDITORDER="0 " DISPID="0 " CREATEDON="00000000" CHANGEDON="00000000" MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<source>*/---------------------------------------------------------------------\
*| This file is part of SAPlink. |
*| |
*| SAPlink is free software; you can redistribute it and/or modify |
*| it under the terms of the GNU General Public License as published |
*| by the Free Software Foundation; either version 2 of the License, |
*| or (at your option) any later version. |
*| |
*| SAPlink is distributed in the hope that it will be useful, |
*| but WITHOUT ANY WARRANTY; without even the implied warranty of |
*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
*| GNU General Public License for more details. |
*| |
*| You should have received a copy of the GNU General Public License |
*| along with SAPlink; if not, write to the |
*| Free Software Foundation, Inc., |
*| 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
*\---------------------------------------------------------------------/
METHOD createobjectfromixmldoc.
* Plugin created by:
* Rich Heilman
* rich.heilman.jr@gmail.com
TYPES: BEGIN OF ttabname,
tabname TYPE dd02v-tabname,
END OF ttabname.
DATA xtabname TYPE ttabname.
DATA xdd02v TYPE dd02v.
DATA xtadir TYPE tadir.
DATA idd03p TYPE TABLE OF dd03p.
DATA xdd03p LIKE LINE OF idd03p.
DATA root_node TYPE REF TO if_ixml_element.
DATA datarow_node TYPE REF TO if_ixml_element.
DATA datarow_filter TYPE REF TO if_ixml_node_filter.
DATA datarow_iterator TYPE REF TO if_ixml_node_iterator.
DATA _objtype TYPE string.
DATA l_answer TYPE string.
DATA l_nameclass TYPE c.
DATA l_client_dependent TYPE abap_bool.
DATA dref_tab TYPE REF TO data.
DATA dref_wa TYPE REF TO data.
FIELD-SYMBOLS: &lt;dyn_tab&gt; TYPE table.
FIELD-SYMBOLS: &lt;dyn_wa&gt; TYPE ANY.
FIELD-SYMBOLS: &lt;fs_mandt&gt; TYPE ANY.
_objtype = getobjecttype( ).
xmldoc = ixmldocument.
root_node = xmldoc-&gt;find_from_name( _objtype ).
* Get table name from XML.
me-&gt;getstructurefromattributes(
EXPORTING node = root_node
CHANGING structure = xtabname ).
objname = xtabname-tabname.
* Check that table exists
CALL FUNCTION &apos;DDIF_TABL_GET&apos;
EXPORTING
name = xtabname-tabname
IMPORTING
dd02v_wa = xdd02v
TABLES
dd03p_tab = idd03p
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc &lt;&gt; 0 OR xdd02v-tabname IS INITIAL.
RAISE EXCEPTION TYPE zcx_saplink
EXPORTING textid = zcx_saplink=&gt;error_message
msg = `Table not found`.
ENDIF.
* Check for MANDT field, if found, then set client dependent
READ TABLE idd03p INTO xdd03p WITH KEY fieldname = &apos;MANDT&apos;.
IF sy-subrc = 0.
l_client_dependent = abap_true.
ENDIF.
* Only allow tables in customer namespace
CLEAR xtadir.
SELECT SINGLE * FROM tadir INTO xtadir
WHERE pgmid = &apos;R3TR&apos;
AND object = &apos;TABL&apos;
AND obj_name = xdd02v-tabname.
CALL FUNCTION &apos;TRINT_OBJECT_NAMESPACE_INFO&apos;
EXPORTING
iv_pgmid = xtadir-pgmid
iv_object = xtadir-object
iv_objname = xtadir-obj_name
IMPORTING
ev_nameclass = l_nameclass
EXCEPTIONS
namespace_not_existing = 1
namespace_use_rejected = 2
invalid_object = 3
OTHERS = 4.
IF l_nameclass &lt;&gt; `C`.
RAISE EXCEPTION TYPE zcx_saplink
EXPORTING textid = zcx_saplink=&gt;error_message
msg = &apos;Table is not within customer namespace&apos;.
ENDIF.
* Create dynamic internal table and work area
CREATE DATA dref_tab TYPE TABLE OF (xdd02v-tabname).
ASSIGN dref_tab-&gt;* TO &lt;dyn_tab&gt;.
CREATE DATA dref_wa LIKE LINE OF &lt;dyn_tab&gt;.
ASSIGN dref_wa-&gt;* TO &lt;dyn_wa&gt;.
* Build dynamic internal table from XML
FREE: datarow_filter, datarow_iterator, datarow_node.
datarow_filter = xmldoc-&gt;create_filter_name( `DataRow` ).
datarow_iterator = xmldoc-&gt;create_iterator_filtered( datarow_filter ).
datarow_node ?= datarow_iterator-&gt;get_next( ).
WHILE datarow_node IS NOT INITIAL.
APPEND INITIAL LINE TO &lt;dyn_tab&gt; ASSIGNING &lt;dyn_wa&gt;.
me-&gt;getstructurefromattributes(
EXPORTING node = datarow_node
CHANGING structure = &lt;dyn_wa&gt; ).
datarow_node ?= datarow_iterator-&gt;get_next( ).
ENDWHILE.
* Any records imported from XML, if not, give error.
IF LINES( &lt;dyn_tab&gt; ) = 0.
RAISE EXCEPTION TYPE zcx_saplink
EXPORTING textid = zcx_saplink=&gt;error_message
msg = `No data records present in XML document`.
ENDIF.
* Change MANDT field to current client number
* Always add imported records to current client number
IF l_client_dependent = abap_true.
LOOP AT &lt;dyn_tab&gt; ASSIGNING &lt;dyn_wa&gt;.
ASSIGN COMPONENT `MANDT` OF STRUCTURE &lt;dyn_wa&gt; TO &lt;fs_mandt&gt;.
&lt;fs_mandt&gt; = sy-mandt.
ENDLOOP.
ENDIF.
* Check that db table is initial, if so, then insert data and exit
DATA: l_count TYPE i.
CASE l_client_dependent .
WHEN abap_true.
SELECT COUNT( * ) INTO l_count
FROM (xdd02v-tabname) CLIENT SPECIFIED
WHERE mandt = sy-mandt.
WHEN abap_false.
SELECT COUNT( * ) INTO l_count
FROM (xdd02v-tabname).
ENDCASE.
IF l_count = 0.
INSERT (xdd02v-tabname) FROM TABLE &lt;dyn_tab&gt;.
name = objname.
RETURN.
ENDIF.
* Still here, then ask user how he wants to handle the existing
* data, either modify it, of delete/insert
DATA: text_question TYPE string.
text_question = `Table contains data which may be modified, ` &amp;
`would you like to modify existing records, ` &amp;
`or delete existing data first and insert`.
CALL FUNCTION &apos;POPUP_TO_CONFIRM&apos;
EXPORTING
text_question = text_question
text_button_1 = &apos;Modify Data&apos; &quot; UPdate table via MODIFY
icon_button_1 = &apos;ICON_CHANGE&apos;
text_button_2 = &apos;Del/Ins Data&apos; &quot; Delete data first, then INSERT
icon_button_2 = &apos;ICON_DELETE&apos;
IMPORTING
answer = l_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
* Check answer
CASE l_answer .
WHEN &apos;1&apos;. &quot;Modify existing rows, insert new rows based on key
MODIFY (xdd02v-tabname) FROM TABLE &lt;dyn_tab&gt;.
WHEN &apos;2&apos;. &quot;Delete existing data first, then insert new data
CASE l_client_dependent .
WHEN abap_true.
DELETE FROM (xdd02v-tabname) WHERE mandt = sy-mandt.
WHEN abap_false.
DELETE FROM (xdd02v-tabname).
ENDCASE.
INSERT (xdd02v-tabname) FROM TABLE &lt;dyn_tab&gt;.
WHEN &apos;A&apos;. &quot;Action has been cancelled
RAISE EXCEPTION TYPE zcx_saplink
EXPORTING textid = zcx_saplink=&gt;error_message
msg = `Action Cancelled`.
ENDCASE.
name = objname.
ENDMETHOD.</source>
</method>
<method CLSNAME="ZSAPLINK" CMPNAME="DELETEOBJECT" VERSION="0" EXPOSURE="0" STATE="0" EDITORDER="0 " DISPID="0 " CREATEDON="00000000" CHANGEDON="00000000" MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<source>*/---------------------------------------------------------------------\
*| This file is part of SAPlink. |
*| |
*| SAPlink is free software; you can redistribute it and/or modify |
*| it under the terms of the GNU General Public License as published |
*| by the Free Software Foundation; either version 2 of the License, |
*| or (at your option) any later version. |
*| |
*| SAPlink is distributed in the hope that it will be useful, |
*| but WITHOUT ANY WARRANTY; without even the implied warranty of |
*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
*| GNU General Public License for more details. |
*| |
*| You should have received a copy of the GNU General Public License |
*| along with SAPlink; if not, write to the |
*| Free Software Foundation, Inc., |
*| 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
*\---------------------------------------------------------------------/
method DELETEOBJECT.
* Plugin created by:
* Rich Heilman
* rich.heilman.jr@gmail.com
* No implementation
endmethod.</source>
</method>
<method CLSNAME="ZSAPLINK" CMPNAME="GETOBJECTTYPE" VERSION="0" EXPOSURE="0" STATE="0" EDITORDER="0 " DISPID="0 " CREATEDON="00000000" CHANGEDON="00000000" MTDTYPE="0" MTDDECLTYP="0" BCMTDCAT="00" BCMTDSYN="0">
<source>*/---------------------------------------------------------------------\
*| This file is part of SAPlink. |
*| |
*| SAPlink is free software; you can redistribute it and/or modify |
*| it under the terms of the GNU General Public License as published |
*| by the Free Software Foundation; either version 2 of the License, |
*| or (at your option) any later version. |
*| |
*| SAPlink is distributed in the hope that it will be useful, |
*| but WITHOUT ANY WARRANTY; without even the implied warranty of |
*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
*| GNU General Public License for more details. |
*| |
*| You should have received a copy of the GNU General Public License |
*| along with SAPlink; if not, write to the |
*| Free Software Foundation, Inc., |
*| 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
*\---------------------------------------------------------------------/
method GETOBJECTTYPE.
* Plugin created by:
* Rich Heilman
* rich.heilman.jr@gmail.com
objecttype = &apos;TABU&apos;. &quot;Table Contents
endmethod.</source>
</method>
</CLAS>