Interne Tabelle als XML-Datei versenden

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

Interne Tabelle als XML-Datei versenden

Beitrag von debianfan (ForumUser / 84 / 64 / 0 ) »
Hallo,

ich hatte den Gedanken, dass ich selektierte Daten aus einer internen Tabelle als XML-Datei versenden kann. Diese kann ich dann später in Excel importieren ;-)


Ich hatte mit dem Programm angefangen und anstatt dem Mailversand ein speichern auf der Festplatte anfangs eingebaut.
Das funktionierte Problemlos.

Jetzt versuche ich das ganze anschliessend per Mail zu versenden - aber die XML-Datei ist leicht zerstört.

Zum Test habe ich die ersten 3 Zeilen der T000 Tabelle genommen:

Die XML-Datei welche ich per Mail erhalte, sieht so aus:

Code: Alles auswählen.

<?xml version="1.0" encoding="utf-16"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"><asx:values><DATA_NODE><T000><MANDT>000</MANDT><MTEXT>SAP AG</MTEXT><ORT01>Walldorf</ORT01><MWAER>EUR</MWAER><ADRNR/><CCCATEGORY>S</CCCATEGORY><CCCORACTIV>2</CCCORACTIV><CCNOCLIIND/><CCCOPYLOCK>X</CCCOPYLOCK><CCNOCASCAD/><CCSOFTLOCK/><CCORIGCONT/><CCIMAILDIS/><CCTEMPLOCK/><CHANGEUSER>OCA</CHANGEUSER><CHANGEDATE>2007-10-06</CHANGEDATE><LOGSYS>CS2CLNT000</LOGSYS></T000><T000><MANDT>001</MANDT><MTEXT>Auslieferungsmandant R11</MTEXT><ORT01>Kundstadt</ORT01><MWAER>USD</MWAER><ADRNR/><CCCATEGORY>C</CCCAT

Der Quellcode des Programms ist hier:

Code: Alles auswählen.

REPORT  z_test7.

*Prepare Mail Object
DATA:  lo_send_request TYPE REF TO cl_bcs VALUE IS INITIAL.
CLASS cl_bcs DEFINITION LOAD.
DATA: lo_document TYPE REF TO cl_document_bcs VALUE IS INITIAL. "document object
DATA : i_text TYPE bcsy_text. "Table for body
DATA : w_text LIKE LINE OF i_text. "work area for message body
DATA: lo_sender TYPE REF TO if_sender_bcs VALUE IS INITIAL. "sender
DATA: lo_recipient TYPE REF TO if_recipient_bcs VALUE IS INITIAL. "recipient
DATA: lx_document_bcs TYPE REF TO cx_document_bcs.

**Selection screen
PARAMETERS : p_email TYPE adr6-smtp_addr. "Email input
***Attachment data
DATA : lt_tadir TYPE TABLE OF tadir,
       wa_tadir TYPE tadir.
DATA : lv_string TYPE string,
       lv_data_string TYPE string,
       lv_xstring TYPE xstring.
DATA: lit_binary_content TYPE solix_tab,
      lv_attsubject   TYPE sood-objdes.

DATA: lt_t000 TYPE STANDARD TABLE OF t000.
DATA: lv_xml TYPE string.
DATA: lo_xml_doc TYPE REF TO cl_xml_document.
DATA: lt_attach TYPE soli_tab.

START-OF-SELECTION.
  lo_send_request = cl_bcs=>create_persistent( ).

  CONCATENATE 'Testnachricht' sy-datum ' ' sy-timlo INTO lv_attsubject RESPECTING BLANKS.

  lo_document = cl_document_bcs=>create_document( "create document
  i_type = 'TXT' "Type of document HTM, TXT etc
  i_text =  i_text "email body internal table
  i_subject = lv_attsubject ). "email subject here p_sub input parameter

  lo_send_request->set_document( lo_document ).


  SELECT * FROM t000 INTO TABLE lt_t000.

  CALL TRANSFORMATION id SOURCE data_node = lt_t000 RESULT XML lv_xml.

  CREATE OBJECT lo_xml_doc.

  lo_xml_doc->parse_string( lv_xml ).

  CALL FUNCTION 'SO_STRING_TO_TAB'
    EXPORTING
      content_str = lv_xml
    TABLES
      content_tab = lt_attach.

* Create Attachment
  TRY.
      lo_document->add_attachment(
          i_attachment_type     = 'XLS'
          i_attachment_subject  = lv_attsubject
           i_att_content_text    = lt_attach
             ).
    CATCH cx_document_bcs INTO lx_document_bcs.
  ENDTRY.

  TRY.
      lo_sender = cl_sapuser_bcs=>create( sy-uname ). "sender is the logged in user
* Set sender to send request
      lo_send_request->set_sender(
      EXPORTING
      i_sender = lo_sender ).
    CATCH cx_address_bcs.
  ENDTRY.
**Set recipient
  lo_recipient = cl_cam_address_bcs=>create_internet_address( p_email ). "Here Recipient is email input p_email
  TRY.
      lo_send_request->add_recipient(
          EXPORTING
          i_recipient = lo_recipient
          i_express = 'X' ).
    CATCH cx_send_req_bcs.
  ENDTRY.
  TRY.
      CALL METHOD lo_send_request->set_send_immediately
        EXPORTING
          i_send_immediately = 'X'. "here selection screen input p_send
    CATCH cx_send_req_bcs.
  ENDTRY.
  TRY.
** Send email
      lo_send_request->send(
      EXPORTING
      i_with_error_screen = 'X' ).
      COMMIT WORK.
      IF sy-subrc = 0. "mail sent successfully
        WRITE :/ 'Mail sent successfully'.
      ENDIF.
    CATCH cx_send_req_bcs.
*catch exception here
  ENDTRY.

Vorschläge ?
Ich weiß viel - aber nicht alles - deswegen lerne ich gern dazu & bin für Hinweise von erfahrenen ITlern immer dankbar.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Interne Tabelle als XML-Datei versenden

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
debianfan hat geschrieben: * Create Attachment
TRY.
lo_document->add_attachment(
i_attachment_type = 'XLS'
i_attachment_subject = lv_attsubject
i_att_content_text = lt_attach
).
CATCH cx_document_bcs INTO lx_document_bcs.
ENDTRY.
Vielleicht liegt es an der Dateiendung?

Re: Interne Tabelle als XML-Datei versenden

Beitrag von debianfan (ForumUser / 84 / 64 / 0 ) »
Ich hab aus dem XLS ein XML gemacht.

Dann ging es aber immer noch nicht - der XML-Datenstrom war zwar komplett, aber der IE verweigerte die Anzeige - auch Excel konnte nicht importieren.

Ich hab das ganze dann durch einen XML-Checker geschoben - der sagte, dass ich einen UTF-8 XML-Datenstrom mit UTF-16 gekennzeichnet habe.

Ich habe dann aus dem UTF16 am Beginn der Datei ein UTF-8 gemacht - es ging.

IE & Excel konnten die Datei laden.

Aber wie gebe ich ihm beim CALL Transformation mit, dass er UTF8 anstatt UTF16 verwenden soll?
Ich weiß viel - aber nicht alles - deswegen lerne ich gern dazu & bin für Hinweise von erfahrenen ITlern immer dankbar.

Re: Interne Tabelle als XML-Datei versenden

Beitrag von Tron (Top Expert / 1327 / 35 / 331 ) »
Moin.
Mein Vorschlag:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  YTEST_ABAP_FORUM                                            *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

REPORT  YTEST_ABAP_FORUM                                            .


*Prepare Mail Object
DATA:  lo_send_request TYPE REF TO cl_bcs VALUE IS INITIAL.
CLASS cl_bcs DEFINITION LOAD.
DATA: lo_document TYPE REF TO cl_document_bcs VALUE IS INITIAL. "document object
DATA : i_text TYPE bcsy_text. "Table for body
DATA : w_text LIKE LINE OF i_text. "work area for message body
DATA: lo_sender TYPE REF TO if_sender_bcs VALUE IS INITIAL. "sender
DATA: lo_recipient TYPE REF TO if_recipient_bcs VALUE IS INITIAL. "recipient
DATA: lx_document_bcs TYPE REF TO cx_document_bcs.

**Selection screen
PARAMETERS : p_email TYPE adr6-smtp_addr default 'sapuser@localhost'. "Email input
***Attachment data
DATA : lt_tadir TYPE TABLE OF tadir,
       wa_tadir TYPE tadir.
DATA : lv_string TYPE string,
       lv_data_string TYPE string,
       lv_xstring TYPE xstring.
DATA: lit_binary_content TYPE solix_tab,
      lv_attsubject   TYPE sood-objdes.

DATA: lt_t000 TYPE STANDARD TABLE OF t000.
DATA: lx_xml TYPE xstring.
DATA: lo_xml_doc TYPE REF TO cl_xml_document.
*DATA: lt_attach TYPE solix_tab.
data  lt_attach TYPE table of SOLIX.
DATA: l_xlen TYPE i.


START-OF-SELECTION.
  lo_send_request = cl_bcs=>create_persistent( ).

  CONCATENATE 'Testnachricht' sy-datum ' ' sy-timlo INTO lv_attsubject.

  lo_document = cl_document_bcs=>create_document( "create document
  i_type = 'TXT' "Type of document HTM, TXT etc
  i_text =  i_text "email body internal table
  i_subject = lv_attsubject ). "email subject here p_sub input parameter

  lo_send_request->set_document( lo_document ).


  SELECT * FROM t000 INTO TABLE lt_t000.

  CALL TRANSFORMATION id SOURCE data_node = lt_t000 RESULT XML lx_xml.


CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer                = lx_xml
    APPEND_TO_TABLE       = ' '
 IMPORTING
   OUTPUT_LENGTH         = l_xlen
  tables
    binary_tab            = lt_attach.

*  CREATE OBJECT lo_xml_doc.

*  lo_xml_doc->parse_string( lv_xml ).

*  CALL FUNCTION 'SO_STRING_TO_TAB'
*    EXPORTING
*      content_str = lv_xml
*    TABLES
*      content_tab = lt_attach.

* Create Attachment
*ALI                        X          X      ABAPList-Dokument
*ARC                        X                 Archivobjekt (Image)
*BCS                                   X      Externe Dokumentablage
*BIN                        X                 Binäres Dokument
*DLI                        X                 Verteilerliste
*EXT                        X    X            PC-Dokument
*FAX                        X          X      Telefax
*FOL                        X                 Mappe
*GRA                        X          X      SAP-Graphik
*OBJ                        X                 Business Objekt
*OFO                                   X      Object folder
*OTF                                   X      OTF-Dokument
*R3I                                   X      IDoc
*RAW   X                    X                 SAP-Editor-Dokument
*SCR                        X                 SAPscript-Dokument
*URL                                          Link ins Inter-/Intranet
*WIM                                   X      Workitem
*XXL                        X          X      Dokument für Listviewer

data l_attsize TYPE SOOD-OBJLEN.
l_attsize = l_xlen.

  TRY.
      lo_document->add_attachment(
          i_attachment_type     = 'XML'
          I_ATTACHMENT_SIZE    = l_attsize
          i_attachment_subject  = lv_attsubject
          I_ATT_CONTENT_HEX     = lt_attach
             ).
    CATCH cx_document_bcs INTO lx_document_bcs.
  ENDTRY.


  TRY.
      lo_sender = cl_sapuser_bcs=>create( sy-uname ). "sender is the logged in user
* Set sender to send request
      lo_send_request->set_sender(
      EXPORTING
      i_sender = lo_sender ).
    CATCH cx_address_bcs.
  ENDTRY.
**Set recipient
  lo_recipient = cl_cam_address_bcs=>create_internet_address( p_email ). "Here Recipient is email input p_email
  TRY.
      lo_send_request->add_recipient(
          EXPORTING
          i_recipient = lo_recipient
          i_express = 'X' ).
    CATCH cx_send_req_bcs.
  ENDTRY.
  TRY.
      CALL METHOD lo_send_request->set_send_immediately
        EXPORTING
          i_send_immediately = 'X'. "here selection screen input p_send
    CATCH cx_send_req_bcs.
  ENDTRY.
  TRY.
** Send email
      lo_send_request->send(
      EXPORTING
      i_with_error_screen = 'X' ).
      COMMIT WORK.
      IF sy-subrc = 0. "mail sent successfully
        WRITE :/ 'Mail sent successfully'.
      ENDIF.
    CATCH cx_send_req_bcs.
*catch exception here
  ENDTRY.
Ich möchte noch anmerken, dass nicht jeder Email-Server das explizite setzen der Absenderadresse erlaubt !

gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Interne Tabelle als XML-Datei versenden

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
debianfan hat geschrieben:Aber wie gebe ich ihm beim CALL Transformation mit, dass er UTF8 anstatt UTF16 verwenden soll?
Gar nicht. Leider.
Ich glaube, du musst den erzeugten XML-String separat umwandeln.

Code: Alles auswählen.

  DATA conv_out TYPE REF TO cl_abap_conv_out_ce.
  DATA conv_in  TYPE REF TO cl_abap_conv_in_ce.
  DATA outx     TYPE xstring.
  DATA len      TYPE i.

  "Damit aus "führen" führen wird...
  conv_out = cl_abap_conv_out_ce=>create( encoding = '1160' ). "1160 = windows-1252
  conv_out->convert( EXPORTING data = in IMPORTING buffer = outx len = len ).
  conv_in = cl_abap_conv_in_ce=>create( input = outx encoding = '4110' ). "4110 = UTF-8
  conv_in->read( EXPORTING n = len  IMPORTING data = out ).

Re: Interne Tabelle als XML-Datei versenden

Beitrag von debianfan (ForumUser / 84 / 64 / 0 ) »
Danke - aber der Netweaver ist nicht ganz aktuell - er kennt diese Syntax nicht.

Ich habs jetzt so gelöst:

REPLACE FIRST OCCURRENCE OF 'utf-16' IN lv_xml WITH 'utf-8' in CHARACTER MODE.

Irgendwie vermutlich von hinten durch die Brust - aber egal..
Ich weiß viel - aber nicht alles - deswegen lerne ich gern dazu & bin für Hinweise von erfahrenen ITlern immer dankbar.

Seite 1 von 1

Vergleichbare Themen

5
Antw.
5393
Views
Interne Tabelle als Mail versenden
von SaskuAc » 12.03.2018 14:38 • Verfasst in ABAP® Core
15
Antw.
999
Views
Interne Tabelle als Excel mit mehrere Blättern versenden
von lisa » 16.02.2022 19:33 • Verfasst in ABAP® für Anfänger
0
Antw.
2145
Views
Interne Tabelle in Datei speichern
von Schludi » 08.06.2006 10:52 • Verfasst in Java & SAP®
3
Antw.
1603
Views
Download interne Tabelle in .ncd Datei
von Anita3 » 02.07.2008 14:09 • Verfasst in ABAP® für Anfänger
3
Antw.
3469
Views
Interne Tabelle mit Zeilenumbruch in .TXT-Datei
von KleinerEisbaer » 28.05.2008 19:10 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 2 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 2 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 2 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140